| Index: net/http/http_stream_parser_unittest.cc
|
| diff --git a/net/http/http_stream_parser_unittest.cc b/net/http/http_stream_parser_unittest.cc
|
| index 1c464b61db7b8abf878dc048fd560aaf6b64d110..30384841bbfdc76f1666af05dfcdc456be27a0d9 100644
|
| --- a/net/http/http_stream_parser_unittest.cc
|
| +++ b/net/http/http_stream_parser_unittest.cc
|
| @@ -19,6 +19,7 @@
|
| #include "net/base/upload_file_element_reader.h"
|
| #include "net/http/http_request_headers.h"
|
| #include "net/http/http_request_info.h"
|
| +#include "net/http/http_response_headers.h"
|
| #include "net/http/http_response_info.h"
|
| #include "net/socket/client_socket_handle.h"
|
| #include "net/socket/socket_test_util.h"
|
| @@ -422,4 +423,65 @@ TEST(HttpStreamParser, TruncatedHeaders) {
|
| }
|
| }
|
|
|
| +// Confirm that on 101 response, the headers are parsed but the data that
|
| +// follows remains in the buffer.
|
| +TEST(HttpStreamParser, Websocket101Response) {
|
| + MockRead reads[] = {
|
| + MockRead(SYNCHRONOUS, 1,
|
| + "HTTP/1.1 101 Switching Protocols\r\n"
|
| + "Upgrade: websocket\r\n"
|
| + "Connection: Upgrade\r\n"
|
| + "\r\n"
|
| + "a fake websocket frame"),
|
| + };
|
| +
|
| + MockWrite writes[] = {
|
| + MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n\r\n"),
|
| + };
|
| +
|
| + DeterministicSocketData data(reads, arraysize(reads),
|
| + writes, arraysize(writes));
|
| + data.set_connect_data(MockConnect(SYNCHRONOUS, OK));
|
| + data.SetStop(2);
|
| +
|
| + scoped_ptr<DeterministicMockTCPClientSocket> transport(
|
| + new DeterministicMockTCPClientSocket(NULL, &data));
|
| + data.set_delegate(transport->AsWeakPtr());
|
| +
|
| + TestCompletionCallback callback;
|
| + int rv = transport->Connect(callback.callback());
|
| + rv = callback.GetResult(rv);
|
| + ASSERT_EQ(OK, rv);
|
| +
|
| + scoped_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle);
|
| + socket_handle->SetSocket(transport.PassAs<StreamSocket>());
|
| +
|
| + HttpRequestInfo request_info;
|
| + request_info.method = "GET";
|
| + request_info.url = GURL("http://localhost");
|
| + request_info.load_flags = LOAD_NORMAL;
|
| +
|
| + scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer);
|
| + HttpStreamParser parser(
|
| + socket_handle.get(), &request_info, read_buffer.get(), BoundNetLog());
|
| +
|
| + HttpRequestHeaders request_headers;
|
| + HttpResponseInfo response_info;
|
| + rv = parser.SendRequest("GET / HTTP/1.1\r\n", request_headers,
|
| + &response_info, callback.callback());
|
| + ASSERT_EQ(OK, rv);
|
| +
|
| + rv = parser.ReadResponseHeaders(callback.callback());
|
| + EXPECT_EQ(OK, rv);
|
| + ASSERT_TRUE(response_info.headers.get());
|
| + EXPECT_EQ(101, response_info.headers->response_code());
|
| + EXPECT_TRUE(response_info.headers->HasHeaderValue("Connection", "Upgrade"));
|
| + EXPECT_TRUE(response_info.headers->HasHeaderValue("Upgrade", "websocket"));
|
| + EXPECT_EQ(read_buffer->capacity(), read_buffer->offset());
|
| + EXPECT_EQ("a fake websocket frame",
|
| + base::StringPiece(read_buffer->StartOfBuffer(),
|
| + read_buffer->capacity()));
|
| +}
|
| +
|
| +
|
| } // namespace net
|
|
|