| 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_stream_parser.h" | 5 #include "net/http/http_stream_parser.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 new MockTCPClientSocket(net::AddressList(), nullptr, data)); | 56 new MockTCPClientSocket(net::AddressList(), nullptr, data)); |
| 57 | 57 |
| 58 TestCompletionCallback callback; | 58 TestCompletionCallback callback; |
| 59 EXPECT_EQ(OK, socket->Connect(callback.callback())); | 59 EXPECT_EQ(OK, socket->Connect(callback.callback())); |
| 60 | 60 |
| 61 std::unique_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle); | 61 std::unique_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle); |
| 62 socket_handle->SetSocket(std::move(socket)); | 62 socket_handle->SetSocket(std::move(socket)); |
| 63 return socket_handle; | 63 return socket_handle; |
| 64 } | 64 } |
| 65 | 65 |
| 66 class ReadErrorUploadDataStream : public UploadDataStream { |
| 67 public: |
| 68 enum class FailureMode { SYNC, ASYNC }; |
| 69 |
| 70 explicit ReadErrorUploadDataStream(FailureMode mode) |
| 71 : UploadDataStream(true, 0), async_(mode), weak_factory_(this) {} |
| 72 |
| 73 private: |
| 74 void CompleteRead() { UploadDataStream::OnReadCompleted(ERR_FAILED); } |
| 75 |
| 76 // UploadDataStream implementation: |
| 77 int InitInternal() override { return OK; } |
| 78 |
| 79 int ReadInternal(IOBuffer* buf, int buf_len) override { |
| 80 if (async_ == FailureMode::ASYNC) { |
| 81 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 82 FROM_HERE, base::Bind(&ReadErrorUploadDataStream::CompleteRead, |
| 83 weak_factory_.GetWeakPtr())); |
| 84 return ERR_IO_PENDING; |
| 85 } |
| 86 return ERR_FAILED; |
| 87 } |
| 88 |
| 89 void ResetInternal() override {} |
| 90 |
| 91 const FailureMode async_; |
| 92 |
| 93 base::WeakPtrFactory<ReadErrorUploadDataStream> weak_factory_; |
| 94 |
| 95 DISALLOW_COPY_AND_ASSIGN(ReadErrorUploadDataStream); |
| 96 }; |
| 97 |
| 98 TEST(HttpStreamParser, DataReadErrorSynchronous) { |
| 99 MockWrite writes[] = { |
| 100 MockWrite(SYNCHRONOUS, 0, "POST / HTTP/1.1\r\n"), |
| 101 MockWrite(SYNCHRONOUS, 1, "Content-Length: 12\r\n\r\n"), |
| 102 }; |
| 103 |
| 104 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| 105 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 106 CreateConnectedSocketHandle(&data); |
| 107 |
| 108 ReadErrorUploadDataStream upload_data_stream( |
| 109 ReadErrorUploadDataStream::FailureMode::SYNC); |
| 110 ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback())); |
| 111 |
| 112 HttpRequestInfo request; |
| 113 request.method = "POST"; |
| 114 request.url = GURL("http://localhost"); |
| 115 request.upload_data_stream = &upload_data_stream; |
| 116 |
| 117 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 118 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| 119 BoundNetLog()); |
| 120 |
| 121 HttpRequestHeaders headers; |
| 122 headers.SetHeader("Content-Length", "12"); |
| 123 |
| 124 HttpResponseInfo response; |
| 125 TestCompletionCallback callback; |
| 126 int result = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, |
| 127 callback.callback()); |
| 128 EXPECT_EQ(ERR_FAILED, callback.GetResult(result)); |
| 129 |
| 130 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
| 131 } |
| 132 |
| 133 TEST(HttpStreamParser, DataReadErrorAsynchronous) { |
| 134 MockWrite writes[] = { |
| 135 MockWrite(ASYNC, 0, "POST / HTTP/1.1\r\n"), |
| 136 MockWrite(ASYNC, 1, "Content-Length: 12\r\n\r\n"), |
| 137 }; |
| 138 |
| 139 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| 140 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 141 CreateConnectedSocketHandle(&data); |
| 142 |
| 143 ReadErrorUploadDataStream upload_data_stream( |
| 144 ReadErrorUploadDataStream::FailureMode::ASYNC); |
| 145 ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback())); |
| 146 |
| 147 HttpRequestInfo request; |
| 148 request.method = "POST"; |
| 149 request.url = GURL("http://localhost"); |
| 150 request.upload_data_stream = &upload_data_stream; |
| 151 |
| 152 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 153 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| 154 BoundNetLog()); |
| 155 |
| 156 HttpRequestHeaders headers; |
| 157 headers.SetHeader("Content-Length", "12"); |
| 158 |
| 159 HttpResponseInfo response; |
| 160 TestCompletionCallback callback; |
| 161 int result = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, |
| 162 callback.callback()); |
| 163 EXPECT_EQ(ERR_IO_PENDING, result); |
| 164 |
| 165 EXPECT_EQ(ERR_FAILED, callback.GetResult(result)); |
| 166 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
| 167 } |
| 168 |
| 66 // The empty payload is how the last chunk is encoded. | 169 // The empty payload is how the last chunk is encoded. |
| 67 TEST(HttpStreamParser, EncodeChunk_EmptyPayload) { | 170 TEST(HttpStreamParser, EncodeChunk_EmptyPayload) { |
| 68 char output[kOutputSize]; | 171 char output[kOutputSize]; |
| 69 | 172 |
| 70 const base::StringPiece kPayload = ""; | 173 const base::StringPiece kPayload = ""; |
| 71 const base::StringPiece kExpected = "0\r\n\r\n"; | 174 const base::StringPiece kExpected = "0\r\n\r\n"; |
| 72 const int num_bytes_written = | 175 const int num_bytes_written = |
| 73 HttpStreamParser::EncodeChunk(kPayload, output, sizeof(output)); | 176 HttpStreamParser::EncodeChunk(kPayload, output, sizeof(output)); |
| 74 ASSERT_EQ(kExpected.size(), static_cast<size_t>(num_bytes_written)); | 177 ASSERT_EQ(kExpected.size(), static_cast<size_t>(num_bytes_written)); |
| 75 EXPECT_EQ(kExpected, base::StringPiece(output, num_bytes_written)); | 178 EXPECT_EQ(kExpected, base::StringPiece(output, num_bytes_written)); |
| (...skipping 1208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1284 ASSERT_EQ(kBodySize, parser.ReadResponseBody( | 1387 ASSERT_EQ(kBodySize, parser.ReadResponseBody( |
| 1285 body_buffer.get(), kBodySize, callback.callback())); | 1388 body_buffer.get(), kBodySize, callback.callback())); |
| 1286 | 1389 |
| 1287 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); | 1390 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
| 1288 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), parser.received_bytes()); | 1391 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), parser.received_bytes()); |
| 1289 } | 1392 } |
| 1290 | 1393 |
| 1291 } // namespace | 1394 } // namespace |
| 1292 | 1395 |
| 1293 } // namespace net | 1396 } // namespace net |
| OLD | NEW |