Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(800)

Unified Diff: net/spdy/spdy_session.cc

Issue 138803002: SPDY4: Turn SYN_STREAM and SYN_REPLY into HEADERS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Windows bool-cast fix. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/spdy/spdy_protocol.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/spdy/spdy_session.cc
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index 9508f0e6af47da6326ecb732c14bdd86e3a4d314..656e851ec557062dd24f7f5d22c5bed315767ba5 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -2016,7 +2016,10 @@ void SpdySession::OnSynStream(SpdyStreamId stream_id,
return;
}
- if (associated_stream_id == 0) {
+ // TODO(jgraettinger): SpdyFramer simulates OnSynStream() from HEADERS
+ // frames, which don't convey associated stream ID. Disable this check
+ // for now, and re-enable when PUSH_PROMISE is implemented properly.
+ if (associated_stream_id == 0 && GetProtocolVersion() < SPDY4) {
std::string description = base::StringPrintf(
"Received invalid OnSyn associated stream id %d for stream %d",
associated_stream_id, stream_id);
@@ -2041,7 +2044,8 @@ void SpdySession::OnSynStream(SpdyStreamId stream_id,
// Verify we have a valid stream association.
ActiveStreamMap::iterator associated_it =
active_streams_.find(associated_stream_id);
- if (associated_it == active_streams_.end()) {
+ // TODO(jgraettinger): (See PUSH_PROMISE comment above).
+ if (GetProtocolVersion() < SPDY4 && associated_it == active_streams_.end()) {
EnqueueResetStreamFrame(
stream_id, request_priority, RST_STREAM_INVALID_STREAM,
base::StringPrintf(
@@ -2062,7 +2066,8 @@ void SpdySession::OnSynStream(SpdyStreamId stream_id,
"Rejected push of Cross Origin HTTPS content %d",
associated_stream_id));
}
- } else {
+ } else if (GetProtocolVersion() < SPDY4) {
+ // TODO(jgraettinger): (See PUSH_PROMISE comment above).
GURL associated_url(associated_it->second.stream->GetUrlFromHeaders());
if (associated_url.GetOrigin() != gurl.GetOrigin()) {
EnqueueResetStreamFrame(
@@ -2186,11 +2191,18 @@ void SpdySession::OnSynReply(SpdyStreamId stream_id,
stream->IncrementRawReceivedBytes(last_compressed_frame_len_);
last_compressed_frame_len_ = 0;
+ if (GetProtocolVersion() >= SPDY4) {
+ const std::string& error =
+ "SPDY4 wasn't expecting SYN_REPLY.";
+ stream->LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
+ ResetStreamIterator(it, RST_STREAM_PROTOCOL_ERROR, error);
+ return;
+ }
if (!it->second.waiting_for_syn_reply) {
const std::string& error =
"Received duplicate SYN_REPLY for stream.";
stream->LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
- ResetStreamIterator(it, RST_STREAM_STREAM_IN_USE, error);
+ ResetStreamIterator(it, RST_STREAM_PROTOCOL_ERROR, error);
return;
}
it->second.waiting_for_syn_reply = false;
@@ -2227,10 +2239,26 @@ void SpdySession::OnHeaders(SpdyStreamId stream_id,
stream->IncrementRawReceivedBytes(last_compressed_frame_len_);
last_compressed_frame_len_ = 0;
- int rv = stream->OnAdditionalResponseHeadersReceived(headers);
- if (rv < 0) {
- DCHECK_NE(rv, ERR_IO_PENDING);
- DCHECK(active_streams_.find(stream_id) == active_streams_.end());
+ if (it->second.waiting_for_syn_reply) {
+ if (GetProtocolVersion() < SPDY4) {
+ const std::string& error =
+ "Was expecting SYN_REPLY, not HEADERS.";
+ stream->LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
+ ResetStreamIterator(it, RST_STREAM_PROTOCOL_ERROR, error);
+ return;
+ }
+ base::Time response_time = base::Time::Now();
+ base::TimeTicks recv_first_byte_time = time_func_();
+
+ it->second.waiting_for_syn_reply = false;
+ ignore_result(OnInitialResponseHeadersReceived(
+ headers, response_time, recv_first_byte_time, stream));
+ } else {
+ int rv = stream->OnAdditionalResponseHeadersReceived(headers);
+ if (rv < 0) {
+ DCHECK_NE(rv, ERR_IO_PENDING);
+ DCHECK(active_streams_.find(stream_id) == active_streams_.end());
+ }
}
}
« no previous file with comments | « net/spdy/spdy_protocol.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698