OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/proxy/mojo_proxy_resolver_impl.h" | 5 #include "net/proxy/mojo_proxy_resolver_impl.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "mojo/common/url_type_converters.h" | 8 #include "mojo/common/url_type_converters.h" |
9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
10 #include "net/log/net_log.h" | 10 #include "net/log/net_log.h" |
11 #include "net/proxy/load_state_change_coalescer.h" | |
12 #include "net/proxy/mojo_proxy_type_converters.h" | 11 #include "net/proxy/mojo_proxy_type_converters.h" |
13 #include "net/proxy/proxy_info.h" | 12 #include "net/proxy/proxy_info.h" |
14 #include "net/proxy/proxy_resolver_script_data.h" | 13 #include "net/proxy/proxy_resolver_script_data.h" |
15 | 14 |
16 namespace net { | 15 namespace net { |
17 namespace { | |
18 const int kLoadStateChangeCoalesceTimeoutMilliseconds = 10; | |
19 } | |
20 | 16 |
21 class MojoProxyResolverImpl::Job : public mojo::ErrorHandler { | 17 class MojoProxyResolverImpl::Job : public mojo::ErrorHandler { |
22 public: | 18 public: |
23 Job(interfaces::ProxyResolverRequestClientPtr client, | 19 Job(interfaces::ProxyResolverRequestClientPtr client, |
24 MojoProxyResolverImpl* resolver, | 20 MojoProxyResolverImpl* resolver, |
25 const GURL& url); | 21 const GURL& url); |
26 ~Job() override; | 22 ~Job() override; |
27 | 23 |
28 void Start(); | 24 void Start(); |
29 | 25 |
30 // Invoked when the LoadState for this job changes. | |
31 void LoadStateChanged(LoadState load_state); | |
32 | |
33 net::ProxyResolver::RequestHandle request_handle() { return request_handle_; } | 26 net::ProxyResolver::RequestHandle request_handle() { return request_handle_; } |
34 | 27 |
35 private: | 28 private: |
36 // mojo::ErrorHandler override. | 29 // mojo::ErrorHandler override. |
37 // This is invoked in response to the client disconnecting, indicating | 30 // This is invoked in response to the client disconnecting, indicating |
38 // cancellation. | 31 // cancellation. |
39 void OnConnectionError() override; | 32 void OnConnectionError() override; |
40 | 33 |
41 void GetProxyDone(int error); | 34 void GetProxyDone(int error); |
42 | 35 |
43 void SendLoadStateChanged(LoadState load_state); | |
44 | |
45 MojoProxyResolverImpl* resolver_; | 36 MojoProxyResolverImpl* resolver_; |
46 | 37 |
47 interfaces::ProxyResolverRequestClientPtr client_; | 38 interfaces::ProxyResolverRequestClientPtr client_; |
48 ProxyInfo result_; | 39 ProxyInfo result_; |
49 GURL url_; | 40 GURL url_; |
50 net::ProxyResolver::RequestHandle request_handle_; | 41 net::ProxyResolver::RequestHandle request_handle_; |
51 bool done_; | 42 bool done_; |
52 LoadStateChangeCoalescer load_state_change_coalescer_; | |
53 | 43 |
54 DISALLOW_COPY_AND_ASSIGN(Job); | 44 DISALLOW_COPY_AND_ASSIGN(Job); |
55 }; | 45 }; |
56 | 46 |
57 MojoProxyResolverImpl::MojoProxyResolverImpl( | 47 MojoProxyResolverImpl::MojoProxyResolverImpl( |
58 scoped_ptr<net::ProxyResolver> resolver, | 48 scoped_ptr<net::ProxyResolver> resolver) |
59 const base::Callback< | |
60 void(const net::ProxyResolver::LoadStateChangedCallback&)>& | |
61 load_state_change_callback_setter) | |
62 : resolver_(resolver.Pass()) { | 49 : resolver_(resolver.Pass()) { |
63 load_state_change_callback_setter.Run(base::Bind( | |
64 &MojoProxyResolverImpl::LoadStateChanged, base::Unretained(this))); | |
65 } | 50 } |
66 | 51 |
67 MojoProxyResolverImpl::~MojoProxyResolverImpl() { | 52 MojoProxyResolverImpl::~MojoProxyResolverImpl() { |
68 STLDeleteElements(&resolve_jobs_); | 53 STLDeleteElements(&resolve_jobs_); |
69 } | 54 } |
70 | 55 |
71 void MojoProxyResolverImpl::LoadStateChanged( | |
72 net::ProxyResolver::RequestHandle handle, | |
73 LoadState load_state) { | |
74 auto it = request_handle_to_job_.find(handle); | |
75 DCHECK(it != request_handle_to_job_.end()); | |
76 it->second->LoadStateChanged(load_state); | |
77 } | |
78 | |
79 void MojoProxyResolverImpl::GetProxyForUrl( | 56 void MojoProxyResolverImpl::GetProxyForUrl( |
80 const mojo::String& url, | 57 const mojo::String& url, |
81 interfaces::ProxyResolverRequestClientPtr client) { | 58 interfaces::ProxyResolverRequestClientPtr client) { |
82 DVLOG(1) << "GetProxyForUrl(" << url << ")"; | 59 DVLOG(1) << "GetProxyForUrl(" << url << ")"; |
83 Job* job = new Job(client.Pass(), this, url.To<GURL>()); | 60 Job* job = new Job(client.Pass(), this, url.To<GURL>()); |
84 bool inserted = resolve_jobs_.insert(job).second; | 61 bool inserted = resolve_jobs_.insert(job).second; |
85 DCHECK(inserted); | 62 DCHECK(inserted); |
86 job->Start(); | 63 job->Start(); |
87 } | 64 } |
88 | 65 |
89 void MojoProxyResolverImpl::DeleteJob(Job* job) { | 66 void MojoProxyResolverImpl::DeleteJob(Job* job) { |
90 if (job->request_handle()) | 67 if (job->request_handle()) |
91 request_handle_to_job_.erase(job->request_handle()); | 68 request_handle_to_job_.erase(job->request_handle()); |
92 | 69 |
93 size_t num_erased = resolve_jobs_.erase(job); | 70 size_t num_erased = resolve_jobs_.erase(job); |
94 DCHECK(num_erased); | 71 DCHECK(num_erased); |
95 delete job; | 72 delete job; |
96 } | 73 } |
97 | 74 |
98 MojoProxyResolverImpl::Job::Job( | 75 MojoProxyResolverImpl::Job::Job( |
99 interfaces::ProxyResolverRequestClientPtr client, | 76 interfaces::ProxyResolverRequestClientPtr client, |
100 MojoProxyResolverImpl* resolver, | 77 MojoProxyResolverImpl* resolver, |
101 const GURL& url) | 78 const GURL& url) |
102 : resolver_(resolver), | 79 : resolver_(resolver), |
103 client_(client.Pass()), | 80 client_(client.Pass()), |
104 url_(url), | 81 url_(url), |
105 request_handle_(nullptr), | 82 request_handle_(nullptr), |
106 done_(false), | 83 done_(false) { |
107 load_state_change_coalescer_( | |
108 base::Bind(&MojoProxyResolverImpl::Job::SendLoadStateChanged, | |
109 base::Unretained(this)), | |
110 base::TimeDelta::FromMilliseconds( | |
111 kLoadStateChangeCoalesceTimeoutMilliseconds), | |
112 LOAD_STATE_RESOLVING_PROXY_FOR_URL) { | |
113 } | 84 } |
114 | 85 |
115 MojoProxyResolverImpl::Job::~Job() { | 86 MojoProxyResolverImpl::Job::~Job() { |
116 if (request_handle_ && !done_) | 87 if (request_handle_ && !done_) |
117 resolver_->resolver_->CancelRequest(request_handle_); | 88 resolver_->resolver_->CancelRequest(request_handle_); |
118 } | 89 } |
119 | 90 |
120 void MojoProxyResolverImpl::Job::Start() { | 91 void MojoProxyResolverImpl::Job::Start() { |
121 int result = resolver_->resolver_->GetProxyForURL( | 92 int result = resolver_->resolver_->GetProxyForURL( |
122 url_, &result_, base::Bind(&Job::GetProxyDone, base::Unretained(this)), | 93 url_, &result_, base::Bind(&Job::GetProxyDone, base::Unretained(this)), |
123 &request_handle_, BoundNetLog()); | 94 &request_handle_, BoundNetLog()); |
124 if (result != ERR_IO_PENDING) { | 95 if (result != ERR_IO_PENDING) { |
125 GetProxyDone(result); | 96 GetProxyDone(result); |
126 return; | 97 return; |
127 } | 98 } |
128 client_.set_error_handler(this); | 99 client_.set_error_handler(this); |
129 resolver_->request_handle_to_job_.insert( | 100 resolver_->request_handle_to_job_.insert( |
130 std::make_pair(request_handle_, this)); | 101 std::make_pair(request_handle_, this)); |
131 } | 102 } |
132 | 103 |
133 void MojoProxyResolverImpl::Job::LoadStateChanged(LoadState load_state) { | |
134 load_state_change_coalescer_.LoadStateChanged(load_state); | |
135 } | |
136 | |
137 void MojoProxyResolverImpl::Job::GetProxyDone(int error) { | 104 void MojoProxyResolverImpl::Job::GetProxyDone(int error) { |
138 done_ = true; | 105 done_ = true; |
139 DVLOG(1) << "GetProxyForUrl(" << url_ << ") finished with error " << error | 106 DVLOG(1) << "GetProxyForUrl(" << url_ << ") finished with error " << error |
140 << ". " << result_.proxy_list().size() << " Proxies returned:"; | 107 << ". " << result_.proxy_list().size() << " Proxies returned:"; |
141 for (const auto& proxy : result_.proxy_list().GetAll()) { | 108 for (const auto& proxy : result_.proxy_list().GetAll()) { |
142 DVLOG(1) << proxy.ToURI(); | 109 DVLOG(1) << proxy.ToURI(); |
143 } | 110 } |
144 mojo::Array<interfaces::ProxyServerPtr> result; | 111 mojo::Array<interfaces::ProxyServerPtr> result; |
145 if (error == OK) { | 112 if (error == OK) { |
146 result = mojo::Array<interfaces::ProxyServerPtr>::From( | 113 result = mojo::Array<interfaces::ProxyServerPtr>::From( |
147 result_.proxy_list().GetAll()); | 114 result_.proxy_list().GetAll()); |
148 } | 115 } |
149 client_->ReportResult(error, result.Pass()); | 116 client_->ReportResult(error, result.Pass()); |
150 resolver_->DeleteJob(this); | 117 resolver_->DeleteJob(this); |
151 } | 118 } |
152 | 119 |
153 void MojoProxyResolverImpl::Job::OnConnectionError() { | 120 void MojoProxyResolverImpl::Job::OnConnectionError() { |
154 resolver_->DeleteJob(this); | 121 resolver_->DeleteJob(this); |
155 } | 122 } |
156 | 123 |
157 void MojoProxyResolverImpl::Job::SendLoadStateChanged(LoadState load_state) { | |
158 client_->LoadStateChanged(load_state); | |
159 } | |
160 | |
161 } // namespace net | 124 } // namespace net |
OLD | NEW |