Index: net/url_request/url_request_job.cc |
diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc |
index 31a0d508e043eb0642936eeade8d7ad900d7407c..d2fa68577ea4e6452d34bdad65a7828d912d9b07 100644 |
--- a/net/url_request/url_request_job.cc |
+++ b/net/url_request/url_request_job.cc |
@@ -541,132 +541,124 @@ void URLRequestJob::DoneReadingRedirectResponse() { |
} |
void URLRequestJob::FilteredDataRead(int bytes_read) { |
- DCHECK(filter_.get()); // don't add data if there is no filter |
+ DCHECK(filter_); |
filter_->FlushStreamBuffer(bytes_read); |
} |
bool URLRequestJob::ReadFilteredData(int* bytes_read) { |
- DCHECK(filter_.get()); // don't add data if there is no filter |
- DCHECK(filtered_read_buffer_.get() != |
- NULL); // we need to have a buffer to fill |
- DCHECK_GT(filtered_read_buffer_len_, 0); // sanity check |
- DCHECK_LT(filtered_read_buffer_len_, 1000000); // sanity check |
- DCHECK(raw_read_buffer_.get() == |
- NULL); // there should be no raw read buffer yet |
+ DCHECK(filter_); |
+ DCHECK(filtered_read_buffer_); |
+ DCHECK_GT(filtered_read_buffer_len_, 0); |
+ DCHECK_LT(filtered_read_buffer_len_, 1000000); // Sanity check. |
+ DCHECK(!raw_read_buffer_); |
- bool rv = false; |
*bytes_read = 0; |
+ bool rv = false; |
- if (is_done()) |
- return true; |
- |
- 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); // Give data to filter. |
+ for (;;) { |
+ if (is_done()) |
+ return true; |
+ |
+ if (!filter_needs_more_output_space_ && !filter_->stream_data_len()) { |
+ // We don't have any raw data to work with, so read from the transaction. |
+ int filtered_data_read; |
+ if (ReadRawDataForFilter(&filtered_data_read)) { |
+ if (filtered_data_read > 0) { |
+ // Give data to filter. |
+ filter_->FlushStreamBuffer(filtered_data_read); |
+ } else { |
+ return true; // EOF. |
+ } |
} else { |
- return true; // EOF |
+ return false; // IO Pending (or error). |
} |
- } else { |
- return false; // IO Pending (or error) |
} |
- } |
- if ((filter_->stream_data_len() || filter_needs_more_output_space_) |
- && !is_done()) { |
- // Get filtered data. |
- int filtered_data_len = filtered_read_buffer_len_; |
- Filter::FilterStatus status; |
- int output_buffer_size = filtered_data_len; |
- status = filter_->ReadData(filtered_read_buffer_->data(), |
- &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: { |
+ if ((filter_->stream_data_len() || filter_needs_more_output_space_) && |
+ !is_done()) { |
+ // Get filtered data. |
+ int filtered_data_len = filtered_read_buffer_len_; |
+ int output_buffer_size = filtered_data_len; |
+ Filter::FilterStatus status = |
+ filter_->ReadData(filtered_read_buffer_->data(), &filtered_data_len); |
+ |
+ if (filter_needs_more_output_space_ && !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; |
- *bytes_read = filtered_data_len; |
- postfilter_bytes_read_ += filtered_data_len; |
- rv = true; |
- break; |
+ continue; |
} |
- 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 |
- // and filling up the output buffer. This leads to more complicated |
- // buffer management and data notification mechanisms. |
- // We can revisit this issue if there is a real perf need. |
- if (filtered_data_len > 0) { |
+ filter_needs_more_output_space_ = |
+ (filtered_data_len == output_buffer_size); |
+ |
+ switch (status) { |
+ case Filter::FILTER_DONE: { |
+ filter_needs_more_output_space_ = false; |
*bytes_read = filtered_data_len; |
postfilter_bytes_read_ += filtered_data_len; |
rv = true; |
- } else { |
- // Read again since we haven't received enough data yet (e.g., we may |
- // not have a complete gzip header yet) |
- rv = ReadFilteredData(bytes_read); |
+ break; |
+ } |
+ case Filter::FILTER_NEED_MORE_DATA: { |
+ // 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 |
+ // and filling up the output buffer. This leads to more complicated |
+ // buffer management and data notification mechanisms. |
+ // We can revisit this issue if there is a real perf need. |
+ if (filtered_data_len > 0) { |
+ *bytes_read = filtered_data_len; |
+ postfilter_bytes_read_ += filtered_data_len; |
+ rv = true; |
+ } else { |
+ // Read again since we haven't received enough data yet (e.g., we |
+ // may not have a complete gzip header yet). |
+ continue; |
+ } |
+ break; |
+ } |
+ case Filter::FILTER_OK: { |
+ *bytes_read = filtered_data_len; |
+ postfilter_bytes_read_ += filtered_data_len; |
+ rv = true; |
+ break; |
+ } |
+ case Filter::FILTER_ERROR: { |
+ DVLOG(1) << __FUNCTION__ << "() " |
+ << "\"" << (request_ ? request_->url().spec() : "???") |
+ << "\"" << " Filter Error"; |
+ filter_needs_more_output_space_ = false; |
+ NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, |
+ ERR_CONTENT_DECODING_FAILED)); |
+ rv = false; |
+ break; |
+ } |
+ default: { |
+ NOTREACHED(); |
+ filter_needs_more_output_space_ = false; |
+ rv = false; |
+ break; |
} |
- break; |
- } |
- case Filter::FILTER_OK: { |
- filter_needs_more_output_space_ = |
- (filtered_data_len == output_buffer_size); |
- *bytes_read = filtered_data_len; |
- postfilter_bytes_read_ += filtered_data_len; |
- rv = true; |
- break; |
- } |
- case Filter::FILTER_ERROR: { |
- DVLOG(1) << __FUNCTION__ << "() " |
- << "\"" << (request_ ? request_->url().spec() : "???") << "\"" |
- << " Filter Error"; |
- filter_needs_more_output_space_ = false; |
- NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, |
- ERR_CONTENT_DECODING_FAILED)); |
- rv = false; |
- break; |
} |
- default: { |
- NOTREACHED(); |
- filter_needs_more_output_space_ = false; |
- rv = false; |
- break; |
+ |
+ // If logging all bytes is enabled, log the filtered bytes read. |
+ if (rv && request() && request()->net_log().IsLoggingBytes() && |
+ filtered_data_len > 0) { |
+ request()->net_log().AddByteTransferEvent( |
+ NetLog::TYPE_URL_REQUEST_JOB_FILTERED_BYTES_READ, |
+ filtered_data_len, filtered_read_buffer_->data()); |
} |
+ } else { |
+ // we are done, or there is no data left. |
+ rv = true; |
} |
- DVLOG(2) << __FUNCTION__ << "() " |
- << "\"" << (request_ ? request_->url().spec() : "???") << "\"" |
- << " rv = " << rv |
- << " post bytes read = " << filtered_data_len |
- << " pre total = " << prefilter_bytes_read_ |
- << " post total = " |
- << postfilter_bytes_read_; |
- // If logging all bytes is enabled, log the filtered bytes read. |
- if (rv && request() && request()->net_log().IsLoggingBytes() && |
- filtered_data_len > 0) { |
- request()->net_log().AddByteTransferEvent( |
- NetLog::TYPE_URL_REQUEST_JOB_FILTERED_BYTES_READ, |
- filtered_data_len, filtered_read_buffer_->data()); |
- } |
- } else { |
- // we are done, or there is no data left. |
- rv = true; |
+ break; |
} |
if (rv) { |
- // When we successfully finished a read, we no longer need to |
- // save the caller's buffers. Release our reference. |
+ // When we successfully finished a read, we no longer need to save the |
+ // caller's buffers. Release our reference. |
filtered_read_buffer_ = NULL; |
filtered_read_buffer_len_ = 0; |
} |