1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/component_updater/test/url_request_post_interceptor.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/file_util.h"
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/stringprintf.h"
9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/test/test_browser_thread.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/base/upload_bytes_element_reader.h"
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "net/url_request/url_request.h"
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "net/url_request/url_request_filter.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/url_request/url_request_job_factory.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/url_request/url_request_simple_job.h"
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "net/url_request/url_request_test_util.h"
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing content::BrowserThread;
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace component_updater {
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Returns a canned response.
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class URLRequestMockJob : public net::URLRequestSimpleJob {
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  URLRequestMockJob(net::URLRequest* request,
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    net::NetworkDelegate* network_delegate,
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    const std::string& response)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : net::URLRequestSimpleJob(request, network_delegate),
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        response_(response) {}
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected:
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual int GetResponseCode() const OVERRIDE {
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return 200;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual int GetData(std::string* mime_type,
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      std::string* charset,
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      std::string* data,
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      const net::CompletionCallback& callback) const OVERRIDE {
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    mime_type->assign("text/plain");
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    charset->assign("US-ASCII");
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    data->assign(response_);
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return net::OK;
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~URLRequestMockJob() {}
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string response_;
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(URLRequestMockJob);
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)URLRequestPostInterceptor::URLRequestPostInterceptor(const GURL& url)
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : url_(url), hit_count_(0) {}
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochURLRequestPostInterceptor::~URLRequestPostInterceptor() {
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ClearExpectations();
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void URLRequestPostInterceptor::ClearExpectations() {
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  while (!expectations_.empty()) {
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Expectation expectation(expectations_.front());
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delete expectation.first;
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    expectations_.pop();
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GURL URLRequestPostInterceptor::GetUrl() const {
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return url_;
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool URLRequestPostInterceptor::ExpectRequest(
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    class RequestMatcher* request_matcher) {
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  expectations_.push(std::make_pair(request_matcher, ""));
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool URLRequestPostInterceptor::ExpectRequest(
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    class RequestMatcher* request_matcher,
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::FilePath& filepath) {
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string response;
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (filepath.empty() || !base::ReadFileToString(filepath, &response))
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  expectations_.push(std::make_pair(request_matcher, response));
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int URLRequestPostInterceptor::GetHitCount() const {
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::AutoLock auto_lock(interceptor_lock_);
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return hit_count_;
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int URLRequestPostInterceptor::GetCount() const {
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::AutoLock auto_lock(interceptor_lock_);
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return static_cast<int>(requests_.size());
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)std::vector<std::string>
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)URLRequestPostInterceptor::GetRequests() const {
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AutoLock auto_lock(interceptor_lock_);
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return requests_;
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)std::string URLRequestPostInterceptor::GetRequestsAsString() const {
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<std::string> requests(GetRequests());
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string s = "Requests are:";
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int i = 0;
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (std::vector<std::string>::const_iterator it = requests.begin();
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      it != requests.end(); ++it) {
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    s.append(base::StringPrintf("\n  (%d): %s", ++i, it->c_str()));
113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return s;
116ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void URLRequestPostInterceptor::Reset() {
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::AutoLock auto_lock(interceptor_lock_);
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  hit_count_ = 0;
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  requests_.clear();
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ClearExpectations();
123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
124ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class URLRequestPostInterceptor::Delegate
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : public net::URLRequestJobFactory::ProtocolHandler {
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Delegate(const std::string& scheme, const std::string& hostname)
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : scheme_(scheme), hostname_(hostname) {}
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Register() {
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    net::URLRequestFilter::GetInstance()->AddHostnameProtocolHandler(
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        scheme_, hostname_,
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(this));
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Unregister() {
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (InterceptorMap::iterator it = interceptors_.begin();
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        it != interceptors_.end(); ++it)
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      delete (*it).second;
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    net::URLRequestFilter::GetInstance()->
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      RemoveHostnameHandler(scheme_, hostname_);
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void OnCreateInterceptor(URLRequestPostInterceptor* interceptor) {
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CHECK(interceptors_.find(interceptor->GetUrl()) == interceptors_.end());
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    interceptors_.insert(std::make_pair(interceptor->GetUrl(), interceptor));
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~Delegate() {}
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual net::URLRequestJob* MaybeCreateJob(
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      net::URLRequest* request,
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      net::NetworkDelegate* network_delegate) const OVERRIDE {
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Only intercepts POST.
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!request->has_upload())
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return NULL;
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GURL url = request->url();
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (url.has_query()) {
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GURL::Replacements replacements;
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      replacements.ClearQuery();
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      url = url.ReplaceComponents(replacements);
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InterceptorMap::const_iterator it(interceptors_.find(url));
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (it == interceptors_.end())
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return NULL;
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // There is an interceptor hooked up for this url. Read the request body,
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // check the existing expectations, and handle the matching case by
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // popping the expectation off the queue, counting the match, and
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // returning a mock object to serve the canned response.
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    URLRequestPostInterceptor* interceptor(it->second);
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const net::UploadDataStream* stream = request->get_upload();
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const net::UploadBytesElementReader* reader =
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        stream->element_readers()[0]->AsBytesReader();
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const int size = reader->length();
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(size));
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string request_body(reader->bytes());
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::AutoLock auto_lock(interceptor->interceptor_lock_);
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      interceptor->requests_.push_back(request_body);
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (interceptor->expectations_.empty())
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return NULL;
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const URLRequestPostInterceptor::Expectation& expectation(
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          interceptor->expectations_.front());
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (expectation.first->Match(request_body)) {
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        const std::string response(expectation.second);
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        delete expectation.first;
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        interceptor->expectations_.pop();
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        ++interceptor->hit_count_;
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return new URLRequestMockJob(request, network_delegate, response);
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return NULL;
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef std::map<GURL, URLRequestPostInterceptor*> InterceptorMap;
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InterceptorMap interceptors_;
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string scheme_;
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string hostname_;
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Delegate);
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)URLRequestPostInterceptorFactory::URLRequestPostInterceptorFactory(
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& scheme,
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& hostname)
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : scheme_(scheme),
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      hostname_(hostname),
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      delegate_(new URLRequestPostInterceptor::Delegate(scheme, hostname)) {
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BrowserThread::PostTask(
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      BrowserThread::IO, FROM_HERE,
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&URLRequestPostInterceptor::Delegate::Register,
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(delegate_)));
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)URLRequestPostInterceptorFactory::~URLRequestPostInterceptorFactory() {
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BrowserThread::PostTask(
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      BrowserThread::IO, FROM_HERE,
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&URLRequestPostInterceptor::Delegate::Unregister,
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(delegate_)));
237ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)URLRequestPostInterceptor* URLRequestPostInterceptorFactory::CreateInterceptor(
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::FilePath& filepath) {
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const GURL base_url(base::StringPrintf("%s://%s",
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                         scheme_.c_str(),
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                         hostname_.c_str()));
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL absolute_url(base_url.Resolve(filepath.MaybeAsASCII()));
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  URLRequestPostInterceptor* interceptor(
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new URLRequestPostInterceptor(absolute_url));
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool res = BrowserThread::PostTask(
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      BrowserThread::IO, FROM_HERE,
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&URLRequestPostInterceptor::Delegate::OnCreateInterceptor,
250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(delegate_),
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(interceptor)));
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!res) {
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delete interceptor;
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return NULL;
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return interceptor;
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace component_updater
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
262