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 <algorithm> | 5 #include <algorithm> |
| 6 #include <memory> | 6 #include <memory> |
| 7 #include <ostream> | 7 #include <ostream> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 1172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1183 | 1183 |
| 1184 request_.url = GURL("https://" + origin.host()); | 1184 request_.url = GURL("https://" + origin.host()); |
| 1185 AddQuicRemoteAlternativeServiceMapping( | 1185 AddQuicRemoteAlternativeServiceMapping( |
| 1186 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative); | 1186 MockCryptoClientStream::CONFIRM_HANDSHAKE, alternative); |
| 1187 AddHangingNonAlternateProtocolSocketData(); | 1187 AddHangingNonAlternateProtocolSocketData(); |
| 1188 CreateSession(); | 1188 CreateSession(); |
| 1189 | 1189 |
| 1190 SendRequestAndExpectQuicResponse("hello!"); | 1190 SendRequestAndExpectQuicResponse("hello!"); |
| 1191 } | 1191 } |
| 1192 | 1192 |
| 1193 TEST_P(QuicNetworkTransactionTest, DoNotUseQuicForUnsupportedVersion) { | |
| 1194 // Add support for another QUIC version besides |version_|. | |
| 1195 // Client supported versions: {version_, QUIC_VERSION_40/QUIC_VERSION_37}. | |
| 1196 if (version_ != QUIC_VERSION_40) { | |
| 1197 supported_versions_.push_back(QUIC_VERSION_40); | |
| 1198 } else { | |
| 1199 supported_versions_.push_back(QUIC_VERSION_37); | |
| 1200 } | |
|
Ryan Hamilton
2017/06/30 02:45:11
Can you do the same trick as in your previous CL?
Zhongyi Shi
2017/06/30 21:08:43
Done.
| |
| 1201 | |
| 1202 // Set up alternative service to use QUIC with a version that is not supported | |
| 1203 // by the net stack: QUIC_VERSION_35/QUIC_VERSION_39. | |
| 1204 QuicVersion unsupported_version(QUIC_VERSION_35); | |
| 1205 if (version_ == QUIC_VERSION_35) | |
| 1206 unsupported_version = QUIC_VERSION_39; | |
|
Ryan Hamilton
2017/06/30 02:45:11
ditto
Zhongyi Shi
2017/06/30 21:08:43
Done.
| |
| 1207 | |
| 1208 url::SchemeHostPort server(request_.url); | |
| 1209 AlternativeService alternative_service(kProtoQUIC, kDefaultServerHostName, | |
| 1210 443); | |
| 1211 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | |
| 1212 http_server_properties_.SetQuicAlternativeService( | |
| 1213 server, alternative_service, expiration, {unsupported_version}); | |
| 1214 | |
| 1215 AlternativeServiceInfoVector alt_svc_info_vector = | |
| 1216 http_server_properties_.GetAlternativeServiceInfos(server); | |
| 1217 EXPECT_EQ(1u, alt_svc_info_vector.size()); | |
| 1218 EXPECT_EQ(kProtoQUIC, alt_svc_info_vector[0].alternative_service().protocol); | |
| 1219 EXPECT_EQ(1u, alt_svc_info_vector[0].advertised_versions().size()); | |
| 1220 EXPECT_EQ(unsupported_version, | |
| 1221 alt_svc_info_vector[0].advertised_versions()[0]); | |
| 1222 | |
| 1223 // First request should still be sent via TCP as the QUIC version advertised | |
| 1224 // in the stored AlternativeService is not supported by the client. However, | |
| 1225 // the response from the server will advertise new Alt-Svc with supported | |
| 1226 // versions. | |
| 1227 std::string advertised_versions_list_str = | |
| 1228 GenerateQuicVersionsListForAltSvcHeader(AllSupportedVersions()); | |
| 1229 std::string altsvc_header = | |
| 1230 base::StringPrintf("Alt-Svc: quic=\":443\"; v=\"%s\"\r\n\r\n", | |
| 1231 advertised_versions_list_str.c_str()); | |
| 1232 MockRead http_reads[] = { | |
| 1233 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()), | |
| 1234 MockRead("hello world"), | |
| 1235 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
| 1236 MockRead(ASYNC, OK)}; | |
| 1237 | |
| 1238 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
| 1239 0); | |
| 1240 socket_factory_.AddSocketDataProvider(&http_data); | |
| 1241 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1242 | |
| 1243 // Second request should be sent via QUIC as a new list of verions supported | |
| 1244 // by the client has been advertised by the server. | |
| 1245 MockQuicData mock_quic_data; | |
| 1246 QuicStreamOffset header_stream_offset = 0; | |
| 1247 mock_quic_data.AddWrite( | |
| 1248 ConstructInitialSettingsPacket(1, &header_stream_offset)); | |
| 1249 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket( | |
| 1250 2, GetNthClientInitiatedStreamId(0), true, true, | |
| 1251 GetRequestHeaders("GET", "https", "/"), &header_stream_offset)); | |
| 1252 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket( | |
| 1253 1, GetNthClientInitiatedStreamId(0), false, false, | |
| 1254 GetResponseHeaders("200 OK"))); | |
| 1255 mock_quic_data.AddRead(ConstructServerDataPacket( | |
| 1256 2, GetNthClientInitiatedStreamId(0), false, true, 0, "hello!")); | |
| 1257 mock_quic_data.AddWrite(ConstructClientAckPacket(3, 2, 1, 1)); | |
| 1258 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | |
| 1259 mock_quic_data.AddRead(ASYNC, 0); // EOF | |
| 1260 | |
| 1261 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | |
| 1262 | |
| 1263 AddHangingNonAlternateProtocolSocketData(); | |
| 1264 | |
| 1265 CreateSession(supported_versions_); | |
| 1266 | |
| 1267 SendRequestAndExpectHttpResponse("hello world"); | |
| 1268 SendRequestAndExpectQuicResponse("hello!"); | |
| 1269 | |
| 1270 // Check alternative service list is updated with new versions. | |
| 1271 alt_svc_info_vector = | |
| 1272 session_->http_server_properties()->GetAlternativeServiceInfos(server); | |
| 1273 EXPECT_EQ(1u, alt_svc_info_vector.size()); | |
| 1274 EXPECT_EQ(kProtoQUIC, alt_svc_info_vector[0].alternative_service().protocol); | |
| 1275 EXPECT_EQ(2u, alt_svc_info_vector[0].advertised_versions().size()); | |
| 1276 // Advertised versions will be lised in a sorted order. | |
| 1277 std::sort(supported_versions_.begin(), supported_versions_.end()); | |
| 1278 EXPECT_EQ(supported_versions_[0], | |
| 1279 alt_svc_info_vector[0].advertised_versions()[0]); | |
| 1280 EXPECT_EQ(supported_versions_[1], | |
| 1281 alt_svc_info_vector[0].advertised_versions()[1]); | |
| 1282 } | |
| 1283 | |
| 1193 // Regression test for https://crbug.com/546991. | 1284 // Regression test for https://crbug.com/546991. |
| 1194 // The server might not be able to serve a request on an alternative connection, | 1285 // The server might not be able to serve a request on an alternative connection, |
| 1195 // and might send a 421 Misdirected Request response status to indicate this. | 1286 // and might send a 421 Misdirected Request response status to indicate this. |
| 1196 // HttpNetworkTransaction should reset the request and retry without using | 1287 // HttpNetworkTransaction should reset the request and retry without using |
| 1197 // alternative services. | 1288 // alternative services. |
| 1198 TEST_P(QuicNetworkTransactionTest, RetryMisdirectedRequest) { | 1289 TEST_P(QuicNetworkTransactionTest, RetryMisdirectedRequest) { |
| 1199 // Set up alternative service to use QUIC. | 1290 // Set up alternative service to use QUIC. |
| 1200 // Note that |origins_to_force_quic_on| cannot be used in this test, because | 1291 // Note that |origins_to_force_quic_on| cannot be used in this test, because |
| 1201 // that overrides |enable_alternative_services|. | 1292 // that overrides |enable_alternative_services|. |
| 1202 url::SchemeHostPort server(request_.url); | 1293 url::SchemeHostPort server(request_.url); |
| (...skipping 3986 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5189 | 5280 |
| 5190 request_.url = GURL("https://mail.example.org/pushed.jpg"); | 5281 request_.url = GURL("https://mail.example.org/pushed.jpg"); |
| 5191 ChunkedUploadDataStream upload_data(0); | 5282 ChunkedUploadDataStream upload_data(0); |
| 5192 upload_data.AppendData("1", 1, true); | 5283 upload_data.AppendData("1", 1, true); |
| 5193 request_.upload_data_stream = &upload_data; | 5284 request_.upload_data_stream = &upload_data; |
| 5194 SendRequestAndExpectQuicResponse("and hello!"); | 5285 SendRequestAndExpectQuicResponse("and hello!"); |
| 5195 } | 5286 } |
| 5196 | 5287 |
| 5197 } // namespace test | 5288 } // namespace test |
| 5198 } // namespace net | 5289 } // namespace net |
| OLD | NEW |