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/test_url_fetcher_factory.h" | 5 #include "net/url_request/test_url_fetcher_factory.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
11 #include "base/memory/weak_ptr.h" | 11 #include "base/memory/weak_ptr.h" |
12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
13 #include "net/base/host_port_pair.h" | 13 #include "net/base/host_port_pair.h" |
14 #include "net/base/io_buffer.h" | 14 #include "net/base/io_buffer.h" |
15 #include "net/base/net_errors.h" | 15 #include "net/base/net_errors.h" |
16 #include "net/http/http_response_headers.h" | 16 #include "net/http/http_response_headers.h" |
17 #include "net/url_request/url_fetcher_delegate.h" | 17 #include "net/url_request/url_fetcher_delegate.h" |
18 #include "net/url_request/url_fetcher_impl.h" | 18 #include "net/url_request/url_fetcher_impl.h" |
19 #include "net/url_request/url_fetcher_response_writer.h" | 19 #include "net/url_request/url_fetcher_response_writer.h" |
20 #include "net/url_request/url_request_status.h" | 20 #include "net/url_request/url_request_status.h" |
21 | 21 |
22 namespace net { | 22 namespace net { |
23 | 23 |
24 ScopedURLFetcherFactory::ScopedURLFetcherFactory( | 24 ScopedURLFetcherFactory::ScopedURLFetcherFactory(URLFetcherFactory* factory) { |
25 URLFetcherFactory* factory) { | |
26 DCHECK(!URLFetcherImpl::factory()); | 25 DCHECK(!URLFetcherImpl::factory()); |
27 URLFetcherImpl::set_factory(factory); | 26 URLFetcherImpl::set_factory(factory); |
28 } | 27 } |
29 | 28 |
30 ScopedURLFetcherFactory::~ScopedURLFetcherFactory() { | 29 ScopedURLFetcherFactory::~ScopedURLFetcherFactory() { |
31 DCHECK(URLFetcherImpl::factory()); | 30 DCHECK(URLFetcherImpl::factory()); |
32 URLFetcherImpl::set_factory(NULL); | 31 URLFetcherImpl::set_factory(NULL); |
33 } | 32 } |
34 | 33 |
35 TestURLFetcher::TestURLFetcher(int id, | 34 TestURLFetcher::TestURLFetcher(int id, const GURL& url, URLFetcherDelegate* d) |
36 const GURL& url, | |
37 URLFetcherDelegate* d) | |
38 : owner_(NULL), | 35 : owner_(NULL), |
39 id_(id), | 36 id_(id), |
40 original_url_(url), | 37 original_url_(url), |
41 delegate_(d), | 38 delegate_(d), |
42 delegate_for_tests_(NULL), | 39 delegate_for_tests_(NULL), |
43 did_receive_last_chunk_(false), | 40 did_receive_last_chunk_(false), |
44 fake_load_flags_(0), | 41 fake_load_flags_(0), |
45 fake_response_code_(-1), | 42 fake_response_code_(-1), |
46 fake_response_destination_(STRING), | 43 fake_response_destination_(STRING), |
47 fake_was_fetched_via_proxy_(false), | 44 fake_was_fetched_via_proxy_(false), |
(...skipping 27 matching lines...) Expand all Loading... |
75 void TestURLFetcher::AppendChunkToUpload(const std::string& data, | 72 void TestURLFetcher::AppendChunkToUpload(const std::string& data, |
76 bool is_last_chunk) { | 73 bool is_last_chunk) { |
77 DCHECK(!did_receive_last_chunk_); | 74 DCHECK(!did_receive_last_chunk_); |
78 did_receive_last_chunk_ = is_last_chunk; | 75 did_receive_last_chunk_ = is_last_chunk; |
79 chunks_.push_back(data); | 76 chunks_.push_back(data); |
80 if (delegate_for_tests_) | 77 if (delegate_for_tests_) |
81 delegate_for_tests_->OnChunkUpload(id_); | 78 delegate_for_tests_->OnChunkUpload(id_); |
82 } | 79 } |
83 | 80 |
84 void TestURLFetcher::SetLoadFlags(int load_flags) { | 81 void TestURLFetcher::SetLoadFlags(int load_flags) { |
85 fake_load_flags_= load_flags; | 82 fake_load_flags_ = load_flags; |
86 } | 83 } |
87 | 84 |
88 int TestURLFetcher::GetLoadFlags() const { | 85 int TestURLFetcher::GetLoadFlags() const { |
89 return fake_load_flags_; | 86 return fake_load_flags_; |
90 } | 87 } |
91 | 88 |
92 void TestURLFetcher::SetReferrer(const std::string& referrer) { | 89 void TestURLFetcher::SetReferrer(const std::string& referrer) { |
93 } | 90 } |
94 | 91 |
95 void TestURLFetcher::SetReferrerPolicy( | 92 void TestURLFetcher::SetReferrerPolicy( |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 | 148 |
152 void TestURLFetcher::SaveResponseWithWriter( | 149 void TestURLFetcher::SaveResponseWithWriter( |
153 scoped_ptr<URLFetcherResponseWriter> response_writer) { | 150 scoped_ptr<URLFetcherResponseWriter> response_writer) { |
154 if (fake_response_destination_ == STRING) { | 151 if (fake_response_destination_ == STRING) { |
155 response_writer_ = response_writer.Pass(); | 152 response_writer_ = response_writer.Pass(); |
156 int response = response_writer_->Initialize(CompletionCallback()); | 153 int response = response_writer_->Initialize(CompletionCallback()); |
157 // The TestURLFetcher doesn't handle asynchronous writes. | 154 // The TestURLFetcher doesn't handle asynchronous writes. |
158 DCHECK_EQ(OK, response); | 155 DCHECK_EQ(OK, response); |
159 | 156 |
160 scoped_refptr<IOBuffer> buffer(new StringIOBuffer(fake_response_string_)); | 157 scoped_refptr<IOBuffer> buffer(new StringIOBuffer(fake_response_string_)); |
161 response = response_writer_->Write(buffer.get(), | 158 response = response_writer_->Write( |
162 fake_response_string_.size(), | 159 buffer.get(), fake_response_string_.size(), CompletionCallback()); |
163 CompletionCallback()); | |
164 DCHECK_EQ(static_cast<int>(fake_response_string_.size()), response); | 160 DCHECK_EQ(static_cast<int>(fake_response_string_.size()), response); |
165 response = response_writer_->Finish(CompletionCallback()); | 161 response = response_writer_->Finish(CompletionCallback()); |
166 DCHECK_EQ(OK, response); | 162 DCHECK_EQ(OK, response); |
167 } else { | 163 } else { |
168 NOTIMPLEMENTED(); | 164 NOTIMPLEMENTED(); |
169 } | 165 } |
170 } | 166 } |
171 | 167 |
172 HttpResponseHeaders* TestURLFetcher::GetResponseHeaders() const { | 168 HttpResponseHeaders* TestURLFetcher::GetResponseHeaders() const { |
173 return fake_response_headers_.get(); | 169 return fake_response_headers_.get(); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 bool TestURLFetcher::GetResponseAsString( | 210 bool TestURLFetcher::GetResponseAsString( |
215 std::string* out_response_string) const { | 211 std::string* out_response_string) const { |
216 if (fake_response_destination_ != STRING) | 212 if (fake_response_destination_ != STRING) |
217 return false; | 213 return false; |
218 | 214 |
219 *out_response_string = fake_response_string_; | 215 *out_response_string = fake_response_string_; |
220 return true; | 216 return true; |
221 } | 217 } |
222 | 218 |
223 bool TestURLFetcher::GetResponseAsFilePath( | 219 bool TestURLFetcher::GetResponseAsFilePath( |
224 bool take_ownership, base::FilePath* out_response_path) const { | 220 bool take_ownership, |
| 221 base::FilePath* out_response_path) const { |
225 if (fake_response_destination_ != TEMP_FILE) | 222 if (fake_response_destination_ != TEMP_FILE) |
226 return false; | 223 return false; |
227 | 224 |
228 *out_response_path = fake_response_file_path_; | 225 *out_response_path = fake_response_file_path_; |
229 return true; | 226 return true; |
230 } | 227 } |
231 | 228 |
232 void TestURLFetcher::GetExtraRequestHeaders( | 229 void TestURLFetcher::GetExtraRequestHeaders(HttpRequestHeaders* headers) const { |
233 HttpRequestHeaders* headers) const { | |
234 *headers = fake_extra_request_headers_; | 230 *headers = fake_extra_request_headers_; |
235 } | 231 } |
236 | 232 |
237 void TestURLFetcher::set_status(const URLRequestStatus& status) { | 233 void TestURLFetcher::set_status(const URLRequestStatus& status) { |
238 fake_status_ = status; | 234 fake_status_ = status; |
239 } | 235 } |
240 | 236 |
241 void TestURLFetcher::set_was_fetched_via_proxy(bool flag) { | 237 void TestURLFetcher::set_was_fetched_via_proxy(bool flag) { |
242 fake_was_fetched_via_proxy_ = flag; | 238 fake_was_fetched_via_proxy_ = flag; |
243 } | 239 } |
(...skipping 20 matching lines...) Expand all Loading... |
264 fake_response_destination_ = TEMP_FILE; | 260 fake_response_destination_ = TEMP_FILE; |
265 fake_response_file_path_ = path; | 261 fake_response_file_path_ = path; |
266 } | 262 } |
267 | 263 |
268 TestURLFetcherFactory::TestURLFetcherFactory() | 264 TestURLFetcherFactory::TestURLFetcherFactory() |
269 : ScopedURLFetcherFactory(this), | 265 : ScopedURLFetcherFactory(this), |
270 delegate_for_tests_(NULL), | 266 delegate_for_tests_(NULL), |
271 remove_fetcher_on_delete_(false) { | 267 remove_fetcher_on_delete_(false) { |
272 } | 268 } |
273 | 269 |
274 TestURLFetcherFactory::~TestURLFetcherFactory() {} | 270 TestURLFetcherFactory::~TestURLFetcherFactory() { |
| 271 } |
275 | 272 |
276 URLFetcher* TestURLFetcherFactory::CreateURLFetcher( | 273 URLFetcher* TestURLFetcherFactory::CreateURLFetcher( |
277 int id, | 274 int id, |
278 const GURL& url, | 275 const GURL& url, |
279 URLFetcher::RequestType request_type, | 276 URLFetcher::RequestType request_type, |
280 URLFetcherDelegate* d) { | 277 URLFetcherDelegate* d) { |
281 TestURLFetcher* fetcher = new TestURLFetcher(id, url, d); | 278 TestURLFetcher* fetcher = new TestURLFetcher(id, url, d); |
282 if (remove_fetcher_on_delete_) | 279 if (remove_fetcher_on_delete_) |
283 fetcher->set_owner(this); | 280 fetcher->set_owner(this); |
284 fetcher->SetDelegateForTests(delegate_for_tests_); | 281 fetcher->SetDelegateForTests(delegate_for_tests_); |
(...skipping 15 matching lines...) Expand all Loading... |
300 void TestURLFetcherFactory::SetDelegateForTests( | 297 void TestURLFetcherFactory::SetDelegateForTests( |
301 TestURLFetcherDelegateForTests* delegate_for_tests) { | 298 TestURLFetcherDelegateForTests* delegate_for_tests) { |
302 delegate_for_tests_ = delegate_for_tests; | 299 delegate_for_tests_ = delegate_for_tests; |
303 } | 300 } |
304 | 301 |
305 FakeURLFetcher::FakeURLFetcher(const GURL& url, | 302 FakeURLFetcher::FakeURLFetcher(const GURL& url, |
306 URLFetcherDelegate* d, | 303 URLFetcherDelegate* d, |
307 const std::string& response_data, | 304 const std::string& response_data, |
308 HttpStatusCode response_code, | 305 HttpStatusCode response_code, |
309 URLRequestStatus::Status status) | 306 URLRequestStatus::Status status) |
310 : TestURLFetcher(0, url, d), | 307 : TestURLFetcher(0, url, d), weak_factory_(this) { |
311 weak_factory_(this) { | |
312 Error error = OK; | 308 Error error = OK; |
313 switch(status) { | 309 switch (status) { |
314 case URLRequestStatus::SUCCESS: | 310 case URLRequestStatus::SUCCESS: |
315 // |error| is initialized to OK. | 311 // |error| is initialized to OK. |
316 break; | 312 break; |
317 case URLRequestStatus::IO_PENDING: | 313 case URLRequestStatus::IO_PENDING: |
318 error = ERR_IO_PENDING; | 314 error = ERR_IO_PENDING; |
319 break; | 315 break; |
320 case URLRequestStatus::CANCELED: | 316 case URLRequestStatus::CANCELED: |
321 error = ERR_ABORTED; | 317 error = ERR_ABORTED; |
322 break; | 318 break; |
323 case URLRequestStatus::FAILED: | 319 case URLRequestStatus::FAILED: |
324 error = ERR_FAILED; | 320 error = ERR_FAILED; |
325 break; | 321 break; |
326 } | 322 } |
327 set_status(URLRequestStatus(status, error)); | 323 set_status(URLRequestStatus(status, error)); |
328 set_response_code(response_code); | 324 set_response_code(response_code); |
329 SetResponseString(response_data); | 325 SetResponseString(response_data); |
330 } | 326 } |
331 | 327 |
332 FakeURLFetcher::~FakeURLFetcher() {} | 328 FakeURLFetcher::~FakeURLFetcher() { |
| 329 } |
333 | 330 |
334 void FakeURLFetcher::Start() { | 331 void FakeURLFetcher::Start() { |
335 base::MessageLoop::current()->PostTask( | 332 base::MessageLoop::current()->PostTask( |
336 FROM_HERE, | 333 FROM_HERE, |
337 base::Bind(&FakeURLFetcher::RunDelegate, weak_factory_.GetWeakPtr())); | 334 base::Bind(&FakeURLFetcher::RunDelegate, weak_factory_.GetWeakPtr())); |
338 } | 335 } |
339 | 336 |
340 void FakeURLFetcher::RunDelegate() { | 337 void FakeURLFetcher::RunDelegate() { |
341 delegate()->OnURLFetchComplete(this); | 338 delegate()->OnURLFetchComplete(this); |
342 } | 339 } |
343 | 340 |
344 const GURL& FakeURLFetcher::GetURL() const { | 341 const GURL& FakeURLFetcher::GetURL() const { |
345 return TestURLFetcher::GetOriginalURL(); | 342 return TestURLFetcher::GetOriginalURL(); |
346 } | 343 } |
347 | 344 |
348 FakeURLFetcherFactory::FakeURLFetcherFactory( | 345 FakeURLFetcherFactory::FakeURLFetcherFactory(URLFetcherFactory* default_factory) |
349 URLFetcherFactory* default_factory) | |
350 : ScopedURLFetcherFactory(this), | 346 : ScopedURLFetcherFactory(this), |
351 creator_(base::Bind(&DefaultFakeURLFetcherCreator)), | 347 creator_(base::Bind(&DefaultFakeURLFetcherCreator)), |
352 default_factory_(default_factory) { | 348 default_factory_(default_factory) { |
353 } | 349 } |
354 | 350 |
355 FakeURLFetcherFactory::FakeURLFetcherFactory( | 351 FakeURLFetcherFactory::FakeURLFetcherFactory( |
356 URLFetcherFactory* default_factory, | 352 URLFetcherFactory* default_factory, |
357 const FakeURLFetcherCreator& creator) | 353 const FakeURLFetcherCreator& creator) |
358 : ScopedURLFetcherFactory(this), | 354 : ScopedURLFetcherFactory(this), |
359 creator_(creator), | 355 creator_(creator), |
360 default_factory_(default_factory) { | 356 default_factory_(default_factory) { |
361 } | 357 } |
362 | 358 |
363 scoped_ptr<FakeURLFetcher> FakeURLFetcherFactory::DefaultFakeURLFetcherCreator( | 359 scoped_ptr<FakeURLFetcher> FakeURLFetcherFactory::DefaultFakeURLFetcherCreator( |
364 const GURL& url, | 360 const GURL& url, |
365 URLFetcherDelegate* delegate, | 361 URLFetcherDelegate* delegate, |
366 const std::string& response_data, | 362 const std::string& response_data, |
367 HttpStatusCode response_code, | 363 HttpStatusCode response_code, |
368 URLRequestStatus::Status status) { | 364 URLRequestStatus::Status status) { |
369 return scoped_ptr<FakeURLFetcher>( | 365 return scoped_ptr<FakeURLFetcher>( |
370 new FakeURLFetcher(url, delegate, response_data, response_code, status)); | 366 new FakeURLFetcher(url, delegate, response_data, response_code, status)); |
371 } | 367 } |
372 | 368 |
373 FakeURLFetcherFactory::~FakeURLFetcherFactory() {} | 369 FakeURLFetcherFactory::~FakeURLFetcherFactory() { |
| 370 } |
374 | 371 |
375 URLFetcher* FakeURLFetcherFactory::CreateURLFetcher( | 372 URLFetcher* FakeURLFetcherFactory::CreateURLFetcher( |
376 int id, | 373 int id, |
377 const GURL& url, | 374 const GURL& url, |
378 URLFetcher::RequestType request_type, | 375 URLFetcher::RequestType request_type, |
379 URLFetcherDelegate* d) { | 376 URLFetcherDelegate* d) { |
380 FakeResponseMap::const_iterator it = fake_responses_.find(url); | 377 FakeResponseMap::const_iterator it = fake_responses_.find(url); |
381 if (it == fake_responses_.end()) { | 378 if (it == fake_responses_.end()) { |
382 if (default_factory_ == NULL) { | 379 if (default_factory_ == NULL) { |
383 // If we don't have a baked response for that URL we return NULL. | 380 // If we don't have a baked response for that URL we return NULL. |
384 DLOG(ERROR) << "No baked response for URL: " << url.spec(); | 381 DLOG(ERROR) << "No baked response for URL: " << url.spec(); |
385 return NULL; | 382 return NULL; |
386 } else { | 383 } else { |
387 return default_factory_->CreateURLFetcher(id, url, request_type, d); | 384 return default_factory_->CreateURLFetcher(id, url, request_type, d); |
388 } | 385 } |
389 } | 386 } |
390 | 387 |
391 scoped_ptr<FakeURLFetcher> fake_fetcher = | 388 scoped_ptr<FakeURLFetcher> fake_fetcher = |
392 creator_.Run(url, d, it->second.response_data, | 389 creator_.Run(url, |
393 it->second.response_code, it->second.status); | 390 d, |
| 391 it->second.response_data, |
| 392 it->second.response_code, |
| 393 it->second.status); |
394 // TODO: Make URLFetcherFactory::CreateURLFetcher return a scoped_ptr | 394 // TODO: Make URLFetcherFactory::CreateURLFetcher return a scoped_ptr |
395 return fake_fetcher.release(); | 395 return fake_fetcher.release(); |
396 } | 396 } |
397 | 397 |
398 void FakeURLFetcherFactory::SetFakeResponse( | 398 void FakeURLFetcherFactory::SetFakeResponse(const GURL& url, |
399 const GURL& url, | 399 const std::string& response_data, |
400 const std::string& response_data, | 400 HttpStatusCode response_code, |
401 HttpStatusCode response_code, | 401 URLRequestStatus::Status status) { |
402 URLRequestStatus::Status status) { | |
403 // Overwrite existing URL if it already exists. | 402 // Overwrite existing URL if it already exists. |
404 FakeURLResponse response; | 403 FakeURLResponse response; |
405 response.response_data = response_data; | 404 response.response_data = response_data; |
406 response.response_code = response_code; | 405 response.response_code = response_code; |
407 response.status = status; | 406 response.status = status; |
408 fake_responses_[url] = response; | 407 fake_responses_[url] = response; |
409 } | 408 } |
410 | 409 |
411 void FakeURLFetcherFactory::ClearFakeResponses() { | 410 void FakeURLFetcherFactory::ClearFakeResponses() { |
412 fake_responses_.clear(); | 411 fake_responses_.clear(); |
413 } | 412 } |
414 | 413 |
415 URLFetcherImplFactory::URLFetcherImplFactory() {} | 414 URLFetcherImplFactory::URLFetcherImplFactory() { |
| 415 } |
416 | 416 |
417 URLFetcherImplFactory::~URLFetcherImplFactory() {} | 417 URLFetcherImplFactory::~URLFetcherImplFactory() { |
| 418 } |
418 | 419 |
419 URLFetcher* URLFetcherImplFactory::CreateURLFetcher( | 420 URLFetcher* URLFetcherImplFactory::CreateURLFetcher( |
420 int id, | 421 int id, |
421 const GURL& url, | 422 const GURL& url, |
422 URLFetcher::RequestType request_type, | 423 URLFetcher::RequestType request_type, |
423 URLFetcherDelegate* d) { | 424 URLFetcherDelegate* d) { |
424 return new URLFetcherImpl(url, request_type, d); | 425 return new URLFetcherImpl(url, request_type, d); |
425 } | 426 } |
426 | 427 |
427 } // namespace net | 428 } // namespace net |
OLD | NEW |