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 TestCompletionCallback callback; |
| 326 session_->CryptoConnect(/*require_confirmation=*/false, |
| 327 callback.callback()); |
326 EXPECT_TRUE(session_->IsCryptoHandshakeConfirmed()); | 328 EXPECT_TRUE(session_->IsCryptoHandshakeConfirmed()); |
327 stream_.reset(use_closing_stream_ | 329 stream_.reset(use_closing_stream_ |
328 ? new AutoClosingStream(session_->GetWeakPtr()) | 330 ? new AutoClosingStream(session_->GetWeakPtr()) |
329 : new QuicHttpStream(session_->GetWeakPtr())); | 331 : new QuicHttpStream(session_->GetWeakPtr())); |
330 | 332 |
331 promised_stream_.reset(use_closing_stream_ | 333 promised_stream_.reset(use_closing_stream_ |
332 ? new AutoClosingStream(session_->GetWeakPtr()) | 334 ? new AutoClosingStream(session_->GetWeakPtr()) |
333 : new QuicHttpStream(session_->GetWeakPtr())); | 335 : new QuicHttpStream(session_->GetWeakPtr())); |
334 | 336 |
335 push_promise_[":path"] = "/bar"; | 337 push_promise_[":path"] = "/bar"; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 should_include_version, fin, offset, data, | 394 should_include_version, fin, offset, data, |
393 &server_maker_); | 395 &server_maker_); |
394 } | 396 } |
395 | 397 |
396 std::unique_ptr<QuicReceivedPacket> InnerConstructRequestHeadersPacket( | 398 std::unique_ptr<QuicReceivedPacket> InnerConstructRequestHeadersPacket( |
397 QuicPacketNumber packet_number, | 399 QuicPacketNumber packet_number, |
398 QuicStreamId stream_id, | 400 QuicStreamId stream_id, |
399 bool should_include_version, | 401 bool should_include_version, |
400 bool fin, | 402 bool fin, |
401 RequestPriority request_priority, | 403 RequestPriority request_priority, |
402 size_t* spdy_headers_frame_length) { | 404 size_t* spdy_headers_frame_length, |
| 405 QuicStreamOffset* offset) { |
403 SpdyPriority priority = | 406 SpdyPriority priority = |
404 ConvertRequestPriorityToQuicPriority(request_priority); | 407 ConvertRequestPriorityToQuicPriority(request_priority); |
405 return client_maker_.MakeRequestHeadersPacket( | 408 return client_maker_.MakeRequestHeadersPacket( |
406 packet_number, stream_id, should_include_version, fin, priority, | 409 packet_number, stream_id, should_include_version, fin, priority, |
407 std::move(request_headers_), spdy_headers_frame_length); | 410 std::move(request_headers_), spdy_headers_frame_length, offset); |
408 } | 411 } |
409 | 412 |
410 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( | 413 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( |
411 QuicPacketNumber packet_number, | 414 QuicPacketNumber packet_number, |
412 bool fin, | 415 bool fin, |
413 RequestPriority request_priority, | 416 RequestPriority request_priority, |
414 size_t* spdy_headers_frame_length) { | 417 size_t* spdy_headers_frame_length) { |
415 return InnerConstructRequestHeadersPacket( | 418 return InnerConstructRequestHeadersPacket( |
416 packet_number, stream_id_, kIncludeVersion, fin, request_priority, | 419 packet_number, stream_id_, kIncludeVersion, fin, request_priority, |
417 spdy_headers_frame_length); | 420 spdy_headers_frame_length, nullptr); |
418 } | 421 } |
419 | 422 |
420 std::unique_ptr<QuicReceivedPacket> InnerConstructResponseHeadersPacket( | 423 std::unique_ptr<QuicReceivedPacket> InnerConstructResponseHeadersPacket( |
421 QuicPacketNumber packet_number, | 424 QuicPacketNumber packet_number, |
422 QuicStreamId stream_id, | 425 QuicStreamId stream_id, |
423 bool fin, | 426 bool fin, |
424 size_t* spdy_headers_frame_length) { | 427 size_t* spdy_headers_frame_length) { |
425 return server_maker_.MakeResponseHeadersPacket( | 428 return server_maker_.MakeResponseHeadersPacket( |
426 packet_number, stream_id, !kIncludeVersion, fin, | 429 packet_number, stream_id, !kIncludeVersion, fin, |
427 std::move(response_headers_), spdy_headers_frame_length, | 430 std::move(response_headers_), spdy_headers_frame_length, |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 } | 522 } |
520 | 523 |
521 void ReceivePromise(QuicStreamId id) { | 524 void ReceivePromise(QuicStreamId id) { |
522 QuicChromiumClientStream* stream = | 525 QuicChromiumClientStream* stream = |
523 QuicHttpStreamPeer::GetQuicChromiumClientStream(stream_.get()); | 526 QuicHttpStreamPeer::GetQuicChromiumClientStream(stream_.get()); |
524 stream->OnStreamHeaders(serialized_push_promise_); | 527 stream->OnStreamHeaders(serialized_push_promise_); |
525 | 528 |
526 stream->OnPromiseHeadersComplete(id, serialized_push_promise_.size()); | 529 stream->OnPromiseHeadersComplete(id, serialized_push_promise_.size()); |
527 } | 530 } |
528 | 531 |
| 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 |
529 BoundTestNetLog net_log_; | 557 BoundTestNetLog net_log_; |
530 bool use_closing_stream_; | 558 bool use_closing_stream_; |
531 MockSendAlgorithm* send_algorithm_; | 559 MockSendAlgorithm* send_algorithm_; |
532 scoped_refptr<TestTaskRunner> runner_; | 560 scoped_refptr<TestTaskRunner> runner_; |
533 std::unique_ptr<MockWrite[]> mock_writes_; | 561 std::unique_ptr<MockWrite[]> mock_writes_; |
534 MockClock clock_; | 562 MockClock clock_; |
535 TestQuicConnection* connection_; | 563 TestQuicConnection* connection_; |
536 std::unique_ptr<QuicChromiumConnectionHelper> helper_; | 564 std::unique_ptr<QuicChromiumConnectionHelper> helper_; |
537 std::unique_ptr<QuicChromiumAlarmFactory> alarm_factory_; | 565 std::unique_ptr<QuicChromiumAlarmFactory> alarm_factory_; |
538 testing::StrictMock<MockQuicConnectionVisitor> visitor_; | 566 testing::StrictMock<MockQuicConnectionVisitor> visitor_; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 TEST_P(QuicHttpStreamTest, GetRequest) { | 629 TEST_P(QuicHttpStreamTest, GetRequest) { |
602 SetRequest("GET", "/", DEFAULT_PRIORITY); | 630 SetRequest("GET", "/", DEFAULT_PRIORITY); |
603 size_t spdy_request_header_frame_length; | 631 size_t spdy_request_header_frame_length; |
604 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, | 632 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, |
605 &spdy_request_header_frame_length)); | 633 &spdy_request_header_frame_length)); |
606 Initialize(); | 634 Initialize(); |
607 | 635 |
608 request_.method = "GET"; | 636 request_.method = "GET"; |
609 request_.url = GURL("http://www.example.org/"); | 637 request_.url = GURL("http://www.example.org/"); |
610 | 638 |
| 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 |
611 EXPECT_EQ(OK, | 643 EXPECT_EQ(OK, |
612 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, | 644 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, |
613 net_log_.bound(), callback_.callback())); | 645 net_log_.bound(), callback_.callback())); |
614 EXPECT_EQ(OK, | 646 EXPECT_EQ(OK, |
615 stream_->SendRequest(headers_, &response_, callback_.callback())); | 647 stream_->SendRequest(headers_, &response_, callback_.callback())); |
616 | 648 |
617 // Ack the request. | 649 // Ack the request. |
618 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); | 650 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); |
619 | 651 |
620 EXPECT_THAT(stream_->ReadResponseHeaders(callback_.callback()), | 652 EXPECT_THAT(stream_->ReadResponseHeaders(callback_.callback()), |
(...skipping 12 matching lines...) Expand all Loading... |
633 EXPECT_FALSE(response_.response_time.is_null()); | 665 EXPECT_FALSE(response_.response_time.is_null()); |
634 EXPECT_FALSE(response_.request_time.is_null()); | 666 EXPECT_FALSE(response_.request_time.is_null()); |
635 | 667 |
636 // There is no body, so this should return immediately. | 668 // There is no body, so this should return immediately. |
637 EXPECT_EQ(0, | 669 EXPECT_EQ(0, |
638 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), | 670 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), |
639 callback_.callback())); | 671 callback_.callback())); |
640 EXPECT_TRUE(stream_->IsResponseBodyComplete()); | 672 EXPECT_TRUE(stream_->IsResponseBodyComplete()); |
641 EXPECT_TRUE(AtEof()); | 673 EXPECT_TRUE(AtEof()); |
642 | 674 |
| 675 EXPECT_TRUE(stream_->GetLoadTimingInfo(&load_timing_info)); |
| 676 assertLoadTimingValid(load_timing_info, /*session_reused=*/false); |
| 677 |
643 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the | 678 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the |
644 // headers and payload. | 679 // headers and payload. |
645 EXPECT_EQ(static_cast<int64_t>(spdy_request_header_frame_length), | 680 EXPECT_EQ(static_cast<int64_t>(spdy_request_header_frame_length), |
646 stream_->GetTotalSentBytes()); | 681 stream_->GetTotalSentBytes()); |
647 EXPECT_EQ(static_cast<int64_t>(spdy_response_header_frame_length), | 682 EXPECT_EQ(static_cast<int64_t>(spdy_response_header_frame_length), |
648 stream_->GetTotalReceivedBytes()); | 683 stream_->GetTotalReceivedBytes()); |
649 } | 684 } |
650 | 685 |
| 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 |
651 // QuicHttpStream does not currently support trailers. It should ignore | 767 // QuicHttpStream does not currently support trailers. It should ignore |
652 // trailers upon receiving them. | 768 // trailers upon receiving them. |
653 TEST_P(QuicHttpStreamTest, GetRequestWithTrailers) { | 769 TEST_P(QuicHttpStreamTest, GetRequestWithTrailers) { |
654 SetRequest("GET", "/", DEFAULT_PRIORITY); | 770 SetRequest("GET", "/", DEFAULT_PRIORITY); |
655 size_t spdy_request_header_frame_length; | 771 size_t spdy_request_header_frame_length; |
656 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, | 772 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, |
657 &spdy_request_header_frame_length)); | 773 &spdy_request_header_frame_length)); |
658 AddWrite(ConstructClientAckPacket(2, 3, 1)); // Ack the data packet. | 774 AddWrite(ConstructClientAckPacket(2, 3, 1)); // Ack the data packet. |
659 | 775 |
660 Initialize(); | 776 Initialize(); |
(...skipping 1116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1777 TEST_P(QuicHttpStreamTest, ServerPushVaryCheckFail) { | 1893 TEST_P(QuicHttpStreamTest, ServerPushVaryCheckFail) { |
1778 SetRequest("GET", "/", DEFAULT_PRIORITY); | 1894 SetRequest("GET", "/", DEFAULT_PRIORITY); |
1779 request_headers_[":scheme"] = "https"; | 1895 request_headers_[":scheme"] = "https"; |
1780 request_headers_[":path"] = "/bar"; | 1896 request_headers_[":path"] = "/bar"; |
1781 request_headers_["accept-encoding"] = "sdch"; | 1897 request_headers_["accept-encoding"] = "sdch"; |
1782 | 1898 |
1783 size_t spdy_request_header_frame_length; | 1899 size_t spdy_request_header_frame_length; |
1784 AddWrite(ConstructClientRstStreamVaryMismatchPacket(1)); | 1900 AddWrite(ConstructClientRstStreamVaryMismatchPacket(1)); |
1785 AddWrite(InnerConstructRequestHeadersPacket( | 1901 AddWrite(InnerConstructRequestHeadersPacket( |
1786 2, stream_id_ + 2, !kIncludeVersion, kFin, DEFAULT_PRIORITY, | 1902 2, stream_id_ + 2, !kIncludeVersion, kFin, DEFAULT_PRIORITY, |
1787 &spdy_request_header_frame_length)); | 1903 &spdy_request_header_frame_length, /*offset=*/nullptr)); |
1788 AddWrite(ConstructClientAckPacket(3, 3, 1)); | 1904 AddWrite(ConstructClientAckPacket(3, 3, 1)); |
1789 AddWrite(ConstructClientRstStreamCancelledPacket(4)); | 1905 AddWrite(ConstructClientRstStreamCancelledPacket(4)); |
1790 Initialize(); | 1906 Initialize(); |
1791 | 1907 |
1792 // Initialize the first stream, for receiving the promise on. | 1908 // Initialize the first stream, for receiving the promise on. |
1793 request_.method = "GET"; | 1909 request_.method = "GET"; |
1794 request_.url = GURL("http://www.example.org/"); | 1910 request_.url = GURL("http://www.example.org/"); |
1795 | 1911 |
1796 EXPECT_EQ(OK, | 1912 EXPECT_EQ(OK, |
1797 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, | 1913 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1953 EXPECT_TRUE(AtEof()); | 2069 EXPECT_TRUE(AtEof()); |
1954 | 2070 |
1955 // QuicHttpStream::GetTotalSent/ReceivedBytes includes only headers. | 2071 // QuicHttpStream::GetTotalSent/ReceivedBytes includes only headers. |
1956 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), | 2072 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), |
1957 stream_->GetTotalSentBytes()); | 2073 stream_->GetTotalSentBytes()); |
1958 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); | 2074 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); |
1959 } | 2075 } |
1960 | 2076 |
1961 } // namespace test | 2077 } // namespace test |
1962 } // namespace net | 2078 } // namespace net |
OLD | NEW |