OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/base/host_resolver_impl.h" | 5 #include "net/base/host_resolver_impl.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <Winsock2.h> | 8 #include <Winsock2.h> |
9 #elif defined(OS_POSIX) | 9 #elif defined(OS_POSIX) |
10 #include <netdb.h> | 10 #include <netdb.h> |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 AddressFamily address_family, | 168 AddressFamily address_family, |
169 HostResolverFlags host_resolver_flags, | 169 HostResolverFlags host_resolver_flags, |
170 AddressList* addr_list, | 170 AddressList* addr_list, |
171 int* os_error) OVERRIDE { | 171 int* os_error) OVERRIDE { |
172 return SystemHostResolverProc(hostname, | 172 return SystemHostResolverProc(hostname, |
173 address_family, | 173 address_family, |
174 host_resolver_flags, | 174 host_resolver_flags, |
175 addr_list, | 175 addr_list, |
176 os_error); | 176 os_error); |
177 } | 177 } |
| 178 |
| 179 protected: |
| 180 virtual ~CallSystemHostResolverProc() {} |
178 }; | 181 }; |
179 | 182 |
180 // Extra parameters to attach to the NetLog when the resolve failed. | 183 // Extra parameters to attach to the NetLog when the resolve failed. |
181 class ProcTaskFailedParams : public NetLog::EventParameters { | 184 class ProcTaskFailedParams : public NetLog::EventParameters { |
182 public: | 185 public: |
183 ProcTaskFailedParams(uint32 attempt_number, int net_error, int os_error) | 186 ProcTaskFailedParams(uint32 attempt_number, int net_error, int os_error) |
184 : attempt_number_(attempt_number), | 187 : attempt_number_(attempt_number), |
185 net_error_(net_error), | 188 net_error_(net_error), |
186 os_error_(os_error) { | 189 os_error_(os_error) { |
187 } | 190 } |
(...skipping 21 matching lines...) Expand all Loading... |
209 0, // Buffer size. | 212 0, // Buffer size. |
210 0); // Arguments (unused). | 213 0); // Arguments (unused). |
211 dict->SetString("os_error_string", WideToUTF8(error_string)); | 214 dict->SetString("os_error_string", WideToUTF8(error_string)); |
212 LocalFree(error_string); | 215 LocalFree(error_string); |
213 #endif | 216 #endif |
214 } | 217 } |
215 | 218 |
216 return dict; | 219 return dict; |
217 } | 220 } |
218 | 221 |
| 222 protected: |
| 223 virtual ~ProcTaskFailedParams() {} |
| 224 |
219 private: | 225 private: |
220 const uint32 attempt_number_; | 226 const uint32 attempt_number_; |
221 const int net_error_; | 227 const int net_error_; |
222 const int os_error_; | 228 const int os_error_; |
223 }; | 229 }; |
224 | 230 |
225 // Extra parameters to attach to the NetLog when the DnsTask failed. | 231 // Extra parameters to attach to the NetLog when the DnsTask failed. |
226 class DnsTaskFailedParams : public NetLog::EventParameters { | 232 class DnsTaskFailedParams : public NetLog::EventParameters { |
227 public: | 233 public: |
228 DnsTaskFailedParams(int net_error, int dns_error) | 234 DnsTaskFailedParams(int net_error, int dns_error) |
229 : net_error_(net_error), dns_error_(dns_error) { | 235 : net_error_(net_error), dns_error_(dns_error) { |
230 } | 236 } |
231 | 237 |
232 virtual Value* ToValue() const OVERRIDE { | 238 virtual Value* ToValue() const OVERRIDE { |
233 DictionaryValue* dict = new DictionaryValue(); | 239 DictionaryValue* dict = new DictionaryValue(); |
234 dict->SetInteger("net_error", net_error_); | 240 dict->SetInteger("net_error", net_error_); |
235 if (dns_error_) | 241 if (dns_error_) |
236 dict->SetInteger("dns_error", dns_error_); | 242 dict->SetInteger("dns_error", dns_error_); |
237 return dict; | 243 return dict; |
238 } | 244 } |
239 | 245 |
| 246 protected: |
| 247 virtual ~DnsTaskFailedParams() {} |
| 248 |
240 private: | 249 private: |
241 const int net_error_; | 250 const int net_error_; |
242 const int dns_error_; | 251 const int dns_error_; |
243 }; | 252 }; |
244 | 253 |
245 // Parameters representing the information in a RequestInfo object, along with | 254 // Parameters representing the information in a RequestInfo object, along with |
246 // the associated NetLog::Source. | 255 // the associated NetLog::Source. |
247 class RequestInfoParameters : public NetLog::EventParameters { | 256 class RequestInfoParameters : public NetLog::EventParameters { |
248 public: | 257 public: |
249 RequestInfoParameters(const HostResolver::RequestInfo& info, | 258 RequestInfoParameters(const HostResolver::RequestInfo& info, |
250 const NetLog::Source& source) | 259 const NetLog::Source& source) |
251 : info_(info), source_(source) {} | 260 : info_(info), source_(source) {} |
252 | 261 |
253 virtual Value* ToValue() const OVERRIDE { | 262 virtual Value* ToValue() const OVERRIDE { |
254 DictionaryValue* dict = new DictionaryValue(); | 263 DictionaryValue* dict = new DictionaryValue(); |
255 dict->SetString("host", info_.host_port_pair().ToString()); | 264 dict->SetString("host", info_.host_port_pair().ToString()); |
256 dict->SetInteger("address_family", | 265 dict->SetInteger("address_family", |
257 static_cast<int>(info_.address_family())); | 266 static_cast<int>(info_.address_family())); |
258 dict->SetBoolean("allow_cached_response", info_.allow_cached_response()); | 267 dict->SetBoolean("allow_cached_response", info_.allow_cached_response()); |
259 dict->SetBoolean("is_speculative", info_.is_speculative()); | 268 dict->SetBoolean("is_speculative", info_.is_speculative()); |
260 dict->SetInteger("priority", info_.priority()); | 269 dict->SetInteger("priority", info_.priority()); |
261 | 270 |
262 if (source_.is_valid()) | 271 if (source_.is_valid()) |
263 dict->Set("source_dependency", source_.ToValue()); | 272 dict->Set("source_dependency", source_.ToValue()); |
264 | 273 |
265 return dict; | 274 return dict; |
266 } | 275 } |
267 | 276 |
| 277 protected: |
| 278 virtual ~RequestInfoParameters() {} |
| 279 |
268 private: | 280 private: |
269 const HostResolver::RequestInfo info_; | 281 const HostResolver::RequestInfo info_; |
270 const NetLog::Source source_; | 282 const NetLog::Source source_; |
271 }; | 283 }; |
272 | 284 |
273 // Parameters associated with the creation of a HostResolverImpl::Job. | 285 // Parameters associated with the creation of a HostResolverImpl::Job. |
274 class JobCreationParameters : public NetLog::EventParameters { | 286 class JobCreationParameters : public NetLog::EventParameters { |
275 public: | 287 public: |
276 JobCreationParameters(const std::string& host, | 288 JobCreationParameters(const std::string& host, |
277 const NetLog::Source& source) | 289 const NetLog::Source& source) |
278 : host_(host), source_(source) {} | 290 : host_(host), source_(source) {} |
279 | 291 |
280 virtual Value* ToValue() const OVERRIDE { | 292 virtual Value* ToValue() const OVERRIDE { |
281 DictionaryValue* dict = new DictionaryValue(); | 293 DictionaryValue* dict = new DictionaryValue(); |
282 dict->SetString("host", host_); | 294 dict->SetString("host", host_); |
283 dict->Set("source_dependency", source_.ToValue()); | 295 dict->Set("source_dependency", source_.ToValue()); |
284 return dict; | 296 return dict; |
285 } | 297 } |
286 | 298 |
| 299 protected: |
| 300 virtual ~JobCreationParameters() {} |
| 301 |
287 private: | 302 private: |
288 const std::string host_; | 303 const std::string host_; |
289 const NetLog::Source source_; | 304 const NetLog::Source source_; |
290 }; | 305 }; |
291 | 306 |
292 // Parameters of the HOST_RESOLVER_IMPL_JOB_ATTACH/DETACH event. | 307 // Parameters of the HOST_RESOLVER_IMPL_JOB_ATTACH/DETACH event. |
293 class JobAttachParameters : public NetLog::EventParameters { | 308 class JobAttachParameters : public NetLog::EventParameters { |
294 public: | 309 public: |
295 JobAttachParameters(const NetLog::Source& source, | 310 JobAttachParameters(const NetLog::Source& source, |
296 RequestPriority priority) | 311 RequestPriority priority) |
297 : source_(source), priority_(priority) {} | 312 : source_(source), priority_(priority) {} |
298 | 313 |
299 virtual Value* ToValue() const OVERRIDE { | 314 virtual Value* ToValue() const OVERRIDE { |
300 DictionaryValue* dict = new DictionaryValue(); | 315 DictionaryValue* dict = new DictionaryValue(); |
301 dict->Set("source_dependency", source_.ToValue()); | 316 dict->Set("source_dependency", source_.ToValue()); |
302 dict->SetInteger("priority", priority_); | 317 dict->SetInteger("priority", priority_); |
303 return dict; | 318 return dict; |
304 } | 319 } |
305 | 320 |
| 321 protected: |
| 322 virtual ~JobAttachParameters() {} |
| 323 |
306 private: | 324 private: |
307 const NetLog::Source source_; | 325 const NetLog::Source source_; |
308 const RequestPriority priority_; | 326 const RequestPriority priority_; |
309 }; | 327 }; |
310 | 328 |
311 // Parameters of the DNS_CONFIG_CHANGED event. | 329 // Parameters of the DNS_CONFIG_CHANGED event. |
312 class DnsConfigParameters : public NetLog::EventParameters { | 330 class DnsConfigParameters : public NetLog::EventParameters { |
313 public: | 331 public: |
314 explicit DnsConfigParameters(const DnsConfig& config) | 332 explicit DnsConfigParameters(const DnsConfig& config) |
315 : num_hosts_(config.hosts.size()) { | 333 : num_hosts_(config.hosts.size()) { |
316 config_.CopyIgnoreHosts(config); | 334 config_.CopyIgnoreHosts(config); |
317 } | 335 } |
318 | 336 |
319 virtual Value* ToValue() const OVERRIDE { | 337 virtual Value* ToValue() const OVERRIDE { |
320 Value* value = config_.ToValue(); | 338 Value* value = config_.ToValue(); |
321 if (!value) | 339 if (!value) |
322 return NULL; | 340 return NULL; |
323 DictionaryValue* dict; | 341 DictionaryValue* dict; |
324 if (value->GetAsDictionary(&dict)) | 342 if (value->GetAsDictionary(&dict)) |
325 dict->SetInteger("num_hosts", num_hosts_); | 343 dict->SetInteger("num_hosts", num_hosts_); |
326 return value; | 344 return value; |
327 } | 345 } |
328 | 346 |
| 347 protected: |
| 348 virtual ~DnsConfigParameters() {} |
| 349 |
329 private: | 350 private: |
330 DnsConfig config_; // Does not include DnsHosts to save memory and work. | 351 DnsConfig config_; // Does not include DnsHosts to save memory and work. |
331 const size_t num_hosts_; | 352 const size_t num_hosts_; |
332 }; | 353 }; |
333 | 354 |
334 // The logging routines are defined here because some requests are resolved | 355 // The logging routines are defined here because some requests are resolved |
335 // without a Request object. | 356 // without a Request object. |
336 | 357 |
337 // Logs when a request has just been started. | 358 // Logs when a request has just been started. |
338 void LogStartRequest(const BoundNetLog& source_net_log, | 359 void LogStartRequest(const BoundNetLog& source_net_log, |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 DCHECK(origin_loop_->BelongsToCurrentThread()); | 649 DCHECK(origin_loop_->BelongsToCurrentThread()); |
629 return callback_.is_null(); | 650 return callback_.is_null(); |
630 } | 651 } |
631 | 652 |
632 bool was_completed() const { | 653 bool was_completed() const { |
633 DCHECK(origin_loop_->BelongsToCurrentThread()); | 654 DCHECK(origin_loop_->BelongsToCurrentThread()); |
634 return completed_attempt_number_ > 0; | 655 return completed_attempt_number_ > 0; |
635 } | 656 } |
636 | 657 |
637 private: | 658 private: |
| 659 friend class base::RefCountedThreadSafe<ProcTask>; |
| 660 ~ProcTask() {} |
| 661 |
638 void StartLookupAttempt() { | 662 void StartLookupAttempt() { |
639 DCHECK(origin_loop_->BelongsToCurrentThread()); | 663 DCHECK(origin_loop_->BelongsToCurrentThread()); |
640 base::TimeTicks start_time = base::TimeTicks::Now(); | 664 base::TimeTicks start_time = base::TimeTicks::Now(); |
641 ++attempt_number_; | 665 ++attempt_number_; |
642 // Dispatch the lookup attempt to a worker thread. | 666 // Dispatch the lookup attempt to a worker thread. |
643 if (!base::WorkerPool::PostTask( | 667 if (!base::WorkerPool::PostTask( |
644 FROM_HERE, | 668 FROM_HERE, |
645 base::Bind(&ProcTask::DoLookup, this, start_time, attempt_number_), | 669 base::Bind(&ProcTask::DoLookup, this, start_time, attempt_number_), |
646 true)) { | 670 true)) { |
647 NOTREACHED(); | 671 NOTREACHED(); |
(...skipping 1303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1951 | 1975 |
1952 if (self && dns_config.IsValid()) | 1976 if (self && dns_config.IsValid()) |
1953 TryServingAllJobsFromHosts(); | 1977 TryServingAllJobsFromHosts(); |
1954 } | 1978 } |
1955 | 1979 |
1956 bool HostResolverImpl::HaveDnsConfig() const { | 1980 bool HostResolverImpl::HaveDnsConfig() const { |
1957 return (dns_client_.get() != NULL) && (dns_client_->GetConfig() != NULL); | 1981 return (dns_client_.get() != NULL) && (dns_client_->GetConfig() != NULL); |
1958 } | 1982 } |
1959 | 1983 |
1960 } // namespace net | 1984 } // namespace net |
OLD | NEW |