Index: net/spdy/spdy_session.cc |
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc |
index 0dce82c8ae86087b62899fe8b9d72e44b24ad4f3..1515f02f801b85c29ca54a0f1804606c06ec1c0c 100644 |
--- a/net/spdy/spdy_session.cc |
+++ b/net/spdy/spdy_session.cc |
@@ -387,6 +387,30 @@ SpdyGoAwayStatus MapNetErrorToGoAwayStatus(Error err) { |
} |
} |
+void SplitPushedHeadersToRequestAndResponse(const SpdyHeaderBlock& headers, |
+ SpdyMajorVersion protocol_version, |
+ SpdyHeaderBlock* request_headers, |
+ SpdyHeaderBlock* response_headers) { |
+ DCHECK(response_headers); |
+ DCHECK(request_headers); |
+ for (SpdyHeaderBlock::const_iterator it = headers.begin(); |
+ it != headers.end(); |
+ ++it) { |
+ SpdyHeaderBlock* to_insert = response_headers; |
+ if (protocol_version == SPDY2) { |
+ if (it->first == "url") |
+ to_insert = request_headers; |
+ } else { |
+ const char* host = protocol_version >= SPDY4 ? ":authority" : ":host"; |
+ static const char* scheme = ":scheme"; |
+ static const char* path = ":path"; |
+ if (it->first == host || it->first == scheme || it->first == path) |
+ to_insert = request_headers; |
+ } |
+ to_insert->insert(*it); |
+ } |
+} |
+ |
SpdyStreamRequest::SpdyStreamRequest() : weak_ptr_factory_(this) { |
Reset(); |
} |
@@ -2189,9 +2213,21 @@ void SpdySession::OnSynStream(SpdyStreamId stream_id, |
} |
// Parse the headers. |
- if (OnInitialResponseHeadersReceived( |
- headers, response_time, |
- recv_first_byte_time, active_it->second.stream) != OK) |
+ |
+ // Split headers to simulate push promise and response. |
+ SpdyHeaderBlock request_headers; |
+ SpdyHeaderBlock response_headers; |
+ SplitPushedHeadersToRequestAndResponse( |
+ headers, GetProtocolVersion(), &request_headers, &response_headers); |
+ |
+ if (active_it->second.stream->OnPushPromiseHeadersReceived(request_headers) != |
+ OK) |
+ return; |
+ |
+ if (OnInitialResponseHeadersReceived(response_headers, |
+ response_time, |
+ recv_first_byte_time, |
+ active_it->second.stream) != OK) |
return; |
base::StatsCounter push_requests("spdy.pushed_streams"); |