summaryrefslogtreecommitdiffstats
path: root/net/spdy/spdy_session.cc
diff options
context:
space:
mode:
authorcbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-14 18:19:17 +0000
committercbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-14 18:19:17 +0000
commit4c21b0f14edcb3bfc2c5c481428fe71bb9107817 (patch)
treee3db730ecdb981b0c66035c6d3efc7431008a778 /net/spdy/spdy_session.cc
parent1655ba34a9191e59006bd7a48eb25b98319352e7 (diff)
downloadchromium_src-4c21b0f14edcb3bfc2c5c481428fe71bb9107817.zip
chromium_src-4c21b0f14edcb3bfc2c5c481428fe71bb9107817.tar.gz
chromium_src-4c21b0f14edcb3bfc2c5c481428fe71bb9107817.tar.bz2
SPDY: Initial support for handling WINDOW_UPDATE frames and some cleanup.
BUG=48100 TEST=net_unittests --gtest_filter="SpdyProtocolTest.ControlFrameStructs:SpdyNetworkTransactionTest.WindowSizeChange:SpdyNetworkTransactionTest.WindowSizeOverflow" Contributed by: agayev@google.com Review URL: http://codereview.chromium.org/2807042 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52352 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/spdy/spdy_session.cc')
-rw-r--r--net/spdy/spdy_session.cc48
1 files changed, 48 insertions, 0 deletions
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index 13a54d5..37ceb57 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -163,6 +163,7 @@ SpdySession::SpdySession(const HostPortPair& host_port_pair,
sent_settings_(false),
received_settings_(false),
in_session_pool_(true),
+ initial_window_size_(kInitialWindowSize),
net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SPDY_SESSION)) {
net_log_.BeginEvent(
NetLog::TYPE_SPDY_SESSION,
@@ -312,6 +313,7 @@ int SpdySession::CreateStream(
stream->set_priority(priority);
stream->set_path(path);
stream->set_net_log(stream_net_log);
+ stream->set_window_size(initial_window_size_);
ActivateStream(stream);
UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyPriorityCount",
@@ -402,6 +404,21 @@ void SpdySession::CloseStream(spdy::SpdyStreamId stream_id, int status) {
DeleteStream(stream_id, status);
}
+void SpdySession::ResetStream(
+ spdy::SpdyStreamId stream_id, spdy::SpdyStatusCodes status) {
+ LOG(INFO) << "Resetting stream " << stream_id << " with status " << status;
+
+ DCHECK(IsStreamActive(stream_id));
+ const scoped_refptr<SpdyStream>& stream = active_streams_[stream_id];
+ CHECK_EQ(stream->stream_id(), stream_id);
+
+ scoped_ptr<spdy::SpdyRstStreamControlFrame> rst_frame(
+ spdy_framer_.CreateRstStream(stream_id, status));
+ QueueFrame(rst_frame.get(), stream->priority(), stream);
+
+ DeleteStream(stream_id, ERR_SPDY_PROTOCOL_ERROR);
+}
+
bool SpdySession::IsStreamActive(spdy::SpdyStreamId stream_id) const {
return ContainsKey(active_streams_, stream_id);
}
@@ -1061,6 +1078,10 @@ void SpdySession::OnControl(const spdy::SpdyControlFrame* frame) {
*reinterpret_cast<const spdy::SpdySynReplyControlFrame*>(frame),
headers);
break;
+ case spdy::WINDOW_UPDATE:
+ OnWindowUpdate(
+ *reinterpret_cast<const spdy::SpdyWindowUpdateControlFrame*>(frame));
+ break;
default:
DCHECK(false); // Error!
}
@@ -1122,6 +1143,8 @@ void SpdySession::OnSettings(const spdy::SpdySettingsControlFrame& frame) {
settings_storage->Set(host_port_pair_, settings);
}
+ // TODO(agayev): Implement initial and per stream window size update.
+
received_settings_ = true;
net_log_.AddEvent(
@@ -1129,6 +1152,31 @@ void SpdySession::OnSettings(const spdy::SpdySettingsControlFrame& frame) {
new NetLogSpdySettingsParameter(settings));
}
+void SpdySession::OnWindowUpdate(
+ const spdy::SpdyWindowUpdateControlFrame& frame) {
+ spdy::SpdyStreamId stream_id = frame.stream_id();
+ LOG(INFO) << "Spdy WINDOW_UPDATE for stream " << stream_id;
+
+ if (!IsStreamActive(stream_id)) {
+ LOG(WARNING) << "Received WINDOW_UPDATE for invalid stream " << stream_id;
+ return;
+ }
+
+ int delta_window_size = static_cast<int>(frame.delta_window_size());
+ if (delta_window_size < 1) {
+ LOG(WARNING) << "Received WINDOW_UPDATE with an invalid delta_window_size "
+ << delta_window_size;
+ return;
+ // TODO(agayev): Send RST_STREAM with status code FLOW_CONTROL_ERROR?
+ }
+
+ const scoped_refptr<SpdyStream>& stream = active_streams_[stream_id];
+ CHECK_EQ(stream->stream_id(), stream_id);
+ CHECK(!stream->cancelled());
+
+ stream->UpdateWindowSize(delta_window_size);
+}
+
void SpdySession::SendSettings() {
const SpdySettingsStorage& settings_storage = session_->spdy_settings();
const spdy::SpdySettings& settings = settings_storage.Get(host_port_pair_);