1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/websockets/websocket_net_log_params.h"
6
7#include "base/strings/stringprintf.h"
8#include "base/values.h"
9
10namespace net {
11
12base::Value* NetLogWebSocketHandshakeCallback(
13    const std::string* headers,
14    NetLog::LogLevel /* log_level */) {
15  base::DictionaryValue* dict = new base::DictionaryValue();
16  base::ListValue* header_list = new base::ListValue();
17
18  size_t last = 0;
19  size_t headers_size = headers->size();
20  size_t pos = 0;
21  while (pos <= headers_size) {
22    if (pos == headers_size ||
23        ((*headers)[pos] == '\r' &&
24         pos + 1 < headers_size && (*headers)[pos + 1] == '\n')) {
25      std::string entry = headers->substr(last, pos - last);
26      pos += 2;
27      last = pos;
28
29      header_list->Append(new base::StringValue(entry));
30
31      if (entry.empty()) {
32        // Dump WebSocket key3.
33        std::string key;
34        for (; pos < headers_size; ++pos) {
35          key += base::StringPrintf("\\x%02x", (*headers)[pos] & 0xff);
36        }
37        header_list->Append(new base::StringValue(key));
38        break;
39      }
40    } else {
41      ++pos;
42    }
43  }
44
45  dict->Set("headers", header_list);
46  return dict;
47}
48
49}  // namespace net
50