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