diff options
author | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-14 18:19:17 +0000 |
---|---|---|
committer | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-14 18:19:17 +0000 |
commit | 4c21b0f14edcb3bfc2c5c481428fe71bb9107817 (patch) | |
tree | e3db730ecdb981b0c66035c6d3efc7431008a778 /net/spdy/spdy_session.cc | |
parent | 1655ba34a9191e59006bd7a48eb25b98319352e7 (diff) | |
download | chromium_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.cc | 48 |
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_); |