| 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 |