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

Side by Side Diff: net/base/host_resolver_impl.cc

Issue 3231005: Fix remaining localhost resolution issues. (Closed)
Patch Set: Fix mock resolver to ignore network config-induced host resolver flags when using default flags. Created 10 years, 3 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
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 857 matching lines...) Expand 10 before | Expand all | Expand 10 after
868 // Choose a unique ID number for observers to see. 868 // Choose a unique ID number for observers to see.
869 int request_id = next_request_id_++; 869 int request_id = next_request_id_++;
870 870
871 // Make a log item for the request. 871 // Make a log item for the request.
872 BoundNetLog request_net_log = BoundNetLog::Make(net_log_, 872 BoundNetLog request_net_log = BoundNetLog::Make(net_log_,
873 NetLog::SOURCE_HOST_RESOLVER_IMPL_REQUEST); 873 NetLog::SOURCE_HOST_RESOLVER_IMPL_REQUEST);
874 874
875 // Update the net log and notify registered observers. 875 // Update the net log and notify registered observers.
876 OnStartRequest(source_net_log, request_net_log, request_id, info); 876 OnStartRequest(source_net_log, request_net_log, request_id, info);
877 877
878 // Check for IP literal.
879 IPAddressNumber ip_number;
880 if (ParseIPLiteralToNumber(info.hostname(), &ip_number)) {
881 DCHECK_EQ((info.host_resolver_flags() &
882 ~(HOST_RESOLVER_CANONNAME | HOST_RESOLVER_LOOPBACK_ONLY)), 0)
883 << " Unhandled flag";
884 AddressList result(ip_number, info.port(),
885 (info.host_resolver_flags() & HOST_RESOLVER_CANONNAME));
886
887 *addresses = result;
888 // Update the net log and notify registered observers.
889 OnFinishRequest(source_net_log, request_net_log, request_id, info, OK,
890 0 /* os_error (unknown since from cache) */);
891 return OK;
892 }
893
894 // Build a key that identifies the request in the cache and in the 878 // Build a key that identifies the request in the cache and in the
895 // outstanding jobs map. 879 // outstanding jobs map.
896 Key key = GetEffectiveKeyForRequest(info); 880 Key key = GetEffectiveKeyForRequest(info);
897 881
882 // Check for IP literal.
883 IPAddressNumber ip_number;
884 if (ParseIPLiteralToNumber(info.hostname(), &ip_number)) {
885 DCHECK_EQ(key.host_resolver_flags &
886 ~(HOST_RESOLVER_CANONNAME | HOST_RESOLVER_LOOPBACK_ONLY |
887 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6),
888 0) << " Unhandled flag";
889 bool ipv6_disabled = default_address_family_ == ADDRESS_FAMILY_IPV4 &&
890 !ipv6_probe_monitoring_;
891 int net_error = OK;
892 if (ip_number.size() == 16 && ipv6_disabled) {
893 net_error = ERR_NAME_NOT_RESOLVED;
willchan no longer on Chromium 2010/09/03 19:36:50 This strikes me as a weird error to return, since
894 } else {
895 AddressList result(ip_number, info.port(),
896 (key.host_resolver_flags & HOST_RESOLVER_CANONNAME));
897 *addresses = result;
898 }
899 // Update the net log and notify registered observers.
900 OnFinishRequest(source_net_log, request_net_log, request_id, info,
901 net_error, 0 /* os_error (unknown since from cache) */);
902 return net_error;
903 }
904
898 // If we have an unexpired cache entry, use it. 905 // If we have an unexpired cache entry, use it.
899 if (info.allow_cached_response() && cache_.get()) { 906 if (info.allow_cached_response() && cache_.get()) {
900 const HostCache::Entry* cache_entry = cache_->Lookup( 907 const HostCache::Entry* cache_entry = cache_->Lookup(
901 key, base::TimeTicks::Now()); 908 key, base::TimeTicks::Now());
902 if (cache_entry) { 909 if (cache_entry) {
903 request_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CACHE_HIT, NULL); 910 request_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CACHE_HIT, NULL);
904 int net_error = cache_entry->error; 911 int net_error = cache_entry->error;
905 if (net_error == OK) 912 if (net_error == OK)
906 addresses->SetFrom(cache_entry->addrlist, info.port()); 913 addresses->SetFrom(cache_entry->addrlist, info.port());
907 914
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 1285
1279 // Search for any other pending request which can piggy-back off this job. 1286 // Search for any other pending request which can piggy-back off this job.
1280 for (size_t pool_i = 0; pool_i < POOL_COUNT; ++pool_i) { 1287 for (size_t pool_i = 0; pool_i < POOL_COUNT; ++pool_i) {
1281 JobPool* pool = job_pools_[pool_i]; 1288 JobPool* pool = job_pools_[pool_i];
1282 pool->MoveRequestsToJob(job); 1289 pool->MoveRequestsToJob(job);
1283 } 1290 }
1284 } 1291 }
1285 1292
1286 HostResolverImpl::Key HostResolverImpl::GetEffectiveKeyForRequest( 1293 HostResolverImpl::Key HostResolverImpl::GetEffectiveKeyForRequest(
1287 const RequestInfo& info) const { 1294 const RequestInfo& info) const {
1295 HostResolverFlags effective_flags =
1296 info.host_resolver_flags() | additional_resolver_flags_;
1288 AddressFamily effective_address_family = info.address_family(); 1297 AddressFamily effective_address_family = info.address_family();
1289 if (effective_address_family == ADDRESS_FAMILY_UNSPECIFIED) 1298 if (effective_address_family == ADDRESS_FAMILY_UNSPECIFIED &&
1299 default_address_family_ != ADDRESS_FAMILY_UNSPECIFIED) {
1290 effective_address_family = default_address_family_; 1300 effective_address_family = default_address_family_;
1291 return Key(info.hostname(), effective_address_family, 1301 if (ipv6_probe_monitoring_)
1292 info.host_resolver_flags() | additional_resolver_flags_); 1302 effective_flags |= HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6;
1303 }
1304 return Key(info.hostname(), effective_address_family, effective_flags);
1293 } 1305 }
1294 1306
1295 HostResolverImpl::Job* HostResolverImpl::CreateAndStartJob(Request* req) { 1307 HostResolverImpl::Job* HostResolverImpl::CreateAndStartJob(Request* req) {
1296 DCHECK(CanCreateJobForPool(*GetPoolForRequest(req))); 1308 DCHECK(CanCreateJobForPool(*GetPoolForRequest(req)));
1297 Key key = GetEffectiveKeyForRequest(req->info()); 1309 Key key = GetEffectiveKeyForRequest(req->info());
1298 1310
1299 req->request_net_log().AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CREATE_JOB, 1311 req->request_net_log().AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CREATE_JOB,
1300 NULL); 1312 NULL);
1301 1313
1302 scoped_refptr<Job> job = new Job(next_job_id_++, this, key, 1314 scoped_refptr<Job> job = new Job(next_job_id_++, this, key,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1340 void HostResolverImpl::AbortAllJobs() { 1352 void HostResolverImpl::AbortAllJobs() {
1341 JobMap jobs; 1353 JobMap jobs;
1342 jobs.swap(jobs_); 1354 jobs.swap(jobs_);
1343 for (JobMap::iterator it = jobs.begin(); it != jobs.end(); ++it) { 1355 for (JobMap::iterator it = jobs.begin(); it != jobs.end(); ++it) {
1344 AbortJob(it->second); 1356 AbortJob(it->second);
1345 it->second->Cancel(); 1357 it->second->Cancel();
1346 } 1358 }
1347 } 1359 }
1348 1360
1349 } // namespace net 1361 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698