Index: net/http/http_network_transaction_unittest.cc |
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc |
index ed7470b3a618ffba8be29837496992d3e2f5ca21..dd11522731803f07fc05bd612e18c93071f66b32 100644 |
--- a/net/http/http_network_transaction_unittest.cc |
+++ b/net/http/http_network_transaction_unittest.cc |
@@ -75,6 +75,7 @@ |
#include "net/spdy/spdy_session.h" |
#include "net/spdy/spdy_session_pool.h" |
#include "net/spdy/spdy_test_util_common.h" |
+#include "net/ssl/default_channel_id_store.h" |
#include "net/ssl/ssl_cert_request_info.h" |
#include "net/ssl/ssl_config_service.h" |
#include "net/ssl/ssl_config_service_defaults.h" |
@@ -14413,6 +14414,12 @@ class FakeStream : public HttpStream, |
bool GetRemoteEndpoint(IPEndPoint* endpoint) override { return false; } |
+ Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, |
+ std::vector<uint8_t>* out) override { |
+ ADD_FAILURE(); |
+ return ERR_NOT_IMPLEMENTED; |
+ } |
+ |
void Drain(HttpNetworkSession* session) override { ADD_FAILURE(); } |
void PopulateNetErrorDetails(NetErrorDetails* details) override { return; } |
@@ -14644,6 +14651,12 @@ class FakeWebSocketBasicHandshakeStream : public WebSocketHandshakeStreamBase { |
bool GetRemoteEndpoint(IPEndPoint* endpoint) override { return false; } |
+ Error GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key, |
+ std::vector<uint8_t>* out) override { |
+ ADD_FAILURE(); |
+ return ERR_NOT_IMPLEMENTED; |
+ } |
+ |
void Drain(HttpNetworkSession* session) override { NOTREACHED(); } |
void PopulateNetErrorDetails(NetErrorDetails* details) override { return; } |
@@ -15802,4 +15815,41 @@ TEST_P(HttpNetworkTransactionTest, DisableNPN) { |
EXPECT_TRUE(trans.server_ssl_config_.npn_protos.empty()); |
} |
+#if !defined(OS_IOS) |
+TEST_P(HttpNetworkTransactionTest, TokenBindingSpdy) { |
+ const std::string https_url = "https://www.example.com"; |
+ HttpRequestInfo request; |
+ request.url = GURL(https_url); |
+ request.method = "GET"; |
+ |
+ SSLSocketDataProvider ssl(ASYNC, OK); |
+ ssl.token_binding_negotiated = true; |
+ ssl.token_binding_key_param = TB_PARAM_ECDSAP256; |
+ ssl.SetNextProto(GetProtocol()); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
+ |
+ scoped_ptr<SpdyFrame> resp( |
+ spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
+ scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
+ MockRead reads[] = {CreateMockRead(*resp), CreateMockRead(*body), |
+ MockRead(ASYNC, ERR_IO_PENDING)}; |
+ StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); |
+ session_deps_.socket_factory->AddSocketDataProvider(&data); |
+ session_deps_.channel_id_service.reset(new ChannelIDService( |
+ new DefaultChannelIDStore(nullptr), base::ThreadTaskRunnerHandle::Get())); |
+ scoped_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
+ |
+ HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
+ TestCompletionCallback callback; |
+ EXPECT_EQ(ERR_IO_PENDING, |
+ trans.Start(&request, callback.callback(), BoundNetLog())); |
+ base::MessageLoop::current()->RunUntilIdle(); |
+ |
+ EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); |
+ HttpRequestHeaders headers; |
+ ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); |
+ EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); |
+} |
+#endif // !defined(OS_IOS) |
+ |
} // namespace net |