Index: net/spdy/spdy_stream.cc |
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc |
index 40ec654bba429fd91253cd27bf1bf61ac8896794..3a0d988d9f77b3a654a27c668973583dcb8798c3 100644 |
--- a/net/spdy/spdy_stream.cc |
+++ b/net/spdy/spdy_stream.cc |
@@ -794,7 +794,12 @@ void SpdyStream::QueueNextDataFrame() { |
io_state_ == STATE_HALF_CLOSED_REMOTE) << io_state_; |
CHECK_GT(stream_id_, 0u); |
CHECK(pending_send_data_.get()); |
- CHECK_GT(pending_send_data_->BytesRemaining(), 0); |
+ // Only the final fame may have a length of 0. |
mef
2014/08/26 12:58:41
nit: fame -> frame.
|
+ if (pending_send_status_ == NO_MORE_DATA_TO_SEND) { |
+ CHECK_GE(pending_send_data_->BytesRemaining(), 0); |
+ } else { |
+ CHECK_GT(pending_send_data_->BytesRemaining(), 0); |
+ } |
SpdyDataFlags flags = |
(pending_send_status_ == NO_MORE_DATA_TO_SEND) ? |
@@ -814,13 +819,18 @@ void SpdyStream::QueueNextDataFrame() { |
size_t payload_size = |
data_buffer->GetRemainingSize() - session_->GetDataFrameMinimumSize(); |
DCHECK_LE(payload_size, session_->GetDataFrameMaximumPayload()); |
- DecreaseSendWindowSize(static_cast<int32>(payload_size)); |
- // This currently isn't strictly needed, since write frames are |
- // discarded only if the stream is about to be closed. But have it |
- // here anyway just in case this changes. |
- data_buffer->AddConsumeCallback( |
- base::Bind(&SpdyStream::OnWriteBufferConsumed, |
- GetWeakPtr(), payload_size)); |
+ |
+ // Send window size is based on payload size, so nothing to do if this is |
+ // just a FIN with no payload. |
+ if (payload_size != 0) { |
+ DecreaseSendWindowSize(static_cast<int32>(payload_size)); |
+ // This currently isn't strictly needed, since write frames are |
+ // discarded only if the stream is about to be closed. But have it |
+ // here anyway just in case this changes. |
+ data_buffer->AddConsumeCallback( |
+ base::Bind(&SpdyStream::OnWriteBufferConsumed, |
+ GetWeakPtr(), payload_size)); |
+ } |
} |
session_->EnqueueStreamWrite( |