| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
| 6 | 6 |
| 7 #include <math.h> // ceil | 7 #include <math.h> // ceil |
| 8 #include <stdarg.h> | 8 #include <stdarg.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 }; | 701 }; |
| 702 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 702 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 703 arraysize(data_reads)); | 703 arraysize(data_reads)); |
| 704 EXPECT_THAT(out.rv, IsOk()); | 704 EXPECT_THAT(out.rv, IsOk()); |
| 705 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); | 705 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
| 706 EXPECT_EQ("hello world", out.response_data); | 706 EXPECT_EQ("hello world", out.response_data); |
| 707 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); | 707 int64_t reads_size = CountReadBytes(data_reads, arraysize(data_reads)); |
| 708 EXPECT_EQ(reads_size, out.total_received_bytes); | 708 EXPECT_EQ(reads_size, out.total_received_bytes); |
| 709 } | 709 } |
| 710 | 710 |
| 711 // Response with no status line, and a weird port. Should fail by default. |
| 712 TEST_F(HttpNetworkTransactionTest, SimpleGETNoHeadersWeirdPort) { |
| 713 MockRead data_reads[] = { |
| 714 MockRead("hello world"), MockRead(SYNCHRONOUS, OK), |
| 715 }; |
| 716 |
| 717 StaticSocketDataProvider data(data_reads, arraysize(data_reads), nullptr, 0); |
| 718 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 719 |
| 720 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 721 |
| 722 std::unique_ptr<HttpTransaction> trans( |
| 723 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
| 724 |
| 725 HttpRequestInfo request; |
| 726 request.method = "GET"; |
| 727 request.url = GURL("http://www.example.com:2000/"); |
| 728 TestCompletionCallback callback; |
| 729 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 730 EXPECT_THAT(callback.GetResult(rv), IsError(ERR_INVALID_HTTP_RESPONSE)); |
| 731 } |
| 732 |
| 733 // Response with no status line, and a weird port. Option to allow weird ports |
| 734 // enabled. |
| 735 TEST_F(HttpNetworkTransactionTest, SimpleGETNoHeadersWeirdPortAllowed) { |
| 736 MockRead data_reads[] = { |
| 737 MockRead("hello world"), MockRead(SYNCHRONOUS, OK), |
| 738 }; |
| 739 |
| 740 StaticSocketDataProvider data(data_reads, arraysize(data_reads), nullptr, 0); |
| 741 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 742 session_deps_.http_09_on_non_default_ports_enabled = true; |
| 743 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 744 |
| 745 std::unique_ptr<HttpTransaction> trans( |
| 746 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
| 747 |
| 748 HttpRequestInfo request; |
| 749 request.method = "GET"; |
| 750 request.url = GURL("http://www.example.com:2000/"); |
| 751 TestCompletionCallback callback; |
| 752 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 753 EXPECT_THAT(callback.GetResult(rv), IsOk()); |
| 754 |
| 755 const HttpResponseInfo* info = trans->GetResponseInfo(); |
| 756 ASSERT_TRUE(info->headers); |
| 757 EXPECT_EQ("HTTP/0.9 200 OK", info->headers->GetStatusLine()); |
| 758 |
| 759 // Don't bother to read the body - that's verified elsewhere, important thing |
| 760 // is that the option to allow HTTP/0.9 on non-default ports is respected. |
| 761 } |
| 762 |
| 711 // Allow up to 4 bytes of junk to precede status line. | 763 // Allow up to 4 bytes of junk to precede status line. |
| 712 TEST_F(HttpNetworkTransactionTest, StatusLineJunk3Bytes) { | 764 TEST_F(HttpNetworkTransactionTest, StatusLineJunk3Bytes) { |
| 713 MockRead data_reads[] = { | 765 MockRead data_reads[] = { |
| 714 MockRead("xxxHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), | 766 MockRead("xxxHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), |
| 715 MockRead(SYNCHRONOUS, OK), | 767 MockRead(SYNCHRONOUS, OK), |
| 716 }; | 768 }; |
| 717 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 769 SimpleGetHelperResult out = SimpleGetHelper(data_reads, |
| 718 arraysize(data_reads)); | 770 arraysize(data_reads)); |
| 719 EXPECT_THAT(out.rv, IsOk()); | 771 EXPECT_THAT(out.rv, IsOk()); |
| 720 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); | 772 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); |
| (...skipping 13568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14289 DISALLOW_COPY_AND_ASSIGN(FakeStreamFactory); | 14341 DISALLOW_COPY_AND_ASSIGN(FakeStreamFactory); |
| 14290 }; | 14342 }; |
| 14291 | 14343 |
| 14292 // TODO(ricea): Maybe unify this with the one in | 14344 // TODO(ricea): Maybe unify this with the one in |
| 14293 // url_request_http_job_unittest.cc ? | 14345 // url_request_http_job_unittest.cc ? |
| 14294 class FakeWebSocketBasicHandshakeStream : public WebSocketHandshakeStreamBase { | 14346 class FakeWebSocketBasicHandshakeStream : public WebSocketHandshakeStreamBase { |
| 14295 public: | 14347 public: |
| 14296 FakeWebSocketBasicHandshakeStream( | 14348 FakeWebSocketBasicHandshakeStream( |
| 14297 std::unique_ptr<ClientSocketHandle> connection, | 14349 std::unique_ptr<ClientSocketHandle> connection, |
| 14298 bool using_proxy) | 14350 bool using_proxy) |
| 14299 : state_(std::move(connection), using_proxy) {} | 14351 : state_(std::move(connection), using_proxy, false) {} |
| 14300 | 14352 |
| 14301 // Fake implementation of HttpStreamBase methods. | 14353 // Fake implementation of HttpStreamBase methods. |
| 14302 // This ends up being quite "real" because this object has to really send data | 14354 // This ends up being quite "real" because this object has to really send data |
| 14303 // on the mock socket. It might be easier to use the real implementation, but | 14355 // on the mock socket. It might be easier to use the real implementation, but |
| 14304 // the fact that the WebSocket code is not compiled on iOS makes that | 14356 // the fact that the WebSocket code is not compiled on iOS makes that |
| 14305 // difficult. | 14357 // difficult. |
| 14306 int InitializeStream(const HttpRequestInfo* request_info, | 14358 int InitializeStream(const HttpRequestInfo* request_info, |
| 14307 RequestPriority priority, | 14359 RequestPriority priority, |
| 14308 const BoundNetLog& net_log, | 14360 const BoundNetLog& net_log, |
| 14309 const CompletionCallback& callback) override { | 14361 const CompletionCallback& callback) override { |
| (...skipping 1211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15521 base::RunLoop().RunUntilIdle(); | 15573 base::RunLoop().RunUntilIdle(); |
| 15522 | 15574 |
| 15523 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); | 15575 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); |
| 15524 HttpRequestHeaders headers; | 15576 HttpRequestHeaders headers; |
| 15525 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); | 15577 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); |
| 15526 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); | 15578 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); |
| 15527 } | 15579 } |
| 15528 #endif // !defined(OS_IOS) | 15580 #endif // !defined(OS_IOS) |
| 15529 | 15581 |
| 15530 } // namespace net | 15582 } // namespace net |
| OLD | NEW |