| 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 ce38cf200026d2a23e9cc68e3bb2be7adb465e13..28deb66786a0fd6b42fb9c520daabc444a324cd7 100644
|
| --- a/net/http/http_network_transaction_unittest.cc
|
| +++ b/net/http/http_network_transaction_unittest.cc
|
| @@ -16513,4 +16513,80 @@ TEST_F(HttpNetworkTransactionTest, TokenBindingSpdy) {
|
| }
|
| #endif // !defined(OS_IOS)
|
|
|
| +// Test a SPDY CONNECT through an HTTPS Proxy to plaintext WebSocket Server.
|
| +TEST_F(HttpNetworkTransactionTest, PlaintextWebsocketOverSpdyProxy) {
|
| + HttpRequestInfo request;
|
| + request.method = "GET";
|
| + request.url = GURL("ws://www.example.org/");
|
| + AddWebSocketHeaders(&request.extra_headers);
|
| +
|
| + // Configure against https proxy server "proxy:70".
|
| + session_deps_.proxy_service = ProxyService::CreateFixed("https://proxy:70");
|
| + BoundTestNetLog log;
|
| + session_deps_.net_log = log.bound().net_log();
|
| + std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
|
| +
|
| + HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
|
| + FakeWebSocketStreamCreateHelper websocket_stream_create_helper;
|
| + trans.SetWebSocketHandshakeStreamCreateHelper(
|
| + &websocket_stream_create_helper);
|
| +
|
| + // CONNECT to www.example.org:443 via SPDY
|
| + SpdySerializedFrame connect(spdy_util_.ConstructSpdyConnect(
|
| + nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 80)));
|
| + const char req[] =
|
| + "GET / HTTP/1.1\r\n"
|
| + "Host: www.example.org\r\n"
|
| + "Connection: Upgrade\r\n"
|
| + "Upgrade: websocket\r\n"
|
| + "Origin: http://www.example.org\r\n"
|
| + "Sec-WebSocket-Version: 13\r\n"
|
| + "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n";
|
| + SpdySerializedFrame wrapped_ws_req(
|
| + spdy_util_.ConstructSpdyDataFrame(1, req, strlen(req), false));
|
| + SpdySerializedFrame conn_resp(
|
| + spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
|
| + const char resp[] =
|
| + "HTTP/1.1 101 Switching Protocols\r\n"
|
| + "Upgrade: websocket\r\n"
|
| + "Connection: Upgrade\r\n"
|
| + "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n";
|
| + SpdySerializedFrame wrapped_ws_resp(
|
| + spdy_util_.ConstructSpdyDataFrame(1, resp, strlen(resp), false));
|
| + SpdySerializedFrame window_update(
|
| + spdy_util_.ConstructSpdyWindowUpdate(1, wrapped_ws_resp.size()));
|
| +
|
| + MockWrite spdy_writes[] = {
|
| + CreateMockWrite(connect, 0), CreateMockWrite(wrapped_ws_req, 2),
|
| + CreateMockWrite(window_update, 4),
|
| + };
|
| +
|
| + MockRead spdy_reads[] = {
|
| + CreateMockRead(conn_resp, 1, ASYNC),
|
| + CreateMockRead(wrapped_ws_resp, 3, ASYNC), MockRead(ASYNC, 0, 5),
|
| + };
|
| +
|
| + SequencedSocketData spdy_data(spdy_reads, arraysize(spdy_reads), spdy_writes,
|
| + arraysize(spdy_writes));
|
| + session_deps_.socket_factory->AddSocketDataProvider(&spdy_data);
|
| +
|
| + SSLSocketDataProvider ssl(ASYNC, OK);
|
| + ssl.next_proto = kProtoHTTP2;
|
| + session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
|
| +
|
| + TestCompletionCallback callback;
|
| +
|
| + int rv = trans.Start(&request, callback.callback(), log.bound());
|
| + EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
|
| +
|
| + rv = callback.WaitForResult();
|
| + ASSERT_THAT(rv, IsOk());
|
| +
|
| + const HttpResponseInfo* response = trans.GetResponseInfo();
|
| + ASSERT_TRUE(response);
|
| + ASSERT_TRUE(response->headers);
|
| + EXPECT_EQ("HTTP/1.1 101 Switching Protocols",
|
| + response->headers->GetStatusLine());
|
| +}
|
| +
|
| } // namespace net
|
|
|