| Index: chrome/browser/renderer_host/buffered_resource_handler.cc
|
| ===================================================================
|
| --- chrome/browser/renderer_host/buffered_resource_handler.cc (revision 8565)
|
| +++ chrome/browser/renderer_host/buffered_resource_handler.cc (working copy)
|
| @@ -8,9 +8,13 @@
|
| #include "net/base/mime_sniffer.h"
|
| #include "chrome/browser/renderer_host/download_throttling_resource_handler.h"
|
| #include "chrome/browser/renderer_host/resource_dispatcher_host.h"
|
| +#include "net/base/mime_sniffer.h"
|
| +#include "net/base/io_buffer.h"
|
|
|
| namespace {
|
|
|
| +const int kMaxBytesToSniff = 512;
|
| +
|
| void RecordSnifferMetrics(bool sniffing_blocked,
|
| bool we_would_like_to_sniff,
|
| const std::string& mime_type) {
|
| @@ -71,13 +75,13 @@
|
|
|
| // We'll let the original event handler provide a buffer, and reuse it for
|
| // subsequent reads until we're done buffering.
|
| -bool BufferedResourceHandler::OnWillRead(int request_id,
|
| - char** buf, int* buf_size,
|
| - int min_size) {
|
| +bool BufferedResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf,
|
| + int* buf_size, int min_size) {
|
| if (buffering_) {
|
| - *buf = read_buffer_ + bytes_read_;
|
| - *buf_size = read_buffer_size_ - bytes_read_;
|
| - DCHECK(*buf_size > 0);
|
| + DCHECK(!my_buffer_.get());
|
| + my_buffer_ = new net::IOBuffer(kMaxBytesToSniff);
|
| + *buf = my_buffer_.get();
|
| + *buf_size = kMaxBytesToSniff;
|
| return true;
|
| }
|
|
|
| @@ -87,6 +91,7 @@
|
| bool ret = real_handler_->OnWillRead(request_id, buf, buf_size, min_size);
|
| read_buffer_ = *buf;
|
| read_buffer_size_ = *buf_size;
|
| + DCHECK(read_buffer_size_ >= kMaxBytesToSniff * 2);
|
| bytes_read_ = 0;
|
| return ret;
|
| }
|
| @@ -168,6 +173,12 @@
|
|
|
| bool BufferedResourceHandler::KeepBuffering(int bytes_read) {
|
| DCHECK(read_buffer_);
|
| + if (my_buffer_) {
|
| + // We are using our own buffer to read, update the main buffer.
|
| + CHECK(bytes_read + bytes_read_ < read_buffer_size_);
|
| + memcpy(read_buffer_->data() + bytes_read_, my_buffer_->data(), bytes_read);
|
| + my_buffer_ = NULL;
|
| + }
|
| bytes_read_ += bytes_read;
|
| finished_ = (bytes_read == 0);
|
|
|
| @@ -175,12 +186,12 @@
|
| std::string type_hint, new_type;
|
| request_->GetMimeType(&type_hint);
|
|
|
| - if (!net::SniffMimeType(read_buffer_, bytes_read_, request_->url(),
|
| - type_hint, &new_type)) {
|
| + if (!net::SniffMimeType(read_buffer_->data(), bytes_read_,
|
| + request_->url(), type_hint, &new_type)) {
|
| // SniffMimeType() returns false if there is not enough data to determine
|
| // the mime type. However, even if it returns false, it returns a new type
|
| // that is probably better than the current one.
|
| - DCHECK(bytes_read_ < 512 /*kMaxBytesToSniff*/);
|
| + DCHECK(bytes_read_ < kMaxBytesToSniff);
|
| if (!finished_) {
|
| buffering_ = true;
|
| return true;
|
| @@ -243,11 +254,11 @@
|
| if (bytes_read_) {
|
| // a Read has already occurred and we need to copy the data into the
|
| // EventHandler.
|
| - char *buf = NULL;
|
| + net::IOBuffer* buf = NULL;
|
| int buf_len = 0;
|
| download_handler->OnWillRead(request_id, &buf, &buf_len, bytes_read_);
|
| CHECK((buf_len >= bytes_read_) && (bytes_read_ >= 0));
|
| - memcpy(buf, read_buffer_, bytes_read_);
|
| + memcpy(buf->data(), read_buffer_->data(), bytes_read_);
|
| }
|
| // Update the renderer with the response headers which will cause it to
|
| // cancel the request.
|
|
|