121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved.
221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Use of this source code is governed by a BSD-style license that can be
321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// found in the LICENSE file.
421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/websockets/websocket_net_log_params.h"
621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace net {
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenNetLogWebSocketHandshakeParameter::NetLogWebSocketHandshakeParameter(
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& headers)
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    : headers_(headers) {
1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenValue* NetLogWebSocketHandshakeParameter::ToValue() const {
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DictionaryValue* dict = new DictionaryValue();
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ListValue* headers = new ListValue();
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  size_t last = 0;
1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  size_t headers_size = headers_.size();
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  size_t pos = 0;
2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  while (pos <= headers_size) {
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (pos == headers_size ||
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        (headers_[pos] == '\r' &&
2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen         pos + 1 < headers_size && headers_[pos + 1] == '\n')) {
2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      std::string entry = headers_.substr(last, pos - last);
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      pos += 2;
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      last = pos;
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      headers->Append(new StringValue(entry));
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      if (entry.empty()) {
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        // Dump WebSocket key3.
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        std::string key;
3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        for (; pos < headers_size; ++pos) {
3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          key += base::StringPrintf("\\x%02x", headers_[pos] & 0xff);
3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        }
3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        headers->Append(new StringValue(key));
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        break;
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      }
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    } else {
4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      ++pos;
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  dict->Set("headers", headers);
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return dict;
4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenNetLogWebSocketHandshakeParameter::~NetLogWebSocketHandshakeParameter() {}
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}  // namespace net
52