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

Side by Side Diff: content/browser/service_worker/service_worker_url_request_job.cc

Issue 1439953006: Reland: URLRequestJob: change ReadRawData contract (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address David's comment Created 5 years, 1 month 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/service_worker/service_worker_url_request_job.h" 5 #include "content/browser/service_worker/service_worker_url_request_job.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 if (!headers.GetHeader(net::HttpRequestHeaders::kRange, &range_header) || 196 if (!headers.GetHeader(net::HttpRequestHeaders::kRange, &range_header) ||
197 !net::HttpUtil::ParseRangeHeader(range_header, &ranges)) { 197 !net::HttpUtil::ParseRangeHeader(range_header, &ranges)) {
198 return; 198 return;
199 } 199 }
200 200
201 // We don't support multiple range requests in one single URL request. 201 // We don't support multiple range requests in one single URL request.
202 if (ranges.size() == 1U) 202 if (ranges.size() == 1U)
203 byte_range_ = ranges[0]; 203 byte_range_ = ranges[0];
204 } 204 }
205 205
206 bool ServiceWorkerURLRequestJob::ReadRawData(net::IOBuffer* buf, 206 int ServiceWorkerURLRequestJob::ReadRawData(net::IOBuffer* buf, int buf_size) {
207 int buf_size,
208 int* bytes_read) {
209 DCHECK(buf); 207 DCHECK(buf);
210 DCHECK_GE(buf_size, 0); 208 DCHECK_GE(buf_size, 0);
211 DCHECK(bytes_read);
212 DCHECK(waiting_stream_url_.is_empty()); 209 DCHECK(waiting_stream_url_.is_empty());
210
211 int bytes_read = 0;
212
213 if (stream_.get()) { 213 if (stream_.get()) {
214 switch (stream_->ReadRawData(buf, buf_size, bytes_read)) { 214 switch (stream_->ReadRawData(buf, buf_size, &bytes_read)) {
215 case Stream::STREAM_HAS_DATA: 215 case Stream::STREAM_HAS_DATA:
216 DCHECK_GT(*bytes_read, 0); 216 DCHECK_GT(bytes_read, 0);
217 return true; 217 return bytes_read;
218 case Stream::STREAM_COMPLETE: 218 case Stream::STREAM_COMPLETE:
219 DCHECK(!*bytes_read); 219 DCHECK_EQ(0, bytes_read);
220 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_STREAM_RESPONSE); 220 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_STREAM_RESPONSE);
221 return true; 221 return 0;
222 case Stream::STREAM_EMPTY: 222 case Stream::STREAM_EMPTY:
223 stream_pending_buffer_ = buf; 223 stream_pending_buffer_ = buf;
224 stream_pending_buffer_size_ = buf_size; 224 stream_pending_buffer_size_ = buf_size;
225 SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0)); 225 return net::ERR_IO_PENDING;
226 return false;
227 case Stream::STREAM_ABORTED: 226 case Stream::STREAM_ABORTED:
228 // Handle this as connection reset. 227 // Handle this as connection reset.
229 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_STREAM_ABORTED); 228 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_STREAM_ABORTED);
230 NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, 229 return net::ERR_CONNECTION_RESET;
231 net::ERR_CONNECTION_RESET));
232 return false;
233 } 230 }
234 NOTREACHED(); 231 NOTREACHED();
235 return false; 232 return net::ERR_FAILED;
236 } 233 }
237 234
238 if (!blob_request_) { 235 if (!blob_request_)
239 *bytes_read = 0; 236 return 0;
240 return true; 237 blob_request_->Read(buf, buf_size, &bytes_read);
241 }
242 blob_request_->Read(buf, buf_size, bytes_read);
243 net::URLRequestStatus status = blob_request_->status(); 238 net::URLRequestStatus status = blob_request_->status();
244 SetStatus(status); 239 if (status.status() != net::URLRequestStatus::SUCCESS)
245 if (status.is_io_pending()) 240 return status.error();
246 return false; 241 if (bytes_read == 0)
247 if (status.is_success() && *bytes_read == 0)
248 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE); 242 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
249 return status.is_success(); 243 return bytes_read;
250 } 244 }
251 245
252 // TODO(falken): Refactor Blob and Stream specific handling to separate classes. 246 // TODO(falken): Refactor Blob and Stream specific handling to separate classes.
253 // Overrides for Blob reading ------------------------------------------------- 247 // Overrides for Blob reading -------------------------------------------------
254 248
255 void ServiceWorkerURLRequestJob::OnReceivedRedirect( 249 void ServiceWorkerURLRequestJob::OnReceivedRedirect(
256 net::URLRequest* request, 250 net::URLRequest* request,
257 const net::RedirectInfo& redirect_info, 251 const net::RedirectInfo& redirect_info,
258 bool* defer_redirect) { 252 bool* defer_redirect) {
259 NOTREACHED(); 253 NOTREACHED();
(...skipping 25 matching lines...) Expand all
285 279
286 void ServiceWorkerURLRequestJob::OnResponseStarted(net::URLRequest* request) { 280 void ServiceWorkerURLRequestJob::OnResponseStarted(net::URLRequest* request) {
287 // TODO(falken): Add Content-Length, Content-Type if they were not provided in 281 // TODO(falken): Add Content-Length, Content-Type if they were not provided in
288 // the ServiceWorkerResponse. 282 // the ServiceWorkerResponse.
289 response_time_ = base::Time::Now(); 283 response_time_ = base::Time::Now();
290 CommitResponseHeader(); 284 CommitResponseHeader();
291 } 285 }
292 286
293 void ServiceWorkerURLRequestJob::OnReadCompleted(net::URLRequest* request, 287 void ServiceWorkerURLRequestJob::OnReadCompleted(net::URLRequest* request,
294 int bytes_read) { 288 int bytes_read) {
295 SetStatus(request->status());
296 if (!request->status().is_success()) { 289 if (!request->status().is_success()) {
297 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_BLOB_READ); 290 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_BLOB_READ);
298 NotifyDone(request->status()); 291 } else if (bytes_read == 0) {
299 return; 292 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
300 } 293 }
301 294 net::URLRequestStatus status = request->status();
302 if (bytes_read == 0) { 295 ReadRawDataComplete(status.is_success() ? bytes_read : status.error());
303 // Protect because NotifyReadComplete() can destroy |this|.
304 scoped_refptr<ServiceWorkerURLRequestJob> protect(this);
305 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
306 NotifyReadComplete(bytes_read);
307 NotifyDone(request->status());
308 return;
309 }
310 NotifyReadComplete(bytes_read);
311 } 296 }
312 297
313 // Overrides for Stream reading ----------------------------------------------- 298 // Overrides for Stream reading -----------------------------------------------
314 299
315 void ServiceWorkerURLRequestJob::OnDataAvailable(Stream* stream) { 300 void ServiceWorkerURLRequestJob::OnDataAvailable(Stream* stream) {
316 // Clear the IO_PENDING status.
317 SetStatus(net::URLRequestStatus());
318 // Do nothing if stream_pending_buffer_ is empty, i.e. there's no ReadRawData 301 // Do nothing if stream_pending_buffer_ is empty, i.e. there's no ReadRawData
319 // operation waiting for IO completion. 302 // operation waiting for IO completion.
320 if (!stream_pending_buffer_.get()) 303 if (!stream_pending_buffer_.get())
321 return; 304 return;
322 305
323 // stream_pending_buffer_ is set to the IOBuffer instance provided to 306 // stream_pending_buffer_ is set to the IOBuffer instance provided to
324 // ReadRawData() by URLRequestJob. 307 // ReadRawData() by URLRequestJob.
325 308
326 int bytes_read = 0; 309 int result = 0;
327 switch (stream_->ReadRawData(stream_pending_buffer_.get(), 310 switch (stream_->ReadRawData(stream_pending_buffer_.get(),
328 stream_pending_buffer_size_, &bytes_read)) { 311 stream_pending_buffer_size_, &result)) {
329 case Stream::STREAM_HAS_DATA: 312 case Stream::STREAM_HAS_DATA:
330 DCHECK_GT(bytes_read, 0); 313 DCHECK_GT(result, 0);
331 break; 314 break;
332 case Stream::STREAM_COMPLETE: 315 case Stream::STREAM_COMPLETE:
333 // Calling NotifyReadComplete with 0 signals completion. 316 // Calling NotifyReadComplete with 0 signals completion.
334 DCHECK(!bytes_read); 317 DCHECK(!result);
335 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_STREAM_RESPONSE); 318 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_STREAM_RESPONSE);
336 break; 319 break;
337 case Stream::STREAM_EMPTY: 320 case Stream::STREAM_EMPTY:
338 NOTREACHED(); 321 NOTREACHED();
339 break; 322 break;
340 case Stream::STREAM_ABORTED: 323 case Stream::STREAM_ABORTED:
341 // Handle this as connection reset. 324 // Handle this as connection reset.
325 result = net::ERR_CONNECTION_RESET;
342 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_STREAM_ABORTED); 326 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_STREAM_ABORTED);
343 NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
344 net::ERR_CONNECTION_RESET));
345 break; 327 break;
346 } 328 }
347 329
348 // Clear the buffers before notifying the read is complete, so that it is 330 // Clear the buffers before notifying the read is complete, so that it is
349 // safe for the observer to read. 331 // safe for the observer to read.
350 stream_pending_buffer_ = nullptr; 332 stream_pending_buffer_ = nullptr;
351 stream_pending_buffer_size_ = 0; 333 stream_pending_buffer_size_ = 0;
352 NotifyReadComplete(bytes_read); 334 ReadRawDataComplete(result);
353 } 335 }
354 336
355 void ServiceWorkerURLRequestJob::OnStreamRegistered(Stream* stream) { 337 void ServiceWorkerURLRequestJob::OnStreamRegistered(Stream* stream) {
356 StreamContext* stream_context = 338 StreamContext* stream_context =
357 GetStreamContextForResourceContext(resource_context_); 339 GetStreamContextForResourceContext(resource_context_);
358 stream_context->registry()->RemoveRegisterObserver(waiting_stream_url_); 340 stream_context->registry()->RemoveRegisterObserver(waiting_stream_url_);
359 waiting_stream_url_ = GURL(); 341 waiting_stream_url_ = GURL();
360 stream_ = stream; 342 stream_ = stream;
361 stream_->SetReadObserver(this); 343 stream_->SetReadObserver(this);
362 CommitResponseHeader(); 344 CommitResponseHeader();
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 return; 620 return;
639 } 621 }
640 622
641 // We should have a response now. 623 // We should have a response now.
642 DCHECK_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, fetch_result); 624 DCHECK_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, fetch_result);
643 625
644 // A response with status code 0 is Blink telling us to respond with network 626 // A response with status code 0 is Blink telling us to respond with network
645 // error. 627 // error.
646 if (response.status_code == 0) { 628 if (response.status_code == 0) {
647 RecordStatusZeroResponseError(response.error); 629 RecordStatusZeroResponseError(response.error);
648 NotifyDone( 630 NotifyStartError(
649 net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED)); 631 net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED));
650 return; 632 return;
651 } 633 }
652 634
653 load_timing_info_.send_end = base::TimeTicks::Now(); 635 load_timing_info_.send_end = base::TimeTicks::Now();
654 636
655 // Creates a new HttpResponseInfo using the the ServiceWorker script's 637 // Creates a new HttpResponseInfo using the the ServiceWorker script's
656 // HttpResponseInfo to show HTTPS padlock. 638 // HttpResponseInfo to show HTTPS padlock.
657 // TODO(horo): When we support mixed-content (HTTP) no-cors requests from a 639 // TODO(horo): When we support mixed-content (HTTP) no-cors requests from a
658 // ServiceWorker, we have to check the security level of the responses. 640 // ServiceWorker, we have to check the security level of the responses.
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 } 795 }
814 if (!waiting_stream_url_.is_empty()) { 796 if (!waiting_stream_url_.is_empty()) {
815 StreamRegistry* stream_registry = 797 StreamRegistry* stream_registry =
816 GetStreamContextForResourceContext(resource_context_)->registry(); 798 GetStreamContextForResourceContext(resource_context_)->registry();
817 stream_registry->RemoveRegisterObserver(waiting_stream_url_); 799 stream_registry->RemoveRegisterObserver(waiting_stream_url_);
818 stream_registry->AbortPendingStream(waiting_stream_url_); 800 stream_registry->AbortPendingStream(waiting_stream_url_);
819 } 801 }
820 } 802 }
821 803
822 } // namespace content 804 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698