| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "net/quic/chromium/bidirectional_stream_quic_impl.h" | 5 #include "net/quic/chromium/bidirectional_stream_quic_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 } | 105 } |
| 106 | 106 |
| 107 int BidirectionalStreamQuicImpl::ReadData(IOBuffer* buffer, int buffer_len) { | 107 int BidirectionalStreamQuicImpl::ReadData(IOBuffer* buffer, int buffer_len) { |
| 108 DCHECK(buffer); | 108 DCHECK(buffer); |
| 109 DCHECK(buffer_len); | 109 DCHECK(buffer_len); |
| 110 | 110 |
| 111 if (!stream_) { | 111 if (!stream_) { |
| 112 // If the stream is already closed, there is no body to read. | 112 // If the stream is already closed, there is no body to read. |
| 113 return response_status_; | 113 return response_status_; |
| 114 } | 114 } |
| 115 int rv = stream_->Read(buffer, buffer_len); | 115 int rv = stream_->ReadBody( |
| 116 if (rv != ERR_IO_PENDING) { | 116 buffer, buffer_len, |
| 117 if (stream_->IsDoneReading()) { | 117 base::Bind(&BidirectionalStreamQuicImpl::OnReadDataComplete, |
| 118 // If the write side is closed, OnFinRead() will call | 118 weak_factory_.GetWeakPtr())); |
| 119 // BidirectionalStreamQuicImpl::OnClose(). | 119 if (rv == ERR_IO_PENDING) { |
| 120 stream_->OnFinRead(); | 120 read_buffer_ = buffer; |
| 121 } | 121 read_buffer_len_ = buffer_len; |
| 122 return ERR_IO_PENDING; |
| 123 } |
| 124 |
| 125 if (rv < 0) |
| 122 return rv; | 126 return rv; |
| 127 |
| 128 if (stream_->IsDoneReading()) { |
| 129 // If the write side is closed, OnFinRead() will call |
| 130 // BidirectionalStreamQuicImpl::OnClose(). |
| 131 stream_->OnFinRead(); |
| 123 } | 132 } |
| 124 // Read will complete asynchronously and Delegate::OnReadCompleted will be | 133 return rv; |
| 125 // called upon completion. | |
| 126 read_buffer_ = buffer; | |
| 127 read_buffer_len_ = buffer_len; | |
| 128 return ERR_IO_PENDING; | |
| 129 } | 134 } |
| 130 | 135 |
| 131 void BidirectionalStreamQuicImpl::SendData(const scoped_refptr<IOBuffer>& data, | 136 void BidirectionalStreamQuicImpl::SendData(const scoped_refptr<IOBuffer>& data, |
| 132 int length, | 137 int length, |
| 133 bool end_stream) { | 138 bool end_stream) { |
| 134 DCHECK(length > 0 || (length == 0 && end_stream)); | 139 DCHECK(length > 0 || (length == 0 && end_stream)); |
| 135 if (!stream_) { | 140 if (!stream_) { |
| 136 LOG(ERROR) << "Trying to send data after stream has been destroyed."; | 141 LOG(ERROR) << "Trying to send data after stream has been destroyed."; |
| 137 base::ThreadTaskRunnerHandle::Get()->PostTask( | 142 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 138 FROM_HERE, base::Bind(&BidirectionalStreamQuicImpl::NotifyError, | 143 FROM_HERE, base::Bind(&BidirectionalStreamQuicImpl::NotifyError, |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 | 234 |
| 230 void BidirectionalStreamQuicImpl::OnTrailingHeadersAvailable( | 235 void BidirectionalStreamQuicImpl::OnTrailingHeadersAvailable( |
| 231 const SpdyHeaderBlock& headers, | 236 const SpdyHeaderBlock& headers, |
| 232 size_t frame_len) { | 237 size_t frame_len) { |
| 233 headers_bytes_received_ += frame_len; | 238 headers_bytes_received_ += frame_len; |
| 234 if (delegate_) | 239 if (delegate_) |
| 235 delegate_->OnTrailersReceived(headers); | 240 delegate_->OnTrailersReceived(headers); |
| 236 // |this| can be destroyed after this point. | 241 // |this| can be destroyed after this point. |
| 237 } | 242 } |
| 238 | 243 |
| 239 void BidirectionalStreamQuicImpl::OnDataAvailable() { | |
| 240 // Return early if ReadData has not been called. | |
| 241 if (!read_buffer_) | |
| 242 return; | |
| 243 | |
| 244 int rv = ReadData(read_buffer_.get(), read_buffer_len_); | |
| 245 if (rv == ERR_IO_PENDING) { | |
| 246 // Spurrious notification. Wait for the next one. | |
| 247 return; | |
| 248 } | |
| 249 read_buffer_ = nullptr; | |
| 250 read_buffer_len_ = 0; | |
| 251 if (delegate_) | |
| 252 delegate_->OnDataRead(rv); | |
| 253 } | |
| 254 | |
| 255 void BidirectionalStreamQuicImpl::OnClose() { | 244 void BidirectionalStreamQuicImpl::OnClose() { |
| 256 DCHECK(stream_); | 245 DCHECK(stream_); |
| 257 | 246 |
| 258 if (stream_->connection_error() != QUIC_NO_ERROR || | 247 if (stream_->connection_error() != QUIC_NO_ERROR || |
| 259 stream_->stream_error() != QUIC_STREAM_NO_ERROR) { | 248 stream_->stream_error() != QUIC_STREAM_NO_ERROR) { |
| 260 NotifyError(session_->IsCryptoHandshakeConfirmed() | 249 NotifyError(session_->IsCryptoHandshakeConfirmed() |
| 261 ? ERR_QUIC_PROTOCOL_ERROR | 250 ? ERR_QUIC_PROTOCOL_ERROR |
| 262 : ERR_QUIC_HANDSHAKE_FAILED); | 251 : ERR_QUIC_HANDSHAKE_FAILED); |
| 263 return; | 252 return; |
| 264 } | 253 } |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 return; | 305 return; |
| 317 } | 306 } |
| 318 | 307 |
| 319 headers_bytes_received_ += rv; | 308 headers_bytes_received_ += rv; |
| 320 negotiated_protocol_ = kProtoQUIC; | 309 negotiated_protocol_ = kProtoQUIC; |
| 321 connect_timing_ = session_->GetConnectTiming(); | 310 connect_timing_ = session_->GetConnectTiming(); |
| 322 if (delegate_) | 311 if (delegate_) |
| 323 delegate_->OnHeadersReceived(initial_headers_); | 312 delegate_->OnHeadersReceived(initial_headers_); |
| 324 } | 313 } |
| 325 | 314 |
| 315 void BidirectionalStreamQuicImpl::OnReadDataComplete(int rv) { |
| 316 DCHECK_GE(rv, 0); |
| 317 read_buffer_ = nullptr; |
| 318 read_buffer_len_ = 0; |
| 319 |
| 320 if (stream_->IsDoneReading()) { |
| 321 // If the write side is closed, OnFinRead() will call |
| 322 // BidirectionalStreamQuicImpl::OnClose(). |
| 323 stream_->OnFinRead(); |
| 324 } |
| 325 |
| 326 if (delegate_) |
| 327 delegate_->OnDataRead(rv); |
| 328 } |
| 329 |
| 326 void BidirectionalStreamQuicImpl::NotifyError(int error) { | 330 void BidirectionalStreamQuicImpl::NotifyError(int error) { |
| 327 DCHECK_NE(OK, error); | 331 DCHECK_NE(OK, error); |
| 328 DCHECK_NE(ERR_IO_PENDING, error); | 332 DCHECK_NE(ERR_IO_PENDING, error); |
| 329 | 333 |
| 330 ResetStream(); | 334 ResetStream(); |
| 331 if (delegate_) { | 335 if (delegate_) { |
| 332 response_status_ = error; | 336 response_status_ = error; |
| 333 BidirectionalStreamImpl::Delegate* delegate = delegate_; | 337 BidirectionalStreamImpl::Delegate* delegate = delegate_; |
| 334 delegate_ = nullptr; | 338 delegate_ = nullptr; |
| 335 // Cancel any pending callback. | 339 // Cancel any pending callback. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 351 if (!stream_) | 355 if (!stream_) |
| 352 return; | 356 return; |
| 353 closed_stream_received_bytes_ = stream_->stream_bytes_read(); | 357 closed_stream_received_bytes_ = stream_->stream_bytes_read(); |
| 354 closed_stream_sent_bytes_ = stream_->stream_bytes_written(); | 358 closed_stream_sent_bytes_ = stream_->stream_bytes_written(); |
| 355 closed_is_first_stream_ = stream_->IsFirstStream(); | 359 closed_is_first_stream_ = stream_->IsFirstStream(); |
| 356 stream_->ClearDelegate(); | 360 stream_->ClearDelegate(); |
| 357 stream_ = nullptr; | 361 stream_ = nullptr; |
| 358 } | 362 } |
| 359 | 363 |
| 360 } // namespace net | 364 } // namespace net |
| OLD | NEW |