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

Side by Side Diff: content/browser/devtools/devtools_url_interceptor_request_job.h

Issue 2739323003: DevTools protocol interception, blocking & modification of requests (Closed)
Patch Set: Hopefully sorted out the threading Created 3 years, 6 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
(Empty)
1 // Copyright 2017 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 #ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_URL_INTERCEPTOR_REQUEST_JOB_H_
6 #define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_URL_INTERCEPTOR_REQUEST_JOB_H_
7
8 #include "base/macros.h"
9 #include "base/memory/weak_ptr.h"
10 #include "content/browser/devtools/devtools_url_request_interceptor.h"
11 #include "content/browser/devtools/protocol/network.h"
12 #include "content/public/browser/browser_thread.h"
13 #include "net/url_request/url_request.h"
14 #include "net/url_request/url_request_job.h"
15
16 namespace net {
17 class UploadElementReader;
18 }
19
20 namespace content {
21
22 // A URLRequestJob that allows programmatic request blocking / modification or
23 // response mocking. This class should only be accessed on the IO thread.
24 class DevToolsURLInterceptorRequestJob : public net::URLRequestJob,
25 public net::URLRequest::Delegate {
26 public:
27 DevToolsURLInterceptorRequestJob(
28 scoped_refptr<DevToolsURLRequestInterceptor::State>
29 devtools_url_request_interceptor_state,
30 const std::string& interception_id,
31 net::URLRequest* original_request,
32 net::NetworkDelegate* original_network_delegate,
33 WebContents* web_contents,
34 base::WeakPtr<protocol::NetworkHandler> network_handler,
35 bool is_redirect);
36
37 ~DevToolsURLInterceptorRequestJob() override;
38
39 // net::URLRequestJob implementation:
40 void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override;
41 void Start() override;
42 void Kill() override;
43 int ReadRawData(net::IOBuffer* buf, int buf_size) override;
44 int GetResponseCode() const override;
45 void GetResponseInfo(net::HttpResponseInfo* info) override;
46 bool GetMimeType(std::string* mime_type) const override;
47 bool GetCharset(std::string* charset) override;
48 void GetLoadTimingInfo(net::LoadTimingInfo* load_timing_info) const override;
49
50 // net::URLRequest::Delegate methods:
51 void OnAuthRequired(net::URLRequest* request,
52 net::AuthChallengeInfo* auth_info) override;
53 void OnCertificateRequested(
54 net::URLRequest* request,
55 net::SSLCertRequestInfo* cert_request_info) override;
56 void OnSSLCertificateError(net::URLRequest* request,
57 const net::SSLInfo& ssl_info,
58 bool fatal) override;
59 void OnResponseStarted(net::URLRequest* request, int net_error) override;
60 void OnReadCompleted(net::URLRequest* request, int bytes_read) override;
61 void OnReceivedRedirect(net::URLRequest* request,
62 const net::RedirectInfo& redirect_info,
63 bool* defer_redirect) override;
64
65 void StopIntercepting();
66 DevToolsURLRequestInterceptor::CommandStatus ContinueInterceptedRequest(
67 std::unique_ptr<DevToolsURLRequestInterceptor::Modifications>
68 modifications);
69
70 WebContents* web_contents() const { return web_contents_; }
71
72 private:
73 class SubRequest;
74
75 // We keep a copy of the original request details to facilitate the
76 // Network.modifyRequest command which could potentially change any of these
77 // fields.
78 struct RequestDetails {
79 RequestDetails(const GURL& url,
80 const std::string& method,
81 std::unique_ptr<net::UploadElementReader> post_data,
82 const net::HttpRequestHeaders& extra_request_headers,
83 const net::RequestPriority& priority,
84 const net::URLRequestContext* url_request_context);
85 ~RequestDetails();
86
87 GURL url;
88 std::string method;
89 std::unique_ptr<net::UploadElementReader> post_data;
90 net::HttpRequestHeaders extra_request_headers;
91 net::RequestPriority priority;
92 const net::URLRequestContext* url_request_context;
93 };
94
95 // If the request was either allowed or modified, a SubRequest will be used to
96 // perform the fetch and the results proxied to the original request. This
97 // gives us the flexibility to pretend redirects didn't happen if the user
98 // chooses to mock the response. Note this SubRequest is ignored by the
99 // interceptor.
100 class SubRequest {
101 public:
102 SubRequest(
103 DevToolsURLInterceptorRequestJob::RequestDetails& request_details,
104 DevToolsURLInterceptorRequestJob* devtools_interceptor_request_job,
105 scoped_refptr<DevToolsURLRequestInterceptor::State>
106 devtools_url_request_interceptor_state);
107 ~SubRequest();
108
109 void Cancel();
110
111 net::URLRequest* request() const { return request_.get(); }
112
113 private:
114 std::unique_ptr<net::URLRequest> request_;
115
116 DevToolsURLInterceptorRequestJob*
117 devtools_interceptor_request_job_; // NOT OWNED.
118
119 scoped_refptr<DevToolsURLRequestInterceptor::State>
120 devtools_url_request_interceptor_state_;
121 bool fetch_in_progress_;
122 };
123
124 class MockResponseDetails {
125 public:
126 MockResponseDetails(std::string response_bytes,
127 base::TimeTicks response_time);
128
129 MockResponseDetails(
130 const scoped_refptr<net::HttpResponseHeaders>& response_headers,
131 std::string response_bytes,
132 size_t read_offset,
133 base::TimeTicks response_time);
134
135 ~MockResponseDetails();
136
137 scoped_refptr<net::HttpResponseHeaders>& response_headers() {
138 return response_headers_;
139 }
140
141 base::TimeTicks response_time() const { return response_time_; }
142
143 int ReadRawData(net::IOBuffer* buf, int buf_size);
144
145 private:
146 scoped_refptr<net::HttpResponseHeaders> response_headers_;
147 std::string response_bytes_;
148 size_t read_offset_;
149 base::TimeTicks response_time_;
150 };
151
152 // Retrieves the response headers from either the |sub_request_| or the
153 // |mock_response_|. In some cases (e.g. file access) this may be null.
154 const net::HttpResponseHeaders* GetHttpResponseHeaders() const;
155
156 scoped_refptr<DevToolsURLRequestInterceptor::State>
157 devtools_url_request_interceptor_state_;
158 RequestDetails request_details_;
159 std::unique_ptr<SubRequest> sub_request_;
160 std::unique_ptr<MockResponseDetails> mock_response_details_;
161 std::unique_ptr<net::RedirectInfo> redirect_;
162 bool waiting_for_user_response_;
163 bool intercepting_requests_;
164
165 const std::string interception_id_;
166 WebContents* const web_contents_;
167 const base::WeakPtr<protocol::NetworkHandler> network_handler_;
168 const bool is_redirect_;
169 base::WeakPtrFactory<DevToolsURLInterceptorRequestJob> weak_ptr_factory_;
170
171 DISALLOW_COPY_AND_ASSIGN(DevToolsURLInterceptorRequestJob);
172 };
173
174 } // namespace content
175
176 #endif // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_URL_INTERCEPTOR_REQUEST_JOB_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698