| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/url_request/url_request_job.h" | 5 #include "net/url_request/url_request_job.h" |
| 6 | 6 |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "googleurl/src/gurl.h" | 9 #include "googleurl/src/gurl.h" |
| 10 #include "net/base/auth.h" | 10 #include "net/base/auth.h" |
| 11 #include "net/base/net_errors.h" | 11 #include "net/base/net_errors.h" |
| 12 #include "net/url_request/url_request.h" | 12 #include "net/url_request/url_request.h" |
| 13 #include "net/url_request/url_request_job_metrics.h" | 13 #include "net/url_request/url_request_job_metrics.h" |
| 14 #include "net/url_request/url_request_job_tracker.h" | 14 #include "net/url_request/url_request_job_tracker.h" |
| 15 | 15 |
| 16 // Buffer size allocated when de-compressing data. | 16 // Buffer size allocated when de-compressing data. |
| 17 static const int kFilterBufSize = 32 * 1024; | 17 static const int kFilterBufSize = 32 * 1024; |
| 18 | 18 |
| 19 URLRequestJob::URLRequestJob(URLRequest* request) | 19 URLRequestJob::URLRequestJob(URLRequest* request) |
| 20 : request_(request), | 20 : request_(request), |
| 21 done_(false), | 21 done_(false), |
| 22 filter_needs_more_output_space_(false), |
| 22 read_buffer_(NULL), | 23 read_buffer_(NULL), |
| 23 read_buffer_len_(0), | 24 read_buffer_len_(0), |
| 24 has_handled_response_(false), | 25 has_handled_response_(false), |
| 25 expected_content_size_(-1) { | 26 expected_content_size_(-1) { |
| 26 is_profiling_ = request->enable_profiling(); | 27 is_profiling_ = request->enable_profiling(); |
| 27 if (is_profiling()) { | 28 if (is_profiling()) { |
| 28 metrics_.reset(new URLRequestJobMetrics()); | 29 metrics_.reset(new URLRequestJobMetrics()); |
| 29 metrics_->start_time_ = TimeTicks::Now(); | 30 metrics_->start_time_ = TimeTicks::Now(); |
| 30 } | 31 } |
| 31 g_url_request_job_tracker.AddNewJob(this); | 32 g_url_request_job_tracker.AddNewJob(this); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 DCHECK(read_buffer_ != NULL); // we need to have a buffer to fill | 157 DCHECK(read_buffer_ != NULL); // we need to have a buffer to fill |
| 157 DCHECK(read_buffer_len_ > 0); // sanity check | 158 DCHECK(read_buffer_len_ > 0); // sanity check |
| 158 DCHECK(read_buffer_len_ < 1000000); // sanity check | 159 DCHECK(read_buffer_len_ < 1000000); // sanity check |
| 159 | 160 |
| 160 bool rv = false; | 161 bool rv = false; |
| 161 *bytes_read = 0; | 162 *bytes_read = 0; |
| 162 | 163 |
| 163 if (is_done()) | 164 if (is_done()) |
| 164 return true; | 165 return true; |
| 165 | 166 |
| 166 if (!filter_->stream_data_len()) { | 167 if (!filter_needs_more_output_space_ && !filter_->stream_data_len()) { |
| 167 // We don't have any raw data to work with, so | 168 // We don't have any raw data to work with, so |
| 168 // read from the socket. | 169 // read from the socket. |
| 169 | |
| 170 int filtered_data_read; | 170 int filtered_data_read; |
| 171 if (ReadRawDataForFilter(&filtered_data_read)) { | 171 if (ReadRawDataForFilter(&filtered_data_read)) { |
| 172 if (filtered_data_read > 0) { | 172 if (filtered_data_read > 0) { |
| 173 filter_->FlushStreamBuffer(filtered_data_read); | 173 filter_->FlushStreamBuffer(filtered_data_read); // Give data to filter. |
| 174 } else { | 174 } else { |
| 175 return true; // EOF | 175 return true; // EOF |
| 176 } | 176 } |
| 177 } else { | 177 } else { |
| 178 return false; // IO Pending (or error) | 178 return false; // IO Pending (or error) |
| 179 } | 179 } |
| 180 } | 180 } |
| 181 | 181 |
| 182 if (filter_->stream_data_len() && !is_done()) { | 182 if ((filter_->stream_data_len() || filter_needs_more_output_space_) |
| 183 // Get filtered data | 183 && !is_done()) { |
| 184 // Get filtered data. |
| 184 int filtered_data_len = read_buffer_len_; | 185 int filtered_data_len = read_buffer_len_; |
| 185 Filter::FilterStatus status; | 186 Filter::FilterStatus status; |
| 187 int output_buffer_size = filtered_data_len; |
| 186 status = filter_->ReadData(read_buffer_, &filtered_data_len); | 188 status = filter_->ReadData(read_buffer_, &filtered_data_len); |
| 189 |
| 190 if (filter_needs_more_output_space_ && 0 == filtered_data_len) { |
| 191 // filter_needs_more_output_space_ was mistaken... there are no more bytes |
| 192 // and we should have at least tried to fill up the filter's input buffer. |
| 193 // Correct the state, and try again. |
| 194 filter_needs_more_output_space_ = false; |
| 195 return ReadFilteredData(bytes_read); |
| 196 } |
| 197 |
| 187 switch (status) { | 198 switch (status) { |
| 188 case Filter::FILTER_DONE: { | 199 case Filter::FILTER_DONE: { |
| 200 filter_needs_more_output_space_ = false; |
| 189 *bytes_read = filtered_data_len; | 201 *bytes_read = filtered_data_len; |
| 190 rv = true; | 202 rv = true; |
| 191 break; | 203 break; |
| 192 } | 204 } |
| 193 case Filter::FILTER_NEED_MORE_DATA: { | 205 case Filter::FILTER_NEED_MORE_DATA: { |
| 206 filter_needs_more_output_space_ = |
| 207 (filtered_data_len == output_buffer_size); |
| 194 // We have finished filtering all data currently in the buffer. | 208 // We have finished filtering all data currently in the buffer. |
| 195 // There might be some space left in the output buffer. One can | 209 // There might be some space left in the output buffer. One can |
| 196 // consider reading more data from the stream to feed the filter | 210 // consider reading more data from the stream to feed the filter |
| 197 // and filling up the output buffer. This leads to more complicated | 211 // and filling up the output buffer. This leads to more complicated |
| 198 // buffer management and data notification mechanisms. | 212 // buffer management and data notification mechanisms. |
| 199 // We can revisit this issue if there is a real perf need. | 213 // We can revisit this issue if there is a real perf need. |
| 200 if (filtered_data_len > 0) { | 214 if (filtered_data_len > 0) { |
| 201 *bytes_read = filtered_data_len; | 215 *bytes_read = filtered_data_len; |
| 202 rv = true; | 216 rv = true; |
| 203 } else { | 217 } else { |
| 204 // Read again since we haven't received enough data yet (e.g., we may | 218 // Read again since we haven't received enough data yet (e.g., we may |
| 205 // not have a complete gzip header yet) | 219 // not have a complete gzip header yet) |
| 206 rv = ReadFilteredData(bytes_read); | 220 rv = ReadFilteredData(bytes_read); |
| 207 } | 221 } |
| 208 break; | 222 break; |
| 209 } | 223 } |
| 210 case Filter::FILTER_OK: { | 224 case Filter::FILTER_OK: { |
| 225 filter_needs_more_output_space_ = |
| 226 (filtered_data_len == output_buffer_size); |
| 211 *bytes_read = filtered_data_len; | 227 *bytes_read = filtered_data_len; |
| 212 rv = true; | 228 rv = true; |
| 213 break; | 229 break; |
| 214 } | 230 } |
| 215 case Filter::FILTER_ERROR: { | 231 case Filter::FILTER_ERROR: { |
| 232 filter_needs_more_output_space_ = false; |
| 216 // TODO: Figure out a better error code. | 233 // TODO: Figure out a better error code. |
| 217 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, net::ERR_FAILED)); | 234 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, net::ERR_FAILED)); |
| 218 rv = false; | 235 rv = false; |
| 219 break; | 236 break; |
| 220 } | 237 } |
| 221 default: { | 238 default: { |
| 222 NOTREACHED(); | 239 NOTREACHED(); |
| 240 filter_needs_more_output_space_ = false; |
| 223 rv = false; | 241 rv = false; |
| 224 break; | 242 break; |
| 225 } | 243 } |
| 226 } | 244 } |
| 227 } else { | 245 } else { |
| 228 // we are done, or there is no data left. | 246 // we are done, or there is no data left. |
| 229 rv = true; | 247 rv = true; |
| 230 } | 248 } |
| 231 | 249 |
| 232 if (rv) { | 250 if (rv) { |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 // If the request is gone, we must be cancelled. | 515 // If the request is gone, we must be cancelled. |
| 498 return URLRequestStatus(URLRequestStatus::CANCELED, | 516 return URLRequestStatus(URLRequestStatus::CANCELED, |
| 499 net::ERR_ABORTED); | 517 net::ERR_ABORTED); |
| 500 } | 518 } |
| 501 | 519 |
| 502 void URLRequestJob::SetStatus(const URLRequestStatus &status) { | 520 void URLRequestJob::SetStatus(const URLRequestStatus &status) { |
| 503 if (request_) | 521 if (request_) |
| 504 request_->set_status(status); | 522 request_->set_status(status); |
| 505 } | 523 } |
| 506 | 524 |
| OLD | NEW |