diff options
author | rch <rch@chromium.org> | 2016-03-21 14:33:12 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-21 21:34:14 +0000 |
commit | f47265dc3ede8dc8fc845fdb54502d35171407d0 (patch) | |
tree | a6c959f8de3129466081c94e0927db9aceff668b /net | |
parent | d06c6bdbbd44f49364ba6bf10a872ffd0ba9281c (diff) | |
download | chromium_src-f47265dc3ede8dc8fc845fdb54502d35171407d0.zip chromium_src-f47265dc3ede8dc8fc845fdb54502d35171407d0.tar.gz chromium_src-f47265dc3ede8dc8fc845fdb54502d35171407d0.tar.bz2 |
Fix Alternate-Protocol handling when a p= option is present.
BUG=596399
Review URL: https://codereview.chromium.org/1822783002
Cr-Commit-Position: refs/heads/master@{#382397}
Diffstat (limited to 'net')
-rw-r--r-- | net/http/http_stream_factory.cc | 5 | ||||
-rw-r--r-- | net/quic/quic_network_transaction_unittest.cc | 78 |
2 files changed, 83 insertions, 0 deletions
diff --git a/net/http/http_stream_factory.cc b/net/http/http_stream_factory.cc index bc0212b..f61a317 100644 --- a/net/http/http_stream_factory.cc +++ b/net/http/http_stream_factory.cc @@ -98,6 +98,11 @@ void HttpStreamFactory::ProcessAlternateProtocol( bool is_valid = true; for (size_t i = 0; i < alternate_protocol_values.size(); ++i) { base::StringPiece alternate_protocol_str = alternate_protocol_values[i]; + if (base::StartsWith(alternate_protocol_str, "p=", + base::CompareCase::SENSITIVE)) { + // Ignore deprecated probability. + continue; + } std::vector<base::StringPiece> port_protocol_vector = base::SplitStringPiece(alternate_protocol_str, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc index 6b174cc..0a5ab02 100644 --- a/net/quic/quic_network_transaction_unittest.cc +++ b/net/quic/quic_network_transaction_unittest.cc @@ -61,10 +61,14 @@ namespace { static const char kQuicAlternateProtocolHeader[] = "Alternate-Protocol: 443:quic\r\n\r\n"; +static const char kQuicAlternateProtocolWithProbabilityHeader[] = + "Alternate-Protocol: 443:quic,p=.5\r\n\r\n"; static const char kQuicAlternateProtocolDifferentPortHeader[] = "Alternate-Protocol: 137:quic\r\n\r\n"; static const char kQuicAlternativeServiceHeader[] = "Alt-Svc: quic=\":443\"\r\n\r\n"; +static const char kQuicAlternativeServiceWithProbabilityHeader[] = + "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n"; static const char kQuicAlternativeServiceDifferentPortHeader[] = "Alt-Svc: quic=\":137\"\r\n\r\n"; @@ -895,6 +899,41 @@ TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) { SendRequestAndExpectQuicResponse("hello!"); } +TEST_P(QuicNetworkTransactionTest, + UseAlternativeServiceWithProbabilityForQuic) { + MockRead http_reads[] = { + MockRead("HTTP/1.1 200 OK\r\n"), + MockRead(kQuicAlternativeServiceWithProbabilityHeader), + MockRead("hello world"), + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), + MockRead(ASYNC, OK)}; + + StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, + 0); + socket_factory_.AddSocketDataProvider(&http_data); + socket_factory_.AddSSLSocketDataProvider(&ssl_data_); + + MockQuicData mock_quic_data; + mock_quic_data.AddWrite( + ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, + GetRequestHeaders("GET", "https", "/"))); + mock_quic_data.AddRead(ConstructResponseHeadersPacket( + 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); + mock_quic_data.AddRead( + ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); + mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); + mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read + mock_quic_data.AddRead(ASYNC, 0); // EOF + + mock_quic_data.AddSocketDataToFactory(&socket_factory_); + + AddHangingNonAlternateProtocolSocketData(); + CreateSession(); + + SendRequestAndExpectHttpResponse("hello world"); + SendRequestAndExpectQuicResponse("hello!"); +} + TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) { std::string altsvc_header = base::StringPrintf( "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam()); @@ -1498,6 +1537,45 @@ TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { SendRequestAndExpectQuicResponse("hello!"); } +TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolWithProbabilityForQuic) { + MockRead http_reads[] = { + MockRead("HTTP/1.1 200 OK\r\n"), + MockRead(kQuicAlternateProtocolWithProbabilityHeader), + MockRead("hello world"), + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), + MockRead(ASYNC, OK)}; + + StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, + 0); + socket_factory_.AddSocketDataProvider(&http_data); + socket_factory_.AddSSLSocketDataProvider(&ssl_data_); + + MockQuicData mock_quic_data; + mock_quic_data.AddWrite( + ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, + GetRequestHeaders("GET", "https", "/"))); + mock_quic_data.AddRead(ConstructResponseHeadersPacket( + 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); + mock_quic_data.AddRead( + ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); + mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); + mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read + mock_quic_data.AddRead(ASYNC, 0); // EOF + + mock_quic_data.AddSocketDataToFactory(&socket_factory_); + + // The non-alternate protocol job needs to hang in order to guarantee that + // the alternate-protocol job will "win". + AddHangingNonAlternateProtocolSocketData(); + + params_.parse_alternative_services = false; + params_.parse_alternative_services = false; + CreateSession(); + + SendRequestAndExpectHttpResponse("hello world"); + SendRequestAndExpectQuicResponse("hello!"); +} + TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) { MockRead http_reads[] = { MockRead("HTTP/1.1 200 OK\r\n"), |