| 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();
|
| }
|
| }
|
|
|