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 56f3bb3d171cb944c83b8ff0fd5882f6f9b2b850..69aed6c48839d268272e993263cde47f1e25b442 100644 |
--- a/net/http/http_network_transaction_unittest.cc |
+++ b/net/http/http_network_transaction_unittest.cc |
@@ -21,6 +21,7 @@ |
#include "base/memory/weak_ptr.h" |
#include "base/run_loop.h" |
#include "base/stl_util.h" |
+#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/test/test_file_util.h" |
@@ -74,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" |
@@ -14027,6 +14029,13 @@ class FakeStream : public HttpStream, |
bool GetRemoteEndpoint(IPEndPoint* endpoint) override { return false; } |
+ int GetProvidedTokenBindingWithKey( |
+ const scoped_ptr<crypto::ECPrivateKey>& key, |
+ std::string* header_out) override { |
+ ADD_FAILURE(); |
+ return ERR_NOT_IMPLEMENTED; |
+ } |
+ |
void Drain(HttpNetworkSession* session) override { ADD_FAILURE(); } |
void SetPriority(RequestPriority priority) override { priority_ = priority; } |
@@ -14245,6 +14254,13 @@ class FakeWebSocketBasicHandshakeStream : public WebSocketHandshakeStreamBase { |
bool GetRemoteEndpoint(IPEndPoint* endpoint) override { return false; } |
+ int GetProvidedTokenBindingWithKey( |
+ const scoped_ptr<crypto::ECPrivateKey>& key, |
+ std::string* header_out) override { |
+ ADD_FAILURE(); |
+ return ERR_NOT_IMPLEMENTED; |
+ } |
+ |
void Drain(HttpNetworkSession* session) override { NOTREACHED(); } |
void SetPriority(RequestPriority priority) override { NOTREACHED(); } |
@@ -15373,4 +15389,36 @@ TEST_P(HttpNetworkTransactionTest, TotalNetworkBytesChunkedPost) { |
trans->GetTotalReceivedBytes()); |
} |
+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(GetParam()); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
+ scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
+ scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
+ MockRead reads[] = {CreateMockRead(*resp, 1), CreateMockRead(*body, 2), |
+ MockRead(ASYNC, ERR_IO_PENDING, 3)}; |
+ StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
+ session_deps_.socket_factory->AddSocketDataProvider(&data); |
+ session_deps_.channel_id_service.reset(new ChannelIDService( |
+ new DefaultChannelIDStore(NULL), 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)); |
+} |
+ |
} // namespace net |