Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Side by Side Diff: chrome/browser/debugger/devtools_netlog_observer.cc

Issue 3133016: Support retrieval of raw headers from network stack (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: nits picked Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2010 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 "chrome/browser/debugger/devtools_netlog_observer.h"
6
7 #include "base/string_util.h"
8 #include "chrome/browser/io_thread.h"
9 #include "chrome/common/resource_response.h"
10 #include "net/base/load_flags.h"
11 #include "net/http/http_net_log_params.h"
12 #include "net/url_request/url_request_netlog_params.h"
13 #include "webkit/glue/resource_loader_bridge.h"
14
15 const size_t kMaxNumEntries = 1000;
16
17 DevToolsNetLogObserver* DevToolsNetLogObserver::instance_ = NULL;
18
19 DevToolsNetLogObserver::DevToolsNetLogObserver(ChromeNetLog* chrome_net_log)
20 : ChromeNetLog::Observer(net::NetLog::LOG_ALL),
21 chrome_net_log_(chrome_net_log) {
22 chrome_net_log_->AddObserver(this);
23 }
24
25 DevToolsNetLogObserver::~DevToolsNetLogObserver() {
26 chrome_net_log_->RemoveObserver(this);
27 }
28
29 DevToolsNetLogObserver::ResourceInfo*
30 DevToolsNetLogObserver::GetResourceInfo(uint32 id) {
31 RequestToInfoMap::iterator it = request_to_info_.find(id);
32 if (it != request_to_info_.end())
33 return it->second;
34 return NULL;
35 }
36
37 void DevToolsNetLogObserver::OnAddEntry(net::NetLog::EventType type,
38 const base::TimeTicks& time,
39 const net::NetLog::Source& source,
40 net::NetLog::EventPhase phase,
41 net::NetLog::EventParameters* params) {
42 if (type == net::NetLog::TYPE_URL_REQUEST_START_JOB) {
43 if (phase != net::NetLog::PHASE_BEGIN)
44 return;
45 int load_flags = static_cast<URLRequestStartEventParameters*>(params)->
46 load_flags();
47 if (!(load_flags & net::LOAD_REPORT_RAW_HEADERS))
48 return;
49 if (request_to_info_.size() > kMaxNumEntries) {
50 LOG(WARNING) << "The raw headers observer url request count has grown "
51 "larger than expected, resetting";
52 request_to_info_.clear();
53 }
54 scoped_refptr<ResourceInfo> new_record = new ResourceInfo();
55 request_to_info_.insert(std::make_pair(source.id, new_record));
56 return;
57 }
58 if (type == net::NetLog::TYPE_REQUEST_ALIVE &&
59 phase == net::NetLog::PHASE_END) {
60 request_to_info_.erase(source.id);
61 return;
62 }
63 if (type != net::NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS &&
64 type != net::NetLog::TYPE_HTTP_TRANSACTION_READ_RESPONSE_HEADERS)
65 return;
66
67 ResourceInfo* info = GetResourceInfo(source.id);
68 if (!info)
69 return;
70
71 switch (type) {
72 case net::NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS: {
73 const net::HttpRequestHeaders &request_headers =
74 static_cast<net::NetLogHttpRequestParameter*>(params)->GetHeaders();
75 for (net::HttpRequestHeaders::Iterator it(request_headers);
76 it.GetNext();) {
77 info->request_headers.push_back(std::make_pair(it.name(),
78 it.value()));
79 }
80 break;
81 }
82 case net::NetLog::TYPE_HTTP_TRANSACTION_READ_RESPONSE_HEADERS: {
83 const net::HttpResponseHeaders& response_headers =
84 static_cast<net::NetLogHttpResponseParameter*>(params)->GetHeaders();
85 std::string name, value;
86 for (void* it = NULL;
87 response_headers.EnumerateHeaderLines(&it, &name, &value); ) {
88 info->response_headers.push_back(std::make_pair(name, value));
89 }
90 break;
91 }
92 default:
93 break;
94 }
95 }
96
97 void DevToolsNetLogObserver::Attach(IOThread* io_thread) {
98 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
99 DCHECK(!instance_);
100
101 instance_ = new DevToolsNetLogObserver(io_thread->globals()->net_log.get());
102 }
103
104 void DevToolsNetLogObserver::Detach() {
105 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
106 DCHECK(instance_);
107
108 delete instance_;
109 instance_ = NULL;
110 }
111
112 DevToolsNetLogObserver* DevToolsNetLogObserver::GetInstance() {
113 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
114
115 return instance_;
116 }
117
118 // static
119 void DevToolsNetLogObserver::PopulateResponseInfo(URLRequest* request,
120 ResourceResponse* response) {
121 if (!(request->load_flags() & net::LOAD_REPORT_RAW_HEADERS))
122 return;
123
124 uint32 source_id = request->net_log().source().id;
125 DevToolsNetLogObserver* dev_tools_net_log_observer =
126 DevToolsNetLogObserver::GetInstance();
127 DCHECK(dev_tools_net_log_observer);
128 if (!dev_tools_net_log_observer)
129 return;
130 response->response_head.devtools_info =
131 dev_tools_net_log_observer->GetResourceInfo(source_id);
132 }
OLDNEW
« no previous file with comments | « chrome/browser/debugger/devtools_netlog_observer.h ('k') | chrome/browser/renderer_host/async_resource_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698