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 "net/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 5112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5123 EXPECT_TRUE(response2.headers->HasHeaderValue("version", "HTTP/1.1")); | 5123 EXPECT_TRUE(response2.headers->HasHeaderValue("version", "HTTP/1.1")); |
5124 | 5124 |
5125 // Read the final EOF (which will close the session) | 5125 // Read the final EOF (which will close the session) |
5126 data.RunFor(1); | 5126 data.RunFor(1); |
5127 | 5127 |
5128 // Verify that we consumed all test data. | 5128 // Verify that we consumed all test data. |
5129 EXPECT_TRUE(data.at_read_eof()); | 5129 EXPECT_TRUE(data.at_read_eof()); |
5130 EXPECT_TRUE(data.at_write_eof()); | 5130 EXPECT_TRUE(data.at_write_eof()); |
5131 } | 5131 } |
5132 | 5132 |
5133 TEST_P(SpdyNetworkTransactionSpdy2Test, ServerPushWithNoStatusHeaderFrames) { | |
Ryan Hamilton
2012/08/03 19:52:14
I want to confirm that if you run this test with t
ramant (doing other things)
2012/08/03 20:50:40
Yes it does. It crashes the code.
| |
5134 // We push a stream and attempt to claim it before the headers come down. | |
5135 static const unsigned char kPushBodyFrame[] = { | |
5136 0x00, 0x00, 0x00, 0x02, // header, ID | |
5137 0x01, 0x00, 0x00, 0x06, // FIN, length | |
5138 'p', 'u', 's', 'h', 'e', 'd' // "pushed" | |
5139 }; | |
5140 scoped_ptr<SpdyFrame> | |
5141 stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | |
5142 scoped_ptr<SpdyFrame> | |
5143 stream1_body(ConstructSpdyBodyFrame(1, true)); | |
5144 MockWrite writes[] = { | |
5145 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS), | |
5146 }; | |
5147 | |
5148 static const char* const kInitialHeaders[] = { | |
5149 "url", | |
5150 "http://www.google.com/foo.dat", | |
5151 }; | |
5152 static const char* const kMiddleHeaders[] = { | |
5153 "hello", | |
5154 "bye", | |
5155 }; | |
5156 scoped_ptr<SpdyFrame> | |
5157 stream2_syn(ConstructSpdyControlFrame(kInitialHeaders, | |
5158 arraysize(kInitialHeaders) / 2, | |
5159 false, | |
5160 2, | |
5161 LOWEST, | |
5162 SYN_STREAM, | |
5163 CONTROL_FLAG_NONE, | |
5164 NULL, | |
5165 0, | |
5166 1)); | |
5167 scoped_ptr<SpdyFrame> | |
5168 stream2_headers1(ConstructSpdyControlFrame(kMiddleHeaders, | |
5169 arraysize(kMiddleHeaders) / 2, | |
5170 false, | |
5171 2, | |
5172 LOWEST, | |
5173 HEADERS, | |
5174 CONTROL_FLAG_NONE, | |
5175 NULL, | |
5176 0, | |
5177 0)); | |
5178 | |
5179 scoped_ptr<SpdyFrame> | |
5180 stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1)); | |
5181 MockRead reads[] = { | |
5182 CreateMockRead(*stream1_reply, 1), | |
5183 CreateMockRead(*stream2_syn, 2), | |
5184 CreateMockRead(*stream1_body, 3), | |
5185 CreateMockRead(*stream2_headers1, 4), | |
5186 MockRead(ASYNC, reinterpret_cast<const char*>(kPushBodyFrame), | |
5187 arraysize(kPushBodyFrame), 5), | |
5188 MockRead(ASYNC, 0, 6), // EOF | |
5189 }; | |
5190 | |
5191 DeterministicSocketData data(reads, arraysize(reads), | |
5192 writes, arraysize(writes)); | |
5193 | |
5194 NormalSpdyTransactionHelper helper(CreateGetRequest(), | |
5195 BoundNetLog(), GetParam(), NULL); | |
5196 helper.SetDeterministic(); | |
5197 helper.AddDeterministicData(&data); | |
5198 helper.RunPreTestSetup(); | |
5199 | |
5200 HttpNetworkTransaction* trans = helper.trans(); | |
5201 | |
5202 // Run until we've received the primary SYN_STREAM, the pushed SYN_STREAM, | |
5203 // the first HEADERS frame, and the body of the primary stream, but before | |
5204 // we've received the final HEADERS for the pushed stream. | |
5205 data.SetStop(4); | |
5206 | |
5207 // Start the transaction. | |
5208 TestCompletionCallback callback; | |
5209 int rv = trans->Start( | |
5210 &CreateGetRequest(), callback.callback(), BoundNetLog()); | |
5211 EXPECT_EQ(ERR_IO_PENDING, rv); | |
5212 data.Run(); | |
5213 rv = callback.WaitForResult(); | |
5214 EXPECT_EQ(0, rv); | |
5215 | |
5216 // Request the pushed path. At this point, we've received the push, but the | |
5217 // headers are not yet complete. | |
5218 scoped_ptr<HttpNetworkTransaction> trans2( | |
5219 new HttpNetworkTransaction(helper.session())); | |
5220 rv = trans2->Start( | |
5221 &CreateGetPushRequest(), callback.callback(), BoundNetLog()); | |
5222 EXPECT_EQ(ERR_IO_PENDING, rv); | |
5223 data.RunFor(2); | |
5224 MessageLoop::current()->RunAllPending(); | |
5225 | |
5226 // Read the server push body. | |
5227 std::string result2; | |
5228 ReadResult(trans2.get(), &data, &result2); | |
5229 // Read the response body. | |
5230 std::string result; | |
5231 ReadResult(trans, &data, &result); | |
5232 EXPECT_EQ("hello!", result); | |
5233 | |
5234 // Verify that we haven't received any push data. | |
5235 EXPECT_EQ("", result2); | |
5236 | |
5237 // Verify the SYN_REPLY. | |
5238 // Copy the response info, because trans goes away. | |
5239 HttpResponseInfo response = *trans->GetResponseInfo(); | |
5240 ASSERT_TRUE(trans2->GetResponseInfo() == NULL); | |
5241 | |
5242 VerifyStreamsClosed(helper); | |
5243 | |
5244 // Verify the SYN_REPLY. | |
5245 EXPECT_TRUE(response.headers != NULL); | |
5246 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); | |
5247 | |
5248 // Read the final EOF (which will close the session). | |
5249 data.RunFor(1); | |
5250 | |
5251 // Verify that we consumed all test data. | |
5252 EXPECT_TRUE(data.at_read_eof()); | |
5253 EXPECT_TRUE(data.at_write_eof()); | |
5254 } | |
5255 | |
5133 TEST_P(SpdyNetworkTransactionSpdy2Test, SynReplyWithHeaders) { | 5256 TEST_P(SpdyNetworkTransactionSpdy2Test, SynReplyWithHeaders) { |
5134 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | 5257 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
5135 MockWrite writes[] = { CreateMockWrite(*req) }; | 5258 MockWrite writes[] = { CreateMockWrite(*req) }; |
5136 | 5259 |
5137 static const char* const kInitialHeaders[] = { | 5260 static const char* const kInitialHeaders[] = { |
5138 "status", | 5261 "status", |
5139 "200 OK", | 5262 "200 OK", |
5140 "version", | 5263 "version", |
5141 "HTTP/1.1" | 5264 "HTTP/1.1" |
5142 }; | 5265 }; |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5547 // And now we can allow everything else to run to completion. | 5670 // And now we can allow everything else to run to completion. |
5548 data.SetStop(10); | 5671 data.SetStop(10); |
5549 data.Run(); | 5672 data.Run(); |
5550 EXPECT_EQ(OK, callback2.WaitForResult()); | 5673 EXPECT_EQ(OK, callback2.WaitForResult()); |
5551 EXPECT_EQ(OK, callback3.WaitForResult()); | 5674 EXPECT_EQ(OK, callback3.WaitForResult()); |
5552 | 5675 |
5553 helper.VerifyDataConsumed(); | 5676 helper.VerifyDataConsumed(); |
5554 } | 5677 } |
5555 | 5678 |
5556 } // namespace net | 5679 } // namespace net |
OLD | NEW |