Index: net/spdy/spdy_proxy_client_socket_unittest.cc |
=================================================================== |
--- net/spdy/spdy_proxy_client_socket_unittest.cc (revision 118888) |
+++ net/spdy/spdy_proxy_client_socket_unittest.cc (working copy) |
@@ -68,6 +68,7 @@ |
spdy::SpdyFrame* ConstructConnectAuthRequestFrame(); |
spdy::SpdyFrame* ConstructConnectReplyFrame(); |
spdy::SpdyFrame* ConstructConnectAuthReplyFrame(); |
+ spdy::SpdyFrame* ConstructConnectNtlmAuthReplyFrame(); |
spdy::SpdyFrame* ConstructConnectErrorReplyFrame(); |
spdy::SpdyFrame* ConstructBodyFrame(const char* data, int length); |
scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); |
@@ -199,8 +200,12 @@ |
sock_.reset( |
new SpdyProxyClientSocket(spdy_stream_, user_agent_, |
endpoint_host_port_pair_, url_, |
- proxy_host_port_, session_->http_auth_cache(), |
- session_->http_auth_handler_factory())); |
+ proxy_host_port_, |
+ new HttpAuthController( |
+ HttpAuth::AUTH_PROXY, |
+ GURL(kProxyUrl), |
+ session_->http_auth_cache(), |
+ session_->http_auth_handler_factory()))); |
} |
scoped_refptr<IOBufferWithSize> SpdyProxyClientSocketTest::CreateBuffer( |
@@ -390,6 +395,26 @@ |
arraysize(kStandardReplyHeaders)); |
} |
+// Constructs a standard SPDY SYN_REPLY frame to match the SPDY CONNECT. |
+spdy::SpdyFrame* |
+SpdyProxyClientSocketTest::ConstructConnectNtlmAuthReplyFrame() { |
+ const char* const kStandardReplyHeaders[] = { |
+ "status", "407 Proxy Authentication Required", |
+ "version", "HTTP/1.1", |
+ "proxy-authenticate", "NTLM" |
+ }; |
+ |
+ return ConstructSpdyControlFrame(NULL, |
+ 0, |
+ false, |
+ kStreamId, |
+ LOWEST, |
+ spdy::SYN_REPLY, |
+ spdy::CONTROL_FLAG_NONE, |
+ kStandardReplyHeaders, |
+ arraysize(kStandardReplyHeaders)); |
+} |
+ |
// Constructs a SPDY SYN_REPLY frame with an HTTP 500 error. |
spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() { |
const char* const kStandardReplyHeaders[] = { |
@@ -436,13 +461,13 @@ |
AssertConnectionEstablished(); |
} |
-TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { |
+TEST_F(SpdyProxyClientSocketTest, ConnectWithUnsupportedAuthScheme) { |
scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
MockWrite writes[] = { |
CreateMockWrite(*conn, 0, false), |
}; |
- scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); |
+ scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectNtlmAuthReplyFrame()); |
MockRead reads[] = { |
CreateMockRead(*resp, 1, true), |
MockRead(true, 0, 3), // EOF |
@@ -450,13 +475,7 @@ |
Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
- AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); |
- |
- const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
- ASSERT_TRUE(response != NULL); |
- ASSERT_EQ(407, response->headers->response_code()); |
- ASSERT_EQ("Proxy Authentication Required", |
- response->headers->GetStatusText()); |
+ AssertConnectFails(ERR_PROXY_AUTH_UNSUPPORTED); |
} |
TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { |
@@ -479,6 +498,39 @@ |
AssertConnectionEstablished(); |
} |
+TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRestart) { |
+ scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
+ scoped_ptr<spdy::SpdyFrame> auth(ConstructConnectAuthRequestFrame()); |
+ MockWrite writes[] = { |
+ CreateMockWrite(*conn, 0, false), |
+ }; |
+ |
+ scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); |
+ scoped_ptr<spdy::SpdyFrame> auth_resp(ConstructConnectReplyFrame()); |
+ MockRead reads[] = { |
+ CreateMockRead(*resp, 1, true), |
+ MockRead(true, 0, 3), // EOF |
+ }; |
+ |
+ Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
+ |
+ AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); |
+ |
+ const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
+ ASSERT_TRUE(response != NULL); |
+ ASSERT_EQ(407, response->headers->response_code()); |
+ ASSERT_EQ("Proxy Authentication Required", |
+ response->headers->GetStatusText()); |
+ |
+ AddAuthToCache(); |
+ |
+ ASSERT_EQ(ERR_NO_KEEP_ALIVE_ON_AUTH_RESTART, |
+ sock_->RestartWithAuth(read_callback_.callback())); |
+ // A SpdyProxyClientSocket sits on a single SPDY stream which can |
+ // only be used for a single request/response. |
+ ASSERT_FALSE(sock_->IsConnectedAndIdle()); |
+} |
+ |
TEST_F(SpdyProxyClientSocketTest, ConnectFails) { |
scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
MockWrite writes[] = { |
@@ -831,7 +883,7 @@ |
Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
- AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); |
+ AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); |
Run(2); // SpdySession consumes the next two reads and sends then to |
// sock_ to be buffered. |