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(), base::TimeTicks::Now(), | 321 "CONNECTION_UNKNOWN", base::TimeTicks::Now(), &push_promise_index_, |
322 &push_promise_index_, base::ThreadTaskRunnerHandle::Get().get(), | 322 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 TestCompletionCallback callback; | 325 session_->GetCryptoStream()->CryptoConnect(); |
326 session_->CryptoConnect(/*require_confirmation=*/false, | |
327 callback.callback()); | |
328 EXPECT_TRUE(session_->IsCryptoHandshakeConfirmed()); | 326 EXPECT_TRUE(session_->IsCryptoHandshakeConfirmed()); |
329 stream_.reset(use_closing_stream_ | 327 stream_.reset(use_closing_stream_ |
330 ? new AutoClosingStream(session_->GetWeakPtr()) | 328 ? new AutoClosingStream(session_->GetWeakPtr()) |
331 : new QuicHttpStream(session_->GetWeakPtr())); | 329 : new QuicHttpStream(session_->GetWeakPtr())); |
332 | 330 |
333 promised_stream_.reset(use_closing_stream_ | 331 promised_stream_.reset(use_closing_stream_ |
334 ? new AutoClosingStream(session_->GetWeakPtr()) | 332 ? new AutoClosingStream(session_->GetWeakPtr()) |
335 : new QuicHttpStream(session_->GetWeakPtr())); | 333 : new QuicHttpStream(session_->GetWeakPtr())); |
336 | 334 |
337 push_promise_[":path"] = "/bar"; | 335 push_promise_[":path"] = "/bar"; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 should_include_version, fin, offset, data, | 392 should_include_version, fin, offset, data, |
395 &server_maker_); | 393 &server_maker_); |
396 } | 394 } |
397 | 395 |
398 std::unique_ptr<QuicReceivedPacket> InnerConstructRequestHeadersPacket( | 396 std::unique_ptr<QuicReceivedPacket> InnerConstructRequestHeadersPacket( |
399 QuicPacketNumber packet_number, | 397 QuicPacketNumber packet_number, |
400 QuicStreamId stream_id, | 398 QuicStreamId stream_id, |
401 bool should_include_version, | 399 bool should_include_version, |
402 bool fin, | 400 bool fin, |
403 RequestPriority request_priority, | 401 RequestPriority request_priority, |
404 size_t* spdy_headers_frame_length, | 402 size_t* spdy_headers_frame_length) { |
405 QuicStreamOffset* offset) { | |
406 SpdyPriority priority = | 403 SpdyPriority priority = |
407 ConvertRequestPriorityToQuicPriority(request_priority); | 404 ConvertRequestPriorityToQuicPriority(request_priority); |
408 return client_maker_.MakeRequestHeadersPacket( | 405 return client_maker_.MakeRequestHeadersPacket( |
409 packet_number, stream_id, should_include_version, fin, priority, | 406 packet_number, stream_id, should_include_version, fin, priority, |
410 std::move(request_headers_), spdy_headers_frame_length, offset); | 407 std::move(request_headers_), spdy_headers_frame_length); |
411 } | 408 } |
412 | 409 |
413 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( | 410 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( |
414 QuicPacketNumber packet_number, | 411 QuicPacketNumber packet_number, |
415 bool fin, | 412 bool fin, |
416 RequestPriority request_priority, | 413 RequestPriority request_priority, |
417 size_t* spdy_headers_frame_length) { | 414 size_t* spdy_headers_frame_length) { |
418 return InnerConstructRequestHeadersPacket( | 415 return InnerConstructRequestHeadersPacket( |
419 packet_number, stream_id_, kIncludeVersion, fin, request_priority, | 416 packet_number, stream_id_, kIncludeVersion, fin, request_priority, |
420 spdy_headers_frame_length, nullptr); | 417 spdy_headers_frame_length); |
421 } | 418 } |
422 | 419 |
423 std::unique_ptr<QuicReceivedPacket> InnerConstructResponseHeadersPacket( | 420 std::unique_ptr<QuicReceivedPacket> InnerConstructResponseHeadersPacket( |
424 QuicPacketNumber packet_number, | 421 QuicPacketNumber packet_number, |
425 QuicStreamId stream_id, | 422 QuicStreamId stream_id, |
426 bool fin, | 423 bool fin, |
427 size_t* spdy_headers_frame_length) { | 424 size_t* spdy_headers_frame_length) { |
428 return server_maker_.MakeResponseHeadersPacket( | 425 return server_maker_.MakeResponseHeadersPacket( |
429 packet_number, stream_id, !kIncludeVersion, fin, | 426 packet_number, stream_id, !kIncludeVersion, fin, |
430 std::move(response_headers_), spdy_headers_frame_length, | 427 std::move(response_headers_), spdy_headers_frame_length, |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 } | 519 } |
523 | 520 |
524 void ReceivePromise(QuicStreamId id) { | 521 void ReceivePromise(QuicStreamId id) { |
525 QuicChromiumClientStream* stream = | 522 QuicChromiumClientStream* stream = |
526 QuicHttpStreamPeer::GetQuicChromiumClientStream(stream_.get()); | 523 QuicHttpStreamPeer::GetQuicChromiumClientStream(stream_.get()); |
527 stream->OnStreamHeaders(serialized_push_promise_); | 524 stream->OnStreamHeaders(serialized_push_promise_); |
528 | 525 |
529 stream->OnPromiseHeadersComplete(id, serialized_push_promise_.size()); | 526 stream->OnPromiseHeadersComplete(id, serialized_push_promise_.size()); |
530 } | 527 } |
531 | 528 |
532 void assertLoadTimingValid(const LoadTimingInfo& load_timing_info, | |
533 bool session_reused) { | |
534 EXPECT_EQ(session_reused, load_timing_info.socket_reused); | |
535 | |
536 // If |session_reused| is true, these fields should all be null, non-null | |
537 // otherwise. | |
538 EXPECT_EQ(session_reused, | |
539 load_timing_info.connect_timing.connect_start.is_null()); | |
540 EXPECT_EQ(session_reused, | |
541 load_timing_info.connect_timing.connect_end.is_null()); | |
542 EXPECT_EQ(session_reused, | |
543 load_timing_info.connect_timing.ssl_start.is_null()); | |
544 EXPECT_EQ(session_reused, | |
545 load_timing_info.connect_timing.ssl_end.is_null()); | |
546 EXPECT_EQ(load_timing_info.connect_timing.connect_start, | |
547 load_timing_info.connect_timing.ssl_start); | |
548 EXPECT_EQ(load_timing_info.connect_timing.connect_end, | |
549 load_timing_info.connect_timing.ssl_end); | |
550 | |
551 EXPECT_EQ(session_reused, | |
552 load_timing_info.connect_timing.dns_start.is_null()); | |
553 EXPECT_EQ(session_reused, | |
554 load_timing_info.connect_timing.dns_end.is_null()); | |
555 } | |
556 | |
557 BoundTestNetLog net_log_; | 529 BoundTestNetLog net_log_; |
558 bool use_closing_stream_; | 530 bool use_closing_stream_; |
559 MockSendAlgorithm* send_algorithm_; | 531 MockSendAlgorithm* send_algorithm_; |
560 scoped_refptr<TestTaskRunner> runner_; | 532 scoped_refptr<TestTaskRunner> runner_; |
561 std::unique_ptr<MockWrite[]> mock_writes_; | 533 std::unique_ptr<MockWrite[]> mock_writes_; |
562 MockClock clock_; | 534 MockClock clock_; |
563 TestQuicConnection* connection_; | 535 TestQuicConnection* connection_; |
564 std::unique_ptr<QuicChromiumConnectionHelper> helper_; | 536 std::unique_ptr<QuicChromiumConnectionHelper> helper_; |
565 std::unique_ptr<QuicChromiumAlarmFactory> alarm_factory_; | 537 std::unique_ptr<QuicChromiumAlarmFactory> alarm_factory_; |
566 testing::StrictMock<MockQuicConnectionVisitor> visitor_; | 538 testing::StrictMock<MockQuicConnectionVisitor> visitor_; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
629 TEST_P(QuicHttpStreamTest, GetRequest) { | 601 TEST_P(QuicHttpStreamTest, GetRequest) { |
630 SetRequest("GET", "/", DEFAULT_PRIORITY); | 602 SetRequest("GET", "/", DEFAULT_PRIORITY); |
631 size_t spdy_request_header_frame_length; | 603 size_t spdy_request_header_frame_length; |
632 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, | 604 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, |
633 &spdy_request_header_frame_length)); | 605 &spdy_request_header_frame_length)); |
634 Initialize(); | 606 Initialize(); |
635 | 607 |
636 request_.method = "GET"; | 608 request_.method = "GET"; |
637 request_.url = GURL("http://www.example.org/"); | 609 request_.url = GURL("http://www.example.org/"); |
638 | 610 |
639 // Make sure getting load timing from the stream early does not crash. | |
640 LoadTimingInfo load_timing_info; | |
641 EXPECT_TRUE(stream_->GetLoadTimingInfo(&load_timing_info)); | |
642 | |
643 EXPECT_EQ(OK, | 611 EXPECT_EQ(OK, |
644 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, | 612 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, |
645 net_log_.bound(), callback_.callback())); | 613 net_log_.bound(), callback_.callback())); |
646 EXPECT_EQ(OK, | 614 EXPECT_EQ(OK, |
647 stream_->SendRequest(headers_, &response_, callback_.callback())); | 615 stream_->SendRequest(headers_, &response_, callback_.callback())); |
648 | 616 |
649 // Ack the request. | 617 // Ack the request. |
650 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); | 618 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); |
651 | 619 |
652 EXPECT_THAT(stream_->ReadResponseHeaders(callback_.callback()), | 620 EXPECT_THAT(stream_->ReadResponseHeaders(callback_.callback()), |
(...skipping 12 matching lines...) Expand all Loading... |
665 EXPECT_FALSE(response_.response_time.is_null()); | 633 EXPECT_FALSE(response_.response_time.is_null()); |
666 EXPECT_FALSE(response_.request_time.is_null()); | 634 EXPECT_FALSE(response_.request_time.is_null()); |
667 | 635 |
668 // There is no body, so this should return immediately. | 636 // There is no body, so this should return immediately. |
669 EXPECT_EQ(0, | 637 EXPECT_EQ(0, |
670 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), | 638 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), |
671 callback_.callback())); | 639 callback_.callback())); |
672 EXPECT_TRUE(stream_->IsResponseBodyComplete()); | 640 EXPECT_TRUE(stream_->IsResponseBodyComplete()); |
673 EXPECT_TRUE(AtEof()); | 641 EXPECT_TRUE(AtEof()); |
674 | 642 |
675 EXPECT_TRUE(stream_->GetLoadTimingInfo(&load_timing_info)); | |
676 assertLoadTimingValid(load_timing_info, /*session_reused=*/false); | |
677 | |
678 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the | 643 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the |
679 // headers and payload. | 644 // headers and payload. |
680 EXPECT_EQ(static_cast<int64_t>(spdy_request_header_frame_length), | 645 EXPECT_EQ(static_cast<int64_t>(spdy_request_header_frame_length), |
681 stream_->GetTotalSentBytes()); | 646 stream_->GetTotalSentBytes()); |
682 EXPECT_EQ(static_cast<int64_t>(spdy_response_header_frame_length), | 647 EXPECT_EQ(static_cast<int64_t>(spdy_response_header_frame_length), |
683 stream_->GetTotalReceivedBytes()); | 648 stream_->GetTotalReceivedBytes()); |
684 } | 649 } |
685 | 650 |
686 TEST_P(QuicHttpStreamTest, LoadTimingTwoRequests) { | |
687 SetRequest("GET", "/", DEFAULT_PRIORITY); | |
688 size_t spdy_request_header_frame_length; | |
689 | |
690 QuicStreamOffset offset = 0; | |
691 AddWrite(InnerConstructRequestHeadersPacket( | |
692 1, kClientDataStreamId1, kIncludeVersion, kFin, DEFAULT_PRIORITY, | |
693 &spdy_request_header_frame_length, &offset)); | |
694 | |
695 // SetRequest() again for second request as |request_headers_| was moved. | |
696 SetRequest("GET", "/", DEFAULT_PRIORITY); | |
697 AddWrite(InnerConstructRequestHeadersPacket( | |
698 2, kClientDataStreamId2, kIncludeVersion, kFin, DEFAULT_PRIORITY, | |
699 &spdy_request_header_frame_length, &offset)); | |
700 AddWrite(ConstructClientAckPacket(3, 3, 1)); // Ack the responses. | |
701 | |
702 Initialize(); | |
703 | |
704 request_.method = "GET"; | |
705 request_.url = GURL("http://www.example.org/"); | |
706 // Start first request. | |
707 EXPECT_EQ(OK, | |
708 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, | |
709 net_log_.bound(), callback_.callback())); | |
710 EXPECT_EQ(OK, | |
711 stream_->SendRequest(headers_, &response_, callback_.callback())); | |
712 | |
713 // Start a second request. | |
714 QuicHttpStream stream2(session_->GetWeakPtr()); | |
715 TestCompletionCallback callback2; | |
716 EXPECT_EQ(OK, | |
717 stream2.InitializeStream(&request_, DEFAULT_PRIORITY, | |
718 net_log_.bound(), callback2.callback())); | |
719 EXPECT_EQ(OK, | |
720 stream2.SendRequest(headers_, &response_, callback2.callback())); | |
721 | |
722 // Ack both requests. | |
723 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); | |
724 | |
725 EXPECT_THAT(stream_->ReadResponseHeaders(callback_.callback()), | |
726 IsError(ERR_IO_PENDING)); | |
727 size_t spdy_response_header_frame_length; | |
728 SetResponse("200 OK", string()); | |
729 ProcessPacket(InnerConstructResponseHeadersPacket( | |
730 2, kClientDataStreamId1, kFin, &spdy_response_header_frame_length)); | |
731 | |
732 // Now that the headers have been processed, the callback will return. | |
733 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | |
734 EXPECT_EQ(200, response_.headers->response_code()); | |
735 | |
736 // There is no body, so this should return immediately. | |
737 EXPECT_EQ(0, | |
738 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), | |
739 callback_.callback())); | |
740 EXPECT_TRUE(stream_->IsResponseBodyComplete()); | |
741 | |
742 LoadTimingInfo load_timing_info; | |
743 EXPECT_TRUE(stream_->GetLoadTimingInfo(&load_timing_info)); | |
744 assertLoadTimingValid(load_timing_info, /*session_reused=*/false); | |
745 | |
746 // SetResponse() again for second request as |response_headers_| was moved. | |
747 SetResponse("200 OK", string()); | |
748 EXPECT_THAT(stream2.ReadResponseHeaders(callback2.callback()), | |
749 IsError(ERR_IO_PENDING)); | |
750 | |
751 ProcessPacket(InnerConstructResponseHeadersPacket( | |
752 3, kClientDataStreamId2, kFin, &spdy_response_header_frame_length)); | |
753 | |
754 EXPECT_THAT(callback2.WaitForResult(), IsOk()); | |
755 | |
756 // There is no body, so this should return immediately. | |
757 EXPECT_EQ(0, | |
758 stream2.ReadResponseBody(read_buffer_.get(), read_buffer_->size(), | |
759 callback2.callback())); | |
760 EXPECT_TRUE(stream2.IsResponseBodyComplete()); | |
761 | |
762 LoadTimingInfo load_timing_info2; | |
763 EXPECT_TRUE(stream2.GetLoadTimingInfo(&load_timing_info2)); | |
764 assertLoadTimingValid(load_timing_info2, /*session_reused=*/true); | |
765 } | |
766 | |
767 // QuicHttpStream does not currently support trailers. It should ignore | 651 // QuicHttpStream does not currently support trailers. It should ignore |
768 // trailers upon receiving them. | 652 // trailers upon receiving them. |
769 TEST_P(QuicHttpStreamTest, GetRequestWithTrailers) { | 653 TEST_P(QuicHttpStreamTest, GetRequestWithTrailers) { |
770 SetRequest("GET", "/", DEFAULT_PRIORITY); | 654 SetRequest("GET", "/", DEFAULT_PRIORITY); |
771 size_t spdy_request_header_frame_length; | 655 size_t spdy_request_header_frame_length; |
772 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, | 656 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, |
773 &spdy_request_header_frame_length)); | 657 &spdy_request_header_frame_length)); |
774 AddWrite(ConstructClientAckPacket(2, 3, 1)); // Ack the data packet. | 658 AddWrite(ConstructClientAckPacket(2, 3, 1)); // Ack the data packet. |
775 | 659 |
776 Initialize(); | 660 Initialize(); |
(...skipping 1116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1893 TEST_P(QuicHttpStreamTest, ServerPushVaryCheckFail) { | 1777 TEST_P(QuicHttpStreamTest, ServerPushVaryCheckFail) { |
1894 SetRequest("GET", "/", DEFAULT_PRIORITY); | 1778 SetRequest("GET", "/", DEFAULT_PRIORITY); |
1895 request_headers_[":scheme"] = "https"; | 1779 request_headers_[":scheme"] = "https"; |
1896 request_headers_[":path"] = "/bar"; | 1780 request_headers_[":path"] = "/bar"; |
1897 request_headers_["accept-encoding"] = "sdch"; | 1781 request_headers_["accept-encoding"] = "sdch"; |
1898 | 1782 |
1899 size_t spdy_request_header_frame_length; | 1783 size_t spdy_request_header_frame_length; |
1900 AddWrite(ConstructClientRstStreamVaryMismatchPacket(1)); | 1784 AddWrite(ConstructClientRstStreamVaryMismatchPacket(1)); |
1901 AddWrite(InnerConstructRequestHeadersPacket( | 1785 AddWrite(InnerConstructRequestHeadersPacket( |
1902 2, stream_id_ + 2, !kIncludeVersion, kFin, DEFAULT_PRIORITY, | 1786 2, stream_id_ + 2, !kIncludeVersion, kFin, DEFAULT_PRIORITY, |
1903 &spdy_request_header_frame_length, /*offset=*/nullptr)); | 1787 &spdy_request_header_frame_length)); |
1904 AddWrite(ConstructClientAckPacket(3, 3, 1)); | 1788 AddWrite(ConstructClientAckPacket(3, 3, 1)); |
1905 AddWrite(ConstructClientRstStreamCancelledPacket(4)); | 1789 AddWrite(ConstructClientRstStreamCancelledPacket(4)); |
1906 Initialize(); | 1790 Initialize(); |
1907 | 1791 |
1908 // Initialize the first stream, for receiving the promise on. | 1792 // Initialize the first stream, for receiving the promise on. |
1909 request_.method = "GET"; | 1793 request_.method = "GET"; |
1910 request_.url = GURL("http://www.example.org/"); | 1794 request_.url = GURL("http://www.example.org/"); |
1911 | 1795 |
1912 EXPECT_EQ(OK, | 1796 EXPECT_EQ(OK, |
1913 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, | 1797 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2069 EXPECT_TRUE(AtEof()); | 1953 EXPECT_TRUE(AtEof()); |
2070 | 1954 |
2071 // QuicHttpStream::GetTotalSent/ReceivedBytes includes only headers. | 1955 // QuicHttpStream::GetTotalSent/ReceivedBytes includes only headers. |
2072 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), | 1956 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), |
2073 stream_->GetTotalSentBytes()); | 1957 stream_->GetTotalSentBytes()); |
2074 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); | 1958 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); |
2075 } | 1959 } |
2076 | 1960 |
2077 } // namespace test | 1961 } // namespace test |
2078 } // namespace net | 1962 } // namespace net |
OLD | NEW |