OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 "net/url_request/url_request_test_job.h" | 5 #include "net/url_request/url_request_test_job.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <list> | 8 #include <list> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 26 matching lines...) Expand all Loading... | |
37 return new URLRequestTestJob(request, network_delegate); | 37 return new URLRequestTestJob(request, network_delegate); |
38 } | 38 } |
39 }; | 39 }; |
40 | 40 |
41 } // namespace | 41 } // namespace |
42 | 42 |
43 // static getters for known URLs | 43 // static getters for known URLs |
44 GURL URLRequestTestJob::test_url_1() { | 44 GURL URLRequestTestJob::test_url_1() { |
45 return GURL("test:url1"); | 45 return GURL("test:url1"); |
46 } | 46 } |
47 | |
47 GURL URLRequestTestJob::test_url_2() { | 48 GURL URLRequestTestJob::test_url_2() { |
48 return GURL("test:url2"); | 49 return GURL("test:url2"); |
49 } | 50 } |
51 | |
50 GURL URLRequestTestJob::test_url_3() { | 52 GURL URLRequestTestJob::test_url_3() { |
51 return GURL("test:url3"); | 53 return GURL("test:url3"); |
52 } | 54 } |
55 | |
53 GURL URLRequestTestJob::test_url_4() { | 56 GURL URLRequestTestJob::test_url_4() { |
54 return GURL("test:url4"); | 57 return GURL("test:url4"); |
55 } | 58 } |
59 | |
60 GURL URLRequestTestJob::test_url_auto_advance_async_reads_1() { | |
61 return GURL("test:url_auto_advance_async_reads_1"); | |
62 } | |
63 | |
56 GURL URLRequestTestJob::test_url_error() { | 64 GURL URLRequestTestJob::test_url_error() { |
57 return GURL("test:error"); | 65 return GURL("test:error"); |
58 } | 66 } |
67 | |
59 GURL URLRequestTestJob::test_url_redirect_to_url_1() { | 68 GURL URLRequestTestJob::test_url_redirect_to_url_1() { |
60 return GURL("test:redirect_to_1"); | 69 return GURL("test:redirect_to_1"); |
61 } | 70 } |
71 | |
62 GURL URLRequestTestJob::test_url_redirect_to_url_2() { | 72 GURL URLRequestTestJob::test_url_redirect_to_url_2() { |
63 return GURL("test:redirect_to_2"); | 73 return GURL("test:redirect_to_2"); |
64 } | 74 } |
65 | 75 |
66 // static getters for known URL responses | 76 // static getters for known URL responses |
67 std::string URLRequestTestJob::test_data_1() { | 77 std::string URLRequestTestJob::test_data_1() { |
68 return std::string("<html><title>Test One</title></html>"); | 78 return std::string("<html><title>Test One</title></html>"); |
69 } | 79 } |
70 std::string URLRequestTestJob::test_data_2() { | 80 std::string URLRequestTestJob::test_data_2() { |
71 return std::string("<html><title>Test Two Two</title></html>"); | 81 return std::string("<html><title>Test Two Two</title></html>"); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
126 } | 136 } |
127 | 137 |
128 // static | 138 // static |
129 std::unique_ptr<URLRequestJobFactory::ProtocolHandler> | 139 std::unique_ptr<URLRequestJobFactory::ProtocolHandler> |
130 URLRequestTestJob::CreateProtocolHandler() { | 140 URLRequestTestJob::CreateProtocolHandler() { |
131 return base::MakeUnique<TestJobProtocolHandler>(); | 141 return base::MakeUnique<TestJobProtocolHandler>(); |
132 } | 142 } |
133 | 143 |
134 URLRequestTestJob::URLRequestTestJob(URLRequest* request, | 144 URLRequestTestJob::URLRequestTestJob(URLRequest* request, |
135 NetworkDelegate* network_delegate) | 145 NetworkDelegate* network_delegate) |
136 : URLRequestJob(request, network_delegate), | 146 : URLRequestTestJob(request, network_delegate, false) {} |
137 auto_advance_(false), | |
138 stage_(WAITING), | |
139 priority_(DEFAULT_PRIORITY), | |
140 offset_(0), | |
141 async_buf_(NULL), | |
142 async_buf_size_(0), | |
143 response_headers_length_(0), | |
144 weak_factory_(this) {} | |
145 | 147 |
146 URLRequestTestJob::URLRequestTestJob(URLRequest* request, | 148 URLRequestTestJob::URLRequestTestJob(URLRequest* request, |
147 NetworkDelegate* network_delegate, | 149 NetworkDelegate* network_delegate, |
148 bool auto_advance) | 150 bool auto_advance) |
149 : URLRequestJob(request, network_delegate), | 151 : URLRequestJob(request, network_delegate), |
150 auto_advance_(auto_advance), | 152 auto_advance_(auto_advance), |
151 stage_(WAITING), | 153 stage_(WAITING), |
152 priority_(DEFAULT_PRIORITY), | 154 priority_(DEFAULT_PRIORITY), |
153 offset_(0), | 155 offset_(0), |
154 async_buf_(NULL), | 156 async_buf_(NULL), |
155 async_buf_size_(0), | 157 async_buf_size_(0), |
156 response_headers_length_(0), | 158 response_headers_length_(0), |
159 async_reads_(false), | |
157 weak_factory_(this) {} | 160 weak_factory_(this) {} |
158 | 161 |
159 URLRequestTestJob::URLRequestTestJob(URLRequest* request, | 162 URLRequestTestJob::URLRequestTestJob(URLRequest* request, |
160 NetworkDelegate* network_delegate, | 163 NetworkDelegate* network_delegate, |
161 const std::string& response_headers, | 164 const std::string& response_headers, |
162 const std::string& response_data, | 165 const std::string& response_data, |
163 bool auto_advance) | 166 bool auto_advance) |
164 : URLRequestJob(request, network_delegate), | 167 : URLRequestJob(request, network_delegate), |
165 auto_advance_(auto_advance), | 168 auto_advance_(auto_advance), |
166 stage_(WAITING), | 169 stage_(WAITING), |
167 priority_(DEFAULT_PRIORITY), | 170 priority_(DEFAULT_PRIORITY), |
168 response_data_(response_data), | 171 response_data_(response_data), |
169 offset_(0), | 172 offset_(0), |
170 async_buf_(NULL), | 173 async_buf_(nullptr), |
171 async_buf_size_(0), | 174 async_buf_size_(0), |
172 response_headers_(new net::HttpResponseHeaders( | 175 response_headers_(new net::HttpResponseHeaders( |
173 net::HttpUtil::AssembleRawHeaders(response_headers.c_str(), | 176 net::HttpUtil::AssembleRawHeaders(response_headers.c_str(), |
174 response_headers.size()))), | 177 response_headers.size()))), |
175 response_headers_length_(response_headers.size()), | 178 response_headers_length_(response_headers.size()), |
179 async_reads_(false), | |
176 weak_factory_(this) {} | 180 weak_factory_(this) {} |
177 | 181 |
178 URLRequestTestJob::~URLRequestTestJob() { | 182 URLRequestTestJob::~URLRequestTestJob() { |
179 g_pending_jobs.Get().erase( | 183 g_pending_jobs.Get().erase( |
180 std::remove( | 184 std::remove( |
181 g_pending_jobs.Get().begin(), g_pending_jobs.Get().end(), this), | 185 g_pending_jobs.Get().begin(), g_pending_jobs.Get().end(), this), |
182 g_pending_jobs.Get().end()); | 186 g_pending_jobs.Get().end()); |
183 } | 187 } |
184 | 188 |
185 bool URLRequestTestJob::GetMimeType(std::string* mime_type) const { | 189 bool URLRequestTestJob::GetMimeType(std::string* mime_type) const { |
(...skipping 11 matching lines...) Expand all Loading... | |
197 // Start reading asynchronously so that all error reporting and data | 201 // Start reading asynchronously so that all error reporting and data |
198 // callbacks happen as they would for network requests. | 202 // callbacks happen as they would for network requests. |
199 base::ThreadTaskRunnerHandle::Get()->PostTask( | 203 base::ThreadTaskRunnerHandle::Get()->PostTask( |
200 FROM_HERE, | 204 FROM_HERE, |
201 base::Bind(&URLRequestTestJob::StartAsync, weak_factory_.GetWeakPtr())); | 205 base::Bind(&URLRequestTestJob::StartAsync, weak_factory_.GetWeakPtr())); |
202 } | 206 } |
203 | 207 |
204 void URLRequestTestJob::StartAsync() { | 208 void URLRequestTestJob::StartAsync() { |
205 if (!response_headers_.get()) { | 209 if (!response_headers_.get()) { |
206 SetResponseHeaders(test_headers()); | 210 SetResponseHeaders(test_headers()); |
207 if (request_->url().spec() == test_url_1().spec()) { | 211 if (request_->url() == test_url_1()) { |
208 response_data_ = test_data_1(); | 212 response_data_ = test_data_1(); |
209 stage_ = DATA_AVAILABLE; // Simulate a synchronous response for this one. | 213 stage_ = DATA_AVAILABLE; // Simulate a synchronous response for this one. |
210 } else if (request_->url().spec() == test_url_2().spec()) { | 214 } else if (request_->url() == test_url_2()) { |
211 response_data_ = test_data_2(); | 215 response_data_ = test_data_2(); |
212 } else if (request_->url().spec() == test_url_3().spec()) { | 216 } else if (request_->url() == test_url_3()) { |
213 response_data_ = test_data_3(); | 217 response_data_ = test_data_3(); |
214 } else if (request_->url().spec() == test_url_4().spec()) { | 218 } else if (request_->url() == test_url_4()) { |
215 response_data_ = test_data_4(); | 219 response_data_ = test_data_4(); |
216 } else if (request_->url().spec() == test_url_redirect_to_url_1().spec()) { | 220 } else if (request_->url() == test_url_auto_advance_async_reads_1()) { |
221 response_data_ = test_data_1(); | |
222 stage_ = DATA_AVAILABLE; // Data is available immediately. | |
223 async_reads_ = true; // All reads complete asynchronously. | |
224 } else if (request_->url() == test_url_redirect_to_url_1()) { | |
217 SetResponseHeaders(test_redirect_to_url_1_headers()); | 225 SetResponseHeaders(test_redirect_to_url_1_headers()); |
218 } else if (request_->url().spec() == test_url_redirect_to_url_2().spec()) { | 226 } else if (request_->url() == test_url_redirect_to_url_2()) { |
219 SetResponseHeaders(test_redirect_to_url_2_headers()); | 227 SetResponseHeaders(test_redirect_to_url_2_headers()); |
220 } else { | 228 } else { |
221 AdvanceJob(); | 229 AdvanceJob(); |
222 | 230 |
223 // unexpected url, return error | 231 // unexpected url, return error |
224 // FIXME(brettw) we may want to use WININET errors or have some more types | 232 // FIXME(brettw) we may want to use WININET errors or have some more types |
225 // of errors | 233 // of errors |
226 NotifyStartError( | 234 NotifyStartError( |
227 URLRequestStatus(URLRequestStatus::FAILED, ERR_INVALID_URL)); | 235 URLRequestStatus(URLRequestStatus::FAILED, ERR_INVALID_URL)); |
228 // FIXME(brettw): this should emulate a network error, and not just fail | 236 // FIXME(brettw): this should emulate a network error, and not just fail |
(...skipping 14 matching lines...) Expand all Loading... | |
243 response_headers_length_ = response_headers.size(); | 251 response_headers_length_ = response_headers.size(); |
244 } | 252 } |
245 | 253 |
246 int URLRequestTestJob::ReadRawData(IOBuffer* buf, int buf_size) { | 254 int URLRequestTestJob::ReadRawData(IOBuffer* buf, int buf_size) { |
247 if (stage_ == WAITING) { | 255 if (stage_ == WAITING) { |
248 async_buf_ = buf; | 256 async_buf_ = buf; |
249 async_buf_size_ = buf_size; | 257 async_buf_size_ = buf_size; |
250 return ERR_IO_PENDING; | 258 return ERR_IO_PENDING; |
251 } | 259 } |
252 | 260 |
253 if (offset_ >= static_cast<int>(response_data_.length())) | 261 int bytes_read = 0; |
254 return 0; // done reading | 262 if (offset_ < static_cast<int>(response_data_.length())) { |
263 bytes_read = buf_size; | |
264 if (bytes_read + offset_ > static_cast<int>(response_data_.length())) | |
265 bytes_read = static_cast<int>(response_data_.length()) - offset_; | |
255 | 266 |
256 int to_read = buf_size; | 267 memcpy(buf->data(), &response_data_.c_str()[offset_], bytes_read); |
257 if (to_read + offset_ > static_cast<int>(response_data_.length())) | 268 offset_ += bytes_read; |
258 to_read = static_cast<int>(response_data_.length()) - offset_; | 269 } |
259 | 270 |
260 memcpy(buf->data(), &response_data_.c_str()[offset_], to_read); | 271 if (async_reads_) { |
261 offset_ += to_read; | 272 base::ThreadTaskRunnerHandle::Get()->PostTask( |
262 | 273 FROM_HERE, base::Bind(&URLRequestTestJob::ReadRawDataComplete, |
263 return to_read; | 274 weak_factory_.GetWeakPtr(), bytes_read)); |
Randy Smith (Not in Mondays)
2016/12/08 22:15:09
I assume you thought about whether there were poss
mmenke
2016/12/08 22:46:37
This is a valid concern - I've suggested it to oth
| |
275 return ERR_IO_PENDING; | |
276 } | |
277 return bytes_read; | |
264 } | 278 } |
265 | 279 |
266 void URLRequestTestJob::GetResponseInfo(HttpResponseInfo* info) { | 280 void URLRequestTestJob::GetResponseInfo(HttpResponseInfo* info) { |
267 if (response_headers_.get()) | 281 if (response_headers_.get()) |
268 info->headers = response_headers_; | 282 info->headers = response_headers_; |
269 } | 283 } |
270 | 284 |
271 void URLRequestTestJob::GetLoadTimingInfo( | 285 void URLRequestTestJob::GetLoadTimingInfo( |
272 LoadTimingInfo* load_timing_info) const { | 286 LoadTimingInfo* load_timing_info) const { |
273 // Preserve the times the URLRequest is responsible for, but overwrite all | 287 // Preserve the times the URLRequest is responsible for, but overwrite all |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
369 | 383 |
370 URLRequestTestJob* next_job(g_pending_jobs.Get().front()); | 384 URLRequestTestJob* next_job(g_pending_jobs.Get().front()); |
371 g_pending_jobs.Get().pop_front(); | 385 g_pending_jobs.Get().pop_front(); |
372 | 386 |
373 DCHECK(!next_job->auto_advance()); // auto_advance jobs should be in this q | 387 DCHECK(!next_job->auto_advance()); // auto_advance jobs should be in this q |
374 next_job->ProcessNextOperation(); | 388 next_job->ProcessNextOperation(); |
375 return true; | 389 return true; |
376 } | 390 } |
377 | 391 |
378 } // namespace net | 392 } // namespace net |
OLD | NEW |