diff options
author | rtenneti@google.com <rtenneti@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-16 23:31:22 +0000 |
---|---|---|
committer | rtenneti@google.com <rtenneti@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-16 23:31:22 +0000 |
commit | e92fa7e1e7d5429b0a020025b9681afb3dcd4a19 (patch) | |
tree | 65de50b784855b5f34289bca67903feea6ce0e29 | |
parent | 67cf7cd5b5f62591f3bb294df539850002983e9c (diff) | |
download | chromium_src-e92fa7e1e7d5429b0a020025b9681afb3dcd4a19.zip chromium_src-e92fa7e1e7d5429b0a020025b9681afb3dcd4a19.tar.gz chromium_src-e92fa7e1e7d5429b0a020025b9681afb3dcd4a19.tar.bz2 |
SPDY Proxy - Bug fix to handle flow control (spdy/2.1)
Increase receive window size with bytes read.
BUG=114064
R=willchan
TEST=spdy tests. Accessing mail with SPDY proxy enabled.
Review URL: https://chromiumcodereview.appspot.com/9392030
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@122395 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | net/spdy/spdy_http_stream.cc | 3 | ||||
-rw-r--r-- | net/spdy/spdy_proxy_client_socket.cc | 7 | ||||
-rw-r--r-- | net/spdy/spdy_stream.cc | 10 |
3 files changed, 15 insertions, 5 deletions
diff --git a/net/spdy/spdy_http_stream.cc b/net/spdy/spdy_http_stream.cc index bf6dfce..3a0a09b 100644 --- a/net/spdy/spdy_http_stream.cc +++ b/net/spdy/spdy_http_stream.cc @@ -129,8 +129,7 @@ int SpdyHttpStream::ReadResponseBody( } bytes_read += bytes_to_copy; } - if (spdy_session_ && spdy_session_->is_flow_control_enabled()) - stream_->IncreaseRecvWindowSize(bytes_read); + stream_->IncreaseRecvWindowSize(bytes_read); return bytes_read; } else if (stream_->closed()) { return stream_->response_status(); diff --git a/net/spdy/spdy_proxy_client_socket.cc b/net/spdy/spdy_proxy_client_socket.cc index 7267fef..a6c50e9 100644 --- a/net/spdy/spdy_proxy_client_socket.cc +++ b/net/spdy/spdy_proxy_client_socket.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -172,12 +172,14 @@ int SpdyProxyClientSocket::PopulateUserReadBuffer() { if (!user_buffer_) return ERR_IO_PENDING; + int bytes_read = 0; while (!read_buffer_.empty() && user_buffer_->BytesRemaining() > 0) { scoped_refptr<DrainableIOBuffer> data = read_buffer_.front(); const int bytes_to_copy = std::min(user_buffer_->BytesRemaining(), data->BytesRemaining()); memcpy(user_buffer_->data(), data->data(), bytes_to_copy); user_buffer_->DidConsume(bytes_to_copy); + bytes_read += bytes_to_copy; if (data->BytesRemaining() == bytes_to_copy) { // Consumed all data from this buffer read_buffer_.pop_front(); @@ -186,6 +188,9 @@ int SpdyProxyClientSocket::PopulateUserReadBuffer() { } } + if (bytes_read > 0 && spdy_stream_) + spdy_stream_->IncreaseRecvWindowSize(bytes_read); + return user_buffer_->BytesConsumed(); } diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc index 2c40e47..7047b00 100644 --- a/net/spdy/spdy_stream.cc +++ b/net/spdy/spdy_stream.cc @@ -192,6 +192,10 @@ void SpdyStream::IncreaseRecvWindowSize(int32 delta_window_size) { // By the time a read is isued, stream may become inactive. if (!session_->IsStreamActive(stream_id_)) return; + + if (!session_->is_flow_control_enabled()) + return; + int32 new_window_size = recv_window_size_ + delta_window_size; if (recv_window_size_ > 0) DCHECK(new_window_size > 0); @@ -207,6 +211,9 @@ void SpdyStream::IncreaseRecvWindowSize(int32 delta_window_size) { void SpdyStream::DecreaseRecvWindowSize(int32 delta_window_size) { DCHECK_GE(delta_window_size, 1); + if (!session_->is_flow_control_enabled()) + return; + recv_window_size_ -= delta_window_size; net_log_.AddEvent( NetLog::TYPE_SPDY_STREAM_UPDATE_RECV_WINDOW, @@ -333,8 +340,7 @@ void SpdyStream::OnDataReceived(const char* data, int length) { return; } - if (session_->is_flow_control_enabled()) - DecreaseRecvWindowSize(length); + DecreaseRecvWindowSize(length); // Track our bandwidth. metrics_.RecordBytes(length); |