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