| Index: net/dns/dns_transaction.cc
|
| diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc
|
| index 6cd02a33bd5b707945971bf300d3540d7a031c0d..8bffa128edf07782e7c305e1c50316aac5064325 100644
|
| --- a/net/dns/dns_transaction.cc
|
| +++ b/net/dns/dns_transaction.cc
|
| @@ -51,22 +51,19 @@ bool IsIPLiteral(const std::string& hostname) {
|
| class StartParameters : public NetLog::EventParameters {
|
| public:
|
| StartParameters(const std::string& hostname,
|
| - uint16 qtype,
|
| - const NetLog::Source& source)
|
| - : hostname_(hostname), qtype_(qtype), source_(source) {}
|
| + uint16 qtype)
|
| + : hostname_(hostname), qtype_(qtype) {}
|
|
|
| virtual Value* ToValue() const OVERRIDE {
|
| DictionaryValue* dict = new DictionaryValue();
|
| dict->SetString("hostname", hostname_);
|
| dict->SetInteger("query_type", qtype_);
|
| - dict->Set("source_dependency", source_.ToValue());
|
| return dict;
|
| }
|
|
|
| private:
|
| const std::string hostname_;
|
| const uint16 qtype_;
|
| - const NetLog::Source source_;
|
| };
|
|
|
| class ResponseParameters : public NetLog::EventParameters {
|
| @@ -78,7 +75,7 @@ class ResponseParameters : public NetLog::EventParameters {
|
| DictionaryValue* dict = new DictionaryValue();
|
| dict->SetInteger("rcode", rcode_);
|
| dict->SetInteger("answer_count", answer_count_);
|
| - dict->Set("socket_source", source_.ToValue());
|
| + dict->Set("source_dependency", source_.ToValue());
|
| return dict;
|
| }
|
|
|
| @@ -211,8 +208,14 @@ class DnsUDPAttempt {
|
| return rv;
|
|
|
| DCHECK(rv);
|
| - if (!response_->InitParse(rv, *query_))
|
| + if (!response_->InitParse(rv, *query_)) {
|
| + // TODO(szym): Consider making this reaction less aggressive.
|
| + // Other implementations simply ignore mismatched responses. Since each
|
| + // DnsUDPAttempt binds to a different port, we might find that responses
|
| + // to previously timed out queries lead to failures in the future.
|
| + // http://crbug.com/107413
|
| return ERR_DNS_MALFORMED_RESPONSE;
|
| + }
|
| if (response_->flags() & dns_protocol::kFlagTC)
|
| return ERR_DNS_SERVER_REQUIRES_TCP;
|
| if (response_->rcode() != dns_protocol::kRcodeNOERROR &&
|
| @@ -258,13 +261,12 @@ class DnsTransactionImpl : public DnsTransaction, public base::NonThreadSafe {
|
| const std::string& hostname,
|
| uint16 qtype,
|
| const DnsTransactionFactory::CallbackType& callback,
|
| - const BoundNetLog& source_net_log)
|
| + const BoundNetLog& net_log)
|
| : session_(session),
|
| hostname_(hostname),
|
| qtype_(qtype),
|
| callback_(callback),
|
| - net_log_(BoundNetLog::Make(session->net_log(),
|
| - NetLog::SOURCE_DNS_TRANSACTION)),
|
| + net_log_(net_log),
|
| first_server_index_(0) {
|
| DCHECK(session_);
|
| DCHECK(!hostname_.empty());
|
| @@ -273,7 +275,7 @@ class DnsTransactionImpl : public DnsTransaction, public base::NonThreadSafe {
|
| DCHECK(!IsIPLiteral(hostname_));
|
|
|
| net_log_.BeginEvent(NetLog::TYPE_DNS_TRANSACTION, make_scoped_refptr(
|
| - new StartParameters(hostname_, qtype_, source_net_log.source())));
|
| + new StartParameters(hostname_, qtype_)));
|
| }
|
|
|
| virtual ~DnsTransactionImpl() {
|
| @@ -299,7 +301,19 @@ class DnsTransactionImpl : public DnsTransaction, public base::NonThreadSafe {
|
| int rv = PrepareSearch();
|
| if (rv == OK)
|
| rv = StartQuery();
|
| - DCHECK_NE(OK, rv);
|
| + if (rv == OK) {
|
| + // In the very unlikely case that we immediately received the response, we
|
| + // cannot simply return OK nor run the callback, but instead complete
|
| + // asynchronously.
|
| + // TODO(szym): replace Unretained with WeakPtr factory.
|
| + MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&DnsTransactionImpl::DoCallback,
|
| + base::Unretained(this),
|
| + OK,
|
| + attempts_.back()));
|
| + return ERR_IO_PENDING;
|
| + }
|
| return rv;
|
| }
|
|
|
| @@ -387,7 +401,8 @@ class DnsTransactionImpl : public DnsTransaction, public base::NonThreadSafe {
|
| }
|
|
|
| net_log_.AddEvent(NetLog::TYPE_DNS_TRANSACTION_ATTEMPT, make_scoped_refptr(
|
| - new NetLogSourceParameter("socket_source", socket->NetLog().source())));
|
| + new NetLogSourceParameter("source_dependency",
|
| + socket->NetLog().source())));
|
|
|
| const DnsConfig& config = session_->config();
|
|
|
| @@ -451,7 +466,7 @@ class DnsTransactionImpl : public DnsTransaction, public base::NonThreadSafe {
|
| DoCallback(rv, attempt);
|
| return;
|
| default:
|
| - // TODO(szym): Some nameservers could fail so try the next one.
|
| + // Some nameservers could fail so try the next one.
|
| const DnsConfig& config = session_->config();
|
| if (attempts_.size() < config.attempts * config.nameservers.size()) {
|
| rv = MakeAttempt();
|
| @@ -512,12 +527,12 @@ class DnsTransactionFactoryImpl : public DnsTransactionFactory {
|
| const std::string& hostname,
|
| uint16 qtype,
|
| const CallbackType& callback,
|
| - const BoundNetLog& source_net_log) OVERRIDE {
|
| + const BoundNetLog& net_log) OVERRIDE {
|
| return scoped_ptr<DnsTransaction>(new DnsTransactionImpl(session_,
|
| hostname,
|
| qtype,
|
| callback,
|
| - source_net_log));
|
| + net_log));
|
| }
|
|
|
| private:
|
|
|