Index: content/browser/loader/mime_sniffing_resource_handler.cc |
diff --git a/content/browser/loader/mime_sniffing_resource_handler.cc b/content/browser/loader/mime_sniffing_resource_handler.cc |
index 11adad4704772748963bc5129752c2e95af17a20..a6147cb4934da2aaec9fefaff7cc166e7130fbc9 100644 |
--- a/content/browser/loader/mime_sniffing_resource_handler.cc |
+++ b/content/browser/loader/mime_sniffing_resource_handler.cc |
@@ -4,6 +4,7 @@ |
#include "content/browser/loader/mime_sniffing_resource_handler.h" |
+#include <algorithm> |
#include <utility> |
#include <vector> |
@@ -125,8 +126,8 @@ MimeSniffingResourceHandler::MimeSniffingResourceHandler( |
must_download_is_set_(false), |
read_buffer_size_(0), |
bytes_read_(0), |
- parent_read_buffer_(nullptr), |
- parent_read_buffer_size_(nullptr), |
+ bytes_replayed_(0), |
+ out_buffer_size_(0), |
intercepting_handler_(intercepting_handler), |
request_context_type_(request_context_type), |
in_state_loop_(false), |
@@ -223,8 +224,6 @@ void MimeSniffingResourceHandler::OnWillRead( |
std::unique_ptr<ResourceController> controller) { |
DCHECK(buf); |
DCHECK(buf_size); |
- DCHECK(!parent_read_buffer_); |
- DCHECK(!parent_read_buffer_size_); |
if (state_ == STATE_STREAMING) { |
next_handler_->OnWillRead(buf, buf_size, std::move(controller)); |
@@ -238,20 +237,13 @@ void MimeSniffingResourceHandler::OnWillRead( |
*buf = new DependentIOBuffer(read_buffer_.get(), bytes_read_); |
*buf_size = read_buffer_size_ - bytes_read_; |
controller->Resume(); |
- return; |
+ } else { |
+ *buf_size = read_buffer_size_ = net::kMaxBytesToSniff * 2; |
+ *buf = read_buffer_ = new net::IOBuffer(read_buffer_size_); |
+ controller->Resume(); |
} |
- DCHECK(!read_buffer_size_); |
- |
- parent_read_buffer_ = buf; |
- parent_read_buffer_size_ = buf_size; |
- |
- HoldController(std::move(controller)); |
- |
- // Have to go through AdvanceState here so that if OnWillRead completes |
- // synchronously, won't post a task. |
- state_ = State::STATE_CALLING_ON_WILL_READ; |
- AdvanceState(); |
+ return; |
} |
void MimeSniffingResourceHandler::OnReadCompleted( |
@@ -335,16 +327,13 @@ void MimeSniffingResourceHandler::AdvanceState() { |
case STATE_BUFFERING: |
MaybeIntercept(); |
break; |
- case STATE_CALLING_ON_WILL_READ: |
- CallOnWillRead(); |
- break; |
- case STATE_WAITING_FOR_BUFFER: |
- BufferReceived(); |
- break; |
case STATE_INTERCEPTION_CHECK_DONE: |
ReplayResponseReceived(); |
break; |
case STATE_REPLAYING_RESPONSE_RECEIVED: |
+ ReplayGetBuffer(); |
+ break; |
+ case STATE_REPLAYING_WAIT_FOR_WILL_READ: |
ReplayReadCompleted(); |
break; |
case STATE_STARTING: |
@@ -372,32 +361,6 @@ void MimeSniffingResourceHandler::MaybeIntercept() { |
ResumeInternal(); |
} |
-void MimeSniffingResourceHandler::CallOnWillRead() { |
- DCHECK_EQ(STATE_CALLING_ON_WILL_READ, state_); |
- |
- state_ = STATE_WAITING_FOR_BUFFER; |
- next_handler_->OnWillRead(&read_buffer_, &read_buffer_size_, |
- base::MakeUnique<Controller>(this)); |
-} |
- |
-void MimeSniffingResourceHandler::BufferReceived() { |
- DCHECK_EQ(STATE_WAITING_FOR_BUFFER, state_); |
- |
- DCHECK(read_buffer_); |
- DCHECK(parent_read_buffer_); |
- DCHECK(parent_read_buffer_size_); |
- DCHECK_GE(read_buffer_size_, net::kMaxBytesToSniff * 2); |
- |
- *parent_read_buffer_ = read_buffer_; |
- *parent_read_buffer_size_ = read_buffer_size_; |
- |
- parent_read_buffer_ = nullptr; |
- parent_read_buffer_size_ = nullptr; |
- |
- state_ = State::STATE_BUFFERING; |
- Resume(); |
-} |
- |
void MimeSniffingResourceHandler::ReplayResponseReceived() { |
DCHECK_EQ(STATE_INTERCEPTION_CHECK_DONE, state_); |
state_ = STATE_REPLAYING_RESPONSE_RECEIVED; |
@@ -405,23 +368,40 @@ void MimeSniffingResourceHandler::ReplayResponseReceived() { |
base::MakeUnique<Controller>(this)); |
} |
-void MimeSniffingResourceHandler::ReplayReadCompleted() { |
+void MimeSniffingResourceHandler::ReplayGetBuffer() { |
DCHECK_EQ(STATE_REPLAYING_RESPONSE_RECEIVED, state_); |
- state_ = STATE_STREAMING; |
+ if (bytes_read_ == bytes_replayed_) { |
+ read_buffer_ = nullptr; |
+ read_buffer_size_ = 0; |
+ bytes_read_ = bytes_replayed_ = 0; |
+ |
+ state_ = STATE_STREAMING; |
- if (!read_buffer_.get()) { |
ResumeInternal(); |
return; |
} |
- int bytes_read = bytes_read_; |
+ state_ = STATE_REPLAYING_WAIT_FOR_WILL_READ; |
+ |
+ out_buffer_ = nullptr; |
+ out_buffer_size_ = 0; |
+ next_handler_->OnWillRead(&out_buffer_, &out_buffer_size_, |
+ base::MakeUnique<Controller>(this)); |
+} |
- read_buffer_ = nullptr; |
- read_buffer_size_ = 0; |
- bytes_read_ = 0; |
+void MimeSniffingResourceHandler::ReplayReadCompleted() { |
+ DCHECK_EQ(STATE_REPLAYING_WAIT_FOR_WILL_READ, state_); |
+ DCHECK(out_buffer_.get()); |
+ DCHECK_LT(0, out_buffer_size_); |
+ |
+ state_ = STATE_REPLAYING_RESPONSE_RECEIVED; |
+ int bytes_to_copy = std::min(bytes_read_ - bytes_replayed_, out_buffer_size_); |
+ memcpy(out_buffer_->data(), read_buffer_->data() + bytes_replayed_, |
+ bytes_to_copy); |
+ bytes_replayed_ += bytes_to_copy; |
- next_handler_->OnReadCompleted(bytes_read, |
+ next_handler_->OnReadCompleted(bytes_to_copy, |
base::MakeUnique<Controller>(this)); |
} |