Index: components/cronet/ios/cronet_bidirectional_stream.cc |
diff --git a/components/cronet/ios/cronet_bidirectional_stream.cc b/components/cronet/ios/cronet_bidirectional_stream.cc |
index a39721a26ef077a852e1a29b8e996089a51833fc..234d96feb89612c913cdee2baeb0c3b35c669293 100644 |
--- a/components/cronet/ios/cronet_bidirectional_stream.cc |
+++ b/components/cronet/ios/cronet_bidirectional_stream.cc |
@@ -158,6 +158,8 @@ void CronetBidirectionalStream::Destroy() { |
void CronetBidirectionalStream::OnStreamReady(bool request_headers_sent) { |
DCHECK(environment_->IsOnNetworkThread()); |
DCHECK_EQ(STARTED, write_state_); |
+ if (!bidi_stream_) |
+ return; |
request_headers_sent_ = request_headers_sent; |
write_state_ = WAITING_FOR_FLUSH; |
if (write_end_of_stream_) { |
@@ -175,6 +177,8 @@ void CronetBidirectionalStream::OnHeadersReceived( |
const net::SpdyHeaderBlock& response_headers) { |
DCHECK(environment_->IsOnNetworkThread()); |
DCHECK_EQ(STARTED, read_state_); |
+ if (!bidi_stream_) |
+ return; |
read_state_ = WAITING_FOR_READ; |
// Get http status code from response headers. |
int http_status_code = 0; |
@@ -198,6 +202,8 @@ void CronetBidirectionalStream::OnHeadersReceived( |
void CronetBidirectionalStream::OnDataRead(int bytes_read) { |
DCHECK(environment_->IsOnNetworkThread()); |
DCHECK_EQ(READING, read_state_); |
+ if (!bidi_stream_) |
+ return; |
read_state_ = WAITING_FOR_READ; |
delegate_->OnDataRead(read_buffer_->data(), bytes_read); |
@@ -210,6 +216,8 @@ void CronetBidirectionalStream::OnDataRead(int bytes_read) { |
void CronetBidirectionalStream::OnDataSent() { |
DCHECK(environment_->IsOnNetworkThread()); |
+ if (!bidi_stream_) |
+ return; |
DCHECK_EQ(WRITING, write_state_); |
write_state_ = WAITING_FOR_FLUSH; |
for (const scoped_refptr<net::IOBuffer>& buffer : |
@@ -231,14 +239,21 @@ void CronetBidirectionalStream::OnDataSent() { |
void CronetBidirectionalStream::OnTrailersReceived( |
const net::SpdyHeaderBlock& response_trailers) { |
DCHECK(environment_->IsOnNetworkThread()); |
+ if (!bidi_stream_) |
+ return; |
delegate_->OnTrailersReceived(response_trailers); |
} |
void CronetBidirectionalStream::OnFailed(int error) { |
DCHECK(environment_->IsOnNetworkThread()); |
+ if (!bidi_stream_ && read_state_ != NOT_STARTED) |
+ return; |
read_state_ = write_state_ = ERROR; |
- bidi_stream_.reset(); |
weak_factory_.InvalidateWeakPtrs(); |
+ // Delete underlying |bidi_stream_| asynchronously as it may still be used. |
+ environment_->PostToNetworkThread( |
+ FROM_HERE, base::Bind(&base::DeletePointer<net::BidirectionalStream>, |
+ bidi_stream_.release())); |
delegate_->OnFailed(error); |
} |
@@ -265,7 +280,7 @@ void CronetBidirectionalStream::ReadDataOnNetworkThread( |
DCHECK(read_buffer); |
DCHECK(!read_buffer_); |
if (read_state_ != WAITING_FOR_READ) { |
- DLOG(ERROR) << "Unexpected Read Data in read_state " << WAITING_FOR_READ; |
+ DLOG(ERROR) << "Unexpected Read Data in read_state " << read_state_; |
// Invoke OnFailed unless it is already invoked. |
if (read_state_ != ERROR) |
OnFailed(net::ERR_UNEXPECTED); |
@@ -359,10 +374,15 @@ void CronetBidirectionalStream::DestroyOnNetworkThread() { |
void CronetBidirectionalStream::MaybeOnSucceded() { |
DCHECK(environment_->IsOnNetworkThread()); |
+ if (!bidi_stream_) |
+ return; |
if (read_state_ == READING_DONE && write_state_ == WRITING_DONE) { |
read_state_ = write_state_ = SUCCESS; |
- bidi_stream_.reset(); |
weak_factory_.InvalidateWeakPtrs(); |
+ // Delete underlying |bidi_stream_| asynchronously as it may still be used. |
+ environment_->PostToNetworkThread( |
+ FROM_HERE, base::Bind(&base::DeletePointer<net::BidirectionalStream>, |
+ bidi_stream_.release())); |
delegate_->OnSucceeded(); |
} |
} |