| 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/dns/dns_transaction.h" | 5 #include "net/dns/dns_transaction.h" |
| 6 | 6 |
| 7 #include <deque> | 7 #include <deque> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> |
| 9 #include <vector> | 10 #include <vector> |
| 10 | 11 |
| 11 #include "base/big_endian.h" | 12 #include "base/big_endian.h" |
| 12 #include "base/bind.h" | 13 #include "base/bind.h" |
| 13 #include "base/location.h" | 14 #include "base/location.h" |
| 14 #include "base/macros.h" | 15 #include "base/macros.h" |
| 15 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
| 16 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
| 17 #include "base/memory/weak_ptr.h" | 18 #include "base/memory/weak_ptr.h" |
| 18 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 return ParseIPLiteralToNumber(hostname, &ip); | 61 return ParseIPLiteralToNumber(hostname, &ip); |
| 61 } | 62 } |
| 62 | 63 |
| 63 scoped_ptr<base::Value> NetLogStartCallback( | 64 scoped_ptr<base::Value> NetLogStartCallback( |
| 64 const std::string* hostname, | 65 const std::string* hostname, |
| 65 uint16_t qtype, | 66 uint16_t qtype, |
| 66 NetLogCaptureMode /* capture_mode */) { | 67 NetLogCaptureMode /* capture_mode */) { |
| 67 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 68 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| 68 dict->SetString("hostname", *hostname); | 69 dict->SetString("hostname", *hostname); |
| 69 dict->SetInteger("query_type", qtype); | 70 dict->SetInteger("query_type", qtype); |
| 70 return dict.Pass(); | 71 return std::move(dict); |
| 71 }; | 72 }; |
| 72 | 73 |
| 73 // ---------------------------------------------------------------------------- | 74 // ---------------------------------------------------------------------------- |
| 74 | 75 |
| 75 // A single asynchronous DNS exchange, which consists of sending out a | 76 // A single asynchronous DNS exchange, which consists of sending out a |
| 76 // DNS query, waiting for a response, and returning the response that it | 77 // DNS query, waiting for a response, and returning the response that it |
| 77 // matches. Logging is done in the socket and in the outer DnsTransaction. | 78 // matches. Logging is done in the socket and in the outer DnsTransaction. |
| 78 class DnsAttempt { | 79 class DnsAttempt { |
| 79 public: | 80 public: |
| 80 explicit DnsAttempt(unsigned server_index) | 81 explicit DnsAttempt(unsigned server_index) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 102 // to the NetLog source source of the UDP socket used. The request must have | 103 // to the NetLog source source of the UDP socket used. The request must have |
| 103 // completed before this is called. | 104 // completed before this is called. |
| 104 scoped_ptr<base::Value> NetLogResponseCallback( | 105 scoped_ptr<base::Value> NetLogResponseCallback( |
| 105 NetLogCaptureMode capture_mode) const { | 106 NetLogCaptureMode capture_mode) const { |
| 106 DCHECK(GetResponse()->IsValid()); | 107 DCHECK(GetResponse()->IsValid()); |
| 107 | 108 |
| 108 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 109 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| 109 dict->SetInteger("rcode", GetResponse()->rcode()); | 110 dict->SetInteger("rcode", GetResponse()->rcode()); |
| 110 dict->SetInteger("answer_count", GetResponse()->answer_count()); | 111 dict->SetInteger("answer_count", GetResponse()->answer_count()); |
| 111 GetSocketNetLog().source().AddToEventParameters(dict.get()); | 112 GetSocketNetLog().source().AddToEventParameters(dict.get()); |
| 112 return dict.Pass(); | 113 return std::move(dict); |
| 113 } | 114 } |
| 114 | 115 |
| 115 void set_result(int result) { | 116 void set_result(int result) { |
| 116 result_ = result; | 117 result_ = result; |
| 117 } | 118 } |
| 118 | 119 |
| 119 // True if current attempt is pending (waiting for server response). | 120 // True if current attempt is pending (waiting for server response). |
| 120 bool is_pending() const { | 121 bool is_pending() const { |
| 121 return result_ == ERR_IO_PENDING; | 122 return result_ == ERR_IO_PENDING; |
| 122 } | 123 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 135 }; | 136 }; |
| 136 | 137 |
| 137 class DnsUDPAttempt : public DnsAttempt { | 138 class DnsUDPAttempt : public DnsAttempt { |
| 138 public: | 139 public: |
| 139 DnsUDPAttempt(unsigned server_index, | 140 DnsUDPAttempt(unsigned server_index, |
| 140 scoped_ptr<DnsSession::SocketLease> socket_lease, | 141 scoped_ptr<DnsSession::SocketLease> socket_lease, |
| 141 scoped_ptr<DnsQuery> query) | 142 scoped_ptr<DnsQuery> query) |
| 142 : DnsAttempt(server_index), | 143 : DnsAttempt(server_index), |
| 143 next_state_(STATE_NONE), | 144 next_state_(STATE_NONE), |
| 144 received_malformed_response_(false), | 145 received_malformed_response_(false), |
| 145 socket_lease_(socket_lease.Pass()), | 146 socket_lease_(std::move(socket_lease)), |
| 146 query_(query.Pass()) {} | 147 query_(std::move(query)) {} |
| 147 | 148 |
| 148 // DnsAttempt: | 149 // DnsAttempt: |
| 149 int Start(const CompletionCallback& callback) override { | 150 int Start(const CompletionCallback& callback) override { |
| 150 DCHECK_EQ(STATE_NONE, next_state_); | 151 DCHECK_EQ(STATE_NONE, next_state_); |
| 151 callback_ = callback; | 152 callback_ = callback; |
| 152 start_time_ = base::TimeTicks::Now(); | 153 start_time_ = base::TimeTicks::Now(); |
| 153 next_state_ = STATE_SEND_QUERY; | 154 next_state_ = STATE_SEND_QUERY; |
| 154 return DoLoop(OK); | 155 return DoLoop(OK); |
| 155 } | 156 } |
| 156 | 157 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 DISALLOW_COPY_AND_ASSIGN(DnsUDPAttempt); | 297 DISALLOW_COPY_AND_ASSIGN(DnsUDPAttempt); |
| 297 }; | 298 }; |
| 298 | 299 |
| 299 class DnsTCPAttempt : public DnsAttempt { | 300 class DnsTCPAttempt : public DnsAttempt { |
| 300 public: | 301 public: |
| 301 DnsTCPAttempt(unsigned server_index, | 302 DnsTCPAttempt(unsigned server_index, |
| 302 scoped_ptr<StreamSocket> socket, | 303 scoped_ptr<StreamSocket> socket, |
| 303 scoped_ptr<DnsQuery> query) | 304 scoped_ptr<DnsQuery> query) |
| 304 : DnsAttempt(server_index), | 305 : DnsAttempt(server_index), |
| 305 next_state_(STATE_NONE), | 306 next_state_(STATE_NONE), |
| 306 socket_(socket.Pass()), | 307 socket_(std::move(socket)), |
| 307 query_(query.Pass()), | 308 query_(std::move(query)), |
| 308 length_buffer_(new IOBufferWithSize(sizeof(uint16_t))), | 309 length_buffer_(new IOBufferWithSize(sizeof(uint16_t))), |
| 309 response_length_(0) {} | 310 response_length_(0) {} |
| 310 | 311 |
| 311 // DnsAttempt: | 312 // DnsAttempt: |
| 312 int Start(const CompletionCallback& callback) override { | 313 int Start(const CompletionCallback& callback) override { |
| 313 DCHECK_EQ(STATE_NONE, next_state_); | 314 DCHECK_EQ(STATE_NONE, next_state_); |
| 314 callback_ = callback; | 315 callback_ = callback; |
| 315 start_time_ = base::TimeTicks::Now(); | 316 start_time_ = base::TimeTicks::Now(); |
| 316 next_state_ = STATE_CONNECT_COMPLETE; | 317 next_state_ = STATE_CONNECT_COMPLETE; |
| 317 int rv = socket_->Connect(base::Bind(&DnsTCPAttempt::OnIOComplete, | 318 int rv = socket_->Connect(base::Bind(&DnsTCPAttempt::OnIOComplete, |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 (first_server_index_ + attempt_number) % config.nameservers.size(); | 718 (first_server_index_ + attempt_number) % config.nameservers.size(); |
| 718 // Skip over known failed servers. | 719 // Skip over known failed servers. |
| 719 server_index = session_->NextGoodServerIndex(server_index); | 720 server_index = session_->NextGoodServerIndex(server_index); |
| 720 | 721 |
| 721 scoped_ptr<DnsSession::SocketLease> lease = | 722 scoped_ptr<DnsSession::SocketLease> lease = |
| 722 session_->AllocateSocket(server_index, net_log_.source()); | 723 session_->AllocateSocket(server_index, net_log_.source()); |
| 723 | 724 |
| 724 bool got_socket = !!lease.get(); | 725 bool got_socket = !!lease.get(); |
| 725 | 726 |
| 726 DnsUDPAttempt* attempt = | 727 DnsUDPAttempt* attempt = |
| 727 new DnsUDPAttempt(server_index, lease.Pass(), query.Pass()); | 728 new DnsUDPAttempt(server_index, std::move(lease), std::move(query)); |
| 728 | 729 |
| 729 attempts_.push_back(make_scoped_ptr(attempt)); | 730 attempts_.push_back(make_scoped_ptr(attempt)); |
| 730 ++attempts_count_; | 731 ++attempts_count_; |
| 731 | 732 |
| 732 if (!got_socket) | 733 if (!got_socket) |
| 733 return AttemptResult(ERR_CONNECTION_REFUSED, NULL); | 734 return AttemptResult(ERR_CONNECTION_REFUSED, NULL); |
| 734 | 735 |
| 735 net_log_.AddEvent( | 736 net_log_.AddEvent( |
| 736 NetLog::TYPE_DNS_TRANSACTION_ATTEMPT, | 737 NetLog::TYPE_DNS_TRANSACTION_ATTEMPT, |
| 737 attempt->GetSocketNetLog().source().ToEventParametersCallback()); | 738 attempt->GetSocketNetLog().source().ToEventParametersCallback()); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 761 uint16_t id = session_->NextQueryId(); | 762 uint16_t id = session_->NextQueryId(); |
| 762 scoped_ptr<DnsQuery> query = | 763 scoped_ptr<DnsQuery> query = |
| 763 previous_attempt->GetQuery()->CloneWithNewId(id); | 764 previous_attempt->GetQuery()->CloneWithNewId(id); |
| 764 | 765 |
| 765 RecordLostPacketsIfAny(); | 766 RecordLostPacketsIfAny(); |
| 766 // Cancel all other attempts, no point waiting on them. | 767 // Cancel all other attempts, no point waiting on them. |
| 767 attempts_.clear(); | 768 attempts_.clear(); |
| 768 | 769 |
| 769 unsigned attempt_number = attempts_.size(); | 770 unsigned attempt_number = attempts_.size(); |
| 770 | 771 |
| 771 DnsTCPAttempt* attempt = new DnsTCPAttempt(server_index, socket.Pass(), | 772 DnsTCPAttempt* attempt = |
| 772 query.Pass()); | 773 new DnsTCPAttempt(server_index, std::move(socket), std::move(query)); |
| 773 | 774 |
| 774 attempts_.push_back(make_scoped_ptr(attempt)); | 775 attempts_.push_back(make_scoped_ptr(attempt)); |
| 775 ++attempts_count_; | 776 ++attempts_count_; |
| 776 had_tcp_attempt_ = true; | 777 had_tcp_attempt_ = true; |
| 777 | 778 |
| 778 net_log_.AddEvent( | 779 net_log_.AddEvent( |
| 779 NetLog::TYPE_DNS_TRANSACTION_TCP_ATTEMPT, | 780 NetLog::TYPE_DNS_TRANSACTION_TCP_ATTEMPT, |
| 780 attempt->GetSocketNetLog().source().ToEventParametersCallback()); | 781 attempt->GetSocketNetLog().source().ToEventParametersCallback()); |
| 781 | 782 |
| 782 int rv = attempt->Start(base::Bind(&DnsTransactionImpl::OnAttemptComplete, | 783 int rv = attempt->Start(base::Bind(&DnsTransactionImpl::OnAttemptComplete, |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 992 } // namespace | 993 } // namespace |
| 993 | 994 |
| 994 // static | 995 // static |
| 995 scoped_ptr<DnsTransactionFactory> DnsTransactionFactory::CreateFactory( | 996 scoped_ptr<DnsTransactionFactory> DnsTransactionFactory::CreateFactory( |
| 996 DnsSession* session) { | 997 DnsSession* session) { |
| 997 return scoped_ptr<DnsTransactionFactory>( | 998 return scoped_ptr<DnsTransactionFactory>( |
| 998 new DnsTransactionFactoryImpl(session)); | 999 new DnsTransactionFactoryImpl(session)); |
| 999 } | 1000 } |
| 1000 | 1001 |
| 1001 } // namespace net | 1002 } // namespace net |
| OLD | NEW |