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

Side by Side Diff: headless/public/util/generic_url_request_job.cc

Issue 2822473002: Add GetPostData and ID to headless::Request plus fix GetFrameTreeNodeId (Closed)
Patch Set: Add a test for GetPostData Created 3 years, 8 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "headless/public/util/generic_url_request_job.h" 5 #include "headless/public/util/generic_url_request_job.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 #include <algorithm> 8 #include <algorithm>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "content/public/browser/devtools_agent_host.h" 11 #include "content/public/browser/devtools_agent_host.h"
12 #include "content/public/browser/render_frame_host.h"
12 #include "content/public/browser/resource_request_info.h" 13 #include "content/public/browser/resource_request_info.h"
13 #include "content/public/browser/web_contents.h" 14 #include "content/public/browser/web_contents.h"
14 #include "headless/public/util/url_request_dispatcher.h" 15 #include "headless/public/util/url_request_dispatcher.h"
15 #include "net/base/io_buffer.h" 16 #include "net/base/io_buffer.h"
16 #include "net/base/net_errors.h" 17 #include "net/base/net_errors.h"
17 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" 18 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
18 #include "net/base/upload_bytes_element_reader.h" 19 #include "net/base/upload_bytes_element_reader.h"
19 #include "net/cookies/cookie_store.h" 20 #include "net/cookies/cookie_store.h"
20 #include "net/http/http_response_headers.h" 21 #include "net/http/http_response_headers.h"
21 #include "net/url_request/url_request_context.h" 22 #include "net/url_request/url_request_context.h"
22 23
23 namespace headless { 24 namespace headless {
24 namespace { 25 namespace {
25 26
26 // True if the request method is "safe" (per section 4.2.1 of RFC 7231). 27 // True if the request method is "safe" (per section 4.2.1 of RFC 7231).
27 bool IsMethodSafe(const std::string& method) { 28 bool IsMethodSafe(const std::string& method) {
28 return method == "GET" || method == "HEAD" || method == "OPTIONS" || 29 return method == "GET" || method == "HEAD" || method == "OPTIONS" ||
29 method == "TRACE"; 30 method == "TRACE";
30 } 31 }
31 32
32 // Keep in sync with X_DevTools_Request_Id defined in HTTPNames.json5. 33 // Keep in sync with X_DevTools_Request_Id defined in HTTPNames.json5.
33 const char kDevtoolsRequestId[] = "X-DevTools-Request-Id"; 34 const char kDevtoolsRequestId[] = "X-DevTools-Request-Id";
34 35
35 } // namespace 36 } // namespace
36 37
38 uint64_t GenericURLRequestJob::next_request_id_ = 0;
39
37 GenericURLRequestJob::GenericURLRequestJob( 40 GenericURLRequestJob::GenericURLRequestJob(
38 net::URLRequest* request, 41 net::URLRequest* request,
39 net::NetworkDelegate* network_delegate, 42 net::NetworkDelegate* network_delegate,
40 URLRequestDispatcher* url_request_dispatcher, 43 URLRequestDispatcher* url_request_dispatcher,
41 std::unique_ptr<URLFetcher> url_fetcher, 44 std::unique_ptr<URLFetcher> url_fetcher,
42 Delegate* delegate) 45 Delegate* delegate)
43 : ManagedDispatchURLRequestJob(request, 46 : ManagedDispatchURLRequestJob(request,
44 network_delegate, 47 network_delegate,
45 url_request_dispatcher), 48 url_request_dispatcher),
46 url_fetcher_(std::move(url_fetcher)), 49 url_fetcher_(std::move(url_fetcher)),
47 origin_task_runner_(base::ThreadTaskRunnerHandle::Get()), 50 origin_task_runner_(base::ThreadTaskRunnerHandle::Get()),
48 delegate_(delegate), 51 delegate_(delegate),
49 request_resource_info_( 52 request_resource_info_(
50 content::ResourceRequestInfo::ForRequest(request_)), 53 content::ResourceRequestInfo::ForRequest(request_)),
54 request_id_(next_request_id_++),
51 weak_factory_(this) {} 55 weak_factory_(this) {}
52 56
53 GenericURLRequestJob::~GenericURLRequestJob() { 57 GenericURLRequestJob::~GenericURLRequestJob() {
54 DCHECK(origin_task_runner_->RunsTasksOnCurrentThread()); 58 DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
55 } 59 }
56 60
57 void GenericURLRequestJob::SetExtraRequestHeaders( 61 void GenericURLRequestJob::SetExtraRequestHeaders(
58 const net::HttpRequestHeaders& headers) { 62 const net::HttpRequestHeaders& headers) {
59 DCHECK(origin_task_runner_->RunsTasksOnCurrentThread()); 63 DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
60 extra_request_headers_ = headers; 64 extra_request_headers_ = headers;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 } 107 }
104 108
105 void GenericURLRequestJob::OnCookiesAvailable( 109 void GenericURLRequestJob::OnCookiesAvailable(
106 const GURL& rewritten_url, 110 const GURL& rewritten_url,
107 const std::string& method, 111 const std::string& method,
108 const base::Closure& done_callback, 112 const base::Closure& done_callback,
109 const net::CookieList& cookie_list) { 113 const net::CookieList& cookie_list) {
110 DCHECK(origin_task_runner_->RunsTasksOnCurrentThread()); 114 DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
111 // TODO(alexclarke): Set user agent. 115 // TODO(alexclarke): Set user agent.
112 // Pass cookies, the referrer and any extra headers into the fetch request. 116 // Pass cookies, the referrer and any extra headers into the fetch request.
113 extra_request_headers_.SetHeader( 117 std::string cookie = net::CookieStore::BuildCookieLine(cookie_list);
114 net::HttpRequestHeaders::kCookie, 118 if (!cookie.empty())
115 net::CookieStore::BuildCookieLine(cookie_list)); 119 extra_request_headers_.SetHeader(net::HttpRequestHeaders::kCookie, cookie);
116 120
117 extra_request_headers_.SetHeader(net::HttpRequestHeaders::kReferer, 121 if (!request_->referrer().empty()) {
118 request_->referrer()); 122 extra_request_headers_.SetHeader(net::HttpRequestHeaders::kReferer,
123 request_->referrer());
124 }
119 125
120 done_callback.Run(); 126 done_callback.Run();
121 } 127 }
122 128
123 void GenericURLRequestJob::OnFetchStartError(net::Error error) { 129 void GenericURLRequestJob::OnFetchStartError(net::Error error) {
124 DCHECK(origin_task_runner_->RunsTasksOnCurrentThread()); 130 DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
125 DispatchStartError(error); 131 DispatchStartError(error);
126 delegate_->OnResourceLoadFailed(this, error); 132 delegate_->OnResourceLoadFailed(this, error);
127 } 133 }
128 134
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 return false; 184 return false;
179 return response_headers_->GetCharset(charset); 185 return response_headers_->GetCharset(charset);
180 } 186 }
181 187
182 void GenericURLRequestJob::GetLoadTimingInfo( 188 void GenericURLRequestJob::GetLoadTimingInfo(
183 net::LoadTimingInfo* load_timing_info) const { 189 net::LoadTimingInfo* load_timing_info) const {
184 // TODO(alexclarke): Investigate setting the other members too where possible. 190 // TODO(alexclarke): Investigate setting the other members too where possible.
185 load_timing_info->receive_headers_end = response_time_; 191 load_timing_info->receive_headers_end = response_time_;
186 } 192 }
187 193
194 uint64_t GenericURLRequestJob::GenericURLRequestJob::GetRequestId() const {
195 return request_id_;
196 }
197
188 const net::URLRequest* GenericURLRequestJob::GetURLRequest() const { 198 const net::URLRequest* GenericURLRequestJob::GetURLRequest() const {
189 return request_; 199 return request_;
190 } 200 }
191 201
192 int GenericURLRequestJob::GetFrameTreeNodeId() const { 202 int GenericURLRequestJob::GetFrameTreeNodeId() const {
193 return request_resource_info_->GetFrameTreeNodeId(); 203 // URLRequestUserData will be set for all renderer initiated resource
204 // requests, but not for browser side navigations.
205 int render_process_id;
206 int render_frame_id;
207 if (content::ResourceRequestInfo::GetRenderFrameForRequest(
208 request_, &render_process_id, &render_frame_id)) {
209 content::RenderFrameHost* render_frame_host =
210 content::RenderFrameHost::FromID(render_process_id, render_frame_id);
211 DCHECK(render_frame_host);
212 return render_frame_host->GetFrameTreeNodeId();
213 }
214 // ResourceRequestInfo::GetFrameTreeNodeId is only set for browser side
215 // navigations.
216 if (request_resource_info_)
217 return request_resource_info_->GetFrameTreeNodeId();
218
219 // This should only happen in tests.
220 return -1;
194 } 221 }
195 222
196 std::string GenericURLRequestJob::GetDevToolsAgentHostId() const { 223 std::string GenericURLRequestJob::GetDevToolsAgentHostId() const {
197 return content::DevToolsAgentHost::GetOrCreateFor( 224 return content::DevToolsAgentHost::GetOrCreateFor(
198 request_resource_info_->GetWebContentsGetterForRequest().Run()) 225 request_resource_info_->GetWebContentsGetterForRequest().Run())
199 ->GetId(); 226 ->GetId();
200 } 227 }
201 228
202 Request::ResourceType GenericURLRequestJob::GetResourceType() const { 229 Request::ResourceType GenericURLRequestJob::GetResourceType() const {
230 // This should only happen in some tests.
231 if (!request_resource_info_)
232 return Request::ResourceType::MAIN_FRAME;
233
203 switch (request_resource_info_->GetResourceType()) { 234 switch (request_resource_info_->GetResourceType()) {
204 case content::RESOURCE_TYPE_MAIN_FRAME: 235 case content::RESOURCE_TYPE_MAIN_FRAME:
205 return Request::ResourceType::MAIN_FRAME; 236 return Request::ResourceType::MAIN_FRAME;
206 case content::RESOURCE_TYPE_SUB_FRAME: 237 case content::RESOURCE_TYPE_SUB_FRAME:
207 return Request::ResourceType::SUB_FRAME; 238 return Request::ResourceType::SUB_FRAME;
208 case content::RESOURCE_TYPE_STYLESHEET: 239 case content::RESOURCE_TYPE_STYLESHEET:
209 return Request::ResourceType::STYLESHEET; 240 return Request::ResourceType::STYLESHEET;
210 case content::RESOURCE_TYPE_SCRIPT: 241 case content::RESOURCE_TYPE_SCRIPT:
211 return Request::ResourceType::SCRIPT; 242 return Request::ResourceType::SCRIPT;
212 case content::RESOURCE_TYPE_IMAGE: 243 case content::RESOURCE_TYPE_IMAGE:
(...skipping 23 matching lines...) Expand all
236 case content::RESOURCE_TYPE_CSP_REPORT: 267 case content::RESOURCE_TYPE_CSP_REPORT:
237 return Request::ResourceType::CSP_REPORT; 268 return Request::ResourceType::CSP_REPORT;
238 case content::RESOURCE_TYPE_PLUGIN_RESOURCE: 269 case content::RESOURCE_TYPE_PLUGIN_RESOURCE:
239 return Request::ResourceType::PLUGIN_RESOURCE; 270 return Request::ResourceType::PLUGIN_RESOURCE;
240 default: 271 default:
241 NOTREACHED() << "Unrecognized resource type"; 272 NOTREACHED() << "Unrecognized resource type";
242 return Request::ResourceType::MAIN_FRAME; 273 return Request::ResourceType::MAIN_FRAME;
243 } 274 }
244 } 275 }
245 276
246 namespace { 277 std::string GenericURLRequestJob::GetPostData() const {
247 std::string GetUploadData(net::URLRequest* request) { 278 if (!request_->has_upload())
248 if (!request->has_upload())
249 return ""; 279 return "";
250 280
251 const net::UploadDataStream* stream = request->get_upload(); 281 const net::UploadDataStream* stream = request_->get_upload();
252 if (!stream->GetElementReaders()) 282 if (!stream->GetElementReaders())
253 return ""; 283 return "";
254 284
255 DCHECK_EQ(1u, stream->GetElementReaders()->size()); 285 DCHECK_EQ(1u, stream->GetElementReaders()->size());
256 const net::UploadBytesElementReader* reader = 286 const net::UploadBytesElementReader* reader =
257 (*stream->GetElementReaders())[0]->AsBytesReader(); 287 (*stream->GetElementReaders())[0]->AsBytesReader();
258 return std::string(reader->bytes(), reader->length()); 288 return std::string(reader->bytes(), reader->length());
259 } 289 }
260 } // namespace
261 290
262 const Request* GenericURLRequestJob::GetRequest() const { 291 const Request* GenericURLRequestJob::GetRequest() const {
263 return this; 292 return this;
264 } 293 }
265 294
266 void GenericURLRequestJob::AllowRequest() { 295 void GenericURLRequestJob::AllowRequest() {
267 if (!origin_task_runner_->RunsTasksOnCurrentThread()) { 296 if (!origin_task_runner_->RunsTasksOnCurrentThread()) {
268 origin_task_runner_->PostTask( 297 origin_task_runner_->PostTask(
269 FROM_HERE, base::Bind(&GenericURLRequestJob::AllowRequest, 298 FROM_HERE, base::Bind(&GenericURLRequestJob::AllowRequest,
270 weak_factory_.GetWeakPtr())); 299 weak_factory_.GetWeakPtr()));
271 return; 300 return;
272 } 301 }
273 302
274 url_fetcher_->StartFetch(request_->url(), request_->method(), 303 url_fetcher_->StartFetch(request_->url(), request_->method(), GetPostData(),
275 GetUploadData(request_), extra_request_headers_, 304 extra_request_headers_, this);
276 this);
277 } 305 }
278 306
279 void GenericURLRequestJob::BlockRequest(net::Error error) { 307 void GenericURLRequestJob::BlockRequest(net::Error error) {
280 if (!origin_task_runner_->RunsTasksOnCurrentThread()) { 308 if (!origin_task_runner_->RunsTasksOnCurrentThread()) {
281 origin_task_runner_->PostTask( 309 origin_task_runner_->PostTask(
282 FROM_HERE, base::Bind(&GenericURLRequestJob::BlockRequest, 310 FROM_HERE, base::Bind(&GenericURLRequestJob::BlockRequest,
283 weak_factory_.GetWeakPtr(), error)); 311 weak_factory_.GetWeakPtr(), error));
284 return; 312 return;
285 } 313 }
286 314
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 348
321 mock_response_ = std::move(mock_response); 349 mock_response_ = std::move(mock_response);
322 350
323 OnFetchCompleteExtractHeaders(request_->url(), 351 OnFetchCompleteExtractHeaders(request_->url(),
324 mock_response_->http_response_code, 352 mock_response_->http_response_code,
325 mock_response_->response_data.data(), 353 mock_response_->response_data.data(),
326 mock_response_->response_data.size()); 354 mock_response_->response_data.size());
327 } 355 }
328 356
329 } // namespace headless 357 } // namespace headless
OLDNEW
« no previous file with comments | « headless/public/util/generic_url_request_job.h ('k') | headless/public/util/generic_url_request_job_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698