| Index: net/proxy/proxy_resolver_mojo.cc
|
| diff --git a/net/proxy/proxy_resolver_mojo.cc b/net/proxy/proxy_resolver_mojo.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c41d62c7f6b7ce160c1ff12c104bf13062d3a391
|
| --- /dev/null
|
| +++ b/net/proxy/proxy_resolver_mojo.cc
|
| @@ -0,0 +1,198 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "net/proxy/proxy_resolver_mojo.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/strings/string16.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "mojo/public/cpp/bindings/interface_ptr.h"
|
| +#include "net/base/address_list.h"
|
| +#include "net/base/completion_callback.h"
|
| +#include "net/base/load_states.h"
|
| +#include "net/base/net_errors.h"
|
| +#include "net/base/net_export.h"
|
| +#include "net/base/net_log.h"
|
| +#include "net/dns/single_request_host_resolver.h"
|
| +#include "net/proxy/proxy_info.h"
|
| +#include "net/proxy/proxy_resolver_script_data.h"
|
| +#include "url/gurl.h"
|
| +
|
| +namespace net {
|
| +
|
| +namespace {
|
| +
|
| +class Job : public mojo::InterfaceImpl<proxy::ResolveRequestClient> {
|
| + public:
|
| + Job(ProxyInfo* results,
|
| + const CompletionCallback& callback,
|
| + const BoundNetLog& net_log,
|
| + HostResolver* host_resolver);
|
| + ~Job() override;
|
| +
|
| + LoadState GetLoadState() const;
|
| +
|
| + private:
|
| + void ReportResult(const mojo::String& pac_string) override;
|
| + void ReportError(int32_t error) override;
|
| + void UpdateLoadState(int32_t load_state) override;
|
| +
|
| + void OnConnectionError() override;
|
| +
|
| + void ResolveHostDone(int32_t result);
|
| + ProxyInfo* results_;
|
| + CompletionCallback callback_;
|
| + BoundNetLog net_log_;
|
| +
|
| + SingleRequestHostResolver host_resolver_;
|
| +
|
| + bool host_resolve_in_progress_;
|
| + AddressList host_resolve_result_;
|
| + LoadState load_state_ = LOAD_STATE_RESOLVING_PROXY_FOR_URL;
|
| + mojo::Callback<void(int32_t, mojo::Array<mojo::String>)>
|
| + host_resolve_callback_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Job);
|
| +};
|
| +
|
| +Job::Job(ProxyInfo* results,
|
| + const CompletionCallback& callback,
|
| + const BoundNetLog& net_log,
|
| + HostResolver* host_resolver)
|
| + : results_(results),
|
| + callback_(callback),
|
| + net_log_(net_log),
|
| + host_resolver_(host_resolver) {
|
| +}
|
| +
|
| +Job::~Job() = default;
|
| +
|
| +LoadState Job::GetLoadState() const {
|
| + return load_state_;
|
| +}
|
| +
|
| +void Job::ReportResult(const mojo::String& pac_string) {
|
| + VLOG(1) << pac_string.To<std::string>();
|
| + results_->UsePacString(pac_string);
|
| + ReportError(0);
|
| +}
|
| +
|
| +void Job::ReportError(int32_t error) {
|
| + callback_.Run(error);
|
| + delete this;
|
| +}
|
| +
|
| +void Job::UpdateLoadState(int32_t load_state) {
|
| + load_state_ = static_cast<LoadState>(load_state);
|
| +}
|
| +
|
| +void Job::OnConnectionError() {
|
| + callback_.Run(ERR_FAILED);
|
| + delete this;
|
| +}
|
| +
|
| +void Job::ResolveHostDone(int32_t result) {
|
| + host_resolve_in_progress_ = false;
|
| + if (result != 0) {
|
| + host_resolve_callback_.Run(result, mojo::Array<mojo::String>());
|
| + return;
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +class ProxyResolverMojo::SetPacScriptJob
|
| + : public mojo::InterfaceImpl<proxy::SetPacScriptClient> {
|
| + public:
|
| + explicit SetPacScriptJob(const CompletionCallback& callback);
|
| + ~SetPacScriptJob() override;
|
| +
|
| + base::WeakPtr<SetPacScriptJob> GetWeakPtr();
|
| +
|
| + private:
|
| + void ReportResult(int32_t error) override;
|
| +
|
| + void OnConnectionError() override;
|
| +
|
| + CompletionCallback callback_;
|
| +
|
| + base::WeakPtrFactory<SetPacScriptJob> weak_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SetPacScriptJob);
|
| +};
|
| +
|
| +ProxyResolverMojo::ProxyResolverMojo(
|
| + mojo::InterfacePtr<proxy::Resolver> resolver,
|
| + HostResolver* host_resolver)
|
| + : ProxyResolver(true),
|
| + resolver_(resolver.Pass()),
|
| + host_resolver_(host_resolver) {
|
| + // XXX: Call SetResolver().
|
| +}
|
| +
|
| +ProxyResolverMojo::~ProxyResolverMojo() = default;
|
| +
|
| +int ProxyResolverMojo::GetProxyForURL(const GURL& url,
|
| + ProxyInfo* results,
|
| + const CompletionCallback& callback,
|
| + RequestHandle* request,
|
| + const BoundNetLog& net_log) {
|
| + VLOG(1) << "GetProxyForURL " << url;
|
| + mojo::InterfacePtr<proxy::ResolveRequestClient> handle;
|
| + *request = mojo::WeakBindToProxy(
|
| + new Job(results, callback, net_log, host_resolver_), &handle);
|
| + resolver_->GetProxyForUrl(url.spec(), handle.Pass());
|
| + return ERR_IO_PENDING;
|
| +}
|
| +
|
| +void ProxyResolverMojo::CancelRequest(RequestHandle request) {
|
| + delete static_cast<Job*>(request);
|
| +}
|
| +
|
| +LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const {
|
| + return static_cast<Job*>(request)->GetLoadState();
|
| +}
|
| +
|
| +void ProxyResolverMojo::CancelSetPacScript() {
|
| + if (set_pac_script_job_)
|
| + delete set_pac_script_job_.get();
|
| +}
|
| +
|
| +int ProxyResolverMojo::SetPacScript(
|
| + const scoped_refptr<ProxyResolverScriptData>& pac_script,
|
| + const CompletionCallback& callback) {
|
| + proxy::SetPacScriptClientPtr handle;
|
| + set_pac_script_job_ = mojo::WeakBindToProxy(new SetPacScriptJob(callback),
|
| + &handle)->GetWeakPtr();
|
| + VLOG(1) << "SetPacScript";
|
| + // XXX: Try to avoid converting between utf16 and utf8 and back to utf16.
|
| + resolver_->SetPacScript(base::UTF16ToUTF8(pac_script->utf16()),
|
| + handle.Pass());
|
| + return ERR_IO_PENDING;
|
| +}
|
| +
|
| +ProxyResolverMojo::SetPacScriptJob::SetPacScriptJob(
|
| + const CompletionCallback& callback)
|
| + : callback_(callback), weak_factory_(this) {
|
| +}
|
| +
|
| +ProxyResolverMojo::SetPacScriptJob::~SetPacScriptJob() = default;
|
| +
|
| +base::WeakPtr<ProxyResolverMojo::SetPacScriptJob>
|
| +ProxyResolverMojo::SetPacScriptJob::GetWeakPtr() {
|
| + return weak_factory_.GetWeakPtr();
|
| +}
|
| +
|
| +void ProxyResolverMojo::SetPacScriptJob::ReportResult(int32_t error) {
|
| + callback_.Run(error);
|
| + delete this;
|
| +}
|
| +
|
| +void ProxyResolverMojo::SetPacScriptJob::OnConnectionError() {
|
| + callback_.Run(ERR_FAILED);
|
| + delete this;
|
| +}
|
| +
|
| +} // namespace net
|
|
|