summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/spdy/spdy_http_stream.cc3
-rw-r--r--net/spdy/spdy_http_stream_spdy3_unittest.cc4
-rw-r--r--net/spdy/spdy_http_utils.cc28
-rw-r--r--net/spdy/spdy_http_utils.h3
-rw-r--r--net/spdy/spdy_network_transaction_spdy3_unittest.cc70
-rw-r--r--net/spdy/spdy_proxy_client_socket.cc11
-rw-r--r--net/spdy/spdy_proxy_client_socket_spdy3_unittest.cc16
-rw-r--r--net/spdy/spdy_session.cc5
-rw-r--r--net/spdy/spdy_session.h2
-rw-r--r--net/spdy/spdy_session_spdy2_unittest.cc81
-rw-r--r--net/spdy/spdy_session_spdy3_unittest.cc2
-rw-r--r--net/spdy/spdy_stream.cc44
-rw-r--r--net/spdy/spdy_stream.h6
-rw-r--r--net/spdy/spdy_stream_spdy2_unittest.cc22
-rw-r--r--net/spdy/spdy_stream_spdy3_unittest.cc67
-rw-r--r--net/spdy/spdy_test_util_spdy3.cc52
16 files changed, 219 insertions, 197 deletions
diff --git a/net/spdy/spdy_http_stream.cc b/net/spdy/spdy_http_stream.cc
index 3a0a09b..a23a060d 100644
--- a/net/spdy/spdy_http_stream.cc
+++ b/net/spdy/spdy_http_stream.cc
@@ -198,7 +198,8 @@ int SpdyHttpStream::SendRequest(const HttpRequestHeaders& request_headers,
linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock);
CreateSpdyHeadersFromHttpRequest(*request_info_, request_headers,
- headers.get(), direct_);
+ headers.get(), stream_->GetProtocolVersion(),
+ direct_);
stream_->set_spdy_headers(headers);
stream_->SetRequestTime(request_time);
diff --git a/net/spdy/spdy_http_stream_spdy3_unittest.cc b/net/spdy/spdy_http_stream_spdy3_unittest.cc
index 49f61a6..6f3f825 100644
--- a/net/spdy/spdy_http_stream_spdy3_unittest.cc
+++ b/net/spdy/spdy_http_stream_spdy3_unittest.cc
@@ -227,8 +227,8 @@ TEST_F(SpdyHttpStreamSpdy3Test, SpdyURLTest) {
spdy::SpdyHeaderBlock* spdy_header =
http_stream->stream()->spdy_headers().get();
EXPECT_TRUE(spdy_header != NULL);
- if (spdy_header->find("url") != spdy_header->end())
- EXPECT_EQ("/foo?query=what", spdy_header->find("url")->second);
+ if (spdy_header->find(":path") != spdy_header->end())
+ EXPECT_EQ("/foo?query=what", spdy_header->find(":path")->second);
else
FAIL() << "No url is set in spdy_header!";
diff --git a/net/spdy/spdy_http_utils.cc b/net/spdy/spdy_http_utils.cc
index a3b7e54..414c1e42 100644
--- a/net/spdy/spdy_http_utils.cc
+++ b/net/spdy/spdy_http_utils.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -78,6 +78,7 @@ bool SpdyHeadersToHttpResponse(const spdy::SpdyHeaderBlock& headers,
void CreateSpdyHeadersFromHttpRequest(const HttpRequestInfo& info,
const HttpRequestHeaders& request_headers,
spdy::SpdyHeaderBlock* headers,
+ int protocol_version,
bool direct) {
HttpRequestHeaders::Iterator it(request_headers);
@@ -98,14 +99,23 @@ void CreateSpdyHeadersFromHttpRequest(const HttpRequestInfo& info,
}
static const char kHttpProtocolVersion[] = "HTTP/1.1";
- (*headers)["version"] = kHttpProtocolVersion;
- (*headers)["method"] = info.method;
- (*headers)["host"] = GetHostAndOptionalPort(info.url);
- (*headers)["scheme"] = info.url.scheme();
- if (direct)
- (*headers)["url"] = HttpUtil::PathForRequest(info.url);
- else
- (*headers)["url"] = HttpUtil::SpecForRequest(info.url);
+ if (protocol_version < 3) {
+ (*headers)["version"] = kHttpProtocolVersion;
+ (*headers)["method"] = info.method;
+ (*headers)["host"] = GetHostAndOptionalPort(info.url);
+ (*headers)["scheme"] = info.url.scheme();
+ if (direct)
+ (*headers)["url"] = HttpUtil::PathForRequest(info.url);
+ else
+ (*headers)["url"] = HttpUtil::SpecForRequest(info.url);
+ } else {
+ (*headers)[":version"] = kHttpProtocolVersion;
+ (*headers)[":method"] = info.method;
+ (*headers)[":host"] = GetHostAndOptionalPort(info.url);
+ (*headers)[":scheme"] = info.url.scheme();
+ (*headers)[":path"] = HttpUtil::PathForRequest(info.url);
+ headers->erase("host"); // this is kinda insane, spdy 3 spec.
+ }
}
diff --git a/net/spdy/spdy_http_utils.h b/net/spdy/spdy_http_utils.h
index d6f1a65..0361fb8 100644
--- a/net/spdy/spdy_http_utils.h
+++ b/net/spdy/spdy_http_utils.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -29,6 +29,7 @@ bool SpdyHeadersToHttpResponse(const spdy::SpdyHeaderBlock& headers,
void CreateSpdyHeadersFromHttpRequest(const HttpRequestInfo& info,
const HttpRequestHeaders& request_headers,
spdy::SpdyHeaderBlock* headers,
+ int protocol_version,
bool direct);
NET_EXPORT_PRIVATE int ConvertRequestPriorityToSpdyPriority(
diff --git a/net/spdy/spdy_network_transaction_spdy3_unittest.cc b/net/spdy/spdy_network_transaction_spdy3_unittest.cc
index 161099d..1acc56a 100644
--- a/net/spdy/spdy_network_transaction_spdy3_unittest.cc
+++ b/net/spdy/spdy_network_transaction_spdy3_unittest.cc
@@ -1459,11 +1459,11 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, Put) {
spdy::DATA_FLAG_NONE // Data Flags
};
const char* const kPutHeaders[] = {
- "method", "PUT",
- "url", "/",
- "host", "www.google.com",
- "scheme", "http",
- "version", "HTTP/1.1",
+ ":method", "PUT",
+ ":path", "/",
+ ":host", "www.google.com",
+ ":scheme", "http",
+ ":version", "HTTP/1.1",
"content-length", "0"
};
scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPacket(kSynStartHeader, NULL, 0,
@@ -1530,11 +1530,11 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, Head) {
spdy::DATA_FLAG_NONE // Data Flags
};
const char* const kHeadHeaders[] = {
- "method", "HEAD",
- "url", "/",
- "host", "www.google.com",
- "scheme", "http",
- "version", "HTTP/1.1",
+ ":method", "HEAD",
+ ":path", "/",
+ ":host", "www.google.com",
+ ":scheme", "http",
+ ":version", "HTTP/1.1",
"content-length", "0"
};
scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPacket(kSynStartHeader, NULL, 0,
@@ -2434,31 +2434,31 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, RedirectGetRequest) {
};
const SpdyHeaderInfo kSynStartHeader = MakeSpdyHeader(spdy::SYN_STREAM);
const char* const kStandardGetHeaders[] = {
- "host",
+ ":host",
"www.google.com",
- "method",
+ ":method",
"GET",
- "scheme",
+ ":scheme",
"http",
- "url",
+ ":path",
"/",
"user-agent",
"",
- "version",
+ ":version",
"HTTP/1.1"
};
const char* const kStandardGetHeaders2[] = {
- "host",
+ ":host",
"www.foo.com",
- "method",
+ ":method",
"GET",
- "scheme",
+ ":scheme",
"http",
- "url",
+ ":path",
"/index.php",
"user-agent",
"",
- "version",
+ ":version",
"HTTP/1.1"
};
@@ -2670,17 +2670,17 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, RedirectServerPush) {
};
const SpdyHeaderInfo kSynStartHeader = MakeSpdyHeader(spdy::SYN_STREAM);
const char* const kStandardGetHeaders[] = {
- "host",
+ ":host",
"www.google.com",
- "method",
+ ":method",
"GET",
- "scheme",
+ ":scheme",
"http",
- "url",
+ ":path",
"/",
"user-agent",
"",
- "version",
+ ":version",
"HTTP/1.1"
};
@@ -2716,17 +2716,17 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, RedirectServerPush) {
// Setup writes/reads to www.foo.com
const char* const kStandardGetHeaders2[] = {
- "host",
+ ":host",
"www.foo.com",
- "method",
+ ":method",
"GET",
- "scheme",
+ ":scheme",
"http",
- "url",
+ ":path",
"/index.php",
"user-agent",
"",
- "version",
+ ":version",
"HTTP/1.1"
};
scoped_ptr<spdy::SpdyFrame> req2(
@@ -3905,11 +3905,11 @@ TEST_P(SpdyNetworkTransactionSpdy3Test, NetLog) {
request_params->GetHeaders().get();
spdy::SpdyHeaderBlock expected;
- expected["host"] = "www.google.com";
- expected["url"] = "/";
- expected["scheme"] = "http";
- expected["version"] = "HTTP/1.1";
- expected["method"] = "GET";
+ expected[":host"] = "www.google.com";
+ expected[":path"] = "/";
+ expected[":scheme"] = "http";
+ expected[":version"] = "HTTP/1.1";
+ expected[":method"] = "GET";
expected["user-agent"] = "Chrome";
EXPECT_EQ(expected.size(), headers->size());
spdy::SpdyHeaderBlock::const_iterator end = expected.end();
diff --git a/net/spdy/spdy_proxy_client_socket.cc b/net/spdy/spdy_proxy_client_socket.cc
index 7a7a03a..0575bb0 100644
--- a/net/spdy/spdy_proxy_client_socket.cc
+++ b/net/spdy/spdy_proxy_client_socket.cc
@@ -372,10 +372,15 @@ int SpdyProxyClientSocket::DoSendRequest() {
request_.extra_headers.MergeFrom(request_headers);
linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock());
CreateSpdyHeadersFromHttpRequest(request_, request_headers, headers.get(),
- true);
+ spdy_stream_->GetProtocolVersion(), true);
// Reset the URL to be the endpoint of the connection
- (*headers)["url"] = endpoint_.ToString();
- headers->erase("scheme");
+ if (spdy_stream_->GetProtocolVersion() > 2) {
+ (*headers)[":path"] = endpoint_.ToString();
+ headers->erase(":scheme");
+ } else {
+ (*headers)["url"] = endpoint_.ToString();
+ headers->erase("scheme");
+ }
spdy_stream_->set_spdy_headers(headers);
return spdy_stream_->SendRequest(true);
diff --git a/net/spdy/spdy_proxy_client_socket_spdy3_unittest.cc b/net/spdy/spdy_proxy_client_socket_spdy3_unittest.cc
index 0073243..966daf3 100644
--- a/net/spdy/spdy_proxy_client_socket_spdy3_unittest.cc
+++ b/net/spdy/spdy_proxy_client_socket_spdy3_unittest.cc
@@ -328,11 +328,11 @@ SpdyProxyClientSocketSpdy3Test::ConstructConnectRequestFrame() {
spdy::DATA_FLAG_NONE
};
const char* const kConnectHeaders[] = {
- "method", "CONNECT",
- "url", kOriginHostPort,
- "host", kOriginHost,
+ ":method", "CONNECT",
+ ":path", kOriginHostPort,
+ ":host", kOriginHost,
"user-agent", kUserAgent,
- "version", "HTTP/1.1",
+ ":version", "HTTP/1.1",
};
return ConstructSpdyPacket(
kSynStartHeader, NULL, 0, kConnectHeaders, arraysize(kConnectHeaders)/2);
@@ -355,11 +355,11 @@ SpdyProxyClientSocketSpdy3Test::ConstructConnectAuthRequestFrame() {
spdy::DATA_FLAG_NONE
};
const char* const kConnectHeaders[] = {
- "method", "CONNECT",
- "url", kOriginHostPort,
- "host", kOriginHost,
+ ":method", "CONNECT",
+ ":path", kOriginHostPort,
+ ":host", kOriginHost,
"user-agent", kUserAgent,
- "version", "HTTP/1.1",
+ ":version", "HTTP/1.1",
"proxy-authorization", "Basic Zm9vOmJhcg==",
};
return ConstructSpdyPacket(
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index cc16eb3..cc190ec 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -593,6 +593,11 @@ void SpdySession::AddPooledAlias(const HostPortProxyPair& alias) {
pooled_aliases_.insert(alias);
}
+int SpdySession::GetProtocolVersion() const {
+ DCHECK(buffered_spdy_framer_.get());
+ return buffered_spdy_framer_->protocol_version();
+}
+
int SpdySession::WriteSynStream(
spdy::SpdyStreamId stream_id,
RequestPriority priority,
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h
index 408245b..50447c0 100644
--- a/net/spdy/spdy_session.h
+++ b/net/spdy/spdy_session.h
@@ -280,6 +280,8 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>,
return pooled_aliases_;
}
+ int GetProtocolVersion() const;
+
private:
friend class base::RefCounted<SpdySession>;
diff --git a/net/spdy/spdy_session_spdy2_unittest.cc b/net/spdy/spdy_session_spdy2_unittest.cc
index 5d85f8f..08d2afc 100644
--- a/net/spdy/spdy_session_spdy2_unittest.cc
+++ b/net/spdy/spdy_session_spdy2_unittest.cc
@@ -127,6 +127,7 @@ TEST_F(SpdySessionSpdy2Test, GoAway) {
session_deps.socket_factory->AddSocketDataProvider(&data);
SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
+ ssl.SetNextProto(SSLClientSocket::kProtoSPDY2);
session_deps.socket_factory->AddSSLSocketDataProvider(&ssl);
scoped_refptr<HttpNetworkSession> http_session(
@@ -154,6 +155,7 @@ TEST_F(SpdySessionSpdy2Test, GoAway) {
http_session->GetTransportSocketPool(),
BoundNetLog()));
EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK));
+ EXPECT_EQ(2, session->GetProtocolVersion());
// Flush the SpdySession::OnReadComplete() task.
MessageLoop::current()->RunAllPending();
@@ -941,7 +943,7 @@ TEST_F(SpdySessionSpdy2Test, NeedsCredentials) {
SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
ssl.origin_bound_cert_type = CLIENT_CERT_ECDSA_SIGN;
- ssl.protocol_negotiated = SSLClientSocket::kProtoSPDY3;
+ ssl.protocol_negotiated = SSLClientSocket::kProtoSPDY2;
session_deps.socket_factory->AddSSLSocketDataProvider(&ssl);
scoped_refptr<HttpNetworkSession> http_session(
@@ -987,82 +989,7 @@ TEST_F(SpdySessionSpdy2Test, NeedsCredentials) {
EXPECT_FALSE(session->NeedsCredentials(test_host_port_pair));
const std::string kTestHost2("www.bar.com");
HostPortPair test_host_port_pair2(kTestHost2, kTestPort);
- EXPECT_TRUE(session->NeedsCredentials(test_host_port_pair2));
-
- // Flush the SpdySession::OnReadComplete() task.
- MessageLoop::current()->RunAllPending();
-
- spdy_session_pool->Remove(session);
- EXPECT_FALSE(spdy_session_pool->HasSession(pair));
-}
-
-TEST_F(SpdySessionSpdy2Test, SendCredentials) {
- SpdySessionDependencies session_deps;
-
- MockConnect connect_data(SYNCHRONOUS, OK);
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever.
- };
- spdy::SpdySettings settings;
- scoped_ptr<spdy::SpdyFrame> settings_frame(
- ConstructSpdySettings(settings));
- MockWrite writes[] = {
- CreateMockWrite(*settings_frame),
- };
- StaticSocketDataProvider data(reads, arraysize(reads),
- writes, arraysize(writes));
- data.set_connect_data(connect_data);
- session_deps.socket_factory->AddSocketDataProvider(&data);
-
- SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
- ssl.origin_bound_cert_type = CLIENT_CERT_ECDSA_SIGN;
- ssl.protocol_negotiated = SSLClientSocket::kProtoSPDY3;
- session_deps.socket_factory->AddSSLSocketDataProvider(&ssl);
-
- scoped_refptr<HttpNetworkSession> http_session(
- SpdySessionDependencies::SpdyCreateSession(&session_deps));
-
- const std::string kTestHost("www.foo.com");
- const int kTestPort = 80;
- HostPortPair test_host_port_pair(kTestHost, kTestPort);
- HostPortProxyPair pair(test_host_port_pair, ProxyServer::Direct());
-
- SpdySessionPool* spdy_session_pool(http_session->spdy_session_pool());
- EXPECT_FALSE(spdy_session_pool->HasSession(pair));
- scoped_refptr<SpdySession> session =
- spdy_session_pool->Get(pair, BoundNetLog());
- EXPECT_TRUE(spdy_session_pool->HasSession(pair));
-
- SSLConfig ssl_config;
- scoped_refptr<TransportSocketParams> transport_params(
- new TransportSocketParams(test_host_port_pair,
- MEDIUM,
- false,
- false));
- scoped_refptr<SOCKSSocketParams> socks_params;
- scoped_refptr<HttpProxySocketParams> http_proxy_params;
- scoped_refptr<SSLSocketParams> ssl_params(
- new SSLSocketParams(transport_params,
- socks_params,
- http_proxy_params,
- ProxyServer::SCHEME_DIRECT,
- test_host_port_pair,
- ssl_config,
- 0,
- false,
- false));
- scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle);
- EXPECT_EQ(OK, connection->Init(test_host_port_pair.ToString(),
- ssl_params, MEDIUM, CompletionCallback(),
- http_session->GetSSLSocketPool(),
- BoundNetLog()));
-
- EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), true, OK));
-
- EXPECT_FALSE(session->NeedsCredentials(test_host_port_pair));
- const std::string kTestHost2("www.bar.com");
- HostPortPair test_host_port_pair2(kTestHost2, kTestPort);
- EXPECT_TRUE(session->NeedsCredentials(test_host_port_pair2));
+ EXPECT_FALSE(session->NeedsCredentials(test_host_port_pair2));
// Flush the SpdySession::OnReadComplete() task.
MessageLoop::current()->RunAllPending();
diff --git a/net/spdy/spdy_session_spdy3_unittest.cc b/net/spdy/spdy_session_spdy3_unittest.cc
index 2c8f5ac..feb71d2 100644
--- a/net/spdy/spdy_session_spdy3_unittest.cc
+++ b/net/spdy/spdy_session_spdy3_unittest.cc
@@ -127,6 +127,7 @@ TEST_F(SpdySessionSpdy3Test, GoAway) {
session_deps.socket_factory->AddSocketDataProvider(&data);
SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
+ ssl.SetNextProto(SSLClientSocket::kProtoSPDY3);
session_deps.socket_factory->AddSSLSocketDataProvider(&ssl);
scoped_refptr<HttpNetworkSession> http_session(
@@ -154,6 +155,7 @@ TEST_F(SpdySessionSpdy3Test, GoAway) {
http_session->GetTransportSocketPool(),
BoundNetLog()));
EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK));
+ EXPECT_EQ(3, session->GetProtocolVersion());
// Flush the SpdySession::OnReadComplete() task.
MessageLoop::current()->RunAllPending();
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc
index 3280d00..0f20a85 100644
--- a/net/spdy/spdy_stream.cc
+++ b/net/spdy/spdy_stream.cc
@@ -440,6 +440,10 @@ void SpdyStream::OnChunkAvailable() {
OnWriteComplete(0);
}
+int SpdyStream::GetProtocolVersion() const {
+ return session_->GetProtocolVersion();
+}
+
void SpdyStream::LogStreamError(int status, const std::string& description) {
net_log_.AddEvent(
NetLog::TYPE_SPDY_STREAM_ERROR,
@@ -516,28 +520,40 @@ GURL SpdyStream::GetUrl() const {
DCHECK(HasUrl());
if (pushed_) {
- // assemble from the response
- std::string url;
- spdy::SpdyHeaderBlock::const_iterator it;
- it = response_->find("url");
- if (it != (*response_).end())
- url = it->second;
- return GURL(url);
+ if (GetProtocolVersion() >= 3) {
+ return GetUrlFromHeaderBlock(response_);
+ } else {
+ // assemble from the response
+ std::string url;
+ spdy::SpdyHeaderBlock::const_iterator it;
+ it = response_->find("url");
+ if (it != (*response_).end())
+ url = it->second;
+ return GURL(url);
+ }
}
- // assemble from the request
+ return GetUrlFromHeaderBlock(request_);
+}
+
+GURL SpdyStream::GetUrlFromHeaderBlock(
+ const linked_ptr<spdy::SpdyHeaderBlock>& headers) const {
+ const char* scheme_header = GetProtocolVersion() >= 3 ? ":scheme" : "scheme";
+ const char* host_header = GetProtocolVersion() >= 3 ? ":host" : "host";
+ const char* path_header = GetProtocolVersion() >= 3 ? ":path" : "path";
+
std::string scheme;
std::string host_port;
std::string path;
spdy::SpdyHeaderBlock::const_iterator it;
- it = request_->find("scheme");
- if (it != (*request_).end())
+ it = headers->find(scheme_header);
+ if (it != (*headers).end())
scheme = it->second;
- it = request_->find("host");
- if (it != (*request_).end())
+ it = headers->find(host_header);
+ if (it != (*headers).end())
host_port = it->second;
- it = request_->find("path");
- if (it != (*request_).end())
+ it = headers->find(path_header);
+ if (it != (*headers).end())
path = it->second;
std::string url = scheme + "://" + host_port + path;
return GURL(url);
diff --git a/net/spdy/spdy_stream.h b/net/spdy/spdy_stream.h
index a7342a7..3d0804b 100644
--- a/net/spdy/spdy_stream.h
+++ b/net/spdy/spdy_stream.h
@@ -253,6 +253,8 @@ class NET_EXPORT_PRIVATE SpdyStream
// ChunkCallback methods.
virtual void OnChunkAvailable() OVERRIDE;
+ int GetProtocolVersion() const;
+
private:
enum State {
STATE_NONE,
@@ -298,6 +300,10 @@ class NET_EXPORT_PRIVATE SpdyStream
// the MessageLoop to replay all the data that the server has already sent.
void PushedStreamReplayData();
+ // Extracts the URL from the various fields in |headers|.
+ GURL GetUrlFromHeaderBlock(
+ const linked_ptr<spdy::SpdyHeaderBlock>& headers) const;
+
// There is a small period of time between when a server pushed stream is
// first created, and the pushed data is replayed. Any data received during
// this time should continue to be buffered.
diff --git a/net/spdy/spdy_stream_spdy2_unittest.cc b/net/spdy/spdy_stream_spdy2_unittest.cc
index b04b42b..36182a6 100644
--- a/net/spdy/spdy_stream_spdy2_unittest.cc
+++ b/net/spdy/spdy_stream_spdy2_unittest.cc
@@ -246,6 +246,28 @@ TEST_F(SpdyStreamSpdy2Test, PushedStream) {
session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps);
SpdySessionPoolPeer pool_peer_(session_->spdy_session_pool());
scoped_refptr<SpdySession> spdy_session(CreateSpdySession());
+
+ MockRead reads[] = {
+ MockRead(ASYNC, 0, 0), // EOF
+ };
+
+ scoped_ptr<OrderedSocketData> data(
+ new OrderedSocketData(reads, arraysize(reads), NULL, 0));
+ MockConnect connect_data(SYNCHRONOUS, OK);
+ data->set_connect_data(connect_data);
+
+ session_deps.socket_factory->AddSocketDataProvider(data.get());
+ SpdySession::SetSSLMode(false);
+
+ HostPortPair host_port_pair("www.google.com", 80);
+ scoped_refptr<TransportSocketParams> transport_params(
+ new TransportSocketParams(host_port_pair, LOWEST, false, false));
+ scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle);
+ EXPECT_EQ(OK, connection->Init(host_port_pair.ToString(), transport_params,
+ LOWEST, CompletionCallback(),
+ session_->GetTransportSocketPool(),
+ BoundNetLog()));
+ spdy_session->InitializeWithSocket(connection.release(), false, OK);
BoundNetLog net_log;
// Conjure up a stream.
diff --git a/net/spdy/spdy_stream_spdy3_unittest.cc b/net/spdy/spdy_stream_spdy3_unittest.cc
index e51b8a5..9672d15 100644
--- a/net/spdy/spdy_stream_spdy3_unittest.cc
+++ b/net/spdy/spdy_stream_spdy3_unittest.cc
@@ -143,15 +143,15 @@ TEST_F(SpdyStreamSpdy3Test, SendDataAfterOpen) {
spdy::DATA_FLAG_NONE
};
static const char* const kGetHeaders[] = {
- "method",
+ ":method",
"GET",
- "scheme",
+ ":scheme",
"http",
- "host",
+ ":host",
"www.google.com",
- "path",
+ ":path",
"/",
- "version",
+ ":version",
"HTTP/1.1",
};
scoped_ptr<spdy::SpdyFrame> req(
@@ -218,11 +218,11 @@ TEST_F(SpdyStreamSpdy3Test, SendDataAfterOpen) {
EXPECT_FALSE(stream->HasUrl());
linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock);
- (*headers)["method"] = "GET";
- (*headers)["scheme"] = url.scheme();
- (*headers)["host"] = url.host();
- (*headers)["path"] = url.path();
- (*headers)["version"] = "HTTP/1.1";
+ (*headers)[":method"] = "GET";
+ (*headers)[":scheme"] = url.scheme();
+ (*headers)[":host"] = url.host();
+ (*headers)[":path"] = url.path();
+ (*headers)[":version"] = "HTTP/1.1";
stream->set_spdy_headers(headers);
EXPECT_TRUE(stream->HasUrl());
EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
@@ -246,6 +246,28 @@ TEST_F(SpdyStreamSpdy3Test, PushedStream) {
session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps);
SpdySessionPoolPeer pool_peer_(session_->spdy_session_pool());
scoped_refptr<SpdySession> spdy_session(CreateSpdySession());
+
+ MockRead reads[] = {
+ MockRead(ASYNC, 0, 0), // EOF
+ };
+
+ scoped_ptr<OrderedSocketData> data(
+ new OrderedSocketData(reads, arraysize(reads), NULL, 0));
+ MockConnect connect_data(SYNCHRONOUS, OK);
+ data->set_connect_data(connect_data);
+
+ session_deps.socket_factory->AddSocketDataProvider(data.get());
+ SpdySession::SetSSLMode(false);
+
+ HostPortPair host_port_pair("www.google.com", 80);
+ scoped_refptr<TransportSocketParams> transport_params(
+ new TransportSocketParams(host_port_pair, LOWEST, false, false));
+ scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle);
+ EXPECT_EQ(OK, connection->Init(host_port_pair.ToString(), transport_params,
+ LOWEST, CompletionCallback(),
+ session_->GetTransportSocketPool(),
+ BoundNetLog()));
+ spdy_session->InitializeWithSocket(connection.release(), false, OK);
BoundNetLog net_log;
// Conjure up a stream.
@@ -258,7 +280,10 @@ TEST_F(SpdyStreamSpdy3Test, PushedStream) {
// Set a couple of headers.
spdy::SpdyHeaderBlock response;
- response["url"] = kStreamUrl;
+ GURL url(kStreamUrl);
+ response[":host"] = url.host();
+ response[":scheme"] = url.scheme();
+ response[":path"] = url.path();
stream->OnResponseReceived(response);
// Send some basic headers.
@@ -292,15 +317,15 @@ TEST_F(SpdyStreamSpdy3Test, StreamError) {
spdy::DATA_FLAG_NONE
};
static const char* const kGetHeaders[] = {
- "method",
+ ":method",
"GET",
- "scheme",
+ ":scheme",
"http",
- "host",
+ ":host",
"www.google.com",
- "path",
+ ":path",
"/",
- "version",
+ ":version",
"HTTP/1.1",
};
scoped_ptr<spdy::SpdyFrame> req(
@@ -369,11 +394,11 @@ TEST_F(SpdyStreamSpdy3Test, StreamError) {
EXPECT_FALSE(stream->HasUrl());
linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock);
- (*headers)["method"] = "GET";
- (*headers)["scheme"] = url.scheme();
- (*headers)["host"] = url.host();
- (*headers)["path"] = url.path();
- (*headers)["version"] = "HTTP/1.1";
+ (*headers)[":method"] = "GET";
+ (*headers)[":scheme"] = url.scheme();
+ (*headers)[":host"] = url.host();
+ (*headers)[":path"] = url.path();
+ (*headers)[":version"] = "HTTP/1.1";
stream->set_spdy_headers(headers);
EXPECT_TRUE(stream->HasUrl());
EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
diff --git a/net/spdy/spdy_test_util_spdy3.cc b/net/spdy/spdy_test_util_spdy3.cc
index 25094c8..1958fda 100644
--- a/net/spdy/spdy_test_util_spdy3.cc
+++ b/net/spdy/spdy_test_util_spdy3.cc
@@ -373,15 +373,15 @@ spdy::SpdyFrame* ConstructSpdyGet(const char* const url,
host.get()[str_host.size()] = '\0';
const char* const headers[] = {
- "method",
+ ":method",
"GET",
- "url",
+ ":path",
req.get(),
- "host",
+ ":host",
host.get(),
- "scheme",
+ ":scheme",
scheme.get(),
- "version",
+ ":version",
"HTTP/1.1"
};
return ConstructSpdyPacket(
@@ -416,16 +416,16 @@ spdy::SpdyFrame* ConstructSpdyGet(const char* const extra_headers[],
RequestPriority request_priority,
bool direct) {
const char* const kStandardGetHeaders[] = {
- "method",
+ ":method",
"GET",
- "url",
- (direct ? "/" : "http://www.google.com/"),
- "host",
+ ":host",
"www.google.com",
- "scheme",
+ ":scheme",
"http",
- "version",
- "HTTP/1.1"
+ ":version",
+ "HTTP/1.1",
+ ":path",
+ (direct ? "/" : "/")
};
return ConstructSpdyControlFrame(extra_headers,
extra_header_count,
@@ -443,10 +443,10 @@ spdy::SpdyFrame* ConstructSpdyConnect(const char* const extra_headers[],
int extra_header_count,
int stream_id) {
const char* const kConnectHeaders[] = {
- "method", "CONNECT",
- "url", "www.google.com:443",
- "host", "www.google.com",
- "version", "HTTP/1.1",
+ ":method", "CONNECT",
+ ":path", "www.google.com:443",
+ ":host", "www.google.com",
+ ":version", "HTTP/1.1",
};
return ConstructSpdyControlFrame(extra_headers,
extra_header_count,
@@ -669,15 +669,15 @@ spdy::SpdyFrame* ConstructSpdyPost(int64 content_length,
int extra_header_count) {
std::string length_str = base::Int64ToString(content_length);
const char* post_headers[] = {
- "method",
+ ":method",
"POST",
- "url",
+ ":path",
"/",
- "host",
+ ":host",
"www.google.com",
- "scheme",
+ ":scheme",
"http",
- "version",
+ ":version",
"HTTP/1.1",
"content-length",
length_str.c_str()
@@ -700,15 +700,15 @@ spdy::SpdyFrame* ConstructSpdyPost(int64 content_length,
spdy::SpdyFrame* ConstructChunkedSpdyPost(const char* const extra_headers[],
int extra_header_count) {
const char* post_headers[] = {
- "method",
+ ":method",
"POST",
- "url",
+ ":path",
"/",
- "host",
+ ":host",
"www.google.com",
- "scheme",
+ ":scheme",
"http",
- "version",
+ ":version",
"HTTP/1.1"
};
return ConstructSpdyControlFrame(extra_headers,