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. |