Chromium Code Reviews| 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 227 } | 227 } |
| 228 | 228 |
| 229 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( | 229 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( |
| 230 QuicPacketNumber num) { | 230 QuicPacketNumber num) { |
| 231 return maker_.MakeConnectionClosePacket(num); | 231 return maker_.MakeConnectionClosePacket(num); |
| 232 } | 232 } |
| 233 | 233 |
| 234 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( | 234 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( |
| 235 QuicPacketNumber largest_received, | 235 QuicPacketNumber largest_received, |
| 236 QuicPacketNumber least_unacked) { | 236 QuicPacketNumber least_unacked) { |
| 237 return maker_.MakeAckPacket(2, largest_received, least_unacked, true); | 237 return maker_.MakeAckPacket(2, largest_received, least_unacked, |
| 238 least_unacked, true); | |
| 238 } | 239 } |
| 239 | 240 |
| 240 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( | 241 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( |
| 242 QuicPacketNumber packet_number, | |
| 243 QuicPacketNumber largest_received, | |
| 244 QuicPacketNumber ack_least_unacked, | |
| 245 QuicPacketNumber stop_least_unacked) { | |
| 246 return maker_.MakeAckPacket(packet_number, largest_received, | |
| 247 ack_least_unacked, stop_least_unacked, true); | |
| 248 } | |
| 249 | |
| 250 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( | |
| 241 QuicPacketNumber num, | 251 QuicPacketNumber num, |
| 242 QuicTime::Delta delta_time_largest_observed, | 252 QuicTime::Delta delta_time_largest_observed, |
| 243 QuicPacketNumber largest_received, | 253 QuicPacketNumber largest_received, |
| 244 QuicPacketNumber least_unacked, | 254 QuicPacketNumber least_unacked, |
| 245 QuicErrorCode quic_error, | 255 QuicErrorCode quic_error, |
| 246 std::string& quic_error_details) { | 256 std::string& quic_error_details) { |
| 247 return maker_.MakeAckAndConnectionClosePacket( | 257 return maker_.MakeAckAndConnectionClosePacket( |
| 248 num, false, delta_time_largest_observed, largest_received, | 258 num, false, delta_time_largest_observed, largest_received, |
| 249 least_unacked, quic_error, quic_error_details); | 259 least_unacked, quic_error, quic_error_details); |
| 250 } | 260 } |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 276 base::StringPiece data) { | 286 base::StringPiece data) { |
| 277 return maker_.MakeDataPacket(packet_number, stream_id, | 287 return maker_.MakeDataPacket(packet_number, stream_id, |
| 278 should_include_version, fin, offset, data); | 288 should_include_version, fin, offset, data); |
| 279 } | 289 } |
| 280 | 290 |
| 281 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( | 291 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( |
| 282 QuicPacketNumber packet_number, | 292 QuicPacketNumber packet_number, |
| 283 QuicStreamId stream_id, | 293 QuicStreamId stream_id, |
| 284 bool should_include_version, | 294 bool should_include_version, |
| 285 bool fin, | 295 bool fin, |
| 296 const SpdyHeaderBlock& headers, | |
| 297 QuicStreamOffset offset) { | |
| 298 SpdyPriority priority = | |
| 299 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); | |
| 300 return maker_.MakeRequestHeadersPacket(packet_number, stream_id, | |
| 301 should_include_version, fin, | |
| 302 priority, headers, offset); | |
| 303 } | |
| 304 | |
| 305 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( | |
| 306 QuicPacketNumber packet_number, | |
| 307 QuicStreamId stream_id, | |
| 308 bool should_include_version, | |
| 309 bool fin, | |
| 286 const SpdyHeaderBlock& headers) { | 310 const SpdyHeaderBlock& headers) { |
| 287 SpdyPriority priority = | 311 return ConstructRequestHeadersPacket( |
| 288 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); | 312 packet_number, stream_id, should_include_version, fin, headers, 0); |
| 289 return maker_.MakeRequestHeadersPacket(packet_number, stream_id, | |
| 290 should_include_version, fin, | |
| 291 priority, headers); | |
| 292 } | 313 } |
| 293 | 314 |
| 294 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( | 315 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( |
| 295 QuicPacketNumber packet_number, | 316 QuicPacketNumber packet_number, |
| 296 QuicStreamId stream_id, | 317 QuicStreamId stream_id, |
| 297 bool should_include_version, | 318 bool should_include_version, |
| 298 bool fin, | 319 bool fin, |
| 299 const SpdyHeaderBlock& headers) { | 320 const SpdyHeaderBlock& headers) { |
| 321 return ConstructResponseHeadersPacket( | |
| 322 packet_number, stream_id, should_include_version, fin, headers, 0); | |
| 323 } | |
| 324 | |
| 325 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( | |
| 326 QuicPacketNumber packet_number, | |
| 327 QuicStreamId stream_id, | |
| 328 bool should_include_version, | |
| 329 bool fin, | |
| 330 const SpdyHeaderBlock& headers, | |
| 331 QuicStreamOffset offset) { | |
| 300 return maker_.MakeResponseHeadersPacket( | 332 return maker_.MakeResponseHeadersPacket( |
| 301 packet_number, stream_id, should_include_version, fin, headers); | 333 packet_number, stream_id, should_include_version, fin, headers, offset); |
| 302 } | 334 } |
| 303 | 335 |
| 304 void CreateSession() { | 336 void CreateSession() { |
| 305 CreateSessionWithFactory(&socket_factory_, false); | 337 CreateSessionWithFactory(&socket_factory_, false); |
| 306 } | 338 } |
| 307 | 339 |
| 308 void CreateSessionWithNextProtos() { | 340 void CreateSessionWithNextProtos() { |
| 309 CreateSessionWithFactory(&socket_factory_, true); | 341 CreateSessionWithFactory(&socket_factory_, true); |
| 310 } | 342 } |
| 311 | 343 |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 764 socket_factory_.AddSocketDataProvider(&http_data); | 796 socket_factory_.AddSocketDataProvider(&http_data); |
| 765 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 797 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 766 | 798 |
| 767 CreateSessionWithNextProtos(); | 799 CreateSessionWithNextProtos(); |
| 768 | 800 |
| 769 SendRequestAndExpectHttpResponse("hello world"); | 801 SendRequestAndExpectHttpResponse("hello world"); |
| 770 SendRequestAndExpectHttpResponse("hello world"); | 802 SendRequestAndExpectHttpResponse("hello world"); |
| 771 } | 803 } |
| 772 | 804 |
| 773 // When multiple alternative services are advertised, | 805 // When multiple alternative services are advertised, |
| 774 // HttpStreamFactoryImpl::RequestStreamInternal() only passes the first one to | 806 // HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative |
| 775 // Job. This is what the following test verifies. | 807 // service which uses existing QUIC session if available. If no existing QUIC |
| 776 // TODO(bnc): Update this test when multiple alternative services are handled | 808 // session can be used, use the first alternative service from the list. |
| 777 // properly. | 809 TEST_P(QuicNetworkTransactionTest, UseBestAlternativeServiceForQuic) { |
| 778 TEST_P(QuicNetworkTransactionTest, UseFirstAlternativeServiceForQuic) { | |
| 779 MockRead http_reads[] = { | 810 MockRead http_reads[] = { |
| 780 MockRead("HTTP/1.1 200 OK\r\n"), | 811 MockRead("HTTP/1.1 200 OK\r\n"), |
| 781 MockRead("Alt-Svc: quic=\":443\", quic=\":1234\"\r\n\r\n"), | 812 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":1234\"\r\n\r\n"), |
| 782 MockRead("hello world"), | 813 MockRead("hello world"), |
| 783 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 814 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 784 MockRead(ASYNC, OK)}; | 815 MockRead(ASYNC, OK)}; |
| 785 | 816 |
| 786 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 817 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 787 0); | 818 0); |
| 788 socket_factory_.AddSocketDataProvider(&http_data); | 819 socket_factory_.AddSocketDataProvider(&http_data); |
| 789 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 820 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 790 | 821 |
| 822 // First QUIC request data. | |
| 823 // Open a session to mail.example.org:443 using the first entry of the | |
|
Ryan Hamilton
2015/12/30 21:51:41
The Alt-Svc: header seems to be foo.example.com no
| |
| 824 // alternative service list. | |
| 791 MockQuicData mock_quic_data; | 825 MockQuicData mock_quic_data; |
| 792 mock_quic_data.AddWrite( | 826 mock_quic_data.AddWrite( |
| 793 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 827 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 794 GetRequestHeaders("GET", "https", "/"))); | 828 GetRequestHeaders("GET", "https", "/"))); |
| 795 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 829 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 796 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 830 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 797 mock_quic_data.AddRead( | 831 mock_quic_data.AddRead( |
| 798 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 832 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 799 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 833 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 834 | |
| 835 // Second QUIC request data. | |
| 836 // Connection pooling, using existing session, no need to include version | |
| 837 // as version negotiation has been completed. | |
| 838 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( | |
| 839 3, kClientDataStreamId2, false, true, | |
| 840 GetRequestHeaders("GET", "https", "/"), 31)); | |
| 841 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | |
| 842 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"), 31)); | |
| 843 mock_quic_data.AddRead( | |
| 844 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!")); | |
| 845 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1)); | |
| 800 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 846 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 801 mock_quic_data.AddRead(ASYNC, 0); // EOF | 847 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 802 | 848 |
| 803 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 849 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 804 | 850 |
| 805 AddHangingNonAlternateProtocolSocketData(); | 851 AddHangingNonAlternateProtocolSocketData(); |
| 806 CreateSessionWithNextProtos(); | 852 CreateSessionWithNextProtos(); |
| 807 | 853 |
| 808 SendRequestAndExpectHttpResponse("hello world"); | 854 SendRequestAndExpectHttpResponse("hello world"); |
| 855 | |
| 856 SendRequestAndExpectQuicResponseOnPort("hello!", 443); | |
| 857 | |
| 858 session_->http_server_properties()->ClearAlternativeServices( | |
| 859 HostPortPair::FromURL(request_.url)); | |
| 860 | |
| 861 // Manually reset the alternative service map where an existing QUIC session | |
| 862 // is in the second entry of the list. | |
| 863 HostPortPair alternative1("mail.example.com", 1234); | |
| 864 HostPortPair alternative2("foo.example.com", 443); | |
| 865 HostPortPair alternative3("bar.example.com", 443); | |
| 866 | |
| 867 AlternativeServiceInfoVector alternative_service_info_vector; | |
| 868 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | |
| 869 AlternativeService alternative_service1(QUIC, alternative1); | |
| 870 AlternativeServiceInfo alternative_service_info1(alternative_service1, 1.0, | |
| 871 expiration); | |
| 872 alternative_service_info_vector.push_back(alternative_service_info1); | |
| 873 AlternativeService alternative_service2(QUIC, alternative2); | |
| 874 AlternativeServiceInfo alternative_service_info2(alternative_service2, 1.0, | |
| 875 expiration); | |
| 876 alternative_service_info_vector.push_back(alternative_service_info2); | |
| 877 AlternativeService alternative_service3(QUIC, alternative3); | |
| 878 AlternativeServiceInfo alternative_service_info3(alternative_service3, 1.0, | |
| 879 expiration); | |
| 880 alternative_service_info_vector.push_back(alternative_service_info3); | |
| 881 session_->http_server_properties()->SetAlternativeServices( | |
| 882 HostPortPair::FromURL(request_.url), alternative_service_info_vector); | |
| 883 | |
| 809 SendRequestAndExpectQuicResponseOnPort("hello!", 443); | 884 SendRequestAndExpectQuicResponseOnPort("hello!", 443); |
| 810 } | 885 } |
| 811 | 886 |
| 812 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { | 887 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { |
| 813 MockRead http_reads[] = { | 888 MockRead http_reads[] = { |
| 814 MockRead("HTTP/1.1 200 OK\r\n"), | 889 MockRead("HTTP/1.1 200 OK\r\n"), |
| 815 MockRead(kQuicAlternativeServiceDifferentPortHeader), | 890 MockRead(kQuicAlternativeServiceDifferentPortHeader), |
| 816 MockRead("hello world"), | 891 MockRead("hello world"), |
| 817 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 892 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 818 MockRead(ASYNC, OK)}; | 893 MockRead(ASYNC, OK)}; |
| (...skipping 1055 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1874 request_.url = GURL("https://www.example.org:443"); | 1949 request_.url = GURL("https://www.example.org:443"); |
| 1875 AddHangingNonAlternateProtocolSocketData(); | 1950 AddHangingNonAlternateProtocolSocketData(); |
| 1876 CreateSessionWithNextProtos(); | 1951 CreateSessionWithNextProtos(); |
| 1877 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); | 1952 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); |
| 1878 SendRequestAndExpectQuicResponse("hello!"); | 1953 SendRequestAndExpectQuicResponse("hello!"); |
| 1879 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); | 1954 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); |
| 1880 } | 1955 } |
| 1881 | 1956 |
| 1882 } // namespace test | 1957 } // namespace test |
| 1883 } // namespace net | 1958 } // namespace net |
| OLD | NEW |