view_http_cache_job_factory.cc revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/view_http_cache_job_factory.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_errors.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_context.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_simple_job.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/view_cache_helper.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A job subclass that dumps an HTTP cache entry. 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ViewHttpCacheJob : public URLRequestJob { 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit ViewHttpCacheJob(URLRequest* request) 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : URLRequestJob(request), data_offset_(0), 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ALLOW_THIS_IN_INITIALIZER_LIST( 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch callback_(this, &ViewHttpCacheJob::OnIOComplete)) {} 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Start(); 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool GetMimeType(std::string* mime_type) const; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool GetCharset(std::string* charset); 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool ReadRawData(net::IOBuffer* buf, int buf_size, int *bytes_read); 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~ViewHttpCacheJob() {} 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when ViewCacheHelper completes the operation. 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnIOComplete(int result); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string data_; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int data_offset_; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::ViewCacheHelper cache_helper_; 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::CompletionCallbackImpl<ViewHttpCacheJob> callback_; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ViewHttpCacheJob::Start() { 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!request_) 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string cache_key = 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request_->url().spec().substr(strlen(chrome::kNetworkViewCacheURL)); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv; 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (cache_key.empty()) { 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = cache_helper_.GetContentsHTML(request_->context(), 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chrome::kNetworkViewCacheURL, &data_, 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &callback_); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = cache_helper_.GetEntryInfoHTML(cache_key, request_->context(), 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &data_, &callback_); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (rv != net::ERR_IO_PENDING) { 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start reading asynchronously so that all error reporting and data 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // callbacks happen as they would for network requests. 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, &ViewHttpCacheJob::OnIOComplete, rv)); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ViewHttpCacheJob::GetMimeType(std::string* mime_type) const { 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mime_type->assign("text/html"); 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ViewHttpCacheJob::GetCharset(std::string* charset) { 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch charset->assign("UTF-8"); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ViewHttpCacheJob::ReadRawData(net::IOBuffer* buf, int buf_size, 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int* bytes_read) { 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(bytes_read); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int remaining = static_cast<int>(data_.size()) - data_offset_; 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (buf_size > remaining) 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch buf_size = remaining; 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch memcpy(buf->data(), data_.data() + data_offset_, buf_size); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data_offset_ += buf_size; 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *bytes_read = buf_size; 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ViewHttpCacheJob::OnIOComplete(int result) { 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_EQ(net::OK, result); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notify that the headers are complete. 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotifyHeadersComplete(); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace. 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Static. 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ViewHttpCacheJobFactory::IsSupportedURL(const GURL& url) { 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return StartsWithASCII(url.spec(), chrome::kNetworkViewCacheURL, 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch true /*case_sensitive*/); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Static. 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochURLRequestJob* ViewHttpCacheJobFactory::CreateJobForRequest( 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLRequest* request) { 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return new ViewHttpCacheJob(request); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 109