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

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

Issue 1410643007: URLRequestJob: change ReadRawData contract (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address michaeln'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( 206 int ServiceWorkerURLRequestJob::ReadRawData(net::IOBuffer* buf, int buf_size) {
207 net::IOBuffer* buf, int buf_size, int *bytes_read) {
208 DCHECK(buf); 207 DCHECK(buf);
209 DCHECK_GE(buf_size, 0); 208 DCHECK_GE(buf_size, 0);
210 DCHECK(bytes_read);
211 DCHECK(waiting_stream_url_.is_empty()); 209 DCHECK(waiting_stream_url_.is_empty());
210
211 int bytes_read = 0;
212
212 if (stream_.get()) { 213 if (stream_.get()) {
213 switch (stream_->ReadRawData(buf, buf_size, bytes_read)) { 214 switch (stream_->ReadRawData(buf, buf_size, &bytes_read)) {
214 case Stream::STREAM_HAS_DATA: 215 case Stream::STREAM_HAS_DATA:
215 DCHECK_GT(*bytes_read, 0); 216 DCHECK_GT(bytes_read, 0);
216 return true; 217 return bytes_read;
217 case Stream::STREAM_COMPLETE: 218 case Stream::STREAM_COMPLETE:
218 DCHECK(!*bytes_read); 219 DCHECK_EQ(0, bytes_read);
219 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_STREAM_RESPONSE); 220 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_STREAM_RESPONSE);
220 return true; 221 return 0;
221 case Stream::STREAM_EMPTY: 222 case Stream::STREAM_EMPTY:
222 stream_pending_buffer_ = buf; 223 stream_pending_buffer_ = buf;
223 stream_pending_buffer_size_ = buf_size; 224 stream_pending_buffer_size_ = buf_size;
224 SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0)); 225 return net::ERR_IO_PENDING;
225 return false;
226 case Stream::STREAM_ABORTED: 226 case Stream::STREAM_ABORTED:
227 // Handle this as connection reset. 227 // Handle this as connection reset.
228 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_STREAM_ABORTED); 228 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_STREAM_ABORTED);
229 NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, 229 return net::ERR_CONNECTION_RESET;
230 net::ERR_CONNECTION_RESET));
231 return false;
232 } 230 }
233 NOTREACHED(); 231 NOTREACHED();
234 return false; 232 return net::ERR_FAILED;
235 } 233 }
236 234
237 if (!blob_request_) { 235 if (!blob_request_)
238 *bytes_read = 0; 236 return 0;
239 return true; 237 blob_request_->Read(buf, buf_size, &bytes_read);
240 }
241 blob_request_->Read(buf, buf_size, bytes_read);
242 net::URLRequestStatus status = blob_request_->status(); 238 net::URLRequestStatus status = blob_request_->status();
243 SetStatus(status); 239 if (status.status() != net::URLRequestStatus::SUCCESS)
244 if (status.is_io_pending()) 240 return status.error();
245 return false; 241 if (bytes_read == 0)
246 if (status.is_success() && *bytes_read == 0)
247 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE); 242 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
248 return status.is_success(); 243 return bytes_read;
249 } 244 }
250 245
251 // TODO(falken): Refactor Blob and Stream specific handling to separate classes. 246 // TODO(falken): Refactor Blob and Stream specific handling to separate classes.
252 // Overrides for Blob reading ------------------------------------------------- 247 // Overrides for Blob reading -------------------------------------------------
253 248
254 void ServiceWorkerURLRequestJob::OnReceivedRedirect( 249 void ServiceWorkerURLRequestJob::OnReceivedRedirect(
255 net::URLRequest* request, 250 net::URLRequest* request,
256 const net::RedirectInfo& redirect_info, 251 const net::RedirectInfo& redirect_info,
257 bool* defer_redirect) { 252 bool* defer_redirect) {
258 NOTREACHED(); 253 NOTREACHED();
(...skipping 25 matching lines...) Expand all
284 279
285 void ServiceWorkerURLRequestJob::OnResponseStarted(net::URLRequest* request) { 280 void ServiceWorkerURLRequestJob::OnResponseStarted(net::URLRequest* request) {
286 // 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
287 // the ServiceWorkerResponse. 282 // the ServiceWorkerResponse.
288 response_time_ = base::Time::Now(); 283 response_time_ = base::Time::Now();
289 CommitResponseHeader(); 284 CommitResponseHeader();
290 } 285 }
291 286
292 void ServiceWorkerURLRequestJob::OnReadCompleted(net::URLRequest* request, 287 void ServiceWorkerURLRequestJob::OnReadCompleted(net::URLRequest* request,
293 int bytes_read) { 288 int bytes_read) {
294 SetStatus(request->status());
295 if (!request->status().is_success()) { 289 if (!request->status().is_success()) {
296 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_BLOB_READ); 290 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_BLOB_READ);
297 NotifyDone(request->status()); 291 } else if (bytes_read == 0) {
298 return; 292 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
299 } 293 }
300 294 net::URLRequestStatus status = request->status();
301 if (bytes_read == 0) { 295 ReadRawDataComplete(status.is_success() ? bytes_read : status.error());
302 // Protect because NotifyReadComplete() can destroy |this|.
303 scoped_refptr<ServiceWorkerURLRequestJob> protect(this);
304 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
305 NotifyReadComplete(bytes_read);
306 NotifyDone(request->status());
307 return;
308 }
309 NotifyReadComplete(bytes_read);
310 } 296 }
311 297
312 // Overrides for Stream reading ----------------------------------------------- 298 // Overrides for Stream reading -----------------------------------------------
313 299
314 void ServiceWorkerURLRequestJob::OnDataAvailable(Stream* stream) { 300 void ServiceWorkerURLRequestJob::OnDataAvailable(Stream* stream) {
315 // Clear the IO_PENDING status.
316 SetStatus(net::URLRequestStatus());
317 // 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
318 // operation waiting for IO completion. 302 // operation waiting for IO completion.
319 if (!stream_pending_buffer_.get()) 303 if (!stream_pending_buffer_.get())
320 return; 304 return;
321 305
322 // stream_pending_buffer_ is set to the IOBuffer instance provided to 306 // stream_pending_buffer_ is set to the IOBuffer instance provided to
323 // ReadRawData() by URLRequestJob. 307 // ReadRawData() by URLRequestJob.
324 308
325 int bytes_read = 0; 309 int result = 0;
326 switch (stream_->ReadRawData( 310 switch (stream_->ReadRawData(stream_pending_buffer_.get(),
327 stream_pending_buffer_.get(), stream_pending_buffer_size_, &bytes_read)) { 311 stream_pending_buffer_size_, &result)) {
328 case Stream::STREAM_HAS_DATA: 312 case Stream::STREAM_HAS_DATA:
329 DCHECK_GT(bytes_read, 0); 313 DCHECK_GT(result, 0);
330 break; 314 break;
331 case Stream::STREAM_COMPLETE: 315 case Stream::STREAM_COMPLETE:
332 // Calling NotifyReadComplete with 0 signals completion. 316 // Calling NotifyReadComplete with 0 signals completion.
333 DCHECK(!bytes_read); 317 DCHECK(!result);
334 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_STREAM_RESPONSE); 318 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_STREAM_RESPONSE);
335 break; 319 break;
336 case Stream::STREAM_EMPTY: 320 case Stream::STREAM_EMPTY:
337 NOTREACHED(); 321 NOTREACHED();
338 break; 322 break;
339 case Stream::STREAM_ABORTED: 323 case Stream::STREAM_ABORTED:
340 // Handle this as connection reset. 324 // Handle this as connection reset.
325 result = net::ERR_CONNECTION_RESET;
341 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_STREAM_ABORTED); 326 RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_STREAM_ABORTED);
342 NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
343 net::ERR_CONNECTION_RESET));
344 break; 327 break;
345 } 328 }
346 329
347 // 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
348 // safe for the observer to read. 331 // safe for the observer to read.
349 stream_pending_buffer_ = nullptr; 332 stream_pending_buffer_ = nullptr;
350 stream_pending_buffer_size_ = 0; 333 stream_pending_buffer_size_ = 0;
351 NotifyReadComplete(bytes_read); 334 ReadRawDataComplete(result);
352 } 335 }
353 336
354 void ServiceWorkerURLRequestJob::OnStreamRegistered(Stream* stream) { 337 void ServiceWorkerURLRequestJob::OnStreamRegistered(Stream* stream) {
355 StreamContext* stream_context = 338 StreamContext* stream_context =
356 GetStreamContextForResourceContext(resource_context_); 339 GetStreamContextForResourceContext(resource_context_);
357 stream_context->registry()->RemoveRegisterObserver(waiting_stream_url_); 340 stream_context->registry()->RemoveRegisterObserver(waiting_stream_url_);
358 waiting_stream_url_ = GURL(); 341 waiting_stream_url_ = GURL();
359 stream_ = stream; 342 stream_ = stream;
360 stream_->SetReadObserver(this); 343 stream_->SetReadObserver(this);
361 CommitResponseHeader(); 344 CommitResponseHeader();
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 return; 620 return;
638 } 621 }
639 622
640 // We should have a response now. 623 // We should have a response now.
641 DCHECK_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, fetch_result); 624 DCHECK_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, fetch_result);
642 625
643 // 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
644 // error. 627 // error.
645 if (response.status_code == 0) { 628 if (response.status_code == 0) {
646 RecordStatusZeroResponseError(response.error); 629 RecordStatusZeroResponseError(response.error);
647 NotifyDone( 630 NotifyStartError(
648 net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED)); 631 net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED));
649 return; 632 return;
650 } 633 }
651 634
652 load_timing_info_.send_end = base::TimeTicks::Now(); 635 load_timing_info_.send_end = base::TimeTicks::Now();
653 636
654 // Creates a new HttpResponseInfo using the the ServiceWorker script's 637 // Creates a new HttpResponseInfo using the the ServiceWorker script's
655 // HttpResponseInfo to show HTTPS padlock. 638 // HttpResponseInfo to show HTTPS padlock.
656 // 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
657 // 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
812 } 795 }
813 if (!waiting_stream_url_.is_empty()) { 796 if (!waiting_stream_url_.is_empty()) {
814 StreamRegistry* stream_registry = 797 StreamRegistry* stream_registry =
815 GetStreamContextForResourceContext(resource_context_)->registry(); 798 GetStreamContextForResourceContext(resource_context_)->registry();
816 stream_registry->RemoveRegisterObserver(waiting_stream_url_); 799 stream_registry->RemoveRegisterObserver(waiting_stream_url_);
817 stream_registry->AbortPendingStream(waiting_stream_url_); 800 stream_registry->AbortPendingStream(waiting_stream_url_);
818 } 801 }
819 } 802 }
820 803
821 } // namespace content 804 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698