Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: content/browser/download/download_resource_handler.cc

Issue 11571025: Initial CL for Downloads resumption. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed CanResumeDownload (unused) and updated comment in RDH::BeginDownload. Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/download_resource_handler.h" 5 #include "content/browser/download/download_resource_handler.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 DownloadItem* item = download_manager->StartDownload( 66 DownloadItem* item = download_manager->StartDownload(
67 info.Pass(), stream.Pass()); 67 info.Pass(), stream.Pass());
68 68
69 if (!started_cb.is_null()) 69 if (!started_cb.is_null())
70 started_cb.Run(item, net::OK); 70 started_cb.Run(item, net::OK);
71 } 71 }
72 72
73 } // namespace 73 } // namespace
74 74
75 DownloadResourceHandler::DownloadResourceHandler( 75 DownloadResourceHandler::DownloadResourceHandler(
76 DownloadId id,
76 net::URLRequest* request, 77 net::URLRequest* request,
77 const DownloadResourceHandler::OnStartedCallback& started_cb, 78 const DownloadResourceHandler::OnStartedCallback& started_cb,
78 scoped_ptr<DownloadSaveInfo> save_info) 79 scoped_ptr<DownloadSaveInfo> save_info)
79 : render_view_id_(0), // Actually initialized below. 80 : download_id_(id),
81 render_view_id_(0), // Actually initialized below.
80 content_length_(0), 82 content_length_(0),
81 request_(request), 83 request_(request),
82 started_cb_(started_cb), 84 started_cb_(started_cb),
83 save_info_(save_info.Pass()), 85 save_info_(save_info.Pass()),
84 last_buffer_size_(0), 86 last_buffer_size_(0),
85 bytes_read_(0), 87 bytes_read_(0),
86 pause_count_(0), 88 pause_count_(0),
87 was_deferred_(false), 89 was_deferred_(false),
88 on_response_started_called_(false) { 90 on_response_started_called_(false) {
89 ResourceRequestInfoImpl* info(ResourceRequestInfoImpl::ForRequest(request)); 91 ResourceRequestInfoImpl* info(ResourceRequestInfoImpl::ForRequest(request));
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 144
143 // Create the ByteStream for sending data to the download sink. 145 // Create the ByteStream for sending data to the download sink.
144 scoped_ptr<ByteStreamReader> stream_reader; 146 scoped_ptr<ByteStreamReader> stream_reader;
145 CreateByteStream( 147 CreateByteStream(
146 base::MessageLoopProxy::current(), 148 base::MessageLoopProxy::current(),
147 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE), 149 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE),
148 kDownloadByteStreamSize, &stream_writer_, &stream_reader); 150 kDownloadByteStreamSize, &stream_writer_, &stream_reader);
149 stream_writer_->RegisterCallback( 151 stream_writer_->RegisterCallback(
150 base::Bind(&DownloadResourceHandler::ResumeRequest, AsWeakPtr())); 152 base::Bind(&DownloadResourceHandler::ResumeRequest, AsWeakPtr()));
151 153
154 info->download_id = download_id_;
152 info->url_chain = request_->url_chain(); 155 info->url_chain = request_->url_chain();
153 info->referrer_url = GURL(request_->referrer()); 156 info->referrer_url = GURL(request_->referrer());
154 info->start_time = base::Time::Now(); 157 info->start_time = base::Time::Now();
155 info->total_bytes = content_length_; 158 info->total_bytes = content_length_;
156 info->has_user_gesture = request_info->HasUserGesture(); 159 info->has_user_gesture = request_info->HasUserGesture();
157 info->content_disposition = content_disposition_; 160 info->content_disposition = content_disposition_;
158 info->mime_type = response->head.mime_type; 161 info->mime_type = response->head.mime_type;
159 info->remote_address = request_->GetSocketAddress().host(); 162 info->remote_address = request_->GetSocketAddress().host();
160 RecordDownloadMimeType(info->mime_type); 163 RecordDownloadMimeType(info->mime_type);
161 RecordDownloadContentDisposition(info->content_disposition); 164 RecordDownloadContentDisposition(info->content_disposition);
162 165
163 info->request_handle = 166 info->request_handle =
164 DownloadRequestHandle(AsWeakPtr(), global_id_.child_id, 167 DownloadRequestHandle(AsWeakPtr(), global_id_.child_id,
165 render_view_id_, global_id_.request_id); 168 render_view_id_, global_id_.request_id);
166 169
167 // Get the last modified time and etag. 170 // Get the last modified time and etag.
168 const net::HttpResponseHeaders* headers = request_->response_headers(); 171 const net::HttpResponseHeaders* headers = request_->response_headers();
169 if (headers) { 172 if (headers) {
170 std::string last_modified_hdr; 173 std::string last_modified_hdr;
171 std::string etag; 174 std::string etag;
172 if (headers->EnumerateHeader(NULL, "Last-Modified", &last_modified_hdr)) 175 if (headers->EnumerateHeader(NULL, "Last-Modified", &last_modified_hdr))
173 info->last_modified = last_modified_hdr; 176 info->last_modified = last_modified_hdr;
174 if (headers->EnumerateHeader(NULL, "ETag", &etag)) 177 if (headers->EnumerateHeader(NULL, "ETag", &etag))
175 info->etag = etag; 178 info->etag = etag;
179
180 int status = headers->response_code();
181 if (status == 200) { // Continue with download:
benjhayden 2013/01/06 15:46:04 This is a browser. If there isn't a constant somew
Randy Smith (Not in Mondays) 2013/01/07 20:54:10 Depressingly enough, when I use code search to loo
benjhayden 2013/01/07 21:14:34 Please use net/http/http_status_code.h
Randy Smith (Not in Mondays) 2013/01/08 16:07:03 But all the *other* lemmings are going off the cli
182 // Downloading the full file. If we asked for a range, we didn't
183 // get it--reset the file pointers to reflect that.
184 save_info_->offset = 0;
185 save_info_->hash_state = "";
186 }
176 } 187 }
177 188
178 std::string content_type_header; 189 std::string content_type_header;
179 if (!response->head.headers || 190 if (!response->head.headers ||
180 !response->head.headers->GetMimeType(&content_type_header)) 191 !response->head.headers->GetMimeType(&content_type_header))
181 content_type_header = ""; 192 content_type_header = "";
182 info->original_mime_type = content_type_header; 193 info->original_mime_type = content_type_header;
183 194
184 if (!response->head.headers || 195 if (!response->head.headers ||
185 !response->head.headers->EnumerateHeader( 196 !response->head.headers->EnumerateHeader(
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 // stack cancelled the request. There aren't that many things that 327 // stack cancelled the request. There aren't that many things that
317 // could do this to a download request (whose lifetime is separated from 328 // could do this to a download request (whose lifetime is separated from
318 // the tab from which it came). We map this to USER_CANCELLED as the 329 // the tab from which it came). We map this to USER_CANCELLED as the
319 // case we know about (system suspend because of laptop close) corresponds 330 // case we know about (system suspend because of laptop close) corresponds
320 // to a user action. 331 // to a user action.
321 // TODO(ahendrickson) -- Find a better set of codes to use here, as 332 // TODO(ahendrickson) -- Find a better set of codes to use here, as
322 // CANCELED/ERR_ABORTED can occur for reasons other than user cancel. 333 // CANCELED/ERR_ABORTED can occur for reasons other than user cancel.
323 reason = DOWNLOAD_INTERRUPT_REASON_USER_CANCELED; 334 reason = DOWNLOAD_INTERRUPT_REASON_USER_CANCELED;
324 } 335 }
325 336
326 if (status.is_success()) { 337 if (status.is_success() &&
327 if (response_code >= 400) { 338 (reason == DOWNLOAD_INTERRUPT_REASON_NONE) &&
339 request_->response_headers()) {
340 // Handle server's response codes.
341 if ((response_code >= 0) && ((response_code % 100) != 2)) {
benjhayden 2013/01/06 15:46:04 There really ought to be a function somewhere like
benjhayden 2013/01/06 15:46:04 Looks like the >= should be >
Randy Smith (Not in Mondays) 2013/01/07 20:54:10 I'm not sure where to look. I'd expect to see it
Randy Smith (Not in Mondays) 2013/01/07 20:54:10 Happy to change it, but what's the use case? I'm
benjhayden 2013/01/07 21:14:34 There isn't a use-case, it just takes the sphinx-l
Randy Smith (Not in Mondays) 2013/01/08 16:07:03 Ok, ok, you win. (Aka you're completely right and
328 switch(response_code) { 342 switch(response_code) {
329 case 404: // File Not Found. 343 // Continue with download:
344 case 200: // Downloading the full file, even if we asked for a
benjhayden 2013/01/06 15:46:04 Are there constants that we can use instead of the
Randy Smith (Not in Mondays) 2013/01/07 20:54:10 As mentioned above, didn't find any in the way I t
345 // range.
346 case 206: // Partial content. Leave alone.
347 break;
348 case 204: // No content. File not present.
349 case 404: // File Not Found.
330 reason = DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; 350 reason = DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
331 break; 351 break;
352 case 412: // Precondition failed. Fails 'If-Unmodified-Since' or
353 // 'If-Match'.
354 reason = DOWNLOAD_INTERRUPT_REASON_SERVER_PRECONDITION;
355 break;
332 case 416: // Range Not Satisfiable. 356 case 416: // Range Not Satisfiable.
357 // Retry by downloading from the start automatically:
358 // If we haven't received data when we get this error, we won't.
333 reason = DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE; 359 reason = DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE;
334 break; 360 break;
335 case 412: // Precondition Failed. 361 default: // All other errors.
336 reason = DOWNLOAD_INTERRUPT_REASON_SERVER_PRECONDITION;
337 break;
338 default:
339 reason = DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED; 362 reason = DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED;
340 break; 363 break;
341 } 364 }
342 } 365 }
343 } 366 }
344 367
345 RecordAcceptsRanges(accept_ranges_, bytes_read_); 368 RecordAcceptsRanges(accept_ranges_, bytes_read_);
346 RecordNetworkBlockage( 369 RecordNetworkBlockage(
347 base::TimeTicks::Now() - download_start_time_, total_pause_time_); 370 base::TimeTicks::Now() - download_start_time_, total_pause_time_);
348 371
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 474
452 // Remove output stream callback if a stream exists. 475 // Remove output stream callback if a stream exists.
453 if (stream_writer_.get()) 476 if (stream_writer_.get())
454 stream_writer_->RegisterCallback(base::Closure()); 477 stream_writer_->RegisterCallback(base::Closure());
455 478
456 UMA_HISTOGRAM_TIMES("SB2.DownloadDuration", 479 UMA_HISTOGRAM_TIMES("SB2.DownloadDuration",
457 base::TimeTicks::Now() - download_start_time_); 480 base::TimeTicks::Now() - download_start_time_);
458 } 481 }
459 482
460 } // namespace content 483 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698