| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/quic_chromium_client_stream.h" | 5 #include "net/quic/chromium/quic_chromium_client_stream.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 void QuicChromiumClientStream::OnError(int error) { | 242 void QuicChromiumClientStream::OnError(int error) { |
| 243 if (delegate_) { | 243 if (delegate_) { |
| 244 QuicChromiumClientStream::Delegate* delegate = delegate_; | 244 QuicChromiumClientStream::Delegate* delegate = delegate_; |
| 245 delegate_ = nullptr; | 245 delegate_ = nullptr; |
| 246 delegate_tasks_.clear(); | 246 delegate_tasks_.clear(); |
| 247 delegate->OnError(error); | 247 delegate->OnError(error); |
| 248 } | 248 } |
| 249 } | 249 } |
| 250 | 250 |
| 251 int QuicChromiumClientStream::Read(IOBuffer* buf, int buf_len) { | 251 int QuicChromiumClientStream::Read(IOBuffer* buf, int buf_len) { |
| 252 if (sequencer()->IsClosed()) | 252 if (IsDoneReading()) |
| 253 return 0; // EOF | 253 return 0; // EOF |
| 254 | 254 |
| 255 if (!HasBytesToRead()) | 255 if (!HasBytesToRead()) |
| 256 return ERR_IO_PENDING; | 256 return ERR_IO_PENDING; |
| 257 | 257 |
| 258 iovec iov; | 258 iovec iov; |
| 259 iov.iov_base = buf->data(); | 259 iov.iov_base = buf->data(); |
| 260 iov.iov_len = buf_len; | 260 iov.iov_len = buf_len; |
| 261 return Readv(&iov, 1); | 261 size_t bytes_read = Readv(&iov, 1); |
| 262 // If no more body bytes and trailers are to be delivered, return |
| 263 // ERR_IO_PENDING now because onDataAvailable() will be called after trailers. |
| 264 if (bytes_read == 0 && !FinishedReadingTrailers()) |
| 265 return ERR_IO_PENDING; |
| 266 return bytes_read; |
| 262 } | 267 } |
| 263 | 268 |
| 264 bool QuicChromiumClientStream::CanWrite(const CompletionCallback& callback) { | 269 bool QuicChromiumClientStream::CanWrite(const CompletionCallback& callback) { |
| 265 bool can_write = session()->connection()->CanWrite(HAS_RETRANSMITTABLE_DATA); | 270 bool can_write = session()->connection()->CanWrite(HAS_RETRANSMITTABLE_DATA); |
| 266 if (!can_write) { | 271 if (!can_write) { |
| 267 session()->MarkConnectionLevelWriteBlocked(id()); | 272 session()->MarkConnectionLevelWriteBlocked(id()); |
| 268 DCHECK(callback_.is_null()); | 273 DCHECK(callback_.is_null()); |
| 269 callback_ = callback; | 274 callback_ = callback; |
| 270 } | 275 } |
| 271 return can_write; | 276 return can_write; |
| 272 } | 277 } |
| 273 | 278 |
| 274 void QuicChromiumClientStream::NotifyDelegateOfHeadersCompleteLater( | 279 void QuicChromiumClientStream::NotifyDelegateOfHeadersCompleteLater( |
| 275 SpdyHeaderBlock headers, | 280 SpdyHeaderBlock headers, |
| 276 size_t frame_len) { | 281 size_t frame_len) { |
| 277 RunOrBuffer(base::Bind( | 282 RunOrBuffer(base::Bind( |
| 278 &QuicChromiumClientStream::NotifyDelegateOfHeadersComplete, | 283 &QuicChromiumClientStream::NotifyDelegateOfHeadersComplete, |
| 279 weak_factory_.GetWeakPtr(), base::Passed(std::move(headers)), frame_len)); | 284 weak_factory_.GetWeakPtr(), base::Passed(std::move(headers)), frame_len)); |
| 280 } | 285 } |
| 281 | 286 |
| 282 void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete( | 287 void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete( |
| 283 SpdyHeaderBlock headers, | 288 SpdyHeaderBlock headers, |
| 284 size_t frame_len) { | 289 size_t frame_len) { |
| 285 if (!delegate_) | 290 if (!delegate_) |
| 286 return; | 291 return; |
| 287 // Only mark trailers consumed when we are about to notify delegate. | 292 // Only mark trailers consumed when we are about to notify delegate. |
| 288 if (headers_delivered_) { | 293 if (headers_delivered_) { |
| 289 MarkTrailersConsumed(decompressed_trailers().length()); | 294 MarkTrailersConsumed(decompressed_trailers().length()); |
| 290 MarkTrailersConsumed(); | 295 MarkTrailersConsumed(); |
| 296 // Post an async task to notify delegate of the FIN flag. |
| 297 NotifyDelegateOfDataAvailableLater(); |
| 291 net_log_.AddEvent( | 298 net_log_.AddEvent( |
| 292 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS, | 299 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS, |
| 293 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers)); | 300 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers)); |
| 294 } else { | 301 } else { |
| 295 headers_delivered_ = true; | 302 headers_delivered_ = true; |
| 296 net_log_.AddEvent( | 303 net_log_.AddEvent( |
| 297 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_HEADERS, | 304 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_HEADERS, |
| 298 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers)); | 305 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers)); |
| 299 } | 306 } |
| 300 | 307 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 322 | 329 |
| 323 void QuicChromiumClientStream::DisableConnectionMigration() { | 330 void QuicChromiumClientStream::DisableConnectionMigration() { |
| 324 can_migrate_ = false; | 331 can_migrate_ = false; |
| 325 } | 332 } |
| 326 | 333 |
| 327 bool QuicChromiumClientStream::IsFirstStream() { | 334 bool QuicChromiumClientStream::IsFirstStream() { |
| 328 return id() == kHeadersStreamId + 2; | 335 return id() == kHeadersStreamId + 2; |
| 329 } | 336 } |
| 330 | 337 |
| 331 } // namespace net | 338 } // namespace net |
| OLD | NEW |