| 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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 public: | 72 public: |
| 73 enum class FailureMode { SYNC, ASYNC }; | 73 enum class FailureMode { SYNC, ASYNC }; |
| 74 | 74 |
| 75 explicit ReadErrorUploadDataStream(FailureMode mode) | 75 explicit ReadErrorUploadDataStream(FailureMode mode) |
| 76 : UploadDataStream(true, 0), async_(mode), weak_factory_(this) {} | 76 : UploadDataStream(true, 0), async_(mode), weak_factory_(this) {} |
| 77 | 77 |
| 78 private: | 78 private: |
| 79 void CompleteRead() { UploadDataStream::OnReadCompleted(ERR_FAILED); } | 79 void CompleteRead() { UploadDataStream::OnReadCompleted(ERR_FAILED); } |
| 80 | 80 |
| 81 // UploadDataStream implementation: | 81 // UploadDataStream implementation: |
| 82 int InitInternal(const BoundNetLog& net_log) override { return OK; } | 82 int InitInternal(const NetLogWithSource& net_log) override { return OK; } |
| 83 | 83 |
| 84 int ReadInternal(IOBuffer* buf, int buf_len) override { | 84 int ReadInternal(IOBuffer* buf, int buf_len) override { |
| 85 if (async_ == FailureMode::ASYNC) { | 85 if (async_ == FailureMode::ASYNC) { |
| 86 base::ThreadTaskRunnerHandle::Get()->PostTask( | 86 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 87 FROM_HERE, base::Bind(&ReadErrorUploadDataStream::CompleteRead, | 87 FROM_HERE, base::Bind(&ReadErrorUploadDataStream::CompleteRead, |
| 88 weak_factory_.GetWeakPtr())); | 88 weak_factory_.GetWeakPtr())); |
| 89 return ERR_IO_PENDING; | 89 return ERR_IO_PENDING; |
| 90 } | 90 } |
| 91 return ERR_FAILED; | 91 return ERR_FAILED; |
| 92 } | 92 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 112 | 112 |
| 113 ReadErrorUploadDataStream upload_data_stream( | 113 ReadErrorUploadDataStream upload_data_stream( |
| 114 ReadErrorUploadDataStream::FailureMode::SYNC); | 114 ReadErrorUploadDataStream::FailureMode::SYNC); |
| 115 | 115 |
| 116 // Test upload progress before init. | 116 // Test upload progress before init. |
| 117 UploadProgress progress = upload_data_stream.GetUploadProgress(); | 117 UploadProgress progress = upload_data_stream.GetUploadProgress(); |
| 118 EXPECT_EQ(0u, progress.size()); | 118 EXPECT_EQ(0u, progress.size()); |
| 119 EXPECT_EQ(0u, progress.position()); | 119 EXPECT_EQ(0u, progress.position()); |
| 120 | 120 |
| 121 ASSERT_THAT(upload_data_stream.Init(TestCompletionCallback().callback(), | 121 ASSERT_THAT(upload_data_stream.Init(TestCompletionCallback().callback(), |
| 122 BoundNetLog()), | 122 NetLogWithSource()), |
| 123 IsOk()); | 123 IsOk()); |
| 124 | 124 |
| 125 // Test upload progress after init. | 125 // Test upload progress after init. |
| 126 progress = upload_data_stream.GetUploadProgress(); | 126 progress = upload_data_stream.GetUploadProgress(); |
| 127 EXPECT_EQ(0u, progress.size()); | 127 EXPECT_EQ(0u, progress.size()); |
| 128 EXPECT_EQ(0u, progress.position()); | 128 EXPECT_EQ(0u, progress.position()); |
| 129 | 129 |
| 130 HttpRequestInfo request; | 130 HttpRequestInfo request; |
| 131 request.method = "POST"; | 131 request.method = "POST"; |
| 132 request.url = GURL("http://localhost"); | 132 request.url = GURL("http://localhost"); |
| 133 request.upload_data_stream = &upload_data_stream; | 133 request.upload_data_stream = &upload_data_stream; |
| 134 | 134 |
| 135 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 135 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 136 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), | 136 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| 137 BoundNetLog()); | 137 NetLogWithSource()); |
| 138 | 138 |
| 139 HttpRequestHeaders headers; | 139 HttpRequestHeaders headers; |
| 140 headers.SetHeader("Content-Length", "12"); | 140 headers.SetHeader("Content-Length", "12"); |
| 141 | 141 |
| 142 HttpResponseInfo response; | 142 HttpResponseInfo response; |
| 143 TestCompletionCallback callback; | 143 TestCompletionCallback callback; |
| 144 int result = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, | 144 int result = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, |
| 145 callback.callback()); | 145 callback.callback()); |
| 146 EXPECT_THAT(callback.GetResult(result), IsError(ERR_FAILED)); | 146 EXPECT_THAT(callback.GetResult(result), IsError(ERR_FAILED)); |
| 147 | 147 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 158 MockWrite(ASYNC, 1, "Content-Length: 12\r\n\r\n"), | 158 MockWrite(ASYNC, 1, "Content-Length: 12\r\n\r\n"), |
| 159 }; | 159 }; |
| 160 | 160 |
| 161 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); | 161 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| 162 std::unique_ptr<ClientSocketHandle> socket_handle = | 162 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 163 CreateConnectedSocketHandle(&data); | 163 CreateConnectedSocketHandle(&data); |
| 164 | 164 |
| 165 ReadErrorUploadDataStream upload_data_stream( | 165 ReadErrorUploadDataStream upload_data_stream( |
| 166 ReadErrorUploadDataStream::FailureMode::ASYNC); | 166 ReadErrorUploadDataStream::FailureMode::ASYNC); |
| 167 ASSERT_THAT(upload_data_stream.Init(TestCompletionCallback().callback(), | 167 ASSERT_THAT(upload_data_stream.Init(TestCompletionCallback().callback(), |
| 168 BoundNetLog()), | 168 NetLogWithSource()), |
| 169 IsOk()); | 169 IsOk()); |
| 170 | 170 |
| 171 HttpRequestInfo request; | 171 HttpRequestInfo request; |
| 172 request.method = "POST"; | 172 request.method = "POST"; |
| 173 request.url = GURL("http://localhost"); | 173 request.url = GURL("http://localhost"); |
| 174 request.upload_data_stream = &upload_data_stream; | 174 request.upload_data_stream = &upload_data_stream; |
| 175 | 175 |
| 176 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 176 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 177 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), | 177 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| 178 BoundNetLog()); | 178 NetLogWithSource()); |
| 179 | 179 |
| 180 HttpRequestHeaders headers; | 180 HttpRequestHeaders headers; |
| 181 headers.SetHeader("Content-Length", "12"); | 181 headers.SetHeader("Content-Length", "12"); |
| 182 | 182 |
| 183 HttpResponseInfo response; | 183 HttpResponseInfo response; |
| 184 TestCompletionCallback callback; | 184 TestCompletionCallback callback; |
| 185 int result = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, | 185 int result = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, |
| 186 callback.callback()); | 186 callback.callback()); |
| 187 EXPECT_THAT(result, IsError(ERR_IO_PENDING)); | 187 EXPECT_THAT(result, IsError(ERR_IO_PENDING)); |
| 188 | 188 |
| 189 UploadProgress progress = upload_data_stream.GetUploadProgress(); | 189 UploadProgress progress = upload_data_stream.GetUploadProgress(); |
| 190 EXPECT_EQ(0u, progress.size()); | 190 EXPECT_EQ(0u, progress.size()); |
| 191 EXPECT_EQ(0u, progress.position()); | 191 EXPECT_EQ(0u, progress.position()); |
| 192 | 192 |
| 193 EXPECT_THAT(callback.GetResult(result), IsError(ERR_FAILED)); | 193 EXPECT_THAT(callback.GetResult(result), IsError(ERR_FAILED)); |
| 194 | 194 |
| 195 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); | 195 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
| 196 } | 196 } |
| 197 | 197 |
| 198 class InitAsyncUploadDataStream : public ChunkedUploadDataStream { | 198 class InitAsyncUploadDataStream : public ChunkedUploadDataStream { |
| 199 public: | 199 public: |
| 200 explicit InitAsyncUploadDataStream(int64_t identifier) | 200 explicit InitAsyncUploadDataStream(int64_t identifier) |
| 201 : ChunkedUploadDataStream(identifier), weak_factory_(this) {} | 201 : ChunkedUploadDataStream(identifier), weak_factory_(this) {} |
| 202 | 202 |
| 203 private: | 203 private: |
| 204 void CompleteInit() { UploadDataStream::OnInitCompleted(OK); } | 204 void CompleteInit() { UploadDataStream::OnInitCompleted(OK); } |
| 205 | 205 |
| 206 int InitInternal(const BoundNetLog& net_log) override { | 206 int InitInternal(const NetLogWithSource& net_log) override { |
| 207 base::ThreadTaskRunnerHandle::Get()->PostTask( | 207 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 208 FROM_HERE, base::Bind(&InitAsyncUploadDataStream::CompleteInit, | 208 FROM_HERE, base::Bind(&InitAsyncUploadDataStream::CompleteInit, |
| 209 weak_factory_.GetWeakPtr())); | 209 weak_factory_.GetWeakPtr())); |
| 210 return ERR_IO_PENDING; | 210 return ERR_IO_PENDING; |
| 211 } | 211 } |
| 212 | 212 |
| 213 base::WeakPtrFactory<InitAsyncUploadDataStream> weak_factory_; | 213 base::WeakPtrFactory<InitAsyncUploadDataStream> weak_factory_; |
| 214 | 214 |
| 215 DISALLOW_COPY_AND_ASSIGN(InitAsyncUploadDataStream); | 215 DISALLOW_COPY_AND_ASSIGN(InitAsyncUploadDataStream); |
| 216 }; | 216 }; |
| 217 | 217 |
| 218 TEST(HttpStreamParser, InitAsynchronousUploadDataStream) { | 218 TEST(HttpStreamParser, InitAsynchronousUploadDataStream) { |
| 219 InitAsyncUploadDataStream upload_data_stream(0); | 219 InitAsyncUploadDataStream upload_data_stream(0); |
| 220 | 220 |
| 221 TestCompletionCallback callback; | 221 TestCompletionCallback callback; |
| 222 int result = upload_data_stream.Init(callback.callback(), BoundNetLog()); | 222 int result = upload_data_stream.Init(callback.callback(), NetLogWithSource()); |
| 223 ASSERT_THAT(result, IsError(ERR_IO_PENDING)); | 223 ASSERT_THAT(result, IsError(ERR_IO_PENDING)); |
| 224 | 224 |
| 225 // Should be empty progress while initialization is in progress. | 225 // Should be empty progress while initialization is in progress. |
| 226 UploadProgress progress = upload_data_stream.GetUploadProgress(); | 226 UploadProgress progress = upload_data_stream.GetUploadProgress(); |
| 227 EXPECT_EQ(0u, progress.size()); | 227 EXPECT_EQ(0u, progress.size()); |
| 228 EXPECT_EQ(0u, progress.position()); | 228 EXPECT_EQ(0u, progress.position()); |
| 229 EXPECT_THAT(callback.GetResult(result), IsOk()); | 229 EXPECT_THAT(callback.GetResult(result), IsOk()); |
| 230 | 230 |
| 231 // Initialization complete. | 231 // Initialization complete. |
| 232 progress = upload_data_stream.GetUploadProgress(); | 232 progress = upload_data_stream.GetUploadProgress(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 244 MockWrite(ASYNC, 1, "Transfer-Encoding: chunked\r\n\r\n"), | 244 MockWrite(ASYNC, 1, "Transfer-Encoding: chunked\r\n\r\n"), |
| 245 MockWrite(ASYNC, 2, "7\r\nChunk 1\r\n"), | 245 MockWrite(ASYNC, 2, "7\r\nChunk 1\r\n"), |
| 246 }; | 246 }; |
| 247 | 247 |
| 248 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); | 248 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| 249 std::unique_ptr<ClientSocketHandle> socket_handle = | 249 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 250 CreateConnectedSocketHandle(&data); | 250 CreateConnectedSocketHandle(&data); |
| 251 | 251 |
| 252 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 252 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 253 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), | 253 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| 254 BoundNetLog()); | 254 NetLogWithSource()); |
| 255 | 255 |
| 256 HttpRequestHeaders headers; | 256 HttpRequestHeaders headers; |
| 257 headers.SetHeader("Transfer-Encoding", "chunked"); | 257 headers.SetHeader("Transfer-Encoding", "chunked"); |
| 258 | 258 |
| 259 HttpResponseInfo response; | 259 HttpResponseInfo response; |
| 260 TestCompletionCallback callback1; | 260 TestCompletionCallback callback1; |
| 261 int result1 = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, | 261 int result1 = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, |
| 262 callback1.callback()); | 262 callback1.callback()); |
| 263 EXPECT_EQ(ERR_IO_PENDING, result1); | 263 EXPECT_EQ(ERR_IO_PENDING, result1); |
| 264 base::RunLoop().RunUntilIdle(); | 264 base::RunLoop().RunUntilIdle(); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 // Shouldn't be merged if upload data is non-existent. | 338 // Shouldn't be merged if upload data is non-existent. |
| 339 ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( | 339 ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( |
| 340 "some header", NULL)); | 340 "some header", NULL)); |
| 341 } | 341 } |
| 342 | 342 |
| 343 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_EmptyBody) { | 343 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_EmptyBody) { |
| 344 std::vector<std::unique_ptr<UploadElementReader>> element_readers; | 344 std::vector<std::unique_ptr<UploadElementReader>> element_readers; |
| 345 std::unique_ptr<UploadDataStream> body( | 345 std::unique_ptr<UploadDataStream> body( |
| 346 base::MakeUnique<ElementsUploadDataStream>(std::move(element_readers), | 346 base::MakeUnique<ElementsUploadDataStream>(std::move(element_readers), |
| 347 0)); | 347 0)); |
| 348 ASSERT_THAT(body->Init(CompletionCallback(), BoundNetLog()), IsOk()); | 348 ASSERT_THAT(body->Init(CompletionCallback(), NetLogWithSource()), IsOk()); |
| 349 // Shouldn't be merged if upload data is empty. | 349 // Shouldn't be merged if upload data is empty. |
| 350 ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( | 350 ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( |
| 351 "some header", body.get())); | 351 "some header", body.get())); |
| 352 } | 352 } |
| 353 | 353 |
| 354 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_ChunkedBody) { | 354 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_ChunkedBody) { |
| 355 const std::string payload = "123"; | 355 const std::string payload = "123"; |
| 356 std::unique_ptr<ChunkedUploadDataStream> body(new ChunkedUploadDataStream(0)); | 356 std::unique_ptr<ChunkedUploadDataStream> body(new ChunkedUploadDataStream(0)); |
| 357 body->AppendData(payload.data(), payload.size(), true); | 357 body->AppendData(payload.data(), payload.size(), true); |
| 358 ASSERT_THAT(body->Init(TestCompletionCallback().callback(), BoundNetLog()), | 358 ASSERT_THAT( |
| 359 IsOk()); | 359 body->Init(TestCompletionCallback().callback(), NetLogWithSource()), |
| 360 IsOk()); |
| 360 // Shouldn't be merged if upload data carries chunked data. | 361 // Shouldn't be merged if upload data carries chunked data. |
| 361 ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( | 362 ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( |
| 362 "some header", body.get())); | 363 "some header", body.get())); |
| 363 } | 364 } |
| 364 | 365 |
| 365 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_FileBody) { | 366 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_FileBody) { |
| 366 // Create an empty temporary file. | 367 // Create an empty temporary file. |
| 367 base::ScopedTempDir temp_dir; | 368 base::ScopedTempDir temp_dir; |
| 368 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 369 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 369 base::FilePath temp_file_path; | 370 base::FilePath temp_file_path; |
| 370 ASSERT_TRUE( | 371 ASSERT_TRUE( |
| 371 base::CreateTemporaryFileInDir(temp_dir.GetPath(), &temp_file_path)); | 372 base::CreateTemporaryFileInDir(temp_dir.GetPath(), &temp_file_path)); |
| 372 | 373 |
| 373 { | 374 { |
| 374 std::vector<std::unique_ptr<UploadElementReader>> element_readers; | 375 std::vector<std::unique_ptr<UploadElementReader>> element_readers; |
| 375 | 376 |
| 376 element_readers.push_back(base::MakeUnique<UploadFileElementReader>( | 377 element_readers.push_back(base::MakeUnique<UploadFileElementReader>( |
| 377 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, 0, | 378 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, 0, |
| 378 base::Time())); | 379 base::Time())); |
| 379 | 380 |
| 380 std::unique_ptr<UploadDataStream> body( | 381 std::unique_ptr<UploadDataStream> body( |
| 381 new ElementsUploadDataStream(std::move(element_readers), 0)); | 382 new ElementsUploadDataStream(std::move(element_readers), 0)); |
| 382 TestCompletionCallback callback; | 383 TestCompletionCallback callback; |
| 383 ASSERT_THAT(body->Init(callback.callback(), BoundNetLog()), | 384 ASSERT_THAT(body->Init(callback.callback(), NetLogWithSource()), |
| 384 IsError(ERR_IO_PENDING)); | 385 IsError(ERR_IO_PENDING)); |
| 385 ASSERT_THAT(callback.WaitForResult(), IsOk()); | 386 ASSERT_THAT(callback.WaitForResult(), IsOk()); |
| 386 // Shouldn't be merged if upload data carries a file, as it's not in-memory. | 387 // Shouldn't be merged if upload data carries a file, as it's not in-memory. |
| 387 ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( | 388 ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( |
| 388 "some header", body.get())); | 389 "some header", body.get())); |
| 389 } | 390 } |
| 390 | 391 |
| 391 // UploadFileElementReaders may post clean-up tasks on destruction. | 392 // UploadFileElementReaders may post clean-up tasks on destruction. |
| 392 base::RunLoop().RunUntilIdle(); | 393 base::RunLoop().RunUntilIdle(); |
| 393 } | 394 } |
| 394 | 395 |
| 395 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_SmallBodyInMemory) { | 396 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_SmallBodyInMemory) { |
| 396 std::vector<std::unique_ptr<UploadElementReader>> element_readers; | 397 std::vector<std::unique_ptr<UploadElementReader>> element_readers; |
| 397 const std::string payload = "123"; | 398 const std::string payload = "123"; |
| 398 element_readers.push_back(base::MakeUnique<UploadBytesElementReader>( | 399 element_readers.push_back(base::MakeUnique<UploadBytesElementReader>( |
| 399 payload.data(), payload.size())); | 400 payload.data(), payload.size())); |
| 400 | 401 |
| 401 std::unique_ptr<UploadDataStream> body( | 402 std::unique_ptr<UploadDataStream> body( |
| 402 new ElementsUploadDataStream(std::move(element_readers), 0)); | 403 new ElementsUploadDataStream(std::move(element_readers), 0)); |
| 403 ASSERT_THAT(body->Init(CompletionCallback(), BoundNetLog()), IsOk()); | 404 ASSERT_THAT(body->Init(CompletionCallback(), NetLogWithSource()), IsOk()); |
| 404 // Yes, should be merged if the in-memory body is small here. | 405 // Yes, should be merged if the in-memory body is small here. |
| 405 ASSERT_TRUE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( | 406 ASSERT_TRUE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( |
| 406 "some header", body.get())); | 407 "some header", body.get())); |
| 407 } | 408 } |
| 408 | 409 |
| 409 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_LargeBodyInMemory) { | 410 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_LargeBodyInMemory) { |
| 410 std::vector<std::unique_ptr<UploadElementReader>> element_readers; | 411 std::vector<std::unique_ptr<UploadElementReader>> element_readers; |
| 411 const std::string payload(10000, 'a'); // 'a' x 10000. | 412 const std::string payload(10000, 'a'); // 'a' x 10000. |
| 412 element_readers.push_back(base::MakeUnique<UploadBytesElementReader>( | 413 element_readers.push_back(base::MakeUnique<UploadBytesElementReader>( |
| 413 payload.data(), payload.size())); | 414 payload.data(), payload.size())); |
| 414 | 415 |
| 415 std::unique_ptr<UploadDataStream> body( | 416 std::unique_ptr<UploadDataStream> body( |
| 416 new ElementsUploadDataStream(std::move(element_readers), 0)); | 417 new ElementsUploadDataStream(std::move(element_readers), 0)); |
| 417 ASSERT_THAT(body->Init(CompletionCallback(), BoundNetLog()), IsOk()); | 418 ASSERT_THAT(body->Init(CompletionCallback(), NetLogWithSource()), IsOk()); |
| 418 // Shouldn't be merged if the in-memory body is large here. | 419 // Shouldn't be merged if the in-memory body is large here. |
| 419 ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( | 420 ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody( |
| 420 "some header", body.get())); | 421 "some header", body.get())); |
| 421 } | 422 } |
| 422 | 423 |
| 423 TEST(HttpStreamParser, SentBytesNoHeaders) { | 424 TEST(HttpStreamParser, SentBytesNoHeaders) { |
| 424 MockWrite writes[] = { | 425 MockWrite writes[] = { |
| 425 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n\r\n"), | 426 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n\r\n"), |
| 426 }; | 427 }; |
| 427 | 428 |
| 428 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); | 429 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| 429 std::unique_ptr<ClientSocketHandle> socket_handle = | 430 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 430 CreateConnectedSocketHandle(&data); | 431 CreateConnectedSocketHandle(&data); |
| 431 | 432 |
| 432 HttpRequestInfo request; | 433 HttpRequestInfo request; |
| 433 request.method = "GET"; | 434 request.method = "GET"; |
| 434 request.url = GURL("http://localhost"); | 435 request.url = GURL("http://localhost"); |
| 435 | 436 |
| 436 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 437 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 437 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), | 438 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| 438 BoundNetLog()); | 439 NetLogWithSource()); |
| 439 | 440 |
| 440 HttpResponseInfo response; | 441 HttpResponseInfo response; |
| 441 TestCompletionCallback callback; | 442 TestCompletionCallback callback; |
| 442 EXPECT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", HttpRequestHeaders(), | 443 EXPECT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", HttpRequestHeaders(), |
| 443 &response, callback.callback())); | 444 &response, callback.callback())); |
| 444 | 445 |
| 445 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); | 446 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
| 446 } | 447 } |
| 447 | 448 |
| 448 TEST(HttpStreamParser, SentBytesWithHeaders) { | 449 TEST(HttpStreamParser, SentBytesWithHeaders) { |
| 449 MockWrite writes[] = { | 450 MockWrite writes[] = { |
| 450 MockWrite(SYNCHRONOUS, 0, | 451 MockWrite(SYNCHRONOUS, 0, |
| 451 "GET / HTTP/1.1\r\n" | 452 "GET / HTTP/1.1\r\n" |
| 452 "Host: localhost\r\n" | 453 "Host: localhost\r\n" |
| 453 "Connection: Keep-Alive\r\n\r\n"), | 454 "Connection: Keep-Alive\r\n\r\n"), |
| 454 }; | 455 }; |
| 455 | 456 |
| 456 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); | 457 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| 457 std::unique_ptr<ClientSocketHandle> socket_handle = | 458 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 458 CreateConnectedSocketHandle(&data); | 459 CreateConnectedSocketHandle(&data); |
| 459 | 460 |
| 460 HttpRequestInfo request; | 461 HttpRequestInfo request; |
| 461 request.method = "GET"; | 462 request.method = "GET"; |
| 462 request.url = GURL("http://localhost"); | 463 request.url = GURL("http://localhost"); |
| 463 | 464 |
| 464 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 465 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 465 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), | 466 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| 466 BoundNetLog()); | 467 NetLogWithSource()); |
| 467 | 468 |
| 468 HttpRequestHeaders headers; | 469 HttpRequestHeaders headers; |
| 469 headers.SetHeader("Host", "localhost"); | 470 headers.SetHeader("Host", "localhost"); |
| 470 headers.SetHeader("Connection", "Keep-Alive"); | 471 headers.SetHeader("Connection", "Keep-Alive"); |
| 471 | 472 |
| 472 HttpResponseInfo response; | 473 HttpResponseInfo response; |
| 473 TestCompletionCallback callback; | 474 TestCompletionCallback callback; |
| 474 EXPECT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", headers, &response, | 475 EXPECT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", headers, &response, |
| 475 callback.callback())); | 476 callback.callback())); |
| 476 | 477 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 487 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); | 488 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| 488 std::unique_ptr<ClientSocketHandle> socket_handle = | 489 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 489 CreateConnectedSocketHandle(&data); | 490 CreateConnectedSocketHandle(&data); |
| 490 | 491 |
| 491 HttpRequestInfo request; | 492 HttpRequestInfo request; |
| 492 request.method = "GET"; | 493 request.method = "GET"; |
| 493 request.url = GURL("http://localhost"); | 494 request.url = GURL("http://localhost"); |
| 494 | 495 |
| 495 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 496 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 496 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), | 497 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| 497 BoundNetLog()); | 498 NetLogWithSource()); |
| 498 | 499 |
| 499 HttpRequestHeaders headers; | 500 HttpRequestHeaders headers; |
| 500 headers.SetHeader("Host", "localhost"); | 501 headers.SetHeader("Host", "localhost"); |
| 501 headers.SetHeader("Connection", "Keep-Alive"); | 502 headers.SetHeader("Connection", "Keep-Alive"); |
| 502 | 503 |
| 503 HttpResponseInfo response; | 504 HttpResponseInfo response; |
| 504 TestCompletionCallback callback; | 505 TestCompletionCallback callback; |
| 505 | 506 |
| 506 EXPECT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", headers, &response, | 507 EXPECT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", headers, &response, |
| 507 callback.callback())); | 508 callback.callback())); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 519 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); | 520 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| 520 std::unique_ptr<ClientSocketHandle> socket_handle = | 521 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 521 CreateConnectedSocketHandle(&data); | 522 CreateConnectedSocketHandle(&data); |
| 522 | 523 |
| 523 HttpRequestInfo request; | 524 HttpRequestInfo request; |
| 524 request.method = "GET"; | 525 request.method = "GET"; |
| 525 request.url = GURL("http://localhost"); | 526 request.url = GURL("http://localhost"); |
| 526 | 527 |
| 527 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 528 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 528 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), | 529 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| 529 BoundNetLog()); | 530 NetLogWithSource()); |
| 530 | 531 |
| 531 HttpRequestHeaders headers; | 532 HttpRequestHeaders headers; |
| 532 headers.SetHeader("Host", "localhost"); | 533 headers.SetHeader("Host", "localhost"); |
| 533 headers.SetHeader("Connection", "Keep-Alive"); | 534 headers.SetHeader("Connection", "Keep-Alive"); |
| 534 | 535 |
| 535 HttpResponseInfo response; | 536 HttpResponseInfo response; |
| 536 TestCompletionCallback callback; | 537 TestCompletionCallback callback; |
| 537 EXPECT_EQ(ERR_CONNECTION_RESET, | 538 EXPECT_EQ(ERR_CONNECTION_RESET, |
| 538 parser.SendRequest("GET / HTTP/1.1\r\n", headers, &response, | 539 parser.SendRequest("GET / HTTP/1.1\r\n", headers, &response, |
| 539 callback.callback())); | 540 callback.callback())); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 550 | 551 |
| 551 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); | 552 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| 552 std::unique_ptr<ClientSocketHandle> socket_handle = | 553 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 553 CreateConnectedSocketHandle(&data); | 554 CreateConnectedSocketHandle(&data); |
| 554 | 555 |
| 555 std::vector<std::unique_ptr<UploadElementReader>> element_readers; | 556 std::vector<std::unique_ptr<UploadElementReader>> element_readers; |
| 556 element_readers.push_back( | 557 element_readers.push_back( |
| 557 base::MakeUnique<UploadBytesElementReader>("hello world!", 12)); | 558 base::MakeUnique<UploadBytesElementReader>("hello world!", 12)); |
| 558 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); | 559 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); |
| 559 ASSERT_THAT(upload_data_stream.Init(TestCompletionCallback().callback(), | 560 ASSERT_THAT(upload_data_stream.Init(TestCompletionCallback().callback(), |
| 560 BoundNetLog()), | 561 NetLogWithSource()), |
| 561 IsOk()); | 562 IsOk()); |
| 562 | 563 |
| 563 HttpRequestInfo request; | 564 HttpRequestInfo request; |
| 564 request.method = "POST"; | 565 request.method = "POST"; |
| 565 request.url = GURL("http://localhost"); | 566 request.url = GURL("http://localhost"); |
| 566 request.upload_data_stream = &upload_data_stream; | 567 request.upload_data_stream = &upload_data_stream; |
| 567 | 568 |
| 568 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 569 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 569 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), | 570 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| 570 BoundNetLog()); | 571 NetLogWithSource()); |
| 571 | 572 |
| 572 HttpRequestHeaders headers; | 573 HttpRequestHeaders headers; |
| 573 headers.SetHeader("Content-Length", "12"); | 574 headers.SetHeader("Content-Length", "12"); |
| 574 | 575 |
| 575 HttpResponseInfo response; | 576 HttpResponseInfo response; |
| 576 TestCompletionCallback callback; | 577 TestCompletionCallback callback; |
| 577 EXPECT_EQ(OK, parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, | 578 EXPECT_EQ(OK, parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, |
| 578 callback.callback())); | 579 callback.callback())); |
| 579 | 580 |
| 580 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); | 581 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 593 MockWrite(ASYNC, 2, "7\r\nChunk 1\r\n"), | 594 MockWrite(ASYNC, 2, "7\r\nChunk 1\r\n"), |
| 594 MockWrite(SYNCHRONOUS, ERR_FAILED, 3), | 595 MockWrite(SYNCHRONOUS, ERR_FAILED, 3), |
| 595 }; | 596 }; |
| 596 | 597 |
| 597 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); | 598 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| 598 std::unique_ptr<ClientSocketHandle> socket_handle = | 599 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 599 CreateConnectedSocketHandle(&data); | 600 CreateConnectedSocketHandle(&data); |
| 600 | 601 |
| 601 ChunkedUploadDataStream upload_data_stream(0); | 602 ChunkedUploadDataStream upload_data_stream(0); |
| 602 ASSERT_THAT(upload_data_stream.Init(TestCompletionCallback().callback(), | 603 ASSERT_THAT(upload_data_stream.Init(TestCompletionCallback().callback(), |
| 603 BoundNetLog()), | 604 NetLogWithSource()), |
| 604 IsOk()); | 605 IsOk()); |
| 605 | 606 |
| 606 HttpRequestInfo request; | 607 HttpRequestInfo request; |
| 607 request.method = "POST"; | 608 request.method = "POST"; |
| 608 request.url = GURL("http://localhost"); | 609 request.url = GURL("http://localhost"); |
| 609 request.upload_data_stream = &upload_data_stream; | 610 request.upload_data_stream = &upload_data_stream; |
| 610 | 611 |
| 611 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 612 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 612 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), | 613 HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| 613 BoundNetLog()); | 614 NetLogWithSource()); |
| 614 | 615 |
| 615 HttpRequestHeaders headers; | 616 HttpRequestHeaders headers; |
| 616 headers.SetHeader("Transfer-Encoding", "chunked"); | 617 headers.SetHeader("Transfer-Encoding", "chunked"); |
| 617 | 618 |
| 618 HttpResponseInfo response; | 619 HttpResponseInfo response; |
| 619 TestCompletionCallback callback; | 620 TestCompletionCallback callback; |
| 620 EXPECT_EQ(ERR_IO_PENDING, parser.SendRequest("POST / HTTP/1.1\r\n", headers, | 621 EXPECT_EQ(ERR_IO_PENDING, parser.SendRequest("POST / HTTP/1.1\r\n", headers, |
| 621 &response, callback.callback())); | 622 &response, callback.callback())); |
| 622 | 623 |
| 623 base::RunLoop().RunUntilIdle(); | 624 base::RunLoop().RunUntilIdle(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 654 static const int kBodySize = 8; | 655 static const int kBodySize = 8; |
| 655 | 656 |
| 656 MockRead reads[] = { | 657 MockRead reads[] = { |
| 657 MockRead(ASYNC, 3, "HTTP/1.1 200 OK\r\n"), | 658 MockRead(ASYNC, 3, "HTTP/1.1 200 OK\r\n"), |
| 658 MockRead(ASYNC, 4, "Content-Length: 8\r\n\r\n"), | 659 MockRead(ASYNC, 4, "Content-Length: 8\r\n\r\n"), |
| 659 MockRead(ASYNC, 5, "one.html"), | 660 MockRead(ASYNC, 5, "one.html"), |
| 660 MockRead(SYNCHRONOUS, 0, 6), // EOF | 661 MockRead(SYNCHRONOUS, 0, 6), // EOF |
| 661 }; | 662 }; |
| 662 | 663 |
| 663 ChunkedUploadDataStream upload_stream(0); | 664 ChunkedUploadDataStream upload_stream(0); |
| 664 ASSERT_THAT( | 665 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback(), |
| 665 upload_stream.Init(TestCompletionCallback().callback(), BoundNetLog()), | 666 NetLogWithSource()), |
| 666 IsOk()); | 667 IsOk()); |
| 667 | 668 |
| 668 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 669 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 669 std::unique_ptr<ClientSocketHandle> socket_handle = | 670 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 670 CreateConnectedSocketHandle(&data); | 671 CreateConnectedSocketHandle(&data); |
| 671 | 672 |
| 672 HttpRequestInfo request_info; | 673 HttpRequestInfo request_info; |
| 673 request_info.method = "GET"; | 674 request_info.method = "GET"; |
| 674 request_info.url = GURL("http://localhost"); | 675 request_info.url = GURL("http://localhost"); |
| 675 request_info.upload_data_stream = &upload_stream; | 676 request_info.upload_data_stream = &upload_stream; |
| 676 | 677 |
| 677 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 678 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 678 HttpStreamParser parser(socket_handle.get(), &request_info, read_buffer.get(), | 679 HttpStreamParser parser(socket_handle.get(), &request_info, read_buffer.get(), |
| 679 BoundNetLog()); | 680 NetLogWithSource()); |
| 680 | 681 |
| 681 HttpRequestHeaders request_headers; | 682 HttpRequestHeaders request_headers; |
| 682 request_headers.SetHeader("Transfer-Encoding", "chunked"); | 683 request_headers.SetHeader("Transfer-Encoding", "chunked"); |
| 683 | 684 |
| 684 HttpResponseInfo response_info; | 685 HttpResponseInfo response_info; |
| 685 TestCompletionCallback callback; | 686 TestCompletionCallback callback; |
| 686 // This will attempt to Write() the initial request and headers, which will | 687 // This will attempt to Write() the initial request and headers, which will |
| 687 // complete asynchronously. | 688 // complete asynchronously. |
| 688 ASSERT_EQ(ERR_IO_PENDING, | 689 ASSERT_EQ(ERR_IO_PENDING, |
| 689 parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers, | 690 parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 732 static const int kBodySize = 8; | 733 static const int kBodySize = 8; |
| 733 | 734 |
| 734 MockRead reads[] = { | 735 MockRead reads[] = { |
| 735 MockRead(ASYNC, 3, "HTTP/1.1 200 OK\r\n"), | 736 MockRead(ASYNC, 3, "HTTP/1.1 200 OK\r\n"), |
| 736 MockRead(ASYNC, 4, "Content-Length: 8\r\n\r\n"), | 737 MockRead(ASYNC, 4, "Content-Length: 8\r\n\r\n"), |
| 737 MockRead(ASYNC, 5, "one.html"), | 738 MockRead(ASYNC, 5, "one.html"), |
| 738 MockRead(SYNCHRONOUS, 0, 6), // EOF | 739 MockRead(SYNCHRONOUS, 0, 6), // EOF |
| 739 }; | 740 }; |
| 740 | 741 |
| 741 ChunkedUploadDataStream upload_stream(0); | 742 ChunkedUploadDataStream upload_stream(0); |
| 742 ASSERT_THAT( | 743 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback(), |
| 743 upload_stream.Init(TestCompletionCallback().callback(), BoundNetLog()), | 744 NetLogWithSource()), |
| 744 IsOk()); | 745 IsOk()); |
| 745 // Append the only chunk. | 746 // Append the only chunk. |
| 746 upload_stream.AppendData(kChunk, arraysize(kChunk) - 1, true); | 747 upload_stream.AppendData(kChunk, arraysize(kChunk) - 1, true); |
| 747 | 748 |
| 748 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 749 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 749 std::unique_ptr<ClientSocketHandle> socket_handle = | 750 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 750 CreateConnectedSocketHandle(&data); | 751 CreateConnectedSocketHandle(&data); |
| 751 | 752 |
| 752 HttpRequestInfo request_info; | 753 HttpRequestInfo request_info; |
| 753 request_info.method = "GET"; | 754 request_info.method = "GET"; |
| 754 request_info.url = GURL("http://localhost"); | 755 request_info.url = GURL("http://localhost"); |
| 755 request_info.upload_data_stream = &upload_stream; | 756 request_info.upload_data_stream = &upload_stream; |
| 756 | 757 |
| 757 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 758 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 758 HttpStreamParser parser(socket_handle.get(), &request_info, read_buffer.get(), | 759 HttpStreamParser parser(socket_handle.get(), &request_info, read_buffer.get(), |
| 759 BoundNetLog()); | 760 NetLogWithSource()); |
| 760 | 761 |
| 761 HttpRequestHeaders request_headers; | 762 HttpRequestHeaders request_headers; |
| 762 request_headers.SetHeader("Transfer-Encoding", "chunked"); | 763 request_headers.SetHeader("Transfer-Encoding", "chunked"); |
| 763 | 764 |
| 764 HttpResponseInfo response_info; | 765 HttpResponseInfo response_info; |
| 765 TestCompletionCallback callback; | 766 TestCompletionCallback callback; |
| 766 // This will attempt to Write() the initial request and headers, which will | 767 // This will attempt to Write() the initial request and headers, which will |
| 767 // complete asynchronously. | 768 // complete asynchronously. |
| 768 ASSERT_EQ(ERR_IO_PENDING, | 769 ASSERT_EQ(ERR_IO_PENDING, |
| 769 parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers, | 770 parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 | 815 |
| 815 MockRead reads[] = { | 816 MockRead reads[] = { |
| 816 MockRead(ASYNC, 5, "HTTP/1.1 200 OK\r\n"), | 817 MockRead(ASYNC, 5, "HTTP/1.1 200 OK\r\n"), |
| 817 MockRead(ASYNC, 6, "Content-Length: 8\r\n\r\n"), | 818 MockRead(ASYNC, 6, "Content-Length: 8\r\n\r\n"), |
| 818 MockRead(ASYNC, 7, "one.html"), | 819 MockRead(ASYNC, 7, "one.html"), |
| 819 MockRead(SYNCHRONOUS, 0, 8), // EOF | 820 MockRead(SYNCHRONOUS, 0, 8), // EOF |
| 820 }; | 821 }; |
| 821 | 822 |
| 822 ChunkedUploadDataStream upload_stream(0); | 823 ChunkedUploadDataStream upload_stream(0); |
| 823 upload_stream.AppendData(kChunk1, arraysize(kChunk1) - 1, false); | 824 upload_stream.AppendData(kChunk1, arraysize(kChunk1) - 1, false); |
| 824 ASSERT_THAT( | 825 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback(), |
| 825 upload_stream.Init(TestCompletionCallback().callback(), BoundNetLog()), | 826 NetLogWithSource()), |
| 826 IsOk()); | 827 IsOk()); |
| 827 | 828 |
| 828 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 829 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 829 std::unique_ptr<ClientSocketHandle> socket_handle = | 830 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 830 CreateConnectedSocketHandle(&data); | 831 CreateConnectedSocketHandle(&data); |
| 831 | 832 |
| 832 HttpRequestInfo request_info; | 833 HttpRequestInfo request_info; |
| 833 request_info.method = "GET"; | 834 request_info.method = "GET"; |
| 834 request_info.url = GURL("http://localhost"); | 835 request_info.url = GURL("http://localhost"); |
| 835 request_info.upload_data_stream = &upload_stream; | 836 request_info.upload_data_stream = &upload_stream; |
| 836 | 837 |
| 837 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 838 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 838 HttpStreamParser parser( | 839 HttpStreamParser parser(socket_handle.get(), &request_info, read_buffer.get(), |
| 839 socket_handle.get(), &request_info, read_buffer.get(), BoundNetLog()); | 840 NetLogWithSource()); |
| 840 | 841 |
| 841 HttpRequestHeaders request_headers; | 842 HttpRequestHeaders request_headers; |
| 842 request_headers.SetHeader("Transfer-Encoding", "chunked"); | 843 request_headers.SetHeader("Transfer-Encoding", "chunked"); |
| 843 | 844 |
| 844 HttpResponseInfo response_info; | 845 HttpResponseInfo response_info; |
| 845 TestCompletionCallback callback; | 846 TestCompletionCallback callback; |
| 846 // This will attempt to Write() the initial request and headers, which will | 847 // This will attempt to Write() the initial request and headers, which will |
| 847 // complete asynchronously. | 848 // complete asynchronously. |
| 848 ASSERT_EQ(ERR_IO_PENDING, | 849 ASSERT_EQ(ERR_IO_PENDING, |
| 849 parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers, | 850 parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 898 const int kBodySize = 8; | 899 const int kBodySize = 8; |
| 899 | 900 |
| 900 MockRead reads[] = { | 901 MockRead reads[] = { |
| 901 MockRead(ASYNC, 2, "HTTP/1.1 200 OK\r\n"), | 902 MockRead(ASYNC, 2, "HTTP/1.1 200 OK\r\n"), |
| 902 MockRead(ASYNC, 3, "Content-Length: 8\r\n\r\n"), | 903 MockRead(ASYNC, 3, "Content-Length: 8\r\n\r\n"), |
| 903 MockRead(ASYNC, 4, "one.html"), | 904 MockRead(ASYNC, 4, "one.html"), |
| 904 MockRead(SYNCHRONOUS, 0, 5), // EOF | 905 MockRead(SYNCHRONOUS, 0, 5), // EOF |
| 905 }; | 906 }; |
| 906 | 907 |
| 907 ChunkedUploadDataStream upload_stream(0); | 908 ChunkedUploadDataStream upload_stream(0); |
| 908 ASSERT_THAT( | 909 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback(), |
| 909 upload_stream.Init(TestCompletionCallback().callback(), BoundNetLog()), | 910 NetLogWithSource()), |
| 910 IsOk()); | 911 IsOk()); |
| 911 | 912 |
| 912 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 913 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 913 std::unique_ptr<ClientSocketHandle> socket_handle = | 914 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 914 CreateConnectedSocketHandle(&data); | 915 CreateConnectedSocketHandle(&data); |
| 915 | 916 |
| 916 HttpRequestInfo request_info; | 917 HttpRequestInfo request_info; |
| 917 request_info.method = "GET"; | 918 request_info.method = "GET"; |
| 918 request_info.url = GURL("http://localhost"); | 919 request_info.url = GURL("http://localhost"); |
| 919 request_info.upload_data_stream = &upload_stream; | 920 request_info.upload_data_stream = &upload_stream; |
| 920 | 921 |
| 921 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 922 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 922 HttpStreamParser parser(socket_handle.get(), &request_info, read_buffer.get(), | 923 HttpStreamParser parser(socket_handle.get(), &request_info, read_buffer.get(), |
| 923 BoundNetLog()); | 924 NetLogWithSource()); |
| 924 | 925 |
| 925 HttpRequestHeaders request_headers; | 926 HttpRequestHeaders request_headers; |
| 926 request_headers.SetHeader("Transfer-Encoding", "chunked"); | 927 request_headers.SetHeader("Transfer-Encoding", "chunked"); |
| 927 | 928 |
| 928 HttpResponseInfo response_info; | 929 HttpResponseInfo response_info; |
| 929 TestCompletionCallback callback; | 930 TestCompletionCallback callback; |
| 930 // This will attempt to Write() the initial request and headers, which will | 931 // This will attempt to Write() the initial request and headers, which will |
| 931 // complete asynchronously. | 932 // complete asynchronously. |
| 932 ASSERT_EQ(ERR_IO_PENDING, | 933 ASSERT_EQ(ERR_IO_PENDING, |
| 933 parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers, | 934 parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 971 const int kBodySize = 8; | 972 const int kBodySize = 8; |
| 972 | 973 |
| 973 MockRead reads[] = { | 974 MockRead reads[] = { |
| 974 MockRead(ASYNC, 2, "HTTP/1.1 200 OK\r\n"), | 975 MockRead(ASYNC, 2, "HTTP/1.1 200 OK\r\n"), |
| 975 MockRead(ASYNC, 3, "Content-Length: 8\r\n\r\n"), | 976 MockRead(ASYNC, 3, "Content-Length: 8\r\n\r\n"), |
| 976 MockRead(ASYNC, 4, "one.html"), | 977 MockRead(ASYNC, 4, "one.html"), |
| 977 MockRead(SYNCHRONOUS, 0, 5), // EOF | 978 MockRead(SYNCHRONOUS, 0, 5), // EOF |
| 978 }; | 979 }; |
| 979 | 980 |
| 980 ChunkedUploadDataStream upload_stream(0); | 981 ChunkedUploadDataStream upload_stream(0); |
| 981 ASSERT_THAT( | 982 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback(), |
| 982 upload_stream.Init(TestCompletionCallback().callback(), BoundNetLog()), | 983 NetLogWithSource()), |
| 983 IsOk()); | 984 IsOk()); |
| 984 // Append final empty chunk. | 985 // Append final empty chunk. |
| 985 upload_stream.AppendData(nullptr, 0, true); | 986 upload_stream.AppendData(nullptr, 0, true); |
| 986 | 987 |
| 987 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 988 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 988 std::unique_ptr<ClientSocketHandle> socket_handle = | 989 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 989 CreateConnectedSocketHandle(&data); | 990 CreateConnectedSocketHandle(&data); |
| 990 | 991 |
| 991 HttpRequestInfo request_info; | 992 HttpRequestInfo request_info; |
| 992 request_info.method = "GET"; | 993 request_info.method = "GET"; |
| 993 request_info.url = GURL("http://localhost"); | 994 request_info.url = GURL("http://localhost"); |
| 994 request_info.upload_data_stream = &upload_stream; | 995 request_info.upload_data_stream = &upload_stream; |
| 995 | 996 |
| 996 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 997 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 997 HttpStreamParser parser(socket_handle.get(), &request_info, read_buffer.get(), | 998 HttpStreamParser parser(socket_handle.get(), &request_info, read_buffer.get(), |
| 998 BoundNetLog()); | 999 NetLogWithSource()); |
| 999 | 1000 |
| 1000 HttpRequestHeaders request_headers; | 1001 HttpRequestHeaders request_headers; |
| 1001 request_headers.SetHeader("Transfer-Encoding", "chunked"); | 1002 request_headers.SetHeader("Transfer-Encoding", "chunked"); |
| 1002 | 1003 |
| 1003 HttpResponseInfo response_info; | 1004 HttpResponseInfo response_info; |
| 1004 TestCompletionCallback callback; | 1005 TestCompletionCallback callback; |
| 1005 // This will attempt to Write() the initial request and headers, which will | 1006 // This will attempt to Write() the initial request and headers, which will |
| 1006 // complete asynchronously. | 1007 // complete asynchronously. |
| 1007 ASSERT_EQ(ERR_IO_PENDING, | 1008 ASSERT_EQ(ERR_IO_PENDING, |
| 1008 parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers, | 1009 parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers, |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1089 HttpRequestInfo request_info; | 1090 HttpRequestInfo request_info; |
| 1090 request_info.method = "GET"; | 1091 request_info.method = "GET"; |
| 1091 if (protocol == HTTP) { | 1092 if (protocol == HTTP) { |
| 1092 request_info.url = GURL("http://localhost"); | 1093 request_info.url = GURL("http://localhost"); |
| 1093 } else { | 1094 } else { |
| 1094 request_info.url = GURL("https://localhost"); | 1095 request_info.url = GURL("https://localhost"); |
| 1095 } | 1096 } |
| 1096 request_info.load_flags = LOAD_NORMAL; | 1097 request_info.load_flags = LOAD_NORMAL; |
| 1097 | 1098 |
| 1098 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 1099 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 1099 HttpStreamParser parser( | 1100 HttpStreamParser parser(socket_handle.get(), &request_info, |
| 1100 socket_handle.get(), &request_info, read_buffer.get(), BoundNetLog()); | 1101 read_buffer.get(), NetLogWithSource()); |
| 1101 | 1102 |
| 1102 HttpRequestHeaders request_headers; | 1103 HttpRequestHeaders request_headers; |
| 1103 HttpResponseInfo response_info; | 1104 HttpResponseInfo response_info; |
| 1104 TestCompletionCallback callback; | 1105 TestCompletionCallback callback; |
| 1105 ASSERT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", request_headers, | 1106 ASSERT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", request_headers, |
| 1106 &response_info, callback.callback())); | 1107 &response_info, callback.callback())); |
| 1107 | 1108 |
| 1108 int rv = parser.ReadResponseHeaders(callback.callback()); | 1109 int rv = parser.ReadResponseHeaders(callback.callback()); |
| 1109 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 1110 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
| 1110 parser.sent_bytes()); | 1111 parser.sent_bytes()); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1146 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1147 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1147 std::unique_ptr<ClientSocketHandle> socket_handle = | 1148 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 1148 CreateConnectedSocketHandle(&data); | 1149 CreateConnectedSocketHandle(&data); |
| 1149 | 1150 |
| 1150 HttpRequestInfo request_info; | 1151 HttpRequestInfo request_info; |
| 1151 request_info.method = "GET"; | 1152 request_info.method = "GET"; |
| 1152 request_info.url = GURL("http://localhost"); | 1153 request_info.url = GURL("http://localhost"); |
| 1153 request_info.load_flags = LOAD_NORMAL; | 1154 request_info.load_flags = LOAD_NORMAL; |
| 1154 | 1155 |
| 1155 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 1156 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 1156 HttpStreamParser parser( | 1157 HttpStreamParser parser(socket_handle.get(), &request_info, read_buffer.get(), |
| 1157 socket_handle.get(), &request_info, read_buffer.get(), BoundNetLog()); | 1158 NetLogWithSource()); |
| 1158 | 1159 |
| 1159 HttpRequestHeaders request_headers; | 1160 HttpRequestHeaders request_headers; |
| 1160 HttpResponseInfo response_info; | 1161 HttpResponseInfo response_info; |
| 1161 TestCompletionCallback callback; | 1162 TestCompletionCallback callback; |
| 1162 ASSERT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", request_headers, | 1163 ASSERT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", request_headers, |
| 1163 &response_info, callback.callback())); | 1164 &response_info, callback.callback())); |
| 1164 | 1165 |
| 1165 EXPECT_THAT(parser.ReadResponseHeaders(callback.callback()), IsOk()); | 1166 EXPECT_THAT(parser.ReadResponseHeaders(callback.callback()), IsOk()); |
| 1166 ASSERT_TRUE(response_info.headers.get()); | 1167 ASSERT_TRUE(response_info.headers.get()); |
| 1167 EXPECT_EQ(101, response_info.headers->response_code()); | 1168 EXPECT_EQ(101, response_info.headers->response_code()); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1217 reads_.push_back(MockRead(SYNCHRONOUS, 0, sequence_number_++)); // EOF | 1218 reads_.push_back(MockRead(SYNCHRONOUS, 0, sequence_number_++)); // EOF |
| 1218 | 1219 |
| 1219 data_.reset(new SequencedSocketData(&reads_.front(), reads_.size(), | 1220 data_.reset(new SequencedSocketData(&reads_.front(), reads_.size(), |
| 1220 &writes_.front(), writes_.size())); | 1221 &writes_.front(), writes_.size())); |
| 1221 socket_handle_ = CreateConnectedSocketHandle(data_.get()); | 1222 socket_handle_ = CreateConnectedSocketHandle(data_.get()); |
| 1222 | 1223 |
| 1223 request_info_.method = "GET"; | 1224 request_info_.method = "GET"; |
| 1224 request_info_.url = url_; | 1225 request_info_.url = url_; |
| 1225 request_info_.load_flags = LOAD_NORMAL; | 1226 request_info_.load_flags = LOAD_NORMAL; |
| 1226 | 1227 |
| 1227 parser_.reset(new HttpStreamParser( | 1228 parser_.reset(new HttpStreamParser(socket_handle_.get(), &request_info_, |
| 1228 socket_handle_.get(), &request_info_, read_buffer(), BoundNetLog())); | 1229 read_buffer(), NetLogWithSource())); |
| 1229 | 1230 |
| 1230 parser_->set_http_09_on_non_default_ports_enabled( | 1231 parser_->set_http_09_on_non_default_ports_enabled( |
| 1231 http_09_on_non_default_ports_enabled_); | 1232 http_09_on_non_default_ports_enabled_); |
| 1232 | 1233 |
| 1233 TestCompletionCallback callback; | 1234 TestCompletionCallback callback; |
| 1234 ASSERT_EQ(OK, parser_->SendRequest("GET / HTTP/1.1\r\n", request_headers_, | 1235 ASSERT_EQ(OK, parser_->SendRequest("GET / HTTP/1.1\r\n", request_headers_, |
| 1235 &response_info_, callback.callback())); | 1236 &response_info_, callback.callback())); |
| 1236 } | 1237 } |
| 1237 | 1238 |
| 1238 void ReadHeadersExpectingError(Error error) { | 1239 void ReadHeadersExpectingError(Error error) { |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1590 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1591 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1591 std::unique_ptr<ClientSocketHandle> socket_handle = | 1592 std::unique_ptr<ClientSocketHandle> socket_handle = |
| 1592 CreateConnectedSocketHandle(&data); | 1593 CreateConnectedSocketHandle(&data); |
| 1593 | 1594 |
| 1594 std::unique_ptr<HttpRequestInfo> request_info(new HttpRequestInfo()); | 1595 std::unique_ptr<HttpRequestInfo> request_info(new HttpRequestInfo()); |
| 1595 request_info->method = "GET"; | 1596 request_info->method = "GET"; |
| 1596 request_info->url = GURL("http://somewhere/foo.html"); | 1597 request_info->url = GURL("http://somewhere/foo.html"); |
| 1597 | 1598 |
| 1598 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); | 1599 scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| 1599 HttpStreamParser parser(socket_handle.get(), request_info.get(), | 1600 HttpStreamParser parser(socket_handle.get(), request_info.get(), |
| 1600 read_buffer.get(), BoundNetLog()); | 1601 read_buffer.get(), NetLogWithSource()); |
| 1601 | 1602 |
| 1602 std::unique_ptr<HttpRequestHeaders> request_headers(new HttpRequestHeaders()); | 1603 std::unique_ptr<HttpRequestHeaders> request_headers(new HttpRequestHeaders()); |
| 1603 std::unique_ptr<HttpResponseInfo> response_info(new HttpResponseInfo()); | 1604 std::unique_ptr<HttpResponseInfo> response_info(new HttpResponseInfo()); |
| 1604 TestCompletionCallback callback; | 1605 TestCompletionCallback callback; |
| 1605 ASSERT_EQ(OK, parser.SendRequest("GET /foo.html HTTP/1.1\r\n", | 1606 ASSERT_EQ(OK, parser.SendRequest("GET /foo.html HTTP/1.1\r\n", |
| 1606 *request_headers, response_info.get(), callback.callback())); | 1607 *request_headers, response_info.get(), callback.callback())); |
| 1607 ASSERT_THAT(parser.ReadResponseHeaders(callback.callback()), IsOk()); | 1608 ASSERT_THAT(parser.ReadResponseHeaders(callback.callback()), IsOk()); |
| 1608 | 1609 |
| 1609 // If the object that owns the HttpStreamParser is deleted, it takes the | 1610 // If the object that owns the HttpStreamParser is deleted, it takes the |
| 1610 // objects passed to the HttpStreamParser with it. | 1611 // objects passed to the HttpStreamParser with it. |
| 1611 request_info.reset(); | 1612 request_info.reset(); |
| 1612 request_headers.reset(); | 1613 request_headers.reset(); |
| 1613 response_info.reset(); | 1614 response_info.reset(); |
| 1614 | 1615 |
| 1615 scoped_refptr<IOBuffer> body_buffer(new IOBuffer(kBodySize)); | 1616 scoped_refptr<IOBuffer> body_buffer(new IOBuffer(kBodySize)); |
| 1616 ASSERT_EQ(kBodySize, parser.ReadResponseBody( | 1617 ASSERT_EQ(kBodySize, parser.ReadResponseBody( |
| 1617 body_buffer.get(), kBodySize, callback.callback())); | 1618 body_buffer.get(), kBodySize, callback.callback())); |
| 1618 | 1619 |
| 1619 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); | 1620 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
| 1620 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), parser.received_bytes()); | 1621 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), parser.received_bytes()); |
| 1621 } | 1622 } |
| 1622 | 1623 |
| 1623 } // namespace | 1624 } // namespace |
| 1624 | 1625 |
| 1625 } // namespace net | 1626 } // namespace net |
| OLD | NEW |