Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(461)

Unified Diff: net/proxy/mojo_proxy_resolver_impl.cc

Issue 896203003: Implement utility-side proxy resolver Mojo service. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@proxy-diffbase
Patch Set: fix windows compile Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/proxy/mojo_proxy_resolver_impl.h ('k') | net/proxy/mojo_proxy_resolver_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/proxy/mojo_proxy_resolver_impl.cc
diff --git a/net/proxy/mojo_proxy_resolver_impl.cc b/net/proxy/mojo_proxy_resolver_impl.cc
new file mode 100644
index 0000000000000000000000000000000000000000..870f5d708db9818f5d9acce014f945ac237de8ff
--- /dev/null
+++ b/net/proxy/mojo_proxy_resolver_impl.cc
@@ -0,0 +1,156 @@
+// 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/mojo_proxy_resolver_impl.h"
+
+#include "base/stl_util.h"
+#include "mojo/common/common_type_converters.h"
+#include "net/base/net_errors.h"
+#include "net/base/net_log.h"
+#include "net/proxy/mojo_type_converters.h"
+#include "net/proxy/proxy_info.h"
+#include "net/proxy/proxy_resolver.h"
+#include "net/proxy/proxy_resolver_script_data.h"
+
+namespace net {
+
+class MojoProxyResolverImpl::Job : public mojo::ErrorHandler {
+ public:
+ Job(interfaces::ProxyResolverRequestClientPtr client,
+ MojoProxyResolverImpl* resolver,
+ const GURL& url);
+ ~Job() override;
+
+ void Start();
+
+ private:
+ // mojo::ErrorHandler override.
+ // This is invoked in response to the client disconnecting, indicating
+ // cancellation.
+ void OnConnectionError() override;
+
+ void GetProxyDone(int error);
+
+ MojoProxyResolverImpl* resolver_;
+
+ interfaces::ProxyResolverRequestClientPtr client_;
+ ProxyInfo result_;
+ GURL url_;
+ net::ProxyResolver::RequestHandle request_handle_;
+
+ DISALLOW_COPY_AND_ASSIGN(Job);
+};
+
+MojoProxyResolverImpl::MojoProxyResolverImpl(
+ scoped_ptr<net::ProxyResolver> resolver)
+ : resolver_(resolver.Pass()) {
+ DCHECK(resolver_->expects_pac_bytes());
+}
+
+MojoProxyResolverImpl::~MojoProxyResolverImpl() {
+ if (!set_pac_script_requests_.empty())
+ resolver_->CancelSetPacScript();
+ STLDeleteElements(&resolve_jobs_);
+}
+
+void MojoProxyResolverImpl::SetPacScript(
+ const mojo::String& data,
+ const mojo::Callback<void(int32_t)>& callback) {
+ DVLOG(1) << "SetPacScript(" << data << ")";
+ set_pac_script_requests_.push(
+ SetPacScriptRequest(ProxyResolverScriptData::FromUTF8(data), callback));
+ if (set_pac_script_requests_.size() == 1)
+ StartSetPacScript();
+}
+
+void MojoProxyResolverImpl::GetProxyForUrl(
+ const mojo::String& url,
+ interfaces::ProxyResolverRequestClientPtr client) {
+ DVLOG(1) << "GetProxyForUrl(" << url << ")";
+ Job* job = new Job(client.Pass(), this, url.To<GURL>());
+ bool inserted = resolve_jobs_.insert(job).second;
+ DCHECK(inserted);
+ job->Start();
+}
+
+void MojoProxyResolverImpl::DeleteJob(Job* job) {
+ size_t num_erased = resolve_jobs_.erase(job);
+ DCHECK(num_erased);
+ delete job;
+}
+
+void MojoProxyResolverImpl::StartSetPacScript() {
+ DCHECK(!set_pac_script_requests_.empty());
+ int result = resolver_->SetPacScript(
+ set_pac_script_requests_.front().script_data,
+ base::Bind(&MojoProxyResolverImpl::SetPacScriptDone,
+ base::Unretained(this)));
+ if (result != ERR_IO_PENDING)
+ SetPacScriptDone(result);
+}
+
+void MojoProxyResolverImpl::SetPacScriptDone(int result) {
+ DVLOG(1) << "SetPacScript finished with error " << result;
+ DCHECK(!set_pac_script_requests_.empty());
+ set_pac_script_requests_.front().callback.Run(result);
+ set_pac_script_requests_.pop();
+ if (!set_pac_script_requests_.empty())
+ StartSetPacScript();
+}
+
+MojoProxyResolverImpl::Job::Job(
+ interfaces::ProxyResolverRequestClientPtr client,
+ MojoProxyResolverImpl* resolver,
+ const GURL& url)
+ : resolver_(resolver),
+ client_(client.Pass()),
+ url_(url),
+ request_handle_(nullptr) {
+}
+
+MojoProxyResolverImpl::Job::~Job() {
+ if (request_handle_)
+ resolver_->resolver_->CancelRequest(request_handle_);
+}
+
+void MojoProxyResolverImpl::Job::Start() {
+ int result = resolver_->resolver_->GetProxyForURL(
+ url_, &result_, base::Bind(&Job::GetProxyDone, base::Unretained(this)),
+ &request_handle_, BoundNetLog());
+ if (result != ERR_IO_PENDING) {
+ GetProxyDone(result);
+ return;
+ }
+ client_.set_error_handler(this);
+}
+
+void MojoProxyResolverImpl::Job::GetProxyDone(int error) {
+ request_handle_ = nullptr;
+ DVLOG(1) << "GetProxyForUrl(" << url_ << ") finished with error " << error
+ << ". " << result_.proxy_list().size() << " Proxies returned:";
+ for (const auto& proxy : result_.proxy_list().GetAll()) {
+ DVLOG(1) << proxy.ToURI();
+ }
+ mojo::Array<interfaces::ProxyServerPtr> result;
+ if (error == OK) {
+ result = mojo::Array<interfaces::ProxyServerPtr>::From(
+ result_.proxy_list().GetAll());
+ }
+ client_->ReportResult(error, result.Pass());
+ resolver_->DeleteJob(this);
+}
+
+void MojoProxyResolverImpl::Job::OnConnectionError() {
+ resolver_->DeleteJob(this);
+}
+
+MojoProxyResolverImpl::SetPacScriptRequest::SetPacScriptRequest(
+ const scoped_refptr<ProxyResolverScriptData>& script_data,
+ const mojo::Callback<void(int32_t)>& callback)
+ : script_data(script_data), callback(callback) {
+}
+
+MojoProxyResolverImpl::SetPacScriptRequest::~SetPacScriptRequest() = default;
+
+} // namespace net
« no previous file with comments | « net/proxy/mojo_proxy_resolver_impl.h ('k') | net/proxy/mojo_proxy_resolver_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698