Chromium Code Reviews| Index: net/dns/dns_transaction.cc |
| diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc |
| index 00d8064f6e8d6f263423659519e9691a99e406aa..45f2e9735f4813341fe5a6444757e8405c4b82d0 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,13 +64,11 @@ 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), |
| - socket_(socket.Pass()), |
| - server_(server), |
| + socket_lease_(socket_lease.Pass()), |
| query_(query.Pass()), |
| callback_(callback) { |
| } |
| @@ -81,7 +77,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); |
| } |
| @@ -90,7 +86,7 @@ class DnsUDPAttempt { |
| } |
| const DatagramClientSocket* socket() const { |
| - return socket_.get(); |
| + return socket_lease_->socket(); |
| } |
| // Returns the response or NULL if has not received a matching response from |
| @@ -109,13 +105,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, |
| @@ -123,6 +118,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; |
| @@ -130,9 +129,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; |
| @@ -154,17 +150,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) { |
| @@ -183,10 +174,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) { |
| @@ -223,8 +214,7 @@ class DnsUDPAttempt { |
| State next_state_; |
| - scoped_ptr<DatagramClientSocket> socket_; |
| - IPEndPoint server_; |
| + scoped_ptr<DnsSession::SocketLease> socket_lease_; |
| scoped_ptr<DnsQuery> query_; |
| scoped_ptr<DnsResponse> response_; |
| @@ -384,21 +374,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()) { |
| @@ -407,22 +382,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), |
| query.Pass(), |
| base::Bind(&DnsTransactionImpl::OnAttemptComplete, |
| base::Unretained(this), |
| attempt_number)); |
| + net_log_.AddEvent( |
|
cbentzel
2012/08/29 16:48:06
Why did this move?
szym
2012/08/29 16:57:08
In my draft CL, this moved because it needs a refe
|
| + NetLog::TYPE_DNS_TRANSACTION_ATTEMPT, |
| + attempt->socket()->NetLog().source().ToEventParametersCallback()); |
| + |
| attempts_.push_back(attempt); |
| int rv = attempt->Start(); |