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 |