Index: net/spdy/spdy_proxy_client_socket_unittest.cc |
=================================================================== |
--- net/spdy/spdy_proxy_client_socket_unittest.cc (revision 110584) |
+++ net/spdy/spdy_proxy_client_socket_unittest.cc (working copy) |
@@ -66,6 +66,7 @@ |
spdy::SpdyFrame* ConstructConnectAuthRequestFrame(); |
spdy::SpdyFrame* ConstructConnectReplyFrame(); |
spdy::SpdyFrame* ConstructConnectAuthReplyFrame(); |
+ spdy::SpdyFrame* ConstructNtlmAuthReplyFrame(); |
spdy::SpdyFrame* ConstructConnectErrorReplyFrame(); |
spdy::SpdyFrame* ConstructBodyFrame(const char* data, int length); |
scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); |
@@ -387,6 +388,26 @@ |
arraysize(kStandardReplyHeaders)); |
} |
+// Constructs a SPDY SYN_REPLY frame to match the SPDY CONNECT which |
+// requires Proxy Authentication using NTLM. |
+spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructNtlmAuthReplyFrame() { |
+ 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[] = { |
@@ -433,6 +454,23 @@ |
AssertConnectionEstablished(); |
} |
+TEST_F(SpdyProxyClientSocketTest, ConnectWithUnsupportedAuth) { |
+ scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
+ MockWrite writes[] = { |
+ CreateMockWrite(*conn, 0, false), |
+ }; |
+ |
+ scoped_ptr<spdy::SpdyFrame> resp(ConstructNtlmAuthReplyFrame()); |
+ MockRead reads[] = { |
+ CreateMockRead(*resp, 1, true), |
+ MockRead(true, 0, 3), // EOF |
+ }; |
+ |
+ Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
+ |
+ AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); |
+} |
+ |
TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { |
scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
MockWrite writes[] = { |
@@ -447,7 +485,7 @@ |
Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
- AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); |
+ AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); |
const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
ASSERT_TRUE(response != NULL); |
@@ -476,6 +514,38 @@ |
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(OK, sock_->RestartWithAuth(&read_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[] = { |
@@ -821,7 +891,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. |