| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 "content/browser/download/parallel_download_utils.h" | 5 #include "content/browser/download/parallel_download_utils.h" |
| 6 | 6 |
| 7 #include "base/metrics/field_trial_params.h" | 7 #include "base/metrics/field_trial_params.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
| 10 #include "content/public/browser/download_save_info.h" | 10 #include "content/public/browser/download_save_info.h" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 !create_info.etag.empty() || !create_info.last_modified.empty(); | 56 !create_info.etag.empty() || !create_info.last_modified.empty(); |
| 57 | 57 |
| 58 return has_strong_validator && create_info.accept_range && | 58 return has_strong_validator && create_info.accept_range && |
| 59 create_info.total_bytes >= GetMinSliceSizeConfig() && | 59 create_info.total_bytes >= GetMinSliceSizeConfig() && |
| 60 create_info.connection_info == | 60 create_info.connection_info == |
| 61 net::HttpResponseInfo::CONNECTION_INFO_HTTP1_1 && | 61 net::HttpResponseInfo::CONNECTION_INFO_HTTP1_1 && |
| 62 base::FeatureList::IsEnabled(features::kParallelDownloading); | 62 base::FeatureList::IsEnabled(features::kParallelDownloading); |
| 63 } | 63 } |
| 64 | 64 |
| 65 std::vector<DownloadItem::ReceivedSlice> FindSlicesForRemainingContent( | 65 std::vector<DownloadItem::ReceivedSlice> FindSlicesForRemainingContent( |
| 66 int64_t bytes_received, | 66 int64_t current_offset, |
| 67 int64_t content_length, | 67 int64_t total_length, |
| 68 int request_count) { | 68 int request_count, |
| 69 std::vector<DownloadItem::ReceivedSlice> slices_to_download; | 69 int64_t min_slice_size) { |
| 70 if (request_count <= 0) | 70 std::vector<DownloadItem::ReceivedSlice> new_slices; |
| 71 return slices_to_download; | |
| 72 | 71 |
| 73 // TODO(xingliu): Consider to use minimum size of a slice. | 72 if (request_count > 0) { |
| 74 int64_t slice_size = content_length / request_count; | 73 int64_t slice_size = |
| 75 slice_size = slice_size > 0 ? slice_size : 1; | 74 std::max<int64_t>(total_length / request_count, min_slice_size); |
| 76 int64_t current_offset = bytes_received; | 75 slice_size = slice_size > 0 ? slice_size : 1; |
| 77 for (int i = 0, num_requests = content_length / slice_size; | 76 for (int i = 0, num_requests = total_length / slice_size; |
| 78 i < num_requests - 1; ++i) { | 77 i < num_requests - 1; ++i) { |
| 79 slices_to_download.emplace_back(current_offset, slice_size); | 78 new_slices.emplace_back(current_offset, slice_size); |
| 80 current_offset += slice_size; | 79 current_offset += slice_size; |
| 80 } |
| 81 } | 81 } |
| 82 | 82 |
| 83 // Last slice is a half open slice, which results in sending range request | 83 // Last slice is a half open slice, which results in sending range request |
| 84 // like "Range:50-" to fetch from 50 bytes to the end of the file. | 84 // like "Range:50-" to fetch from 50 bytes to the end of the file. |
| 85 slices_to_download.emplace_back(current_offset, | 85 new_slices.emplace_back(current_offset, DownloadSaveInfo::kLengthFullContent); |
| 86 DownloadSaveInfo::kLengthFullContent); | 86 return new_slices; |
| 87 return slices_to_download; | |
| 88 } | 87 } |
| 89 | 88 |
| 90 std::vector<DownloadItem::ReceivedSlice> FindSlicesToDownload( | 89 std::vector<DownloadItem::ReceivedSlice> FindSlicesToDownload( |
| 91 const std::vector<DownloadItem::ReceivedSlice>& received_slices) { | 90 const std::vector<DownloadItem::ReceivedSlice>& received_slices) { |
| 92 std::vector<DownloadItem::ReceivedSlice> result; | 91 std::vector<DownloadItem::ReceivedSlice> result; |
| 93 if (received_slices.empty()) { | 92 if (received_slices.empty()) { |
| 94 result.emplace_back(0, DownloadSaveInfo::kLengthFullContent); | 93 result.emplace_back(0, DownloadSaveInfo::kLengthFullContent); |
| 95 return result; | 94 return result; |
| 96 } | 95 } |
| 97 | 96 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 | 163 |
| 165 void DebugSlicesInfo(const DownloadItem::ReceivedSlices& slices) { | 164 void DebugSlicesInfo(const DownloadItem::ReceivedSlices& slices) { |
| 166 DVLOG(1) << "Received slices size : " << slices.size(); | 165 DVLOG(1) << "Received slices size : " << slices.size(); |
| 167 for (const auto& it : slices) { | 166 for (const auto& it : slices) { |
| 168 DVLOG(1) << "Slice offset = " << it.offset | 167 DVLOG(1) << "Slice offset = " << it.offset |
| 169 << " , received_bytes = " << it.received_bytes; | 168 << " , received_bytes = " << it.received_bytes; |
| 170 } | 169 } |
| 171 } | 170 } |
| 172 | 171 |
| 173 } // namespace content | 172 } // namespace content |
| OLD | NEW |