| 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 | 10 |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/run_loop.h" |
| 12 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/threading/thread_task_runner_handle.h" | 14 #include "base/threading/thread_task_runner_handle.h" |
| 14 #include "net/base/chunked_upload_data_stream.h" | 15 #include "net/base/chunked_upload_data_stream.h" |
| 15 #include "net/base/elements_upload_data_stream.h" | 16 #include "net/base/elements_upload_data_stream.h" |
| 16 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" |
| 17 #include "net/base/test_completion_callback.h" | 18 #include "net/base/test_completion_callback.h" |
| 18 #include "net/base/test_data_directory.h" | 19 #include "net/base/test_data_directory.h" |
| 19 #include "net/base/upload_bytes_element_reader.h" | 20 #include "net/base/upload_bytes_element_reader.h" |
| 20 #include "net/http/http_response_headers.h" | 21 #include "net/http/http_response_headers.h" |
| 21 #include "net/http/transport_security_state.h" | 22 #include "net/http/transport_security_state.h" |
| (...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 ProcessPacket( | 623 ProcessPacket( |
| 623 ConstructServerDataPacket(3, false, !kFin, /*offset=*/0, kResponseBody)); | 624 ConstructServerDataPacket(3, false, !kFin, /*offset=*/0, kResponseBody)); |
| 624 SpdyHeaderBlock trailers; | 625 SpdyHeaderBlock trailers; |
| 625 size_t spdy_trailers_frame_length; | 626 size_t spdy_trailers_frame_length; |
| 626 trailers["foo"] = "bar"; | 627 trailers["foo"] = "bar"; |
| 627 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); | 628 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); |
| 628 ProcessPacket(ConstructResponseTrailersPacket( | 629 ProcessPacket(ConstructResponseTrailersPacket( |
| 629 4, kFin, trailers, &spdy_trailers_frame_length, &offset)); | 630 4, kFin, trailers, &spdy_trailers_frame_length, &offset)); |
| 630 | 631 |
| 631 // Make sure trailers are processed. | 632 // Make sure trailers are processed. |
| 632 base::MessageLoop::current()->RunUntilIdle(); | 633 base::RunLoop().RunUntilIdle(); |
| 633 | 634 |
| 634 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), | 635 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), |
| 635 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), | 636 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), |
| 636 callback_.callback())); | 637 callback_.callback())); |
| 637 EXPECT_TRUE(stream_->IsResponseBodyComplete()); | 638 EXPECT_TRUE(stream_->IsResponseBodyComplete()); |
| 638 | 639 |
| 639 EXPECT_EQ(OK, | 640 EXPECT_EQ(OK, |
| 640 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), | 641 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), |
| 641 callback_.callback())); | 642 callback_.callback())); |
| 642 | 643 |
| (...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1148 | 1149 |
| 1149 // Ack the request. | 1150 // Ack the request. |
| 1150 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); | 1151 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); |
| 1151 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback())); | 1152 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback())); |
| 1152 | 1153 |
| 1153 // Send the response with a body. | 1154 // Send the response with a body. |
| 1154 SetResponse("404 OK", "hello world!"); | 1155 SetResponse("404 OK", "hello world!"); |
| 1155 // In the course of processing this packet, the QuicHttpStream close itself. | 1156 // In the course of processing this packet, the QuicHttpStream close itself. |
| 1156 ProcessPacket(ConstructResponseHeadersPacket(2, kFin, nullptr)); | 1157 ProcessPacket(ConstructResponseHeadersPacket(2, kFin, nullptr)); |
| 1157 | 1158 |
| 1158 base::MessageLoop::current()->RunUntilIdle(); | 1159 base::RunLoop().RunUntilIdle(); |
| 1159 | 1160 |
| 1160 EXPECT_TRUE(AtEof()); | 1161 EXPECT_TRUE(AtEof()); |
| 1161 | 1162 |
| 1162 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the | 1163 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the |
| 1163 // headers and payload. | 1164 // headers and payload. |
| 1164 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), | 1165 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), |
| 1165 stream_->GetTotalSentBytes()); | 1166 stream_->GetTotalSentBytes()); |
| 1166 // Zero since the stream is closed before processing the headers. | 1167 // Zero since the stream is closed before processing the headers. |
| 1167 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); | 1168 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); |
| 1168 } | 1169 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1197 | 1198 |
| 1198 // Ack the request. | 1199 // Ack the request. |
| 1199 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); | 1200 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); |
| 1200 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback())); | 1201 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback())); |
| 1201 | 1202 |
| 1202 // Send the response with a body. | 1203 // Send the response with a body. |
| 1203 SetResponse("404 OK", "hello world!"); | 1204 SetResponse("404 OK", "hello world!"); |
| 1204 // In the course of processing this packet, the QuicHttpStream close itself. | 1205 // In the course of processing this packet, the QuicHttpStream close itself. |
| 1205 ProcessPacket(ConstructResponseHeadersPacket(2, kFin, nullptr)); | 1206 ProcessPacket(ConstructResponseHeadersPacket(2, kFin, nullptr)); |
| 1206 | 1207 |
| 1207 base::MessageLoop::current()->RunUntilIdle(); | 1208 base::RunLoop().RunUntilIdle(); |
| 1208 | 1209 |
| 1209 EXPECT_TRUE(AtEof()); | 1210 EXPECT_TRUE(AtEof()); |
| 1210 | 1211 |
| 1211 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the | 1212 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the |
| 1212 // headers and payload. | 1213 // headers and payload. |
| 1213 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), | 1214 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), |
| 1214 stream_->GetTotalSentBytes()); | 1215 stream_->GetTotalSentBytes()); |
| 1215 // Zero since the stream is closed before processing the headers. | 1216 // Zero since the stream is closed before processing the headers. |
| 1216 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); | 1217 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); |
| 1217 } | 1218 } |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1393 response_headers_ = promised_response_; | 1394 response_headers_ = promised_response_; |
| 1394 size_t spdy_response_headers_frame_length; | 1395 size_t spdy_response_headers_frame_length; |
| 1395 ProcessPacket(InnerConstructResponseHeadersPacket( | 1396 ProcessPacket(InnerConstructResponseHeadersPacket( |
| 1396 1, promise_id_, false, &spdy_response_headers_frame_length)); | 1397 1, promise_id_, false, &spdy_response_headers_frame_length)); |
| 1397 | 1398 |
| 1398 // Receive the promised response body. | 1399 // Receive the promised response body. |
| 1399 const char kResponseBody[] = "Hello world!"; | 1400 const char kResponseBody[] = "Hello world!"; |
| 1400 ProcessPacket(InnerConstructDataPacket(2, promise_id_, false, kFin, 0, | 1401 ProcessPacket(InnerConstructDataPacket(2, promise_id_, false, kFin, 0, |
| 1401 kResponseBody, &server_maker_)); | 1402 kResponseBody, &server_maker_)); |
| 1402 | 1403 |
| 1403 base::MessageLoop::current()->RunUntilIdle(); | 1404 base::RunLoop().RunUntilIdle(); |
| 1404 | 1405 |
| 1405 // Rendezvous should have succeeded now, so the promised stream | 1406 // Rendezvous should have succeeded now, so the promised stream |
| 1406 // should point at our push stream, and we should be able read | 1407 // should point at our push stream, and we should be able read |
| 1407 // headers and data from it. | 1408 // headers and data from it. |
| 1408 EXPECT_EQ(OK, callback_.WaitForResult()); | 1409 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 1409 | 1410 |
| 1410 EXPECT_EQ( | 1411 EXPECT_EQ( |
| 1411 QuicHttpStreamPeer::GetQuicChromiumClientStream(promised_stream_.get()) | 1412 QuicHttpStreamPeer::GetQuicChromiumClientStream(promised_stream_.get()) |
| 1412 ->id(), | 1413 ->id(), |
| 1413 promise_id_); | 1414 promise_id_); |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1568 response_headers_ = promised_response_; | 1569 response_headers_ = promised_response_; |
| 1569 size_t spdy_response_headers_frame_length; | 1570 size_t spdy_response_headers_frame_length; |
| 1570 ProcessPacket(InnerConstructResponseHeadersPacket( | 1571 ProcessPacket(InnerConstructResponseHeadersPacket( |
| 1571 1, promise_id_, false, &spdy_response_headers_frame_length)); | 1572 1, promise_id_, false, &spdy_response_headers_frame_length)); |
| 1572 | 1573 |
| 1573 // Receive the promised response body. | 1574 // Receive the promised response body. |
| 1574 const char kResponseBody[] = "Hello world!"; | 1575 const char kResponseBody[] = "Hello world!"; |
| 1575 ProcessPacket(InnerConstructDataPacket(2, promise_id_, false, kFin, 0, | 1576 ProcessPacket(InnerConstructDataPacket(2, promise_id_, false, kFin, 0, |
| 1576 kResponseBody, &server_maker_)); | 1577 kResponseBody, &server_maker_)); |
| 1577 | 1578 |
| 1578 base::MessageLoop::current()->RunUntilIdle(); | 1579 base::RunLoop().RunUntilIdle(); |
| 1579 | 1580 |
| 1580 // Rendezvous should have succeeded now, so the promised stream | 1581 // Rendezvous should have succeeded now, so the promised stream |
| 1581 // should point at our push stream, and we should be able read | 1582 // should point at our push stream, and we should be able read |
| 1582 // headers and data from it. | 1583 // headers and data from it. |
| 1583 EXPECT_EQ(OK, callback_.WaitForResult()); | 1584 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 1584 | 1585 |
| 1585 EXPECT_EQ( | 1586 EXPECT_EQ( |
| 1586 QuicHttpStreamPeer::GetQuicChromiumClientStream(promised_stream_.get()) | 1587 QuicHttpStreamPeer::GetQuicChromiumClientStream(promised_stream_.get()) |
| 1587 ->id(), | 1588 ->id(), |
| 1588 promise_id_); | 1589 promise_id_); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1653 EXPECT_EQ(ERR_IO_PENDING, promised_stream_->SendRequest( | 1654 EXPECT_EQ(ERR_IO_PENDING, promised_stream_->SendRequest( |
| 1654 headers_, &response_, callback_.callback())); | 1655 headers_, &response_, callback_.callback())); |
| 1655 | 1656 |
| 1656 // Receive the promised response headers. | 1657 // Receive the promised response headers. |
| 1657 promised_response_["vary"] = "accept-encoding"; | 1658 promised_response_["vary"] = "accept-encoding"; |
| 1658 response_headers_ = promised_response_; | 1659 response_headers_ = promised_response_; |
| 1659 size_t spdy_response_headers_frame_length; | 1660 size_t spdy_response_headers_frame_length; |
| 1660 ProcessPacket(InnerConstructResponseHeadersPacket( | 1661 ProcessPacket(InnerConstructResponseHeadersPacket( |
| 1661 1, promise_id_, false, &spdy_response_headers_frame_length)); | 1662 1, promise_id_, false, &spdy_response_headers_frame_length)); |
| 1662 | 1663 |
| 1663 base::MessageLoop::current()->RunUntilIdle(); | 1664 base::RunLoop().RunUntilIdle(); |
| 1664 | 1665 |
| 1665 // Rendezvous should have failed due to vary mismatch, so the | 1666 // Rendezvous should have failed due to vary mismatch, so the |
| 1666 // promised stream should have been aborted, and instead we have a | 1667 // promised stream should have been aborted, and instead we have a |
| 1667 // new, regular client initiated stream. | 1668 // new, regular client initiated stream. |
| 1668 EXPECT_EQ(OK, callback_.WaitForResult()); | 1669 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 1669 | 1670 |
| 1670 // Not a server-initiated stream. | 1671 // Not a server-initiated stream. |
| 1671 EXPECT_NE( | 1672 EXPECT_NE( |
| 1672 QuicHttpStreamPeer::GetQuicChromiumClientStream(promised_stream_.get()) | 1673 QuicHttpStreamPeer::GetQuicChromiumClientStream(promised_stream_.get()) |
| 1673 ->id(), | 1674 ->id(), |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1686 // client-initiated version of |promised_stream_| works as intended. | 1687 // client-initiated version of |promised_stream_| works as intended. |
| 1687 | 1688 |
| 1688 // Ack the request. | 1689 // Ack the request. |
| 1689 ProcessPacket(ConstructServerAckPacket(2, 0, 0)); | 1690 ProcessPacket(ConstructServerAckPacket(2, 0, 0)); |
| 1690 | 1691 |
| 1691 SetResponse("404 Not Found", string()); | 1692 SetResponse("404 Not Found", string()); |
| 1692 size_t spdy_response_header_frame_length; | 1693 size_t spdy_response_header_frame_length; |
| 1693 ProcessPacket(InnerConstructResponseHeadersPacket( | 1694 ProcessPacket(InnerConstructResponseHeadersPacket( |
| 1694 3, stream_id_ + 2, kFin, &spdy_response_header_frame_length)); | 1695 3, stream_id_ + 2, kFin, &spdy_response_header_frame_length)); |
| 1695 | 1696 |
| 1696 base::MessageLoop::current()->RunUntilIdle(); | 1697 base::RunLoop().RunUntilIdle(); |
| 1697 | 1698 |
| 1698 EXPECT_EQ(OK, promised_stream_->ReadResponseHeaders(callback_.callback())); | 1699 EXPECT_EQ(OK, promised_stream_->ReadResponseHeaders(callback_.callback())); |
| 1699 ASSERT_TRUE(response_.headers.get()); | 1700 ASSERT_TRUE(response_.headers.get()); |
| 1700 EXPECT_EQ(404, response_.headers->response_code()); | 1701 EXPECT_EQ(404, response_.headers->response_code()); |
| 1701 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain")); | 1702 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain")); |
| 1702 EXPECT_FALSE(response_.response_time.is_null()); | 1703 EXPECT_FALSE(response_.response_time.is_null()); |
| 1703 EXPECT_FALSE(response_.request_time.is_null()); | 1704 EXPECT_FALSE(response_.request_time.is_null()); |
| 1704 | 1705 |
| 1705 // There is no body, so this should return immediately. | 1706 // There is no body, so this should return immediately. |
| 1706 EXPECT_EQ( | 1707 EXPECT_EQ( |
| 1707 0, promised_stream_->ReadResponseBody( | 1708 0, promised_stream_->ReadResponseBody( |
| 1708 read_buffer_.get(), read_buffer_->size(), callback_.callback())); | 1709 read_buffer_.get(), read_buffer_->size(), callback_.callback())); |
| 1709 EXPECT_TRUE(promised_stream_->IsResponseBodyComplete()); | 1710 EXPECT_TRUE(promised_stream_->IsResponseBodyComplete()); |
| 1710 | 1711 |
| 1711 stream_->Close(true); | 1712 stream_->Close(true); |
| 1712 | 1713 |
| 1713 EXPECT_TRUE(AtEof()); | 1714 EXPECT_TRUE(AtEof()); |
| 1714 | 1715 |
| 1715 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the | 1716 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the |
| 1716 // headers and payload. | 1717 // headers and payload. |
| 1717 EXPECT_EQ(static_cast<int64_t>(spdy_request_header_frame_length), | 1718 EXPECT_EQ(static_cast<int64_t>(spdy_request_header_frame_length), |
| 1718 promised_stream_->GetTotalSentBytes()); | 1719 promised_stream_->GetTotalSentBytes()); |
| 1719 EXPECT_EQ(static_cast<int64_t>(spdy_response_header_frame_length), | 1720 EXPECT_EQ(static_cast<int64_t>(spdy_response_header_frame_length), |
| 1720 promised_stream_->GetTotalReceivedBytes()); | 1721 promised_stream_->GetTotalReceivedBytes()); |
| 1721 } | 1722 } |
| 1722 | 1723 |
| 1723 } // namespace test | 1724 } // namespace test |
| 1724 } // namespace net | 1725 } // namespace net |
| OLD | NEW |