Chromium Code Reviews| Index: net/dns/dns_transaction.cc | 
| diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc | 
| index 02add74d6b1fe6dfcf228400d1599328175cf587..471578063f452910b041bc921d777c43f3d5c2bb 100644 | 
| --- a/net/dns/dns_transaction.cc | 
| +++ b/net/dns/dns_transaction.cc | 
| @@ -14,7 +14,6 @@ | 
| #include "base/memory/scoped_vector.h" | 
| #include "base/memory/weak_ptr.h" | 
| #include "base/message_loop.h" | 
| -#include "base/rand_util.h" | 
| #include "base/stl_util.h" | 
| #include "base/string_piece.h" | 
| #include "base/threading/non_thread_safe.h" | 
| @@ -30,7 +29,6 @@ | 
| #include "net/dns/dns_query.h" | 
| #include "net/dns/dns_response.h" | 
| #include "net/dns/dns_session.h" | 
| -#include "net/socket/client_socket_factory.h" | 
| #include "net/udp/datagram_client_socket.h" | 
| namespace net { | 
| @@ -66,14 +64,12 @@ Value* NetLogStartCallback(const std::string* hostname, | 
| // matches. Logging is done in the socket and in the outer DnsTransaction. | 
| class DnsUDPAttempt { | 
| public: | 
| - DnsUDPAttempt(scoped_ptr<DatagramClientSocket> socket, | 
| - const IPEndPoint& server, | 
| + DnsUDPAttempt(scoped_ptr<DnsSession::SocketLease> socket_lease, | 
| scoped_ptr<DnsQuery> query, | 
| const CompletionCallback& callback) | 
| : next_state_(STATE_NONE), | 
| received_malformed_response_(false), | 
| - socket_(socket.Pass()), | 
| - server_(server), | 
| + socket_lease_(socket_lease.Pass()), | 
| query_(query.Pass()), | 
| callback_(callback) { | 
| } | 
| @@ -82,7 +78,7 @@ class DnsUDPAttempt { | 
| // and calls |callback| upon completion. | 
| int Start() { | 
| DCHECK_EQ(STATE_NONE, next_state_); | 
| - next_state_ = STATE_CONNECT; | 
| + next_state_ = STATE_SEND_QUERY; | 
| return DoLoop(OK); | 
| } | 
| @@ -91,7 +87,7 @@ class DnsUDPAttempt { | 
| } | 
| const DatagramClientSocket* socket() const { | 
| 
 
szym
2012/09/26 11:16:12
This is used only to get the NetLog::Source. While
 
Deprecated (see juliatuttle)
2012/09/26 20:44:50
Done.
 
 | 
| - return socket_.get(); | 
| + return socket_lease_->socket(); | 
| } | 
| // Returns the response or NULL if has not received a matching response from | 
| @@ -110,13 +106,12 @@ class DnsUDPAttempt { | 
| DictionaryValue* dict = new DictionaryValue(); | 
| dict->SetInteger("rcode", response_->rcode()); | 
| dict->SetInteger("answer_count", response_->answer_count()); | 
| - socket_->NetLog().source().AddToEventParameters(dict); | 
| + socket()->NetLog().source().AddToEventParameters(dict); | 
| return dict; | 
| } | 
| private: | 
| enum State { | 
| - STATE_CONNECT, | 
| STATE_SEND_QUERY, | 
| STATE_SEND_QUERY_COMPLETE, | 
| STATE_READ_RESPONSE, | 
| @@ -124,6 +119,10 @@ class DnsUDPAttempt { | 
| STATE_NONE, | 
| }; | 
| + DatagramClientSocket* my_socket() { | 
| + return socket_lease_->socket(); | 
| + } | 
| + | 
| int DoLoop(int result) { | 
| CHECK_NE(STATE_NONE, next_state_); | 
| int rv = result; | 
| @@ -131,9 +130,6 @@ class DnsUDPAttempt { | 
| State state = next_state_; | 
| next_state_ = STATE_NONE; | 
| switch (state) { | 
| - case STATE_CONNECT: | 
| - rv = DoConnect(); | 
| - break; | 
| case STATE_SEND_QUERY: | 
| rv = DoSendQuery(); | 
| break; | 
| @@ -158,17 +154,12 @@ class DnsUDPAttempt { | 
| return rv; | 
| } | 
| - int DoConnect() { | 
| - next_state_ = STATE_SEND_QUERY; | 
| - return socket_->Connect(server_); | 
| - } | 
| - | 
| int DoSendQuery() { | 
| next_state_ = STATE_SEND_QUERY_COMPLETE; | 
| - return socket_->Write(query_->io_buffer(), | 
| - query_->io_buffer()->size(), | 
| - base::Bind(&DnsUDPAttempt::OnIOComplete, | 
| - base::Unretained(this))); | 
| + return my_socket()->Write(query_->io_buffer(), | 
| + query_->io_buffer()->size(), | 
| + base::Bind(&DnsUDPAttempt::OnIOComplete, | 
| + base::Unretained(this))); | 
| } | 
| int DoSendQueryComplete(int rv) { | 
| @@ -187,10 +178,10 @@ class DnsUDPAttempt { | 
| int DoReadResponse() { | 
| next_state_ = STATE_READ_RESPONSE_COMPLETE; | 
| response_.reset(new DnsResponse()); | 
| - return socket_->Read(response_->io_buffer(), | 
| - response_->io_buffer()->size(), | 
| - base::Bind(&DnsUDPAttempt::OnIOComplete, | 
| - base::Unretained(this))); | 
| + return my_socket()->Read(response_->io_buffer(), | 
| + response_->io_buffer()->size(), | 
| + base::Bind(&DnsUDPAttempt::OnIOComplete, | 
| + base::Unretained(this))); | 
| } | 
| int DoReadResponseComplete(int rv) { | 
| @@ -230,8 +221,7 @@ class DnsUDPAttempt { | 
| State next_state_; | 
| bool received_malformed_response_; | 
| - scoped_ptr<DatagramClientSocket> socket_; | 
| - IPEndPoint server_; | 
| + scoped_ptr<DnsSession::SocketLease> socket_lease_; | 
| scoped_ptr<DnsQuery> query_; | 
| scoped_ptr<DnsResponse> response_; | 
| @@ -391,21 +381,6 @@ class DnsTransactionImpl : public DnsTransaction, | 
| AttemptResult MakeAttempt() { | 
| unsigned attempt_number = attempts_.size(); | 
| -#if defined(OS_WIN) | 
| - // Avoid the Windows firewall warning about explicit UDP binding. | 
| - // TODO(szym): Reuse a pool of pre-bound sockets. http://crbug.com/107413 | 
| - DatagramSocket::BindType bind_type = DatagramSocket::DEFAULT_BIND; | 
| -#else | 
| - DatagramSocket::BindType bind_type = DatagramSocket::RANDOM_BIND; | 
| -#endif | 
| - | 
| - scoped_ptr<DatagramClientSocket> socket( | 
| - session_->socket_factory()->CreateDatagramClientSocket( | 
| - bind_type, | 
| - base::Bind(&base::RandInt), | 
| - net_log_.net_log(), | 
| - net_log_.source())); | 
| - | 
| uint16 id = session_->NextQueryId(); | 
| scoped_ptr<DnsQuery> query; | 
| if (attempts_.empty()) { | 
| @@ -414,22 +389,22 @@ class DnsTransactionImpl : public DnsTransaction, | 
| query.reset(attempts_[0]->query()->CloneWithNewId(id)); | 
| } | 
| - net_log_.AddEvent(NetLog::TYPE_DNS_TRANSACTION_ATTEMPT, | 
| - socket->NetLog().source().ToEventParametersCallback()); | 
| - | 
| const DnsConfig& config = session_->config(); | 
| unsigned server_index = first_server_index_ + | 
| (attempt_number % config.nameservers.size()); | 
| DnsUDPAttempt* attempt = new DnsUDPAttempt( | 
| - socket.Pass(), | 
| - config.nameservers[server_index], | 
| + session_->AllocateSocket(server_index, net_log_.source()), | 
| query.Pass(), | 
| base::Bind(&DnsTransactionImpl::OnAttemptComplete, | 
| base::Unretained(this), | 
| attempt_number)); | 
| + net_log_.AddEvent( | 
| + NetLog::TYPE_DNS_TRANSACTION_ATTEMPT, | 
| + attempt->socket()->NetLog().source().ToEventParametersCallback()); | 
| + | 
| attempts_.push_back(attempt); | 
| int rv = attempt->Start(); |