Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 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 "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/trace_event.h" | 8 #include "base/trace_event.h" |
| 9 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
| 10 #include "net/http/http_request_info.h" | 10 #include "net/http/http_request_info.h" |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 201 } else { | 201 } else { |
| 202 io_state_ = STATE_REQUEST_SENT; | 202 io_state_ = STATE_REQUEST_SENT; |
| 203 } | 203 } |
| 204 return result; | 204 return result; |
| 205 } | 205 } |
| 206 | 206 |
| 207 int HttpStreamParser::DoReadHeaders() { | 207 int HttpStreamParser::DoReadHeaders() { |
| 208 io_state_ = STATE_READ_HEADERS_COMPLETE; | 208 io_state_ = STATE_READ_HEADERS_COMPLETE; |
| 209 | 209 |
| 210 // Grow the read buffer if necessary. | 210 // Grow the read buffer if necessary. |
| 211 if (read_buf_->RemainingCapacity() == 0) | 211 if (read_buf_->RemainingCapacity() == 0) { |
| 212 read_buf_->set_capacity(read_buf_->capacity() + kHeaderBufInitialSize); | 212 if (!read_buf_->SetCapacity(read_buf_->capacity() + kHeaderBufInitialSize)) |
| 213 return ERR_OUT_OF_MEMORY; | |
| 214 } | |
| 213 | 215 |
| 214 // http://crbug.com/16371: We're seeing |user_buf_->data()| return NULL. | 216 // http://crbug.com/16371: We're seeing |user_buf_->data()| return NULL. |
| 215 // See if the user is passing in an IOBuffer with a NULL |data_|. | 217 // See if the user is passing in an IOBuffer with a NULL |data_|. |
| 216 CHECK(read_buf_->data()); | 218 CHECK(read_buf_->data()); |
| 217 | 219 |
| 218 int bytes_read = connection_->socket()->Read(read_buf_, | 220 int bytes_read = connection_->socket()->Read(read_buf_, |
| 219 read_buf_->RemainingCapacity(), | 221 read_buf_->RemainingCapacity(), |
| 220 &io_callback_); | 222 &io_callback_); |
| 221 if (bytes_read == 0) | 223 if (bytes_read == 0) |
| 222 bytes_read = ERR_CONNECTION_CLOSED; | 224 bytes_read = ERR_CONNECTION_CLOSED; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 293 // data here and transition to DONE. | 295 // data here and transition to DONE. |
| 294 if (response_body_length_ == 0) { | 296 if (response_body_length_ == 0) { |
| 295 io_state_ = STATE_DONE; | 297 io_state_ = STATE_DONE; |
| 296 int extra_bytes = read_buf_->offset() - read_buf_unused_offset_; | 298 int extra_bytes = read_buf_->offset() - read_buf_unused_offset_; |
| 297 if (extra_bytes) { | 299 if (extra_bytes) { |
| 298 CHECK(extra_bytes > 0); | 300 CHECK(extra_bytes > 0); |
| 299 memmove(read_buf_->StartOfBuffer(), | 301 memmove(read_buf_->StartOfBuffer(), |
| 300 read_buf_->StartOfBuffer() + read_buf_unused_offset_, | 302 read_buf_->StartOfBuffer() + read_buf_unused_offset_, |
| 301 extra_bytes); | 303 extra_bytes); |
| 302 } | 304 } |
| 303 read_buf_->set_capacity(extra_bytes); | 305 // Ok if this fails, since it only shrinks the buffer. |
|
wtc
2009/10/27 22:42:10
Sorry, I just realized that if this fails, the ori
wtc
2009/10/28 01:38:44
The memmove call at line 301 above moves extra_byt
vandebo (ex-Chrome)
2009/10/28 01:44:54
Ahh, indeed you are correct. I will change it bac
wtc
2009/10/28 01:55:29
I found that the
read_buf_->set_offset(extra_byt
| |
| 306 read_buf_->SetCapacity(extra_bytes); | |
| 304 read_buf_unused_offset_ = 0; | 307 read_buf_unused_offset_ = 0; |
| 305 return OK; | 308 return OK; |
| 306 } | 309 } |
| 307 } | 310 } |
| 308 } | 311 } |
| 309 return result; | 312 return result; |
| 310 } | 313 } |
| 311 | 314 |
| 312 int HttpStreamParser::DoReadBody() { | 315 int HttpStreamParser::DoReadBody() { |
| 313 io_state_ = STATE_READ_BODY_COMPLETE; | 316 io_state_ = STATE_READ_BODY_COMPLETE; |
| 314 | 317 |
| 315 int bytes_read; | 318 int bytes_read; |
| 316 // There may be some data left over from reading the response headers. | 319 // There may be some data left over from reading the response headers. |
| 317 if (read_buf_->offset()) { | 320 if (read_buf_->offset()) { |
| 318 int available = read_buf_->offset() - read_buf_unused_offset_; | 321 int available = read_buf_->offset() - read_buf_unused_offset_; |
| 319 if (available) { | 322 if (available) { |
| 320 CHECK(available > 0); | 323 CHECK(available > 0); |
| 321 bytes_read = std::min(available, user_read_buf_len_); | 324 bytes_read = std::min(available, user_read_buf_len_); |
| 322 memcpy(user_read_buf_->data(), | 325 memcpy(user_read_buf_->data(), |
| 323 read_buf_->StartOfBuffer() + read_buf_unused_offset_, | 326 read_buf_->StartOfBuffer() + read_buf_unused_offset_, |
| 324 bytes_read); | 327 bytes_read); |
| 325 read_buf_unused_offset_ += bytes_read; | 328 read_buf_unused_offset_ += bytes_read; |
| 326 if (bytes_read == available) { | 329 if (bytes_read == available) { |
| 327 read_buf_->set_capacity(0); | 330 read_buf_->SetCapacity(0); |
| 328 read_buf_unused_offset_ = 0; | 331 read_buf_unused_offset_ = 0; |
| 329 } | 332 } |
| 330 return bytes_read; | 333 return bytes_read; |
| 331 } else { | 334 } else { |
| 332 read_buf_->set_capacity(0); | 335 read_buf_->SetCapacity(0); |
| 333 read_buf_unused_offset_ = 0; | 336 read_buf_unused_offset_ = 0; |
| 334 } | 337 } |
| 335 } | 338 } |
| 336 | 339 |
| 337 // Check to see if we're done reading. | 340 // Check to see if we're done reading. |
| 338 if (IsResponseBodyComplete()) | 341 if (IsResponseBodyComplete()) |
| 339 return 0; | 342 return 0; |
| 340 | 343 |
| 341 DCHECK_EQ(0, read_buf_->offset()); | 344 DCHECK_EQ(0, read_buf_->offset()); |
| 342 bytes_read = connection_->socket()->Read(user_read_buf_, user_read_buf_len_, | 345 bytes_read = connection_->socket()->Read(user_read_buf_, user_read_buf_len_, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 377 } else if (response_body_length_ >= 0) { | 380 } else if (response_body_length_ >= 0) { |
| 378 save_amount = static_cast<int>(response_body_read_ - | 381 save_amount = static_cast<int>(response_body_read_ - |
| 379 response_body_length_); | 382 response_body_length_); |
| 380 if (save_amount < 0) | 383 if (save_amount < 0) |
| 381 save_amount = 0; | 384 save_amount = 0; |
| 382 | 385 |
| 383 if (result > 0) | 386 if (result > 0) |
| 384 result -= save_amount; | 387 result -= save_amount; |
| 385 } | 388 } |
| 386 if (read_buf_->capacity() < save_amount + additional_save_amount) { | 389 if (read_buf_->capacity() < save_amount + additional_save_amount) { |
| 387 read_buf_->set_capacity(save_amount + additional_save_amount); | 390 if (!read_buf_->SetCapacity(save_amount + additional_save_amount)) { |
| 391 // This response is ok, but we weren't able to copy the extra data, | |
| 392 // so close the connection so that it is not reused. | |
| 393 connection_->socket()->Disconnect(); | |
| 394 connection_->Reset(); | |
| 395 read_buf_unused_offset_ = -1; // So that IsMoreDataBuffered works. | |
| 396 return result; | |
| 397 } | |
| 388 } | 398 } |
| 389 if (save_amount) { | 399 if (save_amount) { |
| 390 memcpy(read_buf_->StartOfBuffer(), user_read_buf_->data() + result, | 400 memcpy(read_buf_->StartOfBuffer(), user_read_buf_->data() + result, |
| 391 save_amount); | 401 save_amount); |
| 392 read_buf_->set_offset(save_amount); | 402 read_buf_->set_offset(save_amount); |
| 393 } | 403 } |
| 394 if (additional_save_amount) { | 404 if (additional_save_amount) { |
| 395 memmove(read_buf_->data(), | 405 memmove(read_buf_->data(), |
| 396 read_buf_->StartOfBuffer() + read_buf_unused_offset_, | 406 read_buf_->StartOfBuffer() + read_buf_unused_offset_, |
| 397 additional_save_amount); | 407 additional_save_amount); |
| 398 read_buf_->set_offset(save_amount + additional_save_amount); | 408 read_buf_->set_offset(save_amount + additional_save_amount); |
| 399 } | 409 } |
| 400 read_buf_unused_offset_ = 0; | 410 read_buf_unused_offset_ = 0; |
| 401 } else { | 411 } else { |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 511 | 521 |
| 512 bool HttpStreamParser::CanFindEndOfResponse() const { | 522 bool HttpStreamParser::CanFindEndOfResponse() const { |
| 513 return chunked_decoder_.get() || response_body_length_ >= 0; | 523 return chunked_decoder_.get() || response_body_length_ >= 0; |
| 514 } | 524 } |
| 515 | 525 |
| 516 bool HttpStreamParser::IsMoreDataBuffered() const { | 526 bool HttpStreamParser::IsMoreDataBuffered() const { |
| 517 return read_buf_->offset() > read_buf_unused_offset_; | 527 return read_buf_->offset() > read_buf_unused_offset_; |
| 518 } | 528 } |
| 519 | 529 |
| 520 } // namespace net | 530 } // namespace net |
| OLD | NEW |