| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "media/blink/resource_multibuffer_data_provider.h" | 5 #include "media/blink/resource_multibuffer_data_provider.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 max_enum); // PRESUBMIT_IGNORE_UMA_MAX | 251 max_enum); // PRESUBMIT_IGNORE_UMA_MAX |
| 252 } | 252 } |
| 253 | 253 |
| 254 reasons >>= 1; | 254 reasons >>= 1; |
| 255 ++shift; | 255 ++shift; |
| 256 } | 256 } |
| 257 | 257 |
| 258 // Expected content length can be |kPositionNotSpecified|, in that case | 258 // Expected content length can be |kPositionNotSpecified|, in that case |
| 259 // |content_length_| is not specified and this is a streaming response. | 259 // |content_length_| is not specified and this is a streaming response. |
| 260 int64_t content_length = response.expectedContentLength(); | 260 int64_t content_length = response.expectedContentLength(); |
| 261 bool end_of_file = false; |
| 261 | 262 |
| 262 // We make a strong assumption that when we reach here we have either | 263 // We make a strong assumption that when we reach here we have either |
| 263 // received a response from HTTP/HTTPS protocol or the request was | 264 // received a response from HTTP/HTTPS protocol or the request was |
| 264 // successful (in particular range request). So we only verify the partial | 265 // successful (in particular range request). So we only verify the partial |
| 265 // response for HTTP and HTTPS protocol. | 266 // response for HTTP and HTTPS protocol. |
| 266 if (destination_url_data->url().SchemeIsHTTPOrHTTPS()) { | 267 if (destination_url_data->url().SchemeIsHTTPOrHTTPS()) { |
| 267 bool partial_response = (response.httpStatusCode() == kHttpPartialContent); | 268 bool partial_response = (response.httpStatusCode() == kHttpPartialContent); |
| 268 bool ok_response = (response.httpStatusCode() == kHttpOK); | 269 bool ok_response = (response.httpStatusCode() == kHttpOK); |
| 269 | 270 |
| 270 // Check to see whether the server supports byte ranges. | 271 // Check to see whether the server supports byte ranges. |
| 271 std::string accept_ranges = | 272 std::string accept_ranges = |
| 272 response.httpHeaderField("Accept-Ranges").utf8(); | 273 response.httpHeaderField("Accept-Ranges").utf8(); |
| 273 if (accept_ranges.find("bytes") != std::string::npos) | 274 if (accept_ranges.find("bytes") != std::string::npos) |
| 274 destination_url_data->set_range_supported(); | 275 destination_url_data->set_range_supported(); |
| 275 | 276 |
| 276 // If we have verified the partial response and it is correct. | 277 // If we have verified the partial response and it is correct. |
| 277 // It's also possible for a server to support range requests | 278 // It's also possible for a server to support range requests |
| 278 // without advertising "Accept-Ranges: bytes". | 279 // without advertising "Accept-Ranges: bytes". |
| 279 if (partial_response && | 280 if (partial_response && |
| 280 VerifyPartialResponse(response, destination_url_data)) { | 281 VerifyPartialResponse(response, destination_url_data)) { |
| 281 destination_url_data->set_range_supported(); | 282 destination_url_data->set_range_supported(); |
| 282 } else if (ok_response && pos_ == 0) { | 283 } else if (ok_response && pos_ == 0) { |
| 283 // We accept a 200 response for a Range:0- request, trusting the | 284 // We accept a 200 response for a Range:0- request, trusting the |
| 284 // Accept-Ranges header, because Apache thinks that's a reasonable thing | 285 // Accept-Ranges header, because Apache thinks that's a reasonable thing |
| 285 // to return. | 286 // to return. |
| 286 destination_url_data->set_length(content_length); | 287 destination_url_data->set_length(content_length); |
| 287 } else if (response.httpStatusCode() == kHttpRangeNotSatisfiable) { | 288 } else if (response.httpStatusCode() == kHttpRangeNotSatisfiable) { |
| 289 // Unsatisfiable range |
| 288 // Really, we should never request a range that doesn't exist, but | 290 // Really, we should never request a range that doesn't exist, but |
| 289 // if we do, let's handle it in a sane way. | 291 // if we do, let's handle it in a sane way. |
| 290 // Unsatisfiable range | 292 // Note, we can't just call OnDataProviderEvent() here, because |
| 291 fifo_.push_back(DataBuffer::CreateEOSBuffer()); | 293 // url_data_ hasn't been updated to the final destination yet. |
| 292 destination_url_data->multibuffer()->OnDataProviderEvent(this); | 294 end_of_file = true; |
| 293 return; | |
| 294 } else { | 295 } else { |
| 295 active_loader_ = nullptr; | 296 active_loader_ = nullptr; |
| 296 destination_url_data->Fail(); | 297 destination_url_data->Fail(); |
| 297 return; // "this" may be deleted now. | 298 return; // "this" may be deleted now. |
| 298 } | 299 } |
| 299 } else { | 300 } else { |
| 300 destination_url_data->set_range_supported(); | 301 destination_url_data->set_range_supported(); |
| 301 if (content_length != kPositionNotSpecified) { | 302 if (content_length != kPositionNotSpecified) { |
| 302 destination_url_data->set_length(content_length + byte_pos()); | 303 destination_url_data->set_length(content_length + byte_pos()); |
| 303 } | 304 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 330 | 331 |
| 331 // This test is vital for security! | 332 // This test is vital for security! |
| 332 const GURL& original_url = response.wasFetchedViaServiceWorker() | 333 const GURL& original_url = response.wasFetchedViaServiceWorker() |
| 333 ? response.originalURLViaServiceWorker() | 334 ? response.originalURLViaServiceWorker() |
| 334 : response.url(); | 335 : response.url(); |
| 335 if (!url_data_->ValidateDataOrigin(original_url.GetOrigin())) { | 336 if (!url_data_->ValidateDataOrigin(original_url.GetOrigin())) { |
| 336 active_loader_ = nullptr; | 337 active_loader_ = nullptr; |
| 337 url_data_->Fail(); | 338 url_data_->Fail(); |
| 338 return; // "this" may be deleted now. | 339 return; // "this" may be deleted now. |
| 339 } | 340 } |
| 341 |
| 342 if (end_of_file) { |
| 343 fifo_.push_back(DataBuffer::CreateEOSBuffer()); |
| 344 url_data_->multibuffer()->OnDataProviderEvent(this); |
| 345 } |
| 340 } | 346 } |
| 341 | 347 |
| 342 void ResourceMultiBufferDataProvider::didReceiveData(WebURLLoader* loader, | 348 void ResourceMultiBufferDataProvider::didReceiveData(WebURLLoader* loader, |
| 343 const char* data, | 349 const char* data, |
| 344 int data_length, | 350 int data_length, |
| 345 int encoded_data_length) { | 351 int encoded_data_length) { |
| 346 DVLOG(1) << "didReceiveData: " << data_length << " bytes"; | 352 DVLOG(1) << "didReceiveData: " << data_length << " bytes"; |
| 347 DCHECK(!Available()); | 353 DCHECK(!Available()); |
| 348 DCHECK(active_loader_); | 354 DCHECK(active_loader_); |
| 349 DCHECK_GT(data_length, 0); | 355 DCHECK_GT(data_length, 0); |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 } | 528 } |
| 523 | 529 |
| 524 if (byte_pos() != first_byte_position) { | 530 if (byte_pos() != first_byte_position) { |
| 525 return false; | 531 return false; |
| 526 } | 532 } |
| 527 | 533 |
| 528 return true; | 534 return true; |
| 529 } | 535 } |
| 530 | 536 |
| 531 } // namespace media | 537 } // namespace media |
| OLD | NEW |