| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/quic/chromium/quic_http_stream.h" | 5 #include "net/quic/chromium/quic_http_stream.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 session_.reset(new QuicChromiumClientSession( | 311 session_.reset(new QuicChromiumClientSession( |
| 312 connection_, std::move(socket), | 312 connection_, std::move(socket), |
| 313 /*stream_factory=*/nullptr, &crypto_client_stream_factory_, &clock_, | 313 /*stream_factory=*/nullptr, &crypto_client_stream_factory_, &clock_, |
| 314 &transport_security_state_, | 314 &transport_security_state_, |
| 315 base::WrapUnique(static_cast<QuicServerInfo*>(nullptr)), | 315 base::WrapUnique(static_cast<QuicServerInfo*>(nullptr)), |
| 316 QuicServerId(kDefaultServerHostName, kDefaultServerPort, | 316 QuicServerId(kDefaultServerHostName, kDefaultServerPort, |
| 317 PRIVACY_MODE_DISABLED), | 317 PRIVACY_MODE_DISABLED), |
| 318 kQuicYieldAfterPacketsRead, | 318 kQuicYieldAfterPacketsRead, |
| 319 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds), | 319 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds), |
| 320 /*cert_verify_flags=*/0, DefaultQuicConfig(), &crypto_config_, | 320 /*cert_verify_flags=*/0, DefaultQuicConfig(), &crypto_config_, |
| 321 "CONNECTION_UNKNOWN", base::TimeTicks::Now(), &push_promise_index_, | 321 "CONNECTION_UNKNOWN", base::TimeTicks::Now(), base::TimeTicks::Now(), |
| 322 base::ThreadTaskRunnerHandle::Get().get(), | 322 &push_promise_index_, base::ThreadTaskRunnerHandle::Get().get(), |
| 323 /*socket_performance_watcher=*/nullptr, net_log_.bound().net_log())); | 323 /*socket_performance_watcher=*/nullptr, net_log_.bound().net_log())); |
| 324 session_->Initialize(); | 324 session_->Initialize(); |
| 325 session_->GetCryptoStream()->CryptoConnect(); | 325 session_->GetCryptoStream()->CryptoConnect(); |
| 326 EXPECT_TRUE(session_->IsCryptoHandshakeConfirmed()); | 326 EXPECT_TRUE(session_->IsCryptoHandshakeConfirmed()); |
| 327 stream_.reset(use_closing_stream_ | 327 stream_.reset(use_closing_stream_ |
| 328 ? new AutoClosingStream(session_->GetWeakPtr()) | 328 ? new AutoClosingStream(session_->GetWeakPtr()) |
| 329 : new QuicHttpStream(session_->GetWeakPtr())); | 329 : new QuicHttpStream(session_->GetWeakPtr())); |
| 330 | 330 |
| 331 promised_stream_.reset(use_closing_stream_ | 331 promised_stream_.reset(use_closing_stream_ |
| 332 ? new AutoClosingStream(session_->GetWeakPtr()) | 332 ? new AutoClosingStream(session_->GetWeakPtr()) |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 should_include_version, fin, offset, data, | 392 should_include_version, fin, offset, data, |
| 393 &server_maker_); | 393 &server_maker_); |
| 394 } | 394 } |
| 395 | 395 |
| 396 std::unique_ptr<QuicReceivedPacket> InnerConstructRequestHeadersPacket( | 396 std::unique_ptr<QuicReceivedPacket> InnerConstructRequestHeadersPacket( |
| 397 QuicPacketNumber packet_number, | 397 QuicPacketNumber packet_number, |
| 398 QuicStreamId stream_id, | 398 QuicStreamId stream_id, |
| 399 bool should_include_version, | 399 bool should_include_version, |
| 400 bool fin, | 400 bool fin, |
| 401 RequestPriority request_priority, | 401 RequestPriority request_priority, |
| 402 size_t* spdy_headers_frame_length) { | 402 size_t* spdy_headers_frame_length, |
| 403 QuicStreamOffset* offset) { |
| 403 SpdyPriority priority = | 404 SpdyPriority priority = |
| 404 ConvertRequestPriorityToQuicPriority(request_priority); | 405 ConvertRequestPriorityToQuicPriority(request_priority); |
| 405 return client_maker_.MakeRequestHeadersPacket( | 406 return client_maker_.MakeRequestHeadersPacket( |
| 406 packet_number, stream_id, should_include_version, fin, priority, | 407 packet_number, stream_id, should_include_version, fin, priority, |
| 407 std::move(request_headers_), spdy_headers_frame_length); | 408 std::move(request_headers_), spdy_headers_frame_length, offset); |
| 408 } | 409 } |
| 409 | 410 |
| 410 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( | 411 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( |
| 411 QuicPacketNumber packet_number, | 412 QuicPacketNumber packet_number, |
| 412 bool fin, | 413 bool fin, |
| 413 RequestPriority request_priority, | 414 RequestPriority request_priority, |
| 414 size_t* spdy_headers_frame_length) { | 415 size_t* spdy_headers_frame_length) { |
| 415 return InnerConstructRequestHeadersPacket( | 416 return InnerConstructRequestHeadersPacket( |
| 416 packet_number, stream_id_, kIncludeVersion, fin, request_priority, | 417 packet_number, stream_id_, kIncludeVersion, fin, request_priority, |
| 417 spdy_headers_frame_length); | 418 spdy_headers_frame_length, nullptr); |
| 418 } | 419 } |
| 419 | 420 |
| 420 std::unique_ptr<QuicReceivedPacket> InnerConstructResponseHeadersPacket( | 421 std::unique_ptr<QuicReceivedPacket> InnerConstructResponseHeadersPacket( |
| 421 QuicPacketNumber packet_number, | 422 QuicPacketNumber packet_number, |
| 422 QuicStreamId stream_id, | 423 QuicStreamId stream_id, |
| 423 bool fin, | 424 bool fin, |
| 424 size_t* spdy_headers_frame_length) { | 425 size_t* spdy_headers_frame_length) { |
| 425 return server_maker_.MakeResponseHeadersPacket( | 426 return server_maker_.MakeResponseHeadersPacket( |
| 426 packet_number, stream_id, !kIncludeVersion, fin, | 427 packet_number, stream_id, !kIncludeVersion, fin, |
| 427 std::move(response_headers_), spdy_headers_frame_length, | 428 std::move(response_headers_), spdy_headers_frame_length, |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 } | 520 } |
| 520 | 521 |
| 521 void ReceivePromise(QuicStreamId id) { | 522 void ReceivePromise(QuicStreamId id) { |
| 522 QuicChromiumClientStream* stream = | 523 QuicChromiumClientStream* stream = |
| 523 QuicHttpStreamPeer::GetQuicChromiumClientStream(stream_.get()); | 524 QuicHttpStreamPeer::GetQuicChromiumClientStream(stream_.get()); |
| 524 stream->OnStreamHeaders(serialized_push_promise_); | 525 stream->OnStreamHeaders(serialized_push_promise_); |
| 525 | 526 |
| 526 stream->OnPromiseHeadersComplete(id, serialized_push_promise_.size()); | 527 stream->OnPromiseHeadersComplete(id, serialized_push_promise_.size()); |
| 527 } | 528 } |
| 528 | 529 |
| 530 void assertLoadTimingValid(const LoadTimingInfo& load_timing_info, |
| 531 bool session_reused) { |
| 532 EXPECT_EQ(session_reused, load_timing_info.socket_reused); |
| 533 // Connect time and SSL time are null because test fixture does not do a |
| 534 // real connect. |
| 535 EXPECT_TRUE(load_timing_info.connect_timing.connect_start.is_null()); |
| 536 EXPECT_TRUE(load_timing_info.connect_timing.connect_end.is_null()); |
| 537 EXPECT_TRUE(load_timing_info.connect_timing.ssl_start.is_null()); |
| 538 EXPECT_TRUE(load_timing_info.connect_timing.ssl_end.is_null()); |
| 539 |
| 540 // DNS times are passed in through constructor so they can't be null. |
| 541 // If |session_reused| is true, these fields should all be null, non-null |
| 542 // otherwise. |
| 543 EXPECT_EQ(session_reused, |
| 544 load_timing_info.connect_timing.dns_start.is_null()); |
| 545 EXPECT_EQ(session_reused, |
| 546 load_timing_info.connect_timing.dns_end.is_null()); |
| 547 } |
| 548 |
| 529 BoundTestNetLog net_log_; | 549 BoundTestNetLog net_log_; |
| 530 bool use_closing_stream_; | 550 bool use_closing_stream_; |
| 531 MockSendAlgorithm* send_algorithm_; | 551 MockSendAlgorithm* send_algorithm_; |
| 532 scoped_refptr<TestTaskRunner> runner_; | 552 scoped_refptr<TestTaskRunner> runner_; |
| 533 std::unique_ptr<MockWrite[]> mock_writes_; | 553 std::unique_ptr<MockWrite[]> mock_writes_; |
| 534 MockClock clock_; | 554 MockClock clock_; |
| 535 TestQuicConnection* connection_; | 555 TestQuicConnection* connection_; |
| 536 std::unique_ptr<QuicChromiumConnectionHelper> helper_; | 556 std::unique_ptr<QuicChromiumConnectionHelper> helper_; |
| 537 std::unique_ptr<QuicChromiumAlarmFactory> alarm_factory_; | 557 std::unique_ptr<QuicChromiumAlarmFactory> alarm_factory_; |
| 538 testing::StrictMock<MockQuicConnectionVisitor> visitor_; | 558 testing::StrictMock<MockQuicConnectionVisitor> visitor_; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 TEST_P(QuicHttpStreamTest, GetRequest) { | 621 TEST_P(QuicHttpStreamTest, GetRequest) { |
| 602 SetRequest("GET", "/", DEFAULT_PRIORITY); | 622 SetRequest("GET", "/", DEFAULT_PRIORITY); |
| 603 size_t spdy_request_header_frame_length; | 623 size_t spdy_request_header_frame_length; |
| 604 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, | 624 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, |
| 605 &spdy_request_header_frame_length)); | 625 &spdy_request_header_frame_length)); |
| 606 Initialize(); | 626 Initialize(); |
| 607 | 627 |
| 608 request_.method = "GET"; | 628 request_.method = "GET"; |
| 609 request_.url = GURL("http://www.example.org/"); | 629 request_.url = GURL("http://www.example.org/"); |
| 610 | 630 |
| 631 // Make sure getting load timing from the stream early does not crash. |
| 632 LoadTimingInfo load_timing_info; |
| 633 EXPECT_FALSE(stream_->GetLoadTimingInfo(&load_timing_info)); |
| 634 |
| 611 EXPECT_EQ(OK, | 635 EXPECT_EQ(OK, |
| 612 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, | 636 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, |
| 613 net_log_.bound(), callback_.callback())); | 637 net_log_.bound(), callback_.callback())); |
| 614 EXPECT_EQ(OK, | 638 EXPECT_EQ(OK, |
| 615 stream_->SendRequest(headers_, &response_, callback_.callback())); | 639 stream_->SendRequest(headers_, &response_, callback_.callback())); |
| 616 | 640 |
| 617 // Ack the request. | 641 // Ack the request. |
| 618 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); | 642 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); |
| 619 | 643 |
| 620 EXPECT_THAT(stream_->ReadResponseHeaders(callback_.callback()), | 644 EXPECT_THAT(stream_->ReadResponseHeaders(callback_.callback()), |
| (...skipping 12 matching lines...) Expand all Loading... |
| 633 EXPECT_FALSE(response_.response_time.is_null()); | 657 EXPECT_FALSE(response_.response_time.is_null()); |
| 634 EXPECT_FALSE(response_.request_time.is_null()); | 658 EXPECT_FALSE(response_.request_time.is_null()); |
| 635 | 659 |
| 636 // There is no body, so this should return immediately. | 660 // There is no body, so this should return immediately. |
| 637 EXPECT_EQ(0, | 661 EXPECT_EQ(0, |
| 638 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), | 662 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), |
| 639 callback_.callback())); | 663 callback_.callback())); |
| 640 EXPECT_TRUE(stream_->IsResponseBodyComplete()); | 664 EXPECT_TRUE(stream_->IsResponseBodyComplete()); |
| 641 EXPECT_TRUE(AtEof()); | 665 EXPECT_TRUE(AtEof()); |
| 642 | 666 |
| 667 EXPECT_TRUE(stream_->GetLoadTimingInfo(&load_timing_info)); |
| 668 assertLoadTimingValid(load_timing_info, /*session_reused=*/false); |
| 669 |
| 643 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the | 670 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the |
| 644 // headers and payload. | 671 // headers and payload. |
| 645 EXPECT_EQ(static_cast<int64_t>(spdy_request_header_frame_length), | 672 EXPECT_EQ(static_cast<int64_t>(spdy_request_header_frame_length), |
| 646 stream_->GetTotalSentBytes()); | 673 stream_->GetTotalSentBytes()); |
| 647 EXPECT_EQ(static_cast<int64_t>(spdy_response_header_frame_length), | 674 EXPECT_EQ(static_cast<int64_t>(spdy_response_header_frame_length), |
| 648 stream_->GetTotalReceivedBytes()); | 675 stream_->GetTotalReceivedBytes()); |
| 649 } | 676 } |
| 650 | 677 |
| 678 TEST_P(QuicHttpStreamTest, LoadTimingTwoRequests) { |
| 679 SetRequest("GET", "/", DEFAULT_PRIORITY); |
| 680 size_t spdy_request_header_frame_length; |
| 681 |
| 682 QuicStreamOffset offset = 0; |
| 683 AddWrite(InnerConstructRequestHeadersPacket( |
| 684 1, kClientDataStreamId1, kIncludeVersion, kFin, DEFAULT_PRIORITY, |
| 685 &spdy_request_header_frame_length, &offset)); |
| 686 |
| 687 // SetRequest() again for second request as |request_headers_| was moved. |
| 688 SetRequest("GET", "/", DEFAULT_PRIORITY); |
| 689 AddWrite(InnerConstructRequestHeadersPacket( |
| 690 2, kClientDataStreamId2, kIncludeVersion, kFin, DEFAULT_PRIORITY, |
| 691 &spdy_request_header_frame_length, &offset)); |
| 692 AddWrite(ConstructClientAckPacket(3, 3, 1)); // Ack the responses. |
| 693 |
| 694 Initialize(); |
| 695 |
| 696 request_.method = "GET"; |
| 697 request_.url = GURL("http://www.example.org/"); |
| 698 // Start first request. |
| 699 EXPECT_EQ(OK, |
| 700 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, |
| 701 net_log_.bound(), callback_.callback())); |
| 702 EXPECT_EQ(OK, |
| 703 stream_->SendRequest(headers_, &response_, callback_.callback())); |
| 704 |
| 705 // Start a second request. |
| 706 QuicHttpStream stream2(session_->GetWeakPtr()); |
| 707 TestCompletionCallback callback2; |
| 708 EXPECT_EQ(OK, |
| 709 stream2.InitializeStream(&request_, DEFAULT_PRIORITY, |
| 710 net_log_.bound(), callback2.callback())); |
| 711 EXPECT_EQ(OK, |
| 712 stream2.SendRequest(headers_, &response_, callback2.callback())); |
| 713 |
| 714 // Ack both requests. |
| 715 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); |
| 716 |
| 717 EXPECT_THAT(stream_->ReadResponseHeaders(callback_.callback()), |
| 718 IsError(ERR_IO_PENDING)); |
| 719 size_t spdy_response_header_frame_length; |
| 720 SetResponse("200 OK", string()); |
| 721 ProcessPacket(InnerConstructResponseHeadersPacket( |
| 722 2, kClientDataStreamId1, kFin, &spdy_response_header_frame_length)); |
| 723 |
| 724 // Now that the headers have been processed, the callback will return. |
| 725 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 726 EXPECT_EQ(200, response_.headers->response_code()); |
| 727 |
| 728 // There is no body, so this should return immediately. |
| 729 EXPECT_EQ(0, |
| 730 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), |
| 731 callback_.callback())); |
| 732 EXPECT_TRUE(stream_->IsResponseBodyComplete()); |
| 733 |
| 734 LoadTimingInfo load_timing_info; |
| 735 EXPECT_TRUE(stream_->GetLoadTimingInfo(&load_timing_info)); |
| 736 assertLoadTimingValid(load_timing_info, /*session_reused=*/false); |
| 737 |
| 738 // SetResponse() again for second request as |response_headers_| was moved. |
| 739 SetResponse("200 OK", string()); |
| 740 EXPECT_THAT(stream2.ReadResponseHeaders(callback2.callback()), |
| 741 IsError(ERR_IO_PENDING)); |
| 742 |
| 743 ProcessPacket(InnerConstructResponseHeadersPacket( |
| 744 3, kClientDataStreamId2, kFin, &spdy_response_header_frame_length)); |
| 745 |
| 746 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 747 |
| 748 // There is no body, so this should return immediately. |
| 749 EXPECT_EQ(0, |
| 750 stream2.ReadResponseBody(read_buffer_.get(), read_buffer_->size(), |
| 751 callback2.callback())); |
| 752 EXPECT_TRUE(stream2.IsResponseBodyComplete()); |
| 753 |
| 754 LoadTimingInfo load_timing_info2; |
| 755 EXPECT_TRUE(stream2.GetLoadTimingInfo(&load_timing_info2)); |
| 756 assertLoadTimingValid(load_timing_info2, /*session_reused=*/true); |
| 757 } |
| 758 |
| 651 // QuicHttpStream does not currently support trailers. It should ignore | 759 // QuicHttpStream does not currently support trailers. It should ignore |
| 652 // trailers upon receiving them. | 760 // trailers upon receiving them. |
| 653 TEST_P(QuicHttpStreamTest, GetRequestWithTrailers) { | 761 TEST_P(QuicHttpStreamTest, GetRequestWithTrailers) { |
| 654 SetRequest("GET", "/", DEFAULT_PRIORITY); | 762 SetRequest("GET", "/", DEFAULT_PRIORITY); |
| 655 size_t spdy_request_header_frame_length; | 763 size_t spdy_request_header_frame_length; |
| 656 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, | 764 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, |
| 657 &spdy_request_header_frame_length)); | 765 &spdy_request_header_frame_length)); |
| 658 AddWrite(ConstructClientAckPacket(2, 3, 1)); // Ack the data packet. | 766 AddWrite(ConstructClientAckPacket(2, 3, 1)); // Ack the data packet. |
| 659 | 767 |
| 660 Initialize(); | 768 Initialize(); |
| (...skipping 1116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1777 TEST_P(QuicHttpStreamTest, ServerPushVaryCheckFail) { | 1885 TEST_P(QuicHttpStreamTest, ServerPushVaryCheckFail) { |
| 1778 SetRequest("GET", "/", DEFAULT_PRIORITY); | 1886 SetRequest("GET", "/", DEFAULT_PRIORITY); |
| 1779 request_headers_[":scheme"] = "https"; | 1887 request_headers_[":scheme"] = "https"; |
| 1780 request_headers_[":path"] = "/bar"; | 1888 request_headers_[":path"] = "/bar"; |
| 1781 request_headers_["accept-encoding"] = "sdch"; | 1889 request_headers_["accept-encoding"] = "sdch"; |
| 1782 | 1890 |
| 1783 size_t spdy_request_header_frame_length; | 1891 size_t spdy_request_header_frame_length; |
| 1784 AddWrite(ConstructClientRstStreamVaryMismatchPacket(1)); | 1892 AddWrite(ConstructClientRstStreamVaryMismatchPacket(1)); |
| 1785 AddWrite(InnerConstructRequestHeadersPacket( | 1893 AddWrite(InnerConstructRequestHeadersPacket( |
| 1786 2, stream_id_ + 2, !kIncludeVersion, kFin, DEFAULT_PRIORITY, | 1894 2, stream_id_ + 2, !kIncludeVersion, kFin, DEFAULT_PRIORITY, |
| 1787 &spdy_request_header_frame_length)); | 1895 &spdy_request_header_frame_length, /*offset=*/nullptr)); |
| 1788 AddWrite(ConstructClientAckPacket(3, 3, 1)); | 1896 AddWrite(ConstructClientAckPacket(3, 3, 1)); |
| 1789 AddWrite(ConstructClientRstStreamCancelledPacket(4)); | 1897 AddWrite(ConstructClientRstStreamCancelledPacket(4)); |
| 1790 Initialize(); | 1898 Initialize(); |
| 1791 | 1899 |
| 1792 // Initialize the first stream, for receiving the promise on. | 1900 // Initialize the first stream, for receiving the promise on. |
| 1793 request_.method = "GET"; | 1901 request_.method = "GET"; |
| 1794 request_.url = GURL("http://www.example.org/"); | 1902 request_.url = GURL("http://www.example.org/"); |
| 1795 | 1903 |
| 1796 EXPECT_EQ(OK, | 1904 EXPECT_EQ(OK, |
| 1797 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, | 1905 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1953 EXPECT_TRUE(AtEof()); | 2061 EXPECT_TRUE(AtEof()); |
| 1954 | 2062 |
| 1955 // QuicHttpStream::GetTotalSent/ReceivedBytes includes only headers. | 2063 // QuicHttpStream::GetTotalSent/ReceivedBytes includes only headers. |
| 1956 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), | 2064 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), |
| 1957 stream_->GetTotalSentBytes()); | 2065 stream_->GetTotalSentBytes()); |
| 1958 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); | 2066 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); |
| 1959 } | 2067 } |
| 1960 | 2068 |
| 1961 } // namespace test | 2069 } // namespace test |
| 1962 } // namespace net | 2070 } // namespace net |
| OLD | NEW |