Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(544)

Unified Diff: content/browser/loader/mime_sniffing_resource_handler.cc

Issue 2743723003: Add buffering to MimeSniffingResourceHandler.
Patch Set: Remove unused 'first_call' variable. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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));
}

Powered by Google App Engine
This is Rietveld 408576698