Index: content/browser/net/url_request_slow_download_job.cc |
diff --git a/content/browser/net/url_request_slow_download_job.cc b/content/browser/net/url_request_slow_download_job.cc |
index ef1370ff32329b41538af42a002002efbe73ef68..87584b092f8cea6ffa930bace47644cd8d55b72d 100644 |
--- a/content/browser/net/url_request_slow_download_job.cc |
+++ b/content/browser/net/url_request_slow_download_job.cc |
@@ -10,9 +10,11 @@ |
#include "base/string_util.h" |
#include "googleurl/src/gurl.h" |
#include "net/base/io_buffer.h" |
+#include "net/base/net_errors.h" |
#include "net/http/http_response_headers.h" |
#include "net/url_request/url_request.h" |
#include "net/url_request/url_request_filter.h" |
+#include "net/url_request/url_request_status.h" |
const int kFirstDownloadSize = 1024 * 35; |
const int kSecondDownloadSize = 1024 * 10; |
@@ -23,10 +25,21 @@ const char URLRequestSlowDownloadJob::kKnownSizeUrl[] = |
"http://url.handled.by.slow.download/download-known-size"; |
const char URLRequestSlowDownloadJob::kFinishDownloadUrl[] = |
"http://url.handled.by.slow.download/download-finish"; |
+const char URLRequestSlowDownloadJob::kErrorFinishDownloadUrl[] = |
+ "http://url.handled.by.slow.download/download-error"; |
std::vector<URLRequestSlowDownloadJob*> |
URLRequestSlowDownloadJob::kPendingRequests; |
+// Return whether this is the finish or error URL |
+static bool IsCompletionUrl(GURL url) { |
+ return (LowerCaseEqualsASCII( |
+ URLRequestSlowDownloadJob::kFinishDownloadUrl, url.spec().c_str()) || |
+ LowerCaseEqualsASCII( |
+ URLRequestSlowDownloadJob::kErrorFinishDownloadUrl, |
+ url.spec().c_str())); |
+} |
+ |
void URLRequestSlowDownloadJob::Start() { |
MessageLoop::current()->PostTask( |
FROM_HERE, |
@@ -43,6 +56,8 @@ void URLRequestSlowDownloadJob::AddUrlHandler() { |
&URLRequestSlowDownloadJob::Factory); |
filter->AddUrlHandler(GURL(kFinishDownloadUrl), |
&URLRequestSlowDownloadJob::Factory); |
+ filter->AddUrlHandler(GURL(kErrorFinishDownloadUrl), |
+ &URLRequestSlowDownloadJob::Factory); |
} |
/*static */ |
@@ -50,17 +65,21 @@ net::URLRequestJob* URLRequestSlowDownloadJob::Factory( |
net::URLRequest* request, |
const std::string& scheme) { |
URLRequestSlowDownloadJob* job = new URLRequestSlowDownloadJob(request); |
- if (request->url().spec() != kFinishDownloadUrl) |
+ if (!IsCompletionUrl(request->url())) |
URLRequestSlowDownloadJob::kPendingRequests.push_back(job); |
return job; |
} |
/* static */ |
-void URLRequestSlowDownloadJob::FinishPendingRequests() { |
+void URLRequestSlowDownloadJob::FinishPendingRequests(bool error) { |
typedef std::vector<URLRequestSlowDownloadJob*> JobList; |
for (JobList::iterator it = kPendingRequests.begin(); it != |
kPendingRequests.end(); ++it) { |
- (*it)->set_should_finish_download(); |
+ if (error) { |
+ (*it)->set_should_error_download(); |
+ } else { |
+ (*it)->set_should_finish_download(); |
+ } |
} |
kPendingRequests.clear(); |
} |
@@ -70,19 +89,24 @@ URLRequestSlowDownloadJob::URLRequestSlowDownloadJob(net::URLRequest* request) |
first_download_size_remaining_(kFirstDownloadSize), |
should_finish_download_(false), |
should_send_second_chunk_(false), |
+ should_error_download_(false), |
ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {} |
void URLRequestSlowDownloadJob::StartAsync() { |
if (LowerCaseEqualsASCII(kFinishDownloadUrl, request_->url().spec().c_str())) |
- URLRequestSlowDownloadJob::FinishPendingRequests(); |
+ URLRequestSlowDownloadJob::FinishPendingRequests(false); |
+ |
+ if (LowerCaseEqualsASCII(kErrorFinishDownloadUrl, |
+ request_->url().spec().c_str())) { |
+ URLRequestSlowDownloadJob::FinishPendingRequests(true); |
+ } |
NotifyHeadersComplete(); |
} |
bool URLRequestSlowDownloadJob::ReadRawData(net::IOBuffer* buf, int buf_size, |
int *bytes_read) { |
- if (LowerCaseEqualsASCII(kFinishDownloadUrl, |
- request_->url().spec().c_str())) { |
+ if (IsCompletionUrl(request_->url())) { |
*bytes_read = 0; |
return true; |
} |
@@ -132,6 +156,9 @@ void URLRequestSlowDownloadJob::CheckDoneStatus() { |
should_send_second_chunk_ = true; |
SetStatus(net::URLRequestStatus()); |
NotifyReadComplete(kSecondDownloadSize); |
+ } else if (should_error_download_) { |
+ NotifyDone( |
+ net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED)); |
} else { |
MessageLoop::current()->PostDelayedTask( |
FROM_HERE, |
@@ -154,8 +181,7 @@ void URLRequestSlowDownloadJob::GetResponseInfoConst( |
net::HttpResponseInfo* info) const { |
// Send back mock headers. |
std::string raw_headers; |
- if (LowerCaseEqualsASCII(kFinishDownloadUrl, |
- request_->url().spec().c_str())) { |
+ if (IsCompletionUrl(request_->url())) { |
raw_headers.append( |
"HTTP/1.1 200 OK\n" |
"Content-type: text/plain\n"); |