Index: net/spdy/spdy_session.cc |
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc |
index 9f5704b74e05fcbcc23d82680cb7fa517f98513a..d76b6fe7b4fead8d1b21bbc8bd4a41a15d89fb8b 100644 |
--- a/net/spdy/spdy_session.cc |
+++ b/net/spdy/spdy_session.cc |
@@ -67,6 +67,23 @@ Value* NetLogSpdySynParameter::ToValue() const { |
NetLogSpdySynParameter::~NetLogSpdySynParameter() {} |
+NetLogSpdySynRenumberParameter::NetLogSpdySynRenumberParameter( |
+ SpdyStreamId old_id, |
+ SpdyStreamId new_id) |
+ : old_id_(old_id), |
+ new_id_(new_id) { |
+} |
+ |
+Value* NetLogSpdySynRenumberParameter::ToValue() const { |
+ DictionaryValue* dict = new DictionaryValue(); |
+ dict->SetInteger("old_id", old_id_); |
+ dict->SetInteger("new_id", new_id_); |
+ return dict; |
+} |
+ |
+NetLogSpdySynRenumberParameter::~NetLogSpdySynRenumberParameter() {} |
+ |
+ |
NetLogSpdyCredentialParameter::NetLogSpdyCredentialParameter( |
size_t slot, |
const std::string& origin) |
@@ -348,6 +365,7 @@ SpdySession::SpdySession(const HostPortProxyPair& host_port_proxy_pair, |
read_buffer_(new IOBuffer(kReadBufferSize)), |
read_pending_(false), |
stream_hi_water_mark_(1), // Always start at 1 for the first stream id. |
+ last_syn_stream_id_(0), |
write_pending_(false), |
delayed_write_pending_(false), |
is_secure_(false), |
@@ -1016,6 +1034,33 @@ void SpdySession::WriteSocket() { |
// which is now. At this time, we don't compress our data frames. |
SpdyFrame uncompressed_frame(next_buffer.buffer()->data(), false); |
size_t size; |
+ if (uncompressed_frame.is_control_frame()) { |
+ SpdyControlFrame control_frame(next_buffer.buffer()->data(), false); |
+ if (control_frame.type() == SYN_STREAM) { |
+ SpdySynStreamControlFrame syn_stream(next_buffer.buffer()->data(), |
+ false); |
+ SpdyStreamId id = syn_stream.stream_id(); |
+ DCHECK(IsStreamActive(id)); |
+ if (id < last_syn_stream_id_) { |
+ SpdyStreamId old_id = id; |
+ // need to play some games to change the stream_id |
+ scoped_refptr<SpdyStream> stream = active_streams_[id]; |
+ active_streams_.erase(id); |
+ id = GetNewStreamId(); |
+ syn_stream.set_stream_id(id); |
+ stream->set_stream_id(id); |
+ ActivateStream(stream); |
+ |
+ if (net_log().IsLoggingAllEvents()) { |
+ net_log().AddEvent( |
+ NetLog::TYPE_SPDY_SESSION_SYN_STREAM_RENUMBER, |
+ make_scoped_refptr( |
+ new NetLogSpdySynRenumberParameter(old_id, id))); |
+ } |
+ } |
+ last_syn_stream_id_ = id; |
+ } |
+ } |
if (buffered_spdy_framer_->IsCompressible(uncompressed_frame)) { |
DCHECK(uncompressed_frame.is_control_frame()); |
scoped_ptr<SpdyFrame> compressed_frame( |