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

Unified Diff: net/url_request/url_request_job.cc

Issue 28230: Make sure filter buffer is flushed after it fills its output quota... (Closed) Base URL: svn://chrome-svn/chrome/branches/release_154.next/src/
Patch Set: '' Created 11 years, 10 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
« no previous file with comments | « net/url_request/url_request_job.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/url_request/url_request_job.cc
===================================================================
--- net/url_request/url_request_job.cc (revision 10439)
+++ net/url_request/url_request_job.cc (working copy)
@@ -19,6 +19,7 @@
URLRequestJob::URLRequestJob(URLRequest* request)
: request_(request),
done_(false),
+ filter_needs_more_output_space_(false),
read_buffer_(NULL),
read_buffer_len_(0),
has_handled_response_(false),
@@ -163,14 +164,13 @@
if (is_done())
return true;
- if (!filter_->stream_data_len()) {
+ if (!filter_needs_more_output_space_ && !filter_->stream_data_len()) {
// We don't have any raw data to work with, so
// read from the socket.
-
int filtered_data_read;
if (ReadRawDataForFilter(&filtered_data_read)) {
if (filtered_data_read > 0) {
- filter_->FlushStreamBuffer(filtered_data_read);
+ filter_->FlushStreamBuffer(filtered_data_read); // Give data to filter.
} else {
return true; // EOF
}
@@ -179,18 +179,32 @@
}
}
- if (filter_->stream_data_len() && !is_done()) {
- // Get filtered data
+ if ((filter_->stream_data_len() || filter_needs_more_output_space_)
+ && !is_done()) {
+ // Get filtered data.
int filtered_data_len = read_buffer_len_;
Filter::FilterStatus status;
+ int output_buffer_size = filtered_data_len;
status = filter_->ReadData(read_buffer_, &filtered_data_len);
+
+ if (filter_needs_more_output_space_ && 0 == filtered_data_len) {
+ // filter_needs_more_output_space_ was mistaken... there are no more bytes
+ // and we should have at least tried to fill up the filter's input buffer.
+ // Correct the state, and try again.
+ filter_needs_more_output_space_ = false;
+ return ReadFilteredData(bytes_read);
+ }
+
switch (status) {
case Filter::FILTER_DONE: {
+ filter_needs_more_output_space_ = false;
*bytes_read = filtered_data_len;
rv = true;
break;
}
case Filter::FILTER_NEED_MORE_DATA: {
+ filter_needs_more_output_space_ =
+ (filtered_data_len == output_buffer_size);
// We have finished filtering all data currently in the buffer.
// There might be some space left in the output buffer. One can
// consider reading more data from the stream to feed the filter
@@ -208,11 +222,14 @@
break;
}
case Filter::FILTER_OK: {
+ filter_needs_more_output_space_ =
+ (filtered_data_len == output_buffer_size);
*bytes_read = filtered_data_len;
rv = true;
break;
}
case Filter::FILTER_ERROR: {
+ filter_needs_more_output_space_ = false;
// TODO: Figure out a better error code.
NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, net::ERR_FAILED));
rv = false;
@@ -220,6 +237,7 @@
}
default: {
NOTREACHED();
+ filter_needs_more_output_space_ = false;
rv = false;
break;
}
« no previous file with comments | « net/url_request/url_request_job.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698