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

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: Dont assume there's only one element reader 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 UploadDataStream;
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 // Must be called on IO thread.
66 void StopIntercepting();
67
68 // Must be called only once per interception. Returns true on success or false
69 // otherwise. Must be called on IO thread.
70 bool ContinueInterceptedRequest(
71 std::unique_ptr<DevToolsURLRequestInterceptor::Modifications>
72 modifications);
73
74 WebContents* web_contents() const { return web_contents_; }
75
76 private:
77 class SubRequest;
78
79 // We keep a copy of the original request details to facilitate the
80 // Network.modifyRequest command which could potentially change any of these
81 // fields.
82 struct RequestDetails {
83 RequestDetails(const GURL& url,
84 const std::string& method,
85 std::unique_ptr<net::UploadDataStream> post_data,
86 const net::HttpRequestHeaders& extra_request_headers,
87 const net::RequestPriority& priority,
88 const net::URLRequestContext* url_request_context);
89 ~RequestDetails();
90
91 GURL url;
92 std::string method;
93 std::unique_ptr<net::UploadDataStream> post_data;
94 net::HttpRequestHeaders extra_request_headers;
95 net::RequestPriority priority;
96 const net::URLRequestContext* url_request_context;
97 };
98
99 // If the request was either allowed or modified, a SubRequest will be used to
100 // perform the fetch and the results proxied to the original request. This
101 // gives us the flexibility to pretend redirects didn't happen if the user
102 // chooses to mock the response. Note this SubRequest is ignored by the
103 // interceptor.
104 class SubRequest {
105 public:
106 SubRequest(
107 DevToolsURLInterceptorRequestJob::RequestDetails& request_details,
108 DevToolsURLInterceptorRequestJob* devtools_interceptor_request_job,
109 scoped_refptr<DevToolsURLRequestInterceptor::State>
110 devtools_url_request_interceptor_state);
111 ~SubRequest();
112
113 void Cancel();
114
115 net::URLRequest* request() const { return request_.get(); }
116
117 private:
118 std::unique_ptr<net::URLRequest> request_;
119
120 DevToolsURLInterceptorRequestJob*
121 devtools_interceptor_request_job_; // NOT OWNED.
122
123 scoped_refptr<DevToolsURLRequestInterceptor::State>
124 devtools_url_request_interceptor_state_;
125 bool fetch_in_progress_;
126 };
127
128 class MockResponseDetails {
129 public:
130 MockResponseDetails(std::string response_bytes,
131 base::TimeTicks response_time);
132
133 MockResponseDetails(
134 const scoped_refptr<net::HttpResponseHeaders>& response_headers,
135 std::string response_bytes,
136 size_t read_offset,
137 base::TimeTicks response_time);
138
139 ~MockResponseDetails();
140
141 scoped_refptr<net::HttpResponseHeaders>& response_headers() {
142 return response_headers_;
143 }
144
145 base::TimeTicks response_time() const { return response_time_; }
146
147 int ReadRawData(net::IOBuffer* buf, int buf_size);
148
149 private:
150 scoped_refptr<net::HttpResponseHeaders> response_headers_;
151 std::string response_bytes_;
152 size_t read_offset_;
153 base::TimeTicks response_time_;
154 };
155
156 // Retrieves the response headers from either the |sub_request_| or the
157 // |mock_response_|. In some cases (e.g. file access) this may be null.
158 const net::HttpResponseHeaders* GetHttpResponseHeaders() const;
159
160 scoped_refptr<DevToolsURLRequestInterceptor::State>
161 devtools_url_request_interceptor_state_;
162 RequestDetails request_details_;
163 std::unique_ptr<SubRequest> sub_request_;
164 std::unique_ptr<MockResponseDetails> mock_response_details_;
165 std::unique_ptr<net::RedirectInfo> redirect_;
166 bool waiting_for_user_response_;
167 bool intercepting_requests_;
168
169 const std::string interception_id_;
170 WebContents* const web_contents_;
171 const base::WeakPtr<protocol::NetworkHandler> network_handler_;
172 const bool is_redirect_;
173 base::WeakPtrFactory<DevToolsURLInterceptorRequestJob> weak_ptr_factory_;
174
175 DISALLOW_COPY_AND_ASSIGN(DevToolsURLInterceptorRequestJob);
176 };
177
178 } // namespace content
179
180 #endif // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_URL_INTERCEPTOR_REQUEST_JOB_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698