diff options
-rw-r--r-- | net/spdy/spdy_http_stream.cc | 3 | ||||
-rw-r--r-- | net/spdy/spdy_http_stream_spdy3_unittest.cc | 4 | ||||
-rw-r--r-- | net/spdy/spdy_http_utils.cc | 28 | ||||
-rw-r--r-- | net/spdy/spdy_http_utils.h | 3 | ||||
-rw-r--r-- | net/spdy/spdy_network_transaction_spdy3_unittest.cc | 70 | ||||
-rw-r--r-- | net/spdy/spdy_proxy_client_socket.cc | 11 | ||||
-rw-r--r-- | net/spdy/spdy_proxy_client_socket_spdy3_unittest.cc | 16 | ||||
-rw-r--r-- | net/spdy/spdy_session.cc | 5 | ||||
-rw-r--r-- | net/spdy/spdy_session.h | 2 | ||||
-rw-r--r-- | net/spdy/spdy_session_spdy2_unittest.cc | 81 | ||||
-rw-r--r-- | net/spdy/spdy_session_spdy3_unittest.cc | 2 | ||||
-rw-r--r-- | net/spdy/spdy_stream.cc | 44 | ||||
-rw-r--r-- | net/spdy/spdy_stream.h | 6 | ||||
-rw-r--r-- | net/spdy/spdy_stream_spdy2_unittest.cc | 22 | ||||
-rw-r--r-- | net/spdy/spdy_stream_spdy3_unittest.cc | 67 | ||||
-rw-r--r-- | net/spdy/spdy_test_util_spdy3.cc | 52 |
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, |