| 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/quic/quic_http_stream.h" | 5 #include "net/quic/quic_http_stream.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> |
| 10 | 11 |
| 11 #include "base/memory/ptr_util.h" | 12 #include "base/memory/ptr_util.h" |
| 12 #include "base/run_loop.h" | 13 #include "base/run_loop.h" |
| 13 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
| 14 #include "base/threading/thread_task_runner_handle.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
| 15 #include "net/base/chunked_upload_data_stream.h" | 16 #include "net/base/chunked_upload_data_stream.h" |
| 16 #include "net/base/elements_upload_data_stream.h" | 17 #include "net/base/elements_upload_data_stream.h" |
| 17 #include "net/base/net_errors.h" | 18 #include "net/base/net_errors.h" |
| 18 #include "net/base/test_completion_callback.h" | 19 #include "net/base/test_completion_callback.h" |
| 19 #include "net/base/upload_bytes_element_reader.h" | 20 #include "net/base/upload_bytes_element_reader.h" |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 QuicPacketNumber packet_number, | 372 QuicPacketNumber packet_number, |
| 372 QuicStreamId stream_id, | 373 QuicStreamId stream_id, |
| 373 bool should_include_version, | 374 bool should_include_version, |
| 374 bool fin, | 375 bool fin, |
| 375 RequestPriority request_priority, | 376 RequestPriority request_priority, |
| 376 size_t* spdy_headers_frame_length) { | 377 size_t* spdy_headers_frame_length) { |
| 377 SpdyPriority priority = | 378 SpdyPriority priority = |
| 378 ConvertRequestPriorityToQuicPriority(request_priority); | 379 ConvertRequestPriorityToQuicPriority(request_priority); |
| 379 return client_maker_.MakeRequestHeadersPacket( | 380 return client_maker_.MakeRequestHeadersPacket( |
| 380 packet_number, stream_id, should_include_version, fin, priority, | 381 packet_number, stream_id, should_include_version, fin, priority, |
| 381 request_headers_, spdy_headers_frame_length); | 382 std::move(request_headers_), spdy_headers_frame_length); |
| 382 } | 383 } |
| 383 | 384 |
| 384 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( | 385 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( |
| 385 QuicPacketNumber packet_number, | 386 QuicPacketNumber packet_number, |
| 386 bool fin, | 387 bool fin, |
| 387 RequestPriority request_priority, | 388 RequestPriority request_priority, |
| 388 size_t* spdy_headers_frame_length) { | 389 size_t* spdy_headers_frame_length) { |
| 389 return InnerConstructRequestHeadersPacket( | 390 return InnerConstructRequestHeadersPacket( |
| 390 packet_number, stream_id_, kIncludeVersion, fin, request_priority, | 391 packet_number, stream_id_, kIncludeVersion, fin, request_priority, |
| 391 spdy_headers_frame_length); | 392 spdy_headers_frame_length); |
| 392 } | 393 } |
| 393 | 394 |
| 394 std::unique_ptr<QuicReceivedPacket> InnerConstructResponseHeadersPacket( | 395 std::unique_ptr<QuicReceivedPacket> InnerConstructResponseHeadersPacket( |
| 395 QuicPacketNumber packet_number, | 396 QuicPacketNumber packet_number, |
| 396 QuicStreamId stream_id, | 397 QuicStreamId stream_id, |
| 397 bool fin, | 398 bool fin, |
| 398 size_t* spdy_headers_frame_length) { | 399 size_t* spdy_headers_frame_length) { |
| 399 return server_maker_.MakeResponseHeadersPacket( | 400 return server_maker_.MakeResponseHeadersPacket( |
| 400 packet_number, stream_id, !kIncludeVersion, fin, response_headers_, | 401 packet_number, stream_id, !kIncludeVersion, fin, |
| 401 spdy_headers_frame_length, &response_offset_); | 402 std::move(response_headers_), spdy_headers_frame_length, |
| 403 &response_offset_); |
| 402 } | 404 } |
| 403 | 405 |
| 404 std::unique_ptr<QuicReceivedPacket> ConstructResponseHeadersPacket( | 406 std::unique_ptr<QuicReceivedPacket> ConstructResponseHeadersPacket( |
| 405 QuicPacketNumber packet_number, | 407 QuicPacketNumber packet_number, |
| 406 bool fin, | 408 bool fin, |
| 407 size_t* spdy_headers_frame_length) { | 409 size_t* spdy_headers_frame_length) { |
| 408 return InnerConstructResponseHeadersPacket(packet_number, stream_id_, fin, | 410 return InnerConstructResponseHeadersPacket(packet_number, stream_id_, fin, |
| 409 spdy_headers_frame_length); | 411 spdy_headers_frame_length); |
| 410 } | 412 } |
| 411 | 413 |
| 412 std::unique_ptr<QuicReceivedPacket> ConstructResponseHeadersPacketWithOffset( | 414 std::unique_ptr<QuicReceivedPacket> ConstructResponseHeadersPacketWithOffset( |
| 413 QuicPacketNumber packet_number, | 415 QuicPacketNumber packet_number, |
| 414 bool fin, | 416 bool fin, |
| 415 size_t* spdy_headers_frame_length, | 417 size_t* spdy_headers_frame_length, |
| 416 QuicStreamOffset* offset) { | 418 QuicStreamOffset* offset) { |
| 417 return server_maker_.MakeResponseHeadersPacket( | 419 return server_maker_.MakeResponseHeadersPacket( |
| 418 packet_number, stream_id_, !kIncludeVersion, fin, response_headers_, | 420 packet_number, stream_id_, !kIncludeVersion, fin, |
| 419 spdy_headers_frame_length, offset); | 421 std::move(response_headers_), spdy_headers_frame_length, offset); |
| 420 } | 422 } |
| 421 | 423 |
| 422 std::unique_ptr<QuicReceivedPacket> ConstructResponseTrailersPacket( | 424 std::unique_ptr<QuicReceivedPacket> ConstructResponseTrailersPacket( |
| 423 QuicPacketNumber packet_number, | 425 QuicPacketNumber packet_number, |
| 424 bool fin, | 426 bool fin, |
| 425 const SpdyHeaderBlock& trailers, | 427 SpdyHeaderBlock trailers, |
| 426 size_t* spdy_headers_frame_length, | 428 size_t* spdy_headers_frame_length, |
| 427 QuicStreamOffset* offset) { | 429 QuicStreamOffset* offset) { |
| 428 return server_maker_.MakeResponseHeadersPacket( | 430 return server_maker_.MakeResponseHeadersPacket( |
| 429 packet_number, stream_id_, !kIncludeVersion, fin, trailers, | 431 packet_number, stream_id_, !kIncludeVersion, fin, std::move(trailers), |
| 430 spdy_headers_frame_length, offset); | 432 spdy_headers_frame_length, offset); |
| 431 } | 433 } |
| 432 | 434 |
| 433 std::unique_ptr<QuicReceivedPacket> ConstructClientRstStreamPacket( | 435 std::unique_ptr<QuicReceivedPacket> ConstructClientRstStreamPacket( |
| 434 QuicPacketNumber packet_number) { | 436 QuicPacketNumber packet_number) { |
| 435 return client_maker_.MakeRstPacket( | 437 return client_maker_.MakeRstPacket( |
| 436 packet_number, true, stream_id_, | 438 packet_number, true, stream_id_, |
| 437 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam())); | 439 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam())); |
| 438 } | 440 } |
| 439 | 441 |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 662 | 664 |
| 663 // Send the response body. | 665 // Send the response body. |
| 664 const char kResponseBody[] = "Hello world!"; | 666 const char kResponseBody[] = "Hello world!"; |
| 665 ProcessPacket( | 667 ProcessPacket( |
| 666 ConstructServerDataPacket(3, false, !kFin, /*offset=*/0, kResponseBody)); | 668 ConstructServerDataPacket(3, false, !kFin, /*offset=*/0, kResponseBody)); |
| 667 SpdyHeaderBlock trailers; | 669 SpdyHeaderBlock trailers; |
| 668 size_t spdy_trailers_frame_length; | 670 size_t spdy_trailers_frame_length; |
| 669 trailers["foo"] = "bar"; | 671 trailers["foo"] = "bar"; |
| 670 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); | 672 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); |
| 671 ProcessPacket(ConstructResponseTrailersPacket( | 673 ProcessPacket(ConstructResponseTrailersPacket( |
| 672 4, kFin, trailers, &spdy_trailers_frame_length, &offset)); | 674 4, kFin, std::move(trailers), &spdy_trailers_frame_length, &offset)); |
| 673 | 675 |
| 674 // Make sure trailers are processed. | 676 // Make sure trailers are processed. |
| 675 base::RunLoop().RunUntilIdle(); | 677 base::RunLoop().RunUntilIdle(); |
| 676 | 678 |
| 677 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), | 679 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), |
| 678 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), | 680 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), |
| 679 callback_.callback())); | 681 callback_.callback())); |
| 680 EXPECT_TRUE(stream_->IsResponseBodyComplete()); | 682 EXPECT_TRUE(stream_->IsResponseBodyComplete()); |
| 681 | 683 |
| 682 EXPECT_EQ(OK, | 684 EXPECT_EQ(OK, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 726 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, | 728 stream_->InitializeStream(&request_, DEFAULT_PRIORITY, |
| 727 net_log_.bound(), callback_.callback())); | 729 net_log_.bound(), callback_.callback())); |
| 728 EXPECT_EQ(OK, | 730 EXPECT_EQ(OK, |
| 729 stream_->SendRequest(headers_, &response_, callback_.callback())); | 731 stream_->SendRequest(headers_, &response_, callback_.callback())); |
| 730 | 732 |
| 731 // Ack the request. | 733 // Ack the request. |
| 732 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); | 734 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); |
| 733 | 735 |
| 734 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback())); | 736 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback())); |
| 735 | 737 |
| 736 SpdyHeaderBlock headers; | 738 response_headers_[":status"] = "200 OK"; |
| 737 headers[":status"] = "200 OK"; | 739 response_headers_[":version"] = "HTTP/1.1"; |
| 738 headers[":version"] = "HTTP/1.1"; | 740 response_headers_["content-type"] = "text/plain"; |
| 739 headers["content-type"] = "text/plain"; | 741 response_headers_["big6"] = string(1000, 'x'); // Lots of x's. |
| 740 headers["big6"] = string(1000, 'x'); // Lots of x's. | |
| 741 | 742 |
| 742 response_headers_ = headers; | |
| 743 size_t spdy_response_headers_frame_length; | 743 size_t spdy_response_headers_frame_length; |
| 744 ProcessPacket(ConstructResponseHeadersPacket( | 744 ProcessPacket(ConstructResponseHeadersPacket( |
| 745 2, kFin, &spdy_response_headers_frame_length)); | 745 2, kFin, &spdy_response_headers_frame_length)); |
| 746 | 746 |
| 747 // Now that the headers have been processed, the callback will return. | 747 // Now that the headers have been processed, the callback will return. |
| 748 EXPECT_EQ(OK, callback_.WaitForResult()); | 748 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 749 ASSERT_TRUE(response_.headers.get()); | 749 ASSERT_TRUE(response_.headers.get()); |
| 750 EXPECT_EQ(200, response_.headers->response_code()); | 750 EXPECT_EQ(200, response_.headers->response_code()); |
| 751 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain")); | 751 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain")); |
| 752 | 752 |
| (...skipping 1079 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1832 EXPECT_TRUE(AtEof()); | 1832 EXPECT_TRUE(AtEof()); |
| 1833 | 1833 |
| 1834 // QuicHttpStream::GetTotalSent/ReceivedBytes includes only headers. | 1834 // QuicHttpStream::GetTotalSent/ReceivedBytes includes only headers. |
| 1835 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), | 1835 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), |
| 1836 stream_->GetTotalSentBytes()); | 1836 stream_->GetTotalSentBytes()); |
| 1837 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); | 1837 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); |
| 1838 } | 1838 } |
| 1839 | 1839 |
| 1840 } // namespace test | 1840 } // namespace test |
| 1841 } // namespace net | 1841 } // namespace net |
| OLD | NEW |