summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrtenneti@google.com <rtenneti@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-16 23:31:22 +0000
committerrtenneti@google.com <rtenneti@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-16 23:31:22 +0000
commite92fa7e1e7d5429b0a020025b9681afb3dcd4a19 (patch)
tree65de50b784855b5f34289bca67903feea6ce0e29
parent67cf7cd5b5f62591f3bb294df539850002983e9c (diff)
downloadchromium_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.cc3
-rw-r--r--net/spdy/spdy_proxy_client_socket.cc7
-rw-r--r--net/spdy/spdy_stream.cc10
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);