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 <cmath> | 5 #include <cmath> |
6 #include <memory> | 6 #include <memory> |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 4009 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4020 | 4020 |
4021 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4021 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
4022 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 4022 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
4023 NetLogWithSource(), nullptr); | 4023 NetLogWithSource(), nullptr); |
4024 helper.AddData(&data); | 4024 helper.AddData(&data); |
4025 helper.RunToCompletion(&data); | 4025 helper.RunToCompletion(&data); |
4026 TransactionHelperResult out = helper.output(); | 4026 TransactionHelperResult out = helper.output(); |
4027 EXPECT_THAT(out.rv, IsError(ERR_ABORTED)); | 4027 EXPECT_THAT(out.rv, IsError(ERR_ABORTED)); |
4028 } | 4028 } |
4029 | 4029 |
| 4030 // A server can gracefully shut down by sending a GOAWAY frame |
| 4031 // with maximum last-stream-id value. |
| 4032 // Transactions started before receiving such a GOAWAY frame should succeed, |
| 4033 // but SpdySession should be unavailable for new streams. |
| 4034 TEST_F(SpdyNetworkTransactionTest, GracefulGoaway) { |
| 4035 SpdySerializedFrame req1( |
| 4036 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4037 spdy_util_.UpdateWithStreamDestruction(1); |
| 4038 SpdySerializedFrame req2( |
| 4039 spdy_util_.ConstructSpdyGet("https://www.example.org/foo", 3, LOWEST)); |
| 4040 MockWrite writes[] = {CreateMockWrite(req1, 0), CreateMockWrite(req2, 3)}; |
| 4041 |
| 4042 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 4043 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 4044 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( |
| 4045 0x7fffffff, GOAWAY_NO_ERROR, "Graceful shutdown.")); |
| 4046 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3)); |
| 4047 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 4048 MockRead reads[] = {CreateMockRead(resp1, 1), CreateMockRead(body1, 2), |
| 4049 CreateMockRead(goaway, 4), CreateMockRead(resp2, 5), |
| 4050 CreateMockRead(body2, 6), MockRead(ASYNC, 0, 7)}; |
| 4051 |
| 4052 // Run first transaction. |
| 4053 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4054 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 4055 NetLogWithSource(), nullptr); |
| 4056 helper.RunPreTestSetup(); |
| 4057 helper.AddData(&data); |
| 4058 helper.RunDefaultTest(); |
| 4059 |
| 4060 // Verify first response. |
| 4061 TransactionHelperResult out = helper.output(); |
| 4062 EXPECT_THAT(out.rv, IsOk()); |
| 4063 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 4064 EXPECT_EQ("hello!", out.response_data); |
| 4065 |
| 4066 // GOAWAY frame has not yet been received, SpdySession should be available. |
| 4067 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); |
| 4068 SpdySessionKey key(host_port_pair_, ProxyServer::Direct(), |
| 4069 PRIVACY_MODE_DISABLED); |
| 4070 NetLogWithSource log; |
| 4071 base::WeakPtr<SpdySession> spdy_session = |
| 4072 spdy_session_pool->FindAvailableSession(key, GURL(), log); |
| 4073 EXPECT_TRUE(spdy_session); |
| 4074 |
| 4075 // Start second transaction. |
| 4076 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); |
| 4077 TestCompletionCallback callback; |
| 4078 HttpRequestInfo request2; |
| 4079 request2.method = "GET"; |
| 4080 request2.url = GURL("https://www.example.org/foo"); |
| 4081 int rv = trans2.Start(&request2, callback.callback(), log); |
| 4082 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 4083 rv = callback.WaitForResult(); |
| 4084 EXPECT_THAT(rv, IsOk()); |
| 4085 |
| 4086 // Verify second response. |
| 4087 const HttpResponseInfo* response = trans2.GetResponseInfo(); |
| 4088 ASSERT_TRUE(response); |
| 4089 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP2, response->connection_info); |
| 4090 ASSERT_TRUE(response->headers); |
| 4091 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); |
| 4092 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 4093 EXPECT_TRUE(response->was_alpn_negotiated); |
| 4094 EXPECT_EQ("127.0.0.1", response->socket_address.host()); |
| 4095 EXPECT_EQ(443, response->socket_address.port()); |
| 4096 std::string response_data; |
| 4097 rv = ReadTransaction(&trans2, &response_data); |
| 4098 EXPECT_THAT(rv, IsOk()); |
| 4099 EXPECT_EQ("hello!", response_data); |
| 4100 |
| 4101 // Graceful GOAWAY was received, SpdySession should be unavailable. |
| 4102 spdy_session = spdy_session_pool->FindAvailableSession(key, GURL(), log); |
| 4103 EXPECT_FALSE(spdy_session); |
| 4104 |
| 4105 helper.VerifyDataConsumed(); |
| 4106 } |
| 4107 |
4030 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) { | 4108 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) { |
4031 SpdySerializedFrame req( | 4109 SpdySerializedFrame req( |
4032 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4110 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
4033 MockWrite writes[] = {CreateMockWrite(req, 0)}; | 4111 MockWrite writes[] = {CreateMockWrite(req, 0)}; |
4034 | 4112 |
4035 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); | 4113 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
4036 MockRead reads[] = { | 4114 MockRead reads[] = { |
4037 CreateMockRead(resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF | 4115 CreateMockRead(resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF |
4038 }; | 4116 }; |
4039 | 4117 |
(...skipping 2426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6466 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { | 6544 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { |
6467 std::unique_ptr<SSLSocketDataProvider> ssl_provider( | 6545 std::unique_ptr<SSLSocketDataProvider> ssl_provider( |
6468 new SSLSocketDataProvider(ASYNC, OK)); | 6546 new SSLSocketDataProvider(ASYNC, OK)); |
6469 // Set to TLS_RSA_WITH_NULL_MD5 | 6547 // Set to TLS_RSA_WITH_NULL_MD5 |
6470 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); | 6548 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); |
6471 | 6549 |
6472 RunTLSUsageCheckTest(std::move(ssl_provider)); | 6550 RunTLSUsageCheckTest(std::move(ssl_provider)); |
6473 } | 6551 } |
6474 | 6552 |
6475 } // namespace net | 6553 } // namespace net |
OLD | NEW |