summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorrch <rch@chromium.org>2016-03-21 14:33:12 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-21 21:34:14 +0000
commitf47265dc3ede8dc8fc845fdb54502d35171407d0 (patch)
treea6c959f8de3129466081c94e0927db9aceff668b /net
parentd06c6bdbbd44f49364ba6bf10a872ffd0ba9281c (diff)
downloadchromium_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.cc5
-rw-r--r--net/quic/quic_network_transaction_unittest.cc78
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"),