| Index: components/image_fetcher/core/image_data_fetcher.cc
|
| diff --git a/components/image_fetcher/core/image_data_fetcher.cc b/components/image_fetcher/core/image_data_fetcher.cc
|
| index 0ef812f6465ffe2436e7aed35d73fa781d14c0ab..56078f7005509f873f7691bafa27b5da8432993d 100644
|
| --- a/components/image_fetcher/core/image_data_fetcher.cc
|
| +++ b/components/image_fetcher/core/image_data_fetcher.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "components/image_fetcher/core/image_data_fetcher.h"
|
|
|
| +#include <utility>
|
| +
|
| #include "net/base/load_flags.h"
|
| #include "net/http/http_response_headers.h"
|
| #include "net/http/http_status_code.h"
|
| @@ -45,6 +47,11 @@ void ImageDataFetcher::SetDataUseServiceName(
|
| data_use_service_name_ = data_use_service_name;
|
| }
|
|
|
| +void ImageDataFetcher::SetImageDownloadLimit(
|
| + base::Optional<int64_t> max_download_bytes) {
|
| + max_download_bytes_ = max_download_bytes;
|
| +}
|
| +
|
| void ImageDataFetcher::FetchImageData(
|
| const GURL& image_url,
|
| const ImageDataFetcherCallback& callback) {
|
| @@ -77,9 +84,7 @@ void ImageDataFetcher::FetchImageData(
|
| }
|
|
|
| void ImageDataFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
|
| - auto request_iter = pending_requests_.find(source);
|
| - DCHECK(request_iter != pending_requests_.end());
|
| -
|
| + DCHECK(pending_requests_.find(source) != pending_requests_.end());
|
| bool success = source->GetStatus().status() == net::URLRequestStatus::SUCCESS;
|
|
|
| RequestMetadata metadata;
|
| @@ -94,9 +99,35 @@ void ImageDataFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
|
| if (success) {
|
| source->GetResponseAsString(&image_data);
|
| }
|
| - request_iter->second->callback.Run(image_data, metadata);
|
| + FinishRequest(source, metadata, image_data);
|
| +}
|
|
|
| - // Remove the finished request.
|
| +void ImageDataFetcher::OnURLFetchDownloadProgress(
|
| + const net::URLFetcher* source,
|
| + int64_t current,
|
| + int64_t total,
|
| + int64_t current_network_bytes) {
|
| + if (!max_download_bytes_.has_value()) {
|
| + return;
|
| + }
|
| + if (total <= max_download_bytes_.value() &&
|
| + current <= max_download_bytes_.value()) {
|
| + return;
|
| + }
|
| + DCHECK(pending_requests_.find(source) != pending_requests_.end());
|
| + DLOG(WARNING) << "Image data exceeded download size limit.";
|
| + RequestMetadata metadata;
|
| + metadata.http_response_code = net::URLFetcher::RESPONSE_CODE_INVALID;
|
| +
|
| + FinishRequest(source, metadata, /*image_data=*/std::string());
|
| +}
|
| +
|
| +void ImageDataFetcher::FinishRequest(const net::URLFetcher* source,
|
| + const RequestMetadata& metadata,
|
| + const std::string& image_data) {
|
| + auto request_iter = pending_requests_.find(source);
|
| + DCHECK(request_iter != pending_requests_.end());
|
| + request_iter->second->callback.Run(image_data, metadata);
|
| pending_requests_.erase(request_iter);
|
| }
|
|
|
|
|