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

Side by Side 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: Use net::Error 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/proxy/mojo_proxy_resolver_impl.h"
6
7 #include "base/stl_util.h"
8 #include "mojo/common/common_type_converters.h"
9 #include "net/base/net_errors.h"
10 #include "net/base/net_log.h"
11 #include "net/proxy/mojo_type_converters.h"
12 #include "net/proxy/proxy_info.h"
13 #include "net/proxy/proxy_resolver.h"
14 #include "net/proxy/proxy_resolver_script_data.h"
15
16 namespace net {
17
18 class MojoProxyResolverImpl::Job : public mojo::ErrorHandler {
19 public:
20 Job(interfaces::ProxyResolverRequestClientPtr client,
21 MojoProxyResolverImpl* resolver,
22 const GURL& url);
23 ~Job() override;
24
25 void Start();
26
27 private:
28 // mojo::ErrorHandler override.
29 // This is invoked in response to the client disconnecting, indicating
30 // cancellation.
31 void OnConnectionError() override;
32
33 void GetProxyDone(int error);
34
35 MojoProxyResolverImpl* resolver_;
36
37 interfaces::ProxyResolverRequestClientPtr client_;
38 ProxyInfo result_;
39 GURL url_;
40 net::ProxyResolver::RequestHandle request_handle_;
41
42 DISALLOW_COPY_AND_ASSIGN(Job);
43 };
44
45 struct MojoProxyResolverImpl::SetPacScriptRequest {
46 public:
jamesr 2015/02/25 01:48:04 since you said "struct" the default visibility is
Sam McNally 2015/02/25 02:01:58 Done.
47 SetPacScriptRequest(const scoped_refptr<ProxyResolverScriptData>& script_data,
48 const mojo::Callback<void(int32_t)>& callback);
49
50 // The script data for this request.
51 scoped_refptr<ProxyResolverScriptData> script_data;
52
53 // The callback to run to report the result of this request.
54 const mojo::Callback<void(int32_t)> callback;
55 };
56
57 MojoProxyResolverImpl::MojoProxyResolverImpl(
58 scoped_ptr<net::ProxyResolver> resolver)
59 : resolver_(resolver.Pass()) {
60 DCHECK(resolver_->expects_pac_bytes());
61 }
62
63 MojoProxyResolverImpl::~MojoProxyResolverImpl() {
64 if (!set_pac_script_requests_.empty())
65 resolver_->CancelSetPacScript();
66 STLDeleteElements(&resolve_jobs_);
67 }
68
69 void MojoProxyResolverImpl::SetPacScript(
70 const mojo::String& data,
71 const mojo::Callback<void(int32_t)>& callback) {
72 DVLOG(1) << "SetPacScript(" << data << ")";
73 set_pac_script_requests_.push(
74 SetPacScriptRequest(ProxyResolverScriptData::FromUTF8(data), callback));
75 if (set_pac_script_requests_.size() == 1)
76 StartSetPacScript();
77 }
78
79 void MojoProxyResolverImpl::GetProxyForUrl(
80 const mojo::String& url,
81 interfaces::ProxyResolverRequestClientPtr client) {
82 DVLOG(1) << "GetProxyForUrl(" << url << ")";
83 Job* job = new Job(client.Pass(), this, url.To<GURL>());
84 bool inserted = resolve_jobs_.insert(job).second;
85 DCHECK(inserted);
86 job->Start();
87 }
88
89 void MojoProxyResolverImpl::DeleteJob(Job* job) {
90 size_t num_erased = resolve_jobs_.erase(job);
91 DCHECK(num_erased);
92 delete job;
93 }
94
95 void MojoProxyResolverImpl::StartSetPacScript() {
96 DCHECK(!set_pac_script_requests_.empty());
97 int result = resolver_->SetPacScript(
98 set_pac_script_requests_.front().script_data,
99 base::Bind(&MojoProxyResolverImpl::SetPacScriptDone,
100 base::Unretained(this)));
101 if (result != ERR_IO_PENDING)
102 SetPacScriptDone(result);
103 }
104
105 void MojoProxyResolverImpl::SetPacScriptDone(int result) {
106 DVLOG(1) << "SetPacScript finished with error " << result;
107 DCHECK(!set_pac_script_requests_.empty());
108 set_pac_script_requests_.front().callback.Run(result);
109 set_pac_script_requests_.pop();
110 if (!set_pac_script_requests_.empty())
111 StartSetPacScript();
112 }
113
114 MojoProxyResolverImpl::Job::Job(
115 interfaces::ProxyResolverRequestClientPtr client,
116 MojoProxyResolverImpl* resolver,
117 const GURL& url)
118 : resolver_(resolver),
119 client_(client.Pass()),
120 url_(url),
121 request_handle_(nullptr) {
122 }
123
124 MojoProxyResolverImpl::Job::~Job() {
125 if (request_handle_)
126 resolver_->resolver_->CancelRequest(request_handle_);
127 }
128
129 void MojoProxyResolverImpl::Job::Start() {
130 int result = resolver_->resolver_->GetProxyForURL(
131 url_, &result_, base::Bind(&Job::GetProxyDone, base::Unretained(this)),
132 &request_handle_, BoundNetLog());
133 if (result != ERR_IO_PENDING) {
134 GetProxyDone(result);
135 return;
136 }
137 client_.set_error_handler(this);
138 }
139
140 void MojoProxyResolverImpl::Job::GetProxyDone(int error) {
141 request_handle_ = nullptr;
142 DVLOG(1) << "GetProxyForUrl(" << url_ << ") finished with error " << error
143 << ". " << result_.proxy_list().size() << " Proxies returned:";
144 for (const auto& proxy : result_.proxy_list().GetAll()) {
145 DVLOG(1) << proxy.ToURI();
146 }
147 mojo::Array<interfaces::ProxyServerPtr> result;
148 if (error == OK) {
149 result = mojo::Array<interfaces::ProxyServerPtr>::From(
150 result_.proxy_list().GetAll());
151 }
152 client_->ReportResult(error, result.Pass());
153 resolver_->DeleteJob(this);
154 }
155
156 void MojoProxyResolverImpl::Job::OnConnectionError() {
157 resolver_->DeleteJob(this);
158 }
159
160 MojoProxyResolverImpl::SetPacScriptRequest::SetPacScriptRequest(
161 const scoped_refptr<ProxyResolverScriptData>& script_data,
162 const mojo::Callback<void(int32_t)>& callback)
163 : script_data(script_data), callback(callback) {
164 }
165
166 } // namespace net
OLDNEW
« 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