| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "webkit/glue/media/buffered_resource_loader.h" | 5 #include "webkit/glue/media/buffered_resource_loader.h" |
| 6 | 6 |
| 7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
| 10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" | 10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 } | 96 } |
| 97 | 97 |
| 98 // Increment the reference count right before we start the request. This | 98 // Increment the reference count right before we start the request. This |
| 99 // reference will be release when this request has ended. | 99 // reference will be release when this request has ended. |
| 100 AddRef(); | 100 AddRef(); |
| 101 | 101 |
| 102 // Prepare the request. | 102 // Prepare the request. |
| 103 WebURLRequest request(url_); | 103 WebURLRequest request(url_); |
| 104 request.setTargetType(WebURLRequest::TargetIsMedia); | 104 request.setTargetType(WebURLRequest::TargetIsMedia); |
| 105 | 105 |
| 106 if (!IsWholeFileRange()) { | 106 if (IsRangeRequest()) { |
| 107 range_requested_ = true; | 107 range_requested_ = true; |
| 108 request.setHTTPHeaderField(WebString::fromUTF8("Range"), | 108 request.setHTTPHeaderField(WebString::fromUTF8("Range"), |
| 109 WebString::fromUTF8(GenerateHeaders( | 109 WebString::fromUTF8(GenerateHeaders( |
| 110 first_byte_position_, | 110 first_byte_position_, |
| 111 last_byte_position_))); | 111 last_byte_position_))); |
| 112 } | 112 } |
| 113 frame->setReferrerForRequest(request, WebKit::WebURL()); | 113 frame->setReferrerForRequest(request, WebKit::WebURL()); |
| 114 | 114 |
| 115 // This flag is for unittests as we don't want to reset |url_loader| | 115 // This flag is for unittests as we don't want to reset |url_loader| |
| 116 if (!keep_test_loader_) | 116 if (!keep_test_loader_) |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 | 288 |
| 289 // Check to see whether the server supports byte ranges. | 289 // Check to see whether the server supports byte ranges. |
| 290 std::string accept_ranges = | 290 std::string accept_ranges = |
| 291 response.httpHeaderField("Accept-Ranges").utf8(); | 291 response.httpHeaderField("Accept-Ranges").utf8(); |
| 292 range_supported_ = (accept_ranges.find("bytes") != std::string::npos); | 292 range_supported_ = (accept_ranges.find("bytes") != std::string::npos); |
| 293 | 293 |
| 294 partial_response = (response.httpStatusCode() == kHttpPartialContent); | 294 partial_response = (response.httpStatusCode() == kHttpPartialContent); |
| 295 | 295 |
| 296 if (range_requested_) { | 296 if (range_requested_) { |
| 297 // If we have verified the partial response and it is correct, we will | 297 // If we have verified the partial response and it is correct, we will |
| 298 // return net::OK. | 298 // return net::OK. It's also possible for a server to support range |
| 299 if (!partial_response || !VerifyPartialResponse(response)) | 299 // requests without advertising Accept-Ranges: bytes. |
| 300 if (partial_response && VerifyPartialResponse(response)) |
| 301 range_supported_ = true; |
| 302 else |
| 300 error = net::ERR_INVALID_RESPONSE; | 303 error = net::ERR_INVALID_RESPONSE; |
| 301 } else if (response.httpStatusCode() != kHttpOK) { | 304 } else if (response.httpStatusCode() != kHttpOK) { |
| 302 // We didn't request a range but server didn't reply with "200 OK". | 305 // We didn't request a range but server didn't reply with "200 OK". |
| 303 error = net::ERR_FAILED; | 306 error = net::ERR_FAILED; |
| 304 } | 307 } |
| 305 | 308 |
| 306 if (error != net::OK) { | 309 if (error != net::OK) { |
| 307 DoneStart(error); | 310 DoneStart(error); |
| 308 Stop(); | 311 Stop(); |
| 309 return; | 312 return; |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 void BufferedResourceLoader::DoneStart(int error) { | 639 void BufferedResourceLoader::DoneStart(int error) { |
| 637 start_callback_->RunWithParams(Tuple1<int>(error)); | 640 start_callback_->RunWithParams(Tuple1<int>(error)); |
| 638 start_callback_.reset(); | 641 start_callback_.reset(); |
| 639 } | 642 } |
| 640 | 643 |
| 641 void BufferedResourceLoader::NotifyNetworkEvent() { | 644 void BufferedResourceLoader::NotifyNetworkEvent() { |
| 642 if (event_callback_.get()) | 645 if (event_callback_.get()) |
| 643 event_callback_->Run(); | 646 event_callback_->Run(); |
| 644 } | 647 } |
| 645 | 648 |
| 646 bool BufferedResourceLoader::IsWholeFileRange() const { | 649 bool BufferedResourceLoader::IsRangeRequest() const { |
| 647 return ((first_byte_position_ == kPositionNotSpecified || | 650 return first_byte_position_ != kPositionNotSpecified; |
| 648 first_byte_position_ == 0) && | |
| 649 last_byte_position_ == kPositionNotSpecified); | |
| 650 } | 651 } |
| 651 | 652 |
| 652 } // namespace webkit_glue | 653 } // namespace webkit_glue |
| OLD | NEW |