| Index: net/spdy/spdy_session.cc
|
| diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
|
| index db4754937463fae658a5ebe600f54206f20c08a2..baef19526526726821986a2f7dbe879ccf0baf5b 100644
|
| --- a/net/spdy/spdy_session.cc
|
| +++ b/net/spdy/spdy_session.cc
|
| @@ -1806,6 +1806,26 @@ void SpdySession::OnStreamFrameData(SpdyStreamId stream_id,
|
| base::Bind(&NetLogSpdyDataCallback, stream_id, len, fin));
|
| }
|
|
|
| + // Build the buffer as early as possible so that we go through the
|
| + // session flow control checks and update
|
| + // |unacked_recv_window_bytes_| properly even when the stream is
|
| + // inactive (since the other side has still reduced its session send
|
| + // window).
|
| + scoped_ptr<SpdyBuffer> buffer;
|
| + if (data) {
|
| + DCHECK_GT(len, 0u);
|
| + buffer.reset(new SpdyBuffer(data, len));
|
| +
|
| + if (flow_control_state_ == FLOW_CONTROL_STREAM_AND_SESSION) {
|
| + DecreaseRecvWindowSize(static_cast<int32>(len));
|
| + buffer->AddConsumeCallback(
|
| + base::Bind(&SpdySession::OnReadBufferConsumed,
|
| + weak_factory_.GetWeakPtr()));
|
| + }
|
| + } else {
|
| + DCHECK_EQ(len, 0u);
|
| + }
|
| +
|
| ActiveStreamMap::iterator it = active_streams_.find(stream_id);
|
|
|
| // By the time data comes in, the stream may already be inactive.
|
| @@ -1822,20 +1842,6 @@ void SpdySession::OnStreamFrameData(SpdyStreamId stream_id,
|
| return;
|
| }
|
|
|
| - scoped_ptr<SpdyBuffer> buffer;
|
| - if (data) {
|
| - DCHECK_GT(len, 0u);
|
| - buffer.reset(new SpdyBuffer(data, len));
|
| -
|
| - if (flow_control_state_ == FLOW_CONTROL_STREAM_AND_SESSION) {
|
| - DecreaseRecvWindowSize(static_cast<int32>(len));
|
| - buffer->AddConsumeCallback(
|
| - base::Bind(&SpdySession::OnReadBufferConsumed,
|
| - weak_factory_.GetWeakPtr()));
|
| - }
|
| - } else {
|
| - DCHECK_EQ(len, 0u);
|
| - }
|
| stream->OnDataReceived(buffer.Pass());
|
| }
|
|
|
|
|