Chromium Code Reviews| Index: ios/net/crn_http_protocol_handler.mm |
| diff --git a/ios/net/crn_http_protocol_handler.mm b/ios/net/crn_http_protocol_handler.mm |
| index ed736375c7f125462c80ccff9265e1e4740dfedb..ac23ad6c5cba6e3a152780f26249e498a0a8dfdd 100644 |
| --- a/ios/net/crn_http_protocol_handler.mm |
| +++ b/ios/net/crn_http_protocol_handler.mm |
| @@ -150,7 +150,7 @@ class HttpProtocolHandlerCore |
| void OnSSLCertificateError(URLRequest* request, |
| const SSLInfo& ssl_info, |
| bool fatal) override; |
| - void OnResponseStarted(URLRequest* request) override; |
| + void OnResponseStarted(URLRequest* request, int net_error) override; |
| void OnReadCompleted(URLRequest* request, int bytes_read) override; |
| private: |
| @@ -453,16 +453,16 @@ void HttpProtocolHandlerCore::OnSSLCertificateError(URLRequest* request, |
| } |
| } |
| -void HttpProtocolHandlerCore::OnResponseStarted(URLRequest* request) { |
| +void HttpProtocolHandlerCore::OnResponseStarted(URLRequest* request, |
| + int net_error) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| + DCHECK_NE(net::ERR_IO_PENDING, net_error); |
| if (net_request_ == nullptr) |
| return; |
| - const URLRequestStatus& status = request->status(); |
| - if (!status.is_success()) { |
| - int error = status.error(); |
| - StopRequestWithError(IOSErrorCode(error), error); |
| + if (net_error != net::OK) { |
| + StopRequestWithError(IOSErrorCode(net_error), net_error); |
| return; |
| } |
| @@ -507,18 +507,21 @@ void HttpProtocolHandlerCore::StartReading() { |
| // using it and the object is not re-entrant. |
| [top_level_client_ didReceiveResponse:response]; |
| - int bytes_read = 0; |
| + int bytes_read = net_request_->Read(buffer_.get(), kIOBufferSize); |
| + if (bytes_read == net::ERR_IO_PENDING) |
| + return; |
| - if (net_request_->Read(buffer_.get(), kIOBufferSize, &bytes_read)) { |
| + if (bytes_read >= 0) { |
| OnReadCompleted(net_request_, bytes_read); |
| - } else if (!net_request_->status().is_success()) { |
| - int error = net_request_->status().error(); |
| + } else { |
| + int error = bytes_read; |
| StopRequestWithError(IOSErrorCode(error), error); |
| } |
| } |
| void HttpProtocolHandlerCore::OnReadCompleted(URLRequest* request, |
| int bytes_read) { |
| + DCHECK_NE(net::ERR_IO_PENDING, bytes_read); |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| if (net_request_ == nullptr) |
| @@ -530,25 +533,21 @@ void HttpProtocolHandlerCore::OnReadCompleted(URLRequest* request, |
| // TODO(droger): It may be possible to avoid some of the copies (using |
| // WrappedIOBuffer for example). |
| NSUInteger data_length; |
| - bool loop = (bytes_read > 0); |
| - bool io_pending = false; |
| - uint64_t total_byte_read = loop ? bytes_read : 0; |
| - while (loop) { |
| + uint64_t total_byte_read = 0; |
| + while (bytes_read > 0) { |
| + total_byte_read += bytes_read; |
| data_length = [data length]; // Assumes that getting the length is fast. |
| [data increaseLengthBy:bytes_read]; |
| memcpy(reinterpret_cast<char*>([data mutableBytes]) + data_length, |
| buffer_->data(), bytes_read); |
| - io_pending = !request->Read(buffer_.get(), kIOBufferSize, &bytes_read); |
| - loop = !io_pending && (bytes_read > 0); |
| - total_byte_read += bytes_read; |
| + request->Read(buffer_.get(), kIOBufferSize, &bytes_read); |
|
droger
2016/09/05 09:21:31
Do you want to update this call too?
maksims (do not use this acc)
2016/09/05 10:39:12
Yes.
https://codereview.chromium.org/2262653003/d
|
| } |
| if (tracker_) |
| tracker_->CaptureReceivedBytes(request, total_byte_read); |
| // Notify the client. |
| - const URLRequestStatus& status = request->status(); |
| - if (status.is_success()) { |
| + if (bytes_read == net::OK || bytes_read == net::ERR_IO_PENDING) { |
| if ([data length] > 0) { |
| // If the data is not encoded in UTF8, the NSString is nil. |
| DVLOG(3) << "To client:" << std::endl |
| @@ -557,7 +556,7 @@ void HttpProtocolHandlerCore::OnReadCompleted(URLRequest* request, |
| encoding:NSUTF8StringEncoding] autorelease]); |
| [top_level_client_ didLoadData:data]; |
| } |
| - if (bytes_read == 0 && !io_pending) { |
| + if (bytes_read == 0) { |
| DCHECK_EQ(net_request_, request); |
| // There is nothing more to read. |
| StopNetRequest(); |
| @@ -565,7 +564,7 @@ void HttpProtocolHandlerCore::OnReadCompleted(URLRequest* request, |
| } |
| } else { |
| // Request failed (not canceled). |
| - int error = status.error(); |
| + int error = bytes_read; |
| StopRequestWithError(IOSErrorCode(error), error); |
| } |
| } |