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

Side by Side Diff: content/browser/devtools/devtools_netlog_observer.cc

Issue 1953593002: Move DevToolsNetLogObserver to c/b/loader and create stub of network service interface (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix comment Created 4 years, 7 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
« no previous file with comments | « content/browser/devtools/devtools_netlog_observer.h ('k') | content/browser/loader/DEPS » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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 "content/browser/devtools/devtools_netlog_observer.h"
6
7 #include <stddef.h>
8
9 #include "base/strings/string_util.h"
10 #include "base/values.h"
11 #include "content/browser/loader/resource_request_info_impl.h"
12 #include "content/public/browser/browser_thread.h"
13 #include "content/public/browser/content_browser_client.h"
14 #include "content/public/common/resource_response.h"
15 #include "net/base/load_flags.h"
16 #include "net/http/http_response_headers.h"
17 #include "net/http/http_util.h"
18 #include "net/spdy/spdy_header_block.h"
19 #include "net/url_request/url_request.h"
20 #include "net/url_request/url_request_netlog_params.h"
21
22 namespace content {
23 const size_t kMaxNumEntries = 1000;
24
25 DevToolsNetLogObserver* DevToolsNetLogObserver::instance_ = NULL;
26
27 DevToolsNetLogObserver::DevToolsNetLogObserver() {
28 }
29
30 DevToolsNetLogObserver::~DevToolsNetLogObserver() {
31 }
32
33 DevToolsNetLogObserver::ResourceInfo* DevToolsNetLogObserver::GetResourceInfo(
34 uint32_t id) {
35 RequestToInfoMap::iterator it = request_to_info_.find(id);
36 if (it != request_to_info_.end())
37 return it->second.get();
38 return NULL;
39 }
40
41 void DevToolsNetLogObserver::OnAddEntry(const net::NetLog::Entry& entry) {
42 // The events that the Observer is interested in only occur on the IO thread.
43 if (!BrowserThread::CurrentlyOn(BrowserThread::IO))
44 return;
45
46 if (entry.source().type == net::NetLog::SOURCE_URL_REQUEST)
47 OnAddURLRequestEntry(entry);
48 }
49
50 void DevToolsNetLogObserver::OnAddURLRequestEntry(
51 const net::NetLog::Entry& entry) {
52 DCHECK_CURRENTLY_ON(BrowserThread::IO);
53
54 bool is_begin = entry.phase() == net::NetLog::PHASE_BEGIN;
55 bool is_end = entry.phase() == net::NetLog::PHASE_END;
56
57 if (entry.type() == net::NetLog::TYPE_URL_REQUEST_START_JOB) {
58 if (is_begin) {
59 if (request_to_info_.size() > kMaxNumEntries) {
60 LOG(WARNING) << "The raw headers observer url request count has grown "
61 "larger than expected, resetting";
62 request_to_info_.clear();
63 }
64
65 request_to_info_[entry.source().id] = new ResourceInfo();
66 }
67 return;
68 } else if (entry.type() == net::NetLog::TYPE_REQUEST_ALIVE) {
69 // Cleanup records based on the TYPE_REQUEST_ALIVE entry.
70 if (is_end)
71 request_to_info_.erase(entry.source().id);
72 return;
73 }
74
75 ResourceInfo* info = GetResourceInfo(entry.source().id);
76 if (!info)
77 return;
78
79 switch (entry.type()) {
80 case net::NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS: {
81 std::unique_ptr<base::Value> event_params(entry.ParametersToValue());
82 std::string request_line;
83 net::HttpRequestHeaders request_headers;
84
85 if (!net::HttpRequestHeaders::FromNetLogParam(event_params.get(),
86 &request_headers,
87 &request_line)) {
88 NOTREACHED();
89 }
90
91 // We need to clear headers in case the same url_request is reused for
92 // several http requests (e.g. see http://crbug.com/80157).
93 info->request_headers.clear();
94
95 for (net::HttpRequestHeaders::Iterator it(request_headers);
96 it.GetNext();) {
97 info->request_headers.push_back(std::make_pair(it.name(), it.value()));
98 }
99 info->request_headers_text = request_line + request_headers.ToString();
100 break;
101 }
102 case net::NetLog::TYPE_HTTP_TRANSACTION_HTTP2_SEND_REQUEST_HEADERS: {
103 std::unique_ptr<base::Value> event_params(entry.ParametersToValue());
104 net::SpdyHeaderBlock request_headers;
105
106 if (!net::SpdyHeaderBlockFromNetLogParam(event_params.get(),
107 &request_headers)) {
108 NOTREACHED();
109 }
110
111 // We need to clear headers in case the same url_request is reused for
112 // several http requests (e.g. see http://crbug.com/80157).
113 info->request_headers.clear();
114
115 for (net::SpdyHeaderBlock::const_iterator it = request_headers.begin();
116 it != request_headers.end(); ++it) {
117 info->request_headers.push_back(
118 std::make_pair(it->first.as_string(), it->second.as_string()));
119 }
120 info->request_headers_text = "";
121 break;
122 }
123 case net::NetLog::TYPE_HTTP_TRANSACTION_READ_RESPONSE_HEADERS: {
124 std::unique_ptr<base::Value> event_params(entry.ParametersToValue());
125
126 scoped_refptr<net::HttpResponseHeaders> response_headers;
127
128 if (!net::HttpResponseHeaders::FromNetLogParam(event_params.get(),
129 &response_headers)) {
130 NOTREACHED();
131 }
132
133 info->http_status_code = response_headers->response_code();
134 info->http_status_text = response_headers->GetStatusText();
135 std::string name, value;
136
137 // We need to clear headers in case the same url_request is reused for
138 // several http requests (e.g. see http://crbug.com/80157).
139 info->response_headers.clear();
140
141 for (size_t it = 0;
142 response_headers->EnumerateHeaderLines(&it, &name, &value);) {
143 info->response_headers.push_back(std::make_pair(name, value));
144 }
145
146 if (!info->request_headers_text.empty()) {
147 info->response_headers_text =
148 net::HttpUtil::ConvertHeadersBackToHTTPResponse(
149 response_headers->raw_headers());
150 } else {
151 // SPDY request.
152 info->response_headers_text = "";
153 }
154 break;
155 }
156 default:
157 break;
158 }
159 }
160
161 void DevToolsNetLogObserver::Attach() {
162 DCHECK(!instance_);
163 net::NetLog* net_log = GetContentClient()->browser()->GetNetLog();
164 if (net_log) {
165 instance_ = new DevToolsNetLogObserver();
166 net_log->DeprecatedAddObserver(
167 instance_, net::NetLogCaptureMode::IncludeCookiesAndCredentials());
168 }
169 }
170
171 void DevToolsNetLogObserver::Detach() {
172 DCHECK_CURRENTLY_ON(BrowserThread::IO);
173
174 if (instance_) {
175 // Safest not to do this in the destructor to maintain thread safety across
176 // refactorings.
177 instance_->net_log()->DeprecatedRemoveObserver(instance_);
178 delete instance_;
179 instance_ = NULL;
180 }
181 }
182
183 DevToolsNetLogObserver* DevToolsNetLogObserver::GetInstance() {
184 DCHECK_CURRENTLY_ON(BrowserThread::IO);
185
186 return instance_;
187 }
188
189 // static
190 void DevToolsNetLogObserver::PopulateResponseInfo(
191 net::URLRequest* request,
192 ResourceResponse* response) {
193 const ResourceRequestInfoImpl* request_info =
194 ResourceRequestInfoImpl::ForRequest(request);
195 if (!request_info || !request_info->ShouldReportRawHeaders())
196 return;
197
198 uint32_t source_id = request->net_log().source().id;
199 DevToolsNetLogObserver* dev_tools_net_log_observer =
200 DevToolsNetLogObserver::GetInstance();
201 if (dev_tools_net_log_observer == NULL)
202 return;
203 response->head.devtools_info =
204 dev_tools_net_log_observer->GetResourceInfo(source_id);
205 }
206
207 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/devtools/devtools_netlog_observer.h ('k') | content/browser/loader/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698