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 "base/memory/ref_counted.h" | 5 #include "base/memory/ref_counted.h" |
6 #include "net/base/completion_callback.h" | 6 #include "net/base/completion_callback.h" |
7 #include "net/base/net_log_unittest.h" | 7 #include "net/base/net_log_unittest.h" |
8 #include "net/spdy/buffered_spdy_framer.h" | 8 #include "net/spdy/buffered_spdy_framer.h" |
9 #include "net/spdy/spdy_stream.h" | 9 #include "net/spdy/spdy_stream.h" |
10 #include "net/spdy/spdy_http_utils.h" | 10 #include "net/spdy/spdy_http_utils.h" |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 0, | 136 0, |
137 net::ConvertRequestPriorityToSpdyPriority(LOWEST), | 137 net::ConvertRequestPriorityToSpdyPriority(LOWEST), |
138 spdy::CONTROL_FLAG_NONE, | 138 spdy::CONTROL_FLAG_NONE, |
139 false, | 139 false, |
140 spdy::INVALID, | 140 spdy::INVALID, |
141 NULL, | 141 NULL, |
142 0, | 142 0, |
143 spdy::DATA_FLAG_NONE | 143 spdy::DATA_FLAG_NONE |
144 }; | 144 }; |
145 static const char* const kGetHeaders[] = { | 145 static const char* const kGetHeaders[] = { |
146 "method", | 146 ":method", |
147 "GET", | 147 "GET", |
148 "scheme", | 148 ":scheme", |
149 "http", | 149 "http", |
150 "host", | 150 ":host", |
151 "www.google.com", | 151 "www.google.com", |
152 "path", | 152 ":path", |
153 "/", | 153 "/", |
154 "version", | 154 ":version", |
155 "HTTP/1.1", | 155 "HTTP/1.1", |
156 }; | 156 }; |
157 scoped_ptr<spdy::SpdyFrame> req( | 157 scoped_ptr<spdy::SpdyFrame> req( |
158 ConstructSpdyPacket( | 158 ConstructSpdyPacket( |
159 kSynStartHeader, NULL, 0, kGetHeaders, arraysize(kGetHeaders) / 2)); | 159 kSynStartHeader, NULL, 0, kGetHeaders, arraysize(kGetHeaders) / 2)); |
160 scoped_ptr<spdy::SpdyFrame> msg( | 160 scoped_ptr<spdy::SpdyFrame> msg( |
161 ConstructSpdyBodyFrame("\0hello!\xff", 8)); | 161 ConstructSpdyBodyFrame("\0hello!\xff", 8)); |
162 MockWrite writes[] = { | 162 MockWrite writes[] = { |
163 CreateMockWrite(*req), | 163 CreateMockWrite(*req), |
164 CreateMockWrite(*msg), | 164 CreateMockWrite(*msg), |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 memcpy(buf->data(), "\0hello!\xff", 8); | 211 memcpy(buf->data(), "\0hello!\xff", 8); |
212 TestCompletionCallback callback; | 212 TestCompletionCallback callback; |
213 | 213 |
214 scoped_ptr<TestSpdyStreamDelegate> delegate( | 214 scoped_ptr<TestSpdyStreamDelegate> delegate( |
215 new TestSpdyStreamDelegate(stream.get(), buf.get(), callback.callback())); | 215 new TestSpdyStreamDelegate(stream.get(), buf.get(), callback.callback())); |
216 stream->SetDelegate(delegate.get()); | 216 stream->SetDelegate(delegate.get()); |
217 | 217 |
218 EXPECT_FALSE(stream->HasUrl()); | 218 EXPECT_FALSE(stream->HasUrl()); |
219 | 219 |
220 linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock); | 220 linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock); |
221 (*headers)["method"] = "GET"; | 221 (*headers)[":method"] = "GET"; |
222 (*headers)["scheme"] = url.scheme(); | 222 (*headers)[":scheme"] = url.scheme(); |
223 (*headers)["host"] = url.host(); | 223 (*headers)[":host"] = url.host(); |
224 (*headers)["path"] = url.path(); | 224 (*headers)[":path"] = url.path(); |
225 (*headers)["version"] = "HTTP/1.1"; | 225 (*headers)[":version"] = "HTTP/1.1"; |
226 stream->set_spdy_headers(headers); | 226 stream->set_spdy_headers(headers); |
227 EXPECT_TRUE(stream->HasUrl()); | 227 EXPECT_TRUE(stream->HasUrl()); |
228 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 228 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
229 | 229 |
230 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); | 230 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
231 | 231 |
232 EXPECT_EQ(OK, callback.WaitForResult()); | 232 EXPECT_EQ(OK, callback.WaitForResult()); |
233 | 233 |
234 EXPECT_TRUE(delegate->send_headers_completed()); | 234 EXPECT_TRUE(delegate->send_headers_completed()); |
235 EXPECT_EQ("200", (*delegate->response())["status"]); | 235 EXPECT_EQ("200", (*delegate->response())["status"]); |
236 EXPECT_EQ("HTTP/1.1", (*delegate->response())["version"]); | 236 EXPECT_EQ("HTTP/1.1", (*delegate->response())["version"]); |
237 EXPECT_EQ(std::string("\0hello!\xff", 8), delegate->received_data()); | 237 EXPECT_EQ(std::string("\0hello!\xff", 8), delegate->received_data()); |
238 EXPECT_EQ(8, delegate->data_sent()); | 238 EXPECT_EQ(8, delegate->data_sent()); |
239 EXPECT_TRUE(delegate->closed()); | 239 EXPECT_TRUE(delegate->closed()); |
240 } | 240 } |
241 | 241 |
242 TEST_F(SpdyStreamSpdy3Test, PushedStream) { | 242 TEST_F(SpdyStreamSpdy3Test, PushedStream) { |
243 const char kStreamUrl[] = "http://www.google.com/"; | 243 const char kStreamUrl[] = "http://www.google.com/"; |
244 | 244 |
245 SpdySessionDependencies session_deps; | 245 SpdySessionDependencies session_deps; |
246 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps); | 246 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps); |
247 SpdySessionPoolPeer pool_peer_(session_->spdy_session_pool()); | 247 SpdySessionPoolPeer pool_peer_(session_->spdy_session_pool()); |
248 scoped_refptr<SpdySession> spdy_session(CreateSpdySession()); | 248 scoped_refptr<SpdySession> spdy_session(CreateSpdySession()); |
| 249 |
| 250 MockRead reads[] = { |
| 251 MockRead(ASYNC, 0, 0), // EOF |
| 252 }; |
| 253 |
| 254 scoped_ptr<OrderedSocketData> data( |
| 255 new OrderedSocketData(reads, arraysize(reads), NULL, 0)); |
| 256 MockConnect connect_data(SYNCHRONOUS, OK); |
| 257 data->set_connect_data(connect_data); |
| 258 |
| 259 session_deps.socket_factory->AddSocketDataProvider(data.get()); |
| 260 SpdySession::SetSSLMode(false); |
| 261 |
| 262 HostPortPair host_port_pair("www.google.com", 80); |
| 263 scoped_refptr<TransportSocketParams> transport_params( |
| 264 new TransportSocketParams(host_port_pair, LOWEST, false, false)); |
| 265 scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle); |
| 266 EXPECT_EQ(OK, connection->Init(host_port_pair.ToString(), transport_params, |
| 267 LOWEST, CompletionCallback(), |
| 268 session_->GetTransportSocketPool(), |
| 269 BoundNetLog())); |
| 270 spdy_session->InitializeWithSocket(connection.release(), false, OK); |
249 BoundNetLog net_log; | 271 BoundNetLog net_log; |
250 | 272 |
251 // Conjure up a stream. | 273 // Conjure up a stream. |
252 scoped_refptr<SpdyStream> stream = new SpdyStream(spdy_session, | 274 scoped_refptr<SpdyStream> stream = new SpdyStream(spdy_session, |
253 2, | 275 2, |
254 true, | 276 true, |
255 net_log); | 277 net_log); |
256 EXPECT_FALSE(stream->response_received()); | 278 EXPECT_FALSE(stream->response_received()); |
257 EXPECT_FALSE(stream->HasUrl()); | 279 EXPECT_FALSE(stream->HasUrl()); |
258 | 280 |
259 // Set a couple of headers. | 281 // Set a couple of headers. |
260 spdy::SpdyHeaderBlock response; | 282 spdy::SpdyHeaderBlock response; |
261 response["url"] = kStreamUrl; | 283 GURL url(kStreamUrl); |
| 284 response[":host"] = url.host(); |
| 285 response[":scheme"] = url.scheme(); |
| 286 response[":path"] = url.path(); |
262 stream->OnResponseReceived(response); | 287 stream->OnResponseReceived(response); |
263 | 288 |
264 // Send some basic headers. | 289 // Send some basic headers. |
265 spdy::SpdyHeaderBlock headers; | 290 spdy::SpdyHeaderBlock headers; |
266 response["status"] = "200"; | 291 response["status"] = "200"; |
267 response["version"] = "OK"; | 292 response["version"] = "OK"; |
268 stream->OnHeaders(headers); | 293 stream->OnHeaders(headers); |
269 | 294 |
270 stream->set_response_received(); | 295 stream->set_response_received(); |
271 EXPECT_TRUE(stream->response_received()); | 296 EXPECT_TRUE(stream->response_received()); |
(...skipping 13 matching lines...) Expand all Loading... |
285 0, | 310 0, |
286 net::ConvertRequestPriorityToSpdyPriority(LOWEST), | 311 net::ConvertRequestPriorityToSpdyPriority(LOWEST), |
287 spdy::CONTROL_FLAG_NONE, | 312 spdy::CONTROL_FLAG_NONE, |
288 false, | 313 false, |
289 spdy::INVALID, | 314 spdy::INVALID, |
290 NULL, | 315 NULL, |
291 0, | 316 0, |
292 spdy::DATA_FLAG_NONE | 317 spdy::DATA_FLAG_NONE |
293 }; | 318 }; |
294 static const char* const kGetHeaders[] = { | 319 static const char* const kGetHeaders[] = { |
295 "method", | 320 ":method", |
296 "GET", | 321 "GET", |
297 "scheme", | 322 ":scheme", |
298 "http", | 323 "http", |
299 "host", | 324 ":host", |
300 "www.google.com", | 325 "www.google.com", |
301 "path", | 326 ":path", |
302 "/", | 327 "/", |
303 "version", | 328 ":version", |
304 "HTTP/1.1", | 329 "HTTP/1.1", |
305 }; | 330 }; |
306 scoped_ptr<spdy::SpdyFrame> req( | 331 scoped_ptr<spdy::SpdyFrame> req( |
307 ConstructSpdyPacket( | 332 ConstructSpdyPacket( |
308 kSynStartHeader, NULL, 0, kGetHeaders, arraysize(kGetHeaders) / 2)); | 333 kSynStartHeader, NULL, 0, kGetHeaders, arraysize(kGetHeaders) / 2)); |
309 scoped_ptr<spdy::SpdyFrame> msg( | 334 scoped_ptr<spdy::SpdyFrame> msg( |
310 ConstructSpdyBodyFrame("\0hello!\xff", 8)); | 335 ConstructSpdyBodyFrame("\0hello!\xff", 8)); |
311 MockWrite writes[] = { | 336 MockWrite writes[] = { |
312 CreateMockWrite(*req), | 337 CreateMockWrite(*req), |
313 CreateMockWrite(*msg), | 338 CreateMockWrite(*msg), |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 memcpy(buf->data(), "\0hello!\xff", 8); | 387 memcpy(buf->data(), "\0hello!\xff", 8); |
363 TestCompletionCallback callback; | 388 TestCompletionCallback callback; |
364 | 389 |
365 scoped_ptr<TestSpdyStreamDelegate> delegate( | 390 scoped_ptr<TestSpdyStreamDelegate> delegate( |
366 new TestSpdyStreamDelegate(stream.get(), buf.get(), callback.callback())); | 391 new TestSpdyStreamDelegate(stream.get(), buf.get(), callback.callback())); |
367 stream->SetDelegate(delegate.get()); | 392 stream->SetDelegate(delegate.get()); |
368 | 393 |
369 EXPECT_FALSE(stream->HasUrl()); | 394 EXPECT_FALSE(stream->HasUrl()); |
370 | 395 |
371 linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock); | 396 linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock); |
372 (*headers)["method"] = "GET"; | 397 (*headers)[":method"] = "GET"; |
373 (*headers)["scheme"] = url.scheme(); | 398 (*headers)[":scheme"] = url.scheme(); |
374 (*headers)["host"] = url.host(); | 399 (*headers)[":host"] = url.host(); |
375 (*headers)["path"] = url.path(); | 400 (*headers)[":path"] = url.path(); |
376 (*headers)["version"] = "HTTP/1.1"; | 401 (*headers)[":version"] = "HTTP/1.1"; |
377 stream->set_spdy_headers(headers); | 402 stream->set_spdy_headers(headers); |
378 EXPECT_TRUE(stream->HasUrl()); | 403 EXPECT_TRUE(stream->HasUrl()); |
379 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 404 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
380 | 405 |
381 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); | 406 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
382 | 407 |
383 const spdy::SpdyStreamId stream_id = stream->stream_id(); | 408 const spdy::SpdyStreamId stream_id = stream->stream_id(); |
384 | 409 |
385 EXPECT_EQ(OK, callback.WaitForResult()); | 410 EXPECT_EQ(OK, callback.WaitForResult()); |
386 | 411 |
(...skipping 16 matching lines...) Expand all Loading... |
403 net::NetLog::PHASE_NONE); | 428 net::NetLog::PHASE_NONE); |
404 | 429 |
405 CapturingNetLog::Entry entry = entries[pos]; | 430 CapturingNetLog::Entry entry = entries[pos]; |
406 NetLogSpdyStreamErrorParameter* request_params = | 431 NetLogSpdyStreamErrorParameter* request_params = |
407 static_cast<NetLogSpdyStreamErrorParameter*>( | 432 static_cast<NetLogSpdyStreamErrorParameter*>( |
408 entry.extra_parameters.get()); | 433 entry.extra_parameters.get()); |
409 EXPECT_EQ(stream_id, request_params->stream_id()); | 434 EXPECT_EQ(stream_id, request_params->stream_id()); |
410 } | 435 } |
411 | 436 |
412 } // namespace net | 437 } // namespace net |
OLD | NEW |