| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/appcache/appcache_update_job.h" | 5 #include "content/browser/appcache/appcache_update_job.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 request_->SetLoadFlags(request_->load_flags() | net::LOAD_BYPASS_CACHE); | 167 request_->SetLoadFlags(request_->load_flags() | net::LOAD_BYPASS_CACHE); |
| 168 else if (existing_response_headers_.get()) | 168 else if (existing_response_headers_.get()) |
| 169 AddConditionalHeaders(existing_response_headers_.get()); | 169 AddConditionalHeaders(existing_response_headers_.get()); |
| 170 request_->Start(); | 170 request_->Start(); |
| 171 } | 171 } |
| 172 | 172 |
| 173 void AppCacheUpdateJob::URLFetcher::OnReceivedRedirect( | 173 void AppCacheUpdateJob::URLFetcher::OnReceivedRedirect( |
| 174 net::URLRequest* request, | 174 net::URLRequest* request, |
| 175 const net::RedirectInfo& redirect_info, | 175 const net::RedirectInfo& redirect_info, |
| 176 bool* defer_redirect) { | 176 bool* defer_redirect) { |
| 177 DCHECK(request_ == request); | 177 DCHECK_EQ(request_.get(), request); |
| 178 // Redirect is not allowed by the update process. | 178 // Redirect is not allowed by the update process. |
| 179 job_->MadeProgress(); | 179 job_->MadeProgress(); |
| 180 redirect_response_code_ = request->GetResponseCode(); | 180 redirect_response_code_ = request->GetResponseCode(); |
| 181 request->Cancel(); | 181 request->Cancel(); |
| 182 result_ = REDIRECT_ERROR; | 182 result_ = REDIRECT_ERROR; |
| 183 OnResponseCompleted(); | 183 OnResponseCompleted(); |
| 184 } | 184 } |
| 185 | 185 |
| 186 void AppCacheUpdateJob::URLFetcher::OnResponseStarted( | 186 void AppCacheUpdateJob::URLFetcher::OnResponseStarted( |
| 187 net::URLRequest *request) { | 187 net::URLRequest *request) { |
| 188 DCHECK(request == request_); | 188 DCHECK_EQ(request_.get(), request); |
| 189 int response_code = -1; | 189 int response_code = -1; |
| 190 if (request->status().is_success()) { | 190 if (request->status().is_success()) { |
| 191 response_code = request->GetResponseCode(); | 191 response_code = request->GetResponseCode(); |
| 192 job_->MadeProgress(); | 192 job_->MadeProgress(); |
| 193 } | 193 } |
| 194 | 194 |
| 195 if ((response_code / 100) != 2) { | 195 if ((response_code / 100) != 2) { |
| 196 if (response_code > 0) | 196 if (response_code > 0) |
| 197 result_ = SERVER_ERROR; | 197 result_ = SERVER_ERROR; |
| 198 else | 198 else |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 response_writer_->WriteInfo( | 237 response_writer_->WriteInfo( |
| 238 io_buffer.get(), | 238 io_buffer.get(), |
| 239 base::Bind(&URLFetcher::OnWriteComplete, base::Unretained(this))); | 239 base::Bind(&URLFetcher::OnWriteComplete, base::Unretained(this))); |
| 240 } else { | 240 } else { |
| 241 ReadResponseData(); | 241 ReadResponseData(); |
| 242 } | 242 } |
| 243 } | 243 } |
| 244 | 244 |
| 245 void AppCacheUpdateJob::URLFetcher::OnReadCompleted( | 245 void AppCacheUpdateJob::URLFetcher::OnReadCompleted( |
| 246 net::URLRequest* request, int bytes_read) { | 246 net::URLRequest* request, int bytes_read) { |
| 247 DCHECK(request_ == request); | 247 DCHECK_EQ(request_.get(), request); |
| 248 bool data_consumed = true; | 248 bool data_consumed = true; |
| 249 if (request->status().is_success() && bytes_read > 0) { | 249 if (request->status().is_success() && bytes_read > 0) { |
| 250 job_->MadeProgress(); | 250 job_->MadeProgress(); |
| 251 data_consumed = ConsumeResponseData(bytes_read); | 251 data_consumed = ConsumeResponseData(bytes_read); |
| 252 if (data_consumed) { | 252 if (data_consumed) { |
| 253 bytes_read = 0; | 253 bytes_read = 0; |
| 254 while (request->Read(buffer_.get(), kBufferSize, &bytes_read)) { | 254 while (request->Read(buffer_.get(), kBufferSize, &bytes_read)) { |
| 255 if (bytes_read > 0) { | 255 if (bytes_read > 0) { |
| 256 data_consumed = ConsumeResponseData(bytes_read); | 256 data_consumed = ConsumeResponseData(bytes_read); |
| 257 if (!data_consumed) | 257 if (!data_consumed) |
| 258 break; // wait for async data processing, then read more | 258 break; // wait for async data processing, then read more |
| 259 } else { | 259 } else { |
| 260 break; | 260 break; |
| 261 } | 261 } |
| 262 } | 262 } |
| 263 } | 263 } |
| 264 } | 264 } |
| 265 if (data_consumed && !request->status().is_io_pending()) { | 265 if (data_consumed && !request->status().is_io_pending()) { |
| 266 DCHECK_EQ(UPDATE_OK, result_); | 266 DCHECK_EQ(UPDATE_OK, result_); |
| 267 OnResponseCompleted(); | 267 OnResponseCompleted(); |
| 268 } | 268 } |
| 269 } | 269 } |
| 270 | 270 |
| 271 void AppCacheUpdateJob::URLFetcher::AddConditionalHeaders( | 271 void AppCacheUpdateJob::URLFetcher::AddConditionalHeaders( |
| 272 const net::HttpResponseHeaders* headers) { | 272 const net::HttpResponseHeaders* headers) { |
| 273 DCHECK(request_.get() && headers); | 273 DCHECK(request_); |
| 274 DCHECK(headers); |
| 274 net::HttpRequestHeaders extra_headers; | 275 net::HttpRequestHeaders extra_headers; |
| 275 | 276 |
| 276 // Add If-Modified-Since header if response info has Last-Modified header. | 277 // Add If-Modified-Since header if response info has Last-Modified header. |
| 277 const std::string last_modified = "Last-Modified"; | 278 const std::string last_modified = "Last-Modified"; |
| 278 std::string last_modified_value; | 279 std::string last_modified_value; |
| 279 headers->EnumerateHeader(NULL, last_modified, &last_modified_value); | 280 headers->EnumerateHeader(NULL, last_modified, &last_modified_value); |
| 280 if (!last_modified_value.empty()) { | 281 if (!last_modified_value.empty()) { |
| 281 extra_headers.SetHeader(net::HttpRequestHeaders::kIfModifiedSince, | 282 extra_headers.SetHeader(net::HttpRequestHeaders::kIfModifiedSince, |
| 282 last_modified_value); | 283 last_modified_value); |
| 283 } | 284 } |
| (...skipping 1414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1698 // on this object after we've posted a task to delete ourselves. | 1699 // on this object after we've posted a task to delete ourselves. |
| 1699 if (group_) { | 1700 if (group_) { |
| 1700 group_->SetUpdateAppCacheStatus(AppCacheGroup::IDLE); | 1701 group_->SetUpdateAppCacheStatus(AppCacheGroup::IDLE); |
| 1701 group_ = NULL; | 1702 group_ = NULL; |
| 1702 } | 1703 } |
| 1703 | 1704 |
| 1704 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); | 1705 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
| 1705 } | 1706 } |
| 1706 | 1707 |
| 1707 } // namespace content | 1708 } // namespace content |
| OLD | NEW |