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 |