Chromium Code Reviews| Index: net/url_request/url_request_simple_job.cc |
| diff --git a/net/url_request/url_request_simple_job.cc b/net/url_request/url_request_simple_job.cc |
| index bd945557e3de2f5edd0b71b4c5fbf9839409a2d6..8934d455c3c343131951ac83a05befc12d00e16a 100644 |
| --- a/net/url_request/url_request_simple_job.cc |
| +++ b/net/url_request/url_request_simple_job.cc |
| @@ -4,18 +4,22 @@ |
| #include "net/url_request/url_request_simple_job.h" |
| +#include <vector> |
| + |
| #include "base/bind.h" |
| #include "base/compiler_specific.h" |
| #include "base/message_loop/message_loop.h" |
| #include "net/base/io_buffer.h" |
| #include "net/base/net_errors.h" |
| +#include "net/http/http_request_headers.h" |
| +#include "net/http/http_util.h" |
| #include "net/url_request/url_request_status.h" |
| namespace net { |
| URLRequestSimpleJob::URLRequestSimpleJob( |
| URLRequest* request, NetworkDelegate* network_delegate) |
| - : URLRequestJob(request, network_delegate), |
| + : URLRangeRequestJob(request, network_delegate), |
| data_offset_(0), |
| weak_factory_(this) {} |
| @@ -42,7 +46,7 @@ URLRequestSimpleJob::~URLRequestSimpleJob() {} |
| bool URLRequestSimpleJob::ReadRawData(IOBuffer* buf, int buf_size, |
| int* bytes_read) { |
| DCHECK(bytes_read); |
| - int remaining = static_cast<int>(data_.size()) - data_offset_; |
| + int remaining = byte_range_.last_byte_position() - data_offset_ + 1; |
| if (buf_size > remaining) |
| buf_size = remaining; |
| memcpy(buf->data(), data_.data() + data_offset_, buf_size); |
| @@ -55,6 +59,15 @@ void URLRequestSimpleJob::StartAsync() { |
| if (!request_) |
| return; |
| + if (ranges().size() > 1) { |
| + NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, |
| + ERR_REQUEST_RANGE_NOT_SATISFIABLE)); |
| + return; |
| + } |
| + |
| + if (!ranges().empty() && range_parse_result() == net::OK) |
|
mmenke
2014/01/09 15:49:24
nit: "net::" not needed.
|
| + byte_range_ = ranges().front(); |
| + |
| int result = GetData(&mime_type_, &charset_, &data_, |
| base::Bind(&URLRequestSimpleJob::OnGetDataCompleted, |
| weak_factory_.GetWeakPtr())); |
| @@ -65,6 +78,16 @@ void URLRequestSimpleJob::StartAsync() { |
| void URLRequestSimpleJob::OnGetDataCompleted(int result) { |
| if (result == OK) { |
| // Notify that the headers are complete |
| + if (!byte_range_.ComputeBounds(data_.size())) { |
| + NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, |
| + ERR_REQUEST_RANGE_NOT_SATISFIABLE)); |
| + return; |
| + } |
| + |
| + data_offset_ = byte_range_.first_byte_position(); |
| + int remaining_bytes = byte_range_.last_byte_position() - |
| + byte_range_.first_byte_position() + 1; |
| + set_expected_content_size(remaining_bytes); |
| NotifyHeadersComplete(); |
| } else { |
| NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, result)); |