From d15f52c9d708f3a0f127a8bc770cfc22f12f63df Mon Sep 17 00:00:00 2001 From: Yash Vempati Date: Wed, 21 Feb 2018 01:05:07 +0000 Subject: [PATCH] Plumb raw headers when intercepting a request This CL ensures that |RequestHeadersCallback| and |ResponseHeadersCallback| are proxied from the |URLRequest| to the |DevToolsURLInterceptorJob::SubRequest| when intercepting a request. This allows the SubRequest to receive SPDY/QUIC internal headers, as well as plain HTTP raw headers. BUG=806281 R=caseq@chromium.org Change-Id: Id152c63426468ab7637d2885dad7b91f124b54aa Reviewed-on: https://chromium-review.googlesource.com/916901 Commit-Queue: Andrey Kosyakov Reviewed-by: Andrey Kosyakov Cr-Commit-Position: refs/heads/master@{#537971} --- AUTHORS | 1 + .../devtools_url_interceptor_request_job.cc | 14 ++++++++++ .../devtools_url_interceptor_request_job.h | 7 +++++ .../redirect-interception-mocked-expected.txt | 2 +- ...uest-interception-raw-headers-expected.txt | 13 +++++++++ .../request-interception-raw-headers.js | 28 +++++++++++++++++++ 6 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-raw-headers-expected.txt create mode 100644 third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-raw-headers.js diff --git a/AUTHORS b/AUTHORS index 032503b576e7cf..dc0fe5ea074873 100644 --- a/AUTHORS +++ b/AUTHORS @@ -876,6 +876,7 @@ Yan Wang Yang Gu Yannic Bonenberger Yarin Kaul +Yash Vempati Ye Liu Yeol Park Yi Shen diff --git a/content/browser/devtools/devtools_url_interceptor_request_job.cc b/content/browser/devtools/devtools_url_interceptor_request_job.cc index 8babf023b82fd1..91a151c75ea33f 100644 --- a/content/browser/devtools/devtools_url_interceptor_request_job.cc +++ b/content/browser/devtools/devtools_url_interceptor_request_job.cc @@ -115,6 +115,10 @@ DevToolsURLInterceptorRequestJob::SubRequest::SubRequest( request_->SetExtraRequestHeaders(request_details.extra_request_headers); request_->SetReferrer(request_details.referrer); request_->set_referrer_policy(request_details.referrer_policy); + request_->SetRequestHeadersCallback( + devtools_interceptor_request_job->request_headers_callback_); + request_->SetResponseHeadersCallback( + devtools_interceptor_request_job->response_headers_callback_); // Mimic the ResourceRequestInfoImpl of the original request. const ResourceRequestInfoImpl* resource_request_info = @@ -1154,6 +1158,16 @@ bool DevToolsURLInterceptorRequestJob::ProcessAuthRespose( return false; } +void DevToolsURLInterceptorRequestJob::SetRequestHeadersCallback( + net::RequestHeadersCallback callback) { + request_headers_callback_ = callback; +} + +void DevToolsURLInterceptorRequestJob::SetResponseHeadersCallback( + net::ResponseHeadersCallback callback) { + response_headers_callback_ = callback; +} + DevToolsURLInterceptorRequestJob::RequestDetails::RequestDetails( const GURL& url, const std::string& method, diff --git a/content/browser/devtools/devtools_url_interceptor_request_job.h b/content/browser/devtools/devtools_url_interceptor_request_job.h index 6ca5023681308c..961cf901c6baf9 100644 --- a/content/browser/devtools/devtools_url_interceptor_request_job.h +++ b/content/browser/devtools/devtools_url_interceptor_request_job.h @@ -12,6 +12,8 @@ #include "content/browser/devtools/protocol/network.h" #include "content/public/browser/browser_thread.h" #include "content/public/common/resource_type.h" +#include "net/http/http_raw_request_headers.h" +#include "net/http/http_response_headers.h" #include "net/url_request/url_request.h" #include "net/url_request/url_request_job.h" @@ -56,6 +58,9 @@ class DevToolsURLInterceptorRequestJob : public net::URLRequestJob { void SetAuth(const net::AuthCredentials& credentials) override; void CancelAuth() override; + void SetRequestHeadersCallback(net::RequestHeadersCallback callback) override; + void SetResponseHeadersCallback( + net::ResponseHeadersCallback callback) override; // Must be called on IO thread. void StopIntercepting(); @@ -154,6 +159,8 @@ class DevToolsURLInterceptorRequestJob : public net::URLRequestJob { std::vector> pending_body_requests_; + net::RequestHeadersCallback request_headers_callback_; + net::ResponseHeadersCallback response_headers_callback_; base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(DevToolsURLInterceptorRequestJob); diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/redirect-interception-mocked-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/redirect-interception-mocked-expected.txt index 53215baa41cc74..341cdaf763209a 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/redirect-interception-mocked-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/redirect-interception-mocked-expected.txt @@ -15,7 +15,7 @@ Network.requestIntercepted ID 2 302 redirect redirect2.pl -> redirect3.pl allowRequest ID 2 Network.requestIntercepted ID 2 301 redirect redirect3.pl -> final.js mockResponse ID 2 -Network.responseReceived redirect3.pl 200 application/javascript +Network.responseReceived redirect3.pl 301 application/javascript Page.frameStoppedLoading Hello from the mock resource diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-raw-headers-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-raw-headers-expected.txt new file mode 100644 index 00000000000000..cb338451ac9a0b --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-raw-headers-expected.txt @@ -0,0 +1,13 @@ +Tests that raw response headers are correctly reported in case of interception. +Test started +Network agent enabled +Request interception enabled +Page agent enabled +Runtime agent enabled +Response.requestHeadersText present: true +Connection raw header present: true +Network.requestIntercepted ID 1 GET simple-iframe.html type: Document +allowRequest ID 1 +Network.responseReceived simple-iframe.html 200 text/html +Page.frameStoppedLoading + diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-raw-headers.js b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-raw-headers.js new file mode 100644 index 00000000000000..f5ab4e40c33a5f --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/request-interception-raw-headers.js @@ -0,0 +1,28 @@ +(async function(testRunner) { + var {page, session, dp} = await testRunner.startBlank( + `Tests that raw response headers are correctly reported in case of interception.`); + + var InterceptionHelper = await testRunner.loadScript('../resources/interception-test.js'); + var helper = new InterceptionHelper(testRunner, session); + + var requestInterceptedDict = { + 'simple-iframe.html': event => helper.allowRequest(event), + }; + + await helper.startInterceptionTest(requestInterceptedDict); + session.evaluate(` + var iframe = document.createElement('iframe'); + iframe.src = '${testRunner.url('./resources/simple-iframe.html')}'; + document.body.appendChild(iframe); + `); + + await dp.Network.onResponseReceived(event => { + const response = event.params.response; + const haveRequestHeadersText = response.requestHeadersText; + const splitRawHeaders = response.requestHeadersText.split('\r\n'); + const connectionHeaderPresent = splitRawHeaders.filter(header => header.includes('Connection')); + + testRunner.log(`Response.requestHeadersText present: ${!!haveRequestHeadersText}`); + testRunner.log(`Connection raw header present: ${!!connectionHeaderPresent.length}`); + }); +}) \ No newline at end of file