| Index: net/dns/dns_transaction.cc
|
| diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc
|
| deleted file mode 100644
|
| index 6d711b4a5a97cbcd3fe4d3b88cf1192a962a3177..0000000000000000000000000000000000000000
|
| --- a/net/dns/dns_transaction.cc
|
| +++ /dev/null
|
| @@ -1,278 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/dns/dns_transaction.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/rand_util.h"
|
| -#include "base/values.h"
|
| -#include "net/base/io_buffer.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/dns/dns_protocol.h"
|
| -#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 {
|
| -
|
| -namespace {
|
| -
|
| -class DnsTransactionStartParameters : public NetLog::EventParameters {
|
| - public:
|
| - DnsTransactionStartParameters(const IPEndPoint& dns_server,
|
| - const base::StringPiece& qname,
|
| - uint16 qtype,
|
| - const NetLog::Source& source)
|
| - : dns_server_(dns_server),
|
| - qname_(qname.data(), qname.length()),
|
| - qtype_(qtype),
|
| - source_(source) {}
|
| -
|
| - virtual Value* ToValue() const {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| - dict->SetString("dns_server", dns_server_.ToString());
|
| - dict->SetString("hostname", qname_);
|
| - dict->SetInteger("query_type", qtype_);
|
| - if (source_.is_valid())
|
| - dict->Set("source_dependency", source_.ToValue());
|
| - return dict;
|
| - }
|
| -
|
| - private:
|
| - IPEndPoint dns_server_;
|
| - std::string qname_;
|
| - uint16 qtype_;
|
| - const NetLog::Source source_;
|
| -};
|
| -
|
| -class DnsTransactionFinishParameters : public NetLog::EventParameters {
|
| - public:
|
| - // TODO(szym): add rcode ?
|
| - DnsTransactionFinishParameters(int net_error, int answer_count)
|
| - : net_error_(net_error), answer_count_(answer_count) {}
|
| -
|
| - virtual Value* ToValue() const {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| - if (net_error_)
|
| - dict->SetInteger("net_error", net_error_);
|
| - dict->SetInteger("answer_count", answer_count_);
|
| - return dict;
|
| - }
|
| -
|
| - private:
|
| - const int net_error_;
|
| - const int answer_count_;
|
| -};
|
| -
|
| -class DnsTransactionRetryParameters : public NetLog::EventParameters {
|
| - public:
|
| - DnsTransactionRetryParameters(int attempt_number,
|
| - const NetLog::Source& source)
|
| - : attempt_number_(attempt_number), source_(source) {}
|
| -
|
| - virtual Value* ToValue() const {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| - dict->SetInteger("attempt_number", attempt_number_);
|
| - dict->Set("source_dependency", source_.ToValue());
|
| - return dict;
|
| - }
|
| -
|
| - private:
|
| - const int attempt_number_;
|
| - const NetLog::Source source_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -
|
| -DnsTransaction::DnsTransaction(DnsSession* session,
|
| - const base::StringPiece& qname,
|
| - uint16 qtype,
|
| - const ResultCallback& callback,
|
| - const BoundNetLog& source_net_log)
|
| - : session_(session),
|
| - dns_server_(session->NextServer()),
|
| - query_(new DnsQuery(session->NextId(), qname, qtype)),
|
| - callback_(callback),
|
| - attempts_(0),
|
| - next_state_(STATE_NONE),
|
| - net_log_(BoundNetLog::Make(session->net_log(),
|
| - NetLog::SOURCE_DNS_TRANSACTION)) {
|
| - net_log_.BeginEvent(
|
| - NetLog::TYPE_DNS_TRANSACTION,
|
| - make_scoped_refptr(
|
| - new DnsTransactionStartParameters(dns_server_,
|
| - qname,
|
| - qtype,
|
| - source_net_log.source())));
|
| -}
|
| -
|
| -DnsTransaction::~DnsTransaction() {}
|
| -
|
| -int DnsTransaction::Start() {
|
| - DCHECK_EQ(STATE_NONE, next_state_);
|
| - next_state_ = STATE_CONNECT;
|
| - return DoLoop(OK);
|
| -}
|
| -
|
| -int DnsTransaction::DoLoop(int result) {
|
| - DCHECK_NE(STATE_NONE, next_state_);
|
| - int rv = result;
|
| - do {
|
| - State state = next_state_;
|
| - next_state_ = STATE_NONE;
|
| - switch (state) {
|
| - case STATE_CONNECT:
|
| - rv = DoConnect();
|
| - break;
|
| - case STATE_CONNECT_COMPLETE:
|
| - rv = DoConnectComplete(rv);
|
| - break;
|
| - case STATE_SEND_QUERY:
|
| - rv = DoSendQuery();
|
| - break;
|
| - case STATE_SEND_QUERY_COMPLETE:
|
| - rv = DoSendQueryComplete(rv);
|
| - break;
|
| - case STATE_READ_RESPONSE:
|
| - rv = DoReadResponse();
|
| - break;
|
| - case STATE_READ_RESPONSE_COMPLETE:
|
| - rv = DoReadResponseComplete(rv);
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE);
|
| -
|
| - return rv;
|
| -}
|
| -
|
| -void DnsTransaction::DoCallback(int result) {
|
| - DCHECK_NE(result, ERR_IO_PENDING);
|
| - int answer_count = (result == OK) ? response()->answer_count() : 0;
|
| - net_log_.EndEvent(
|
| - NetLog::TYPE_DNS_TRANSACTION,
|
| - make_scoped_refptr(
|
| - new DnsTransactionFinishParameters(result, answer_count)));
|
| - callback_.Run(this, result);
|
| -}
|
| -
|
| -void DnsTransaction::OnIOComplete(int result) {
|
| - int rv = DoLoop(result);
|
| - if (rv != ERR_IO_PENDING)
|
| - DoCallback(rv);
|
| -}
|
| -
|
| -int DnsTransaction::DoConnect() {
|
| - next_state_ = STATE_CONNECT_COMPLETE;
|
| -
|
| - StartTimer(session_->NextTimeout(attempts_));
|
| - ++attempts_;
|
| -
|
| - // TODO(szym): keep all sockets around in case the server responds
|
| - // after its timeout; state machine will need to change to handle that.
|
| - // The current plan is to move socket management out to DnsSession.
|
| - // Hence also move retransmissions to DnsClient::Request.
|
| - socket_.reset(session_->socket_factory()->CreateDatagramClientSocket(
|
| - DatagramSocket::RANDOM_BIND,
|
| - base::Bind(&base::RandInt),
|
| - net_log_.net_log(),
|
| - net_log_.source()));
|
| -
|
| - net_log_.AddEvent(
|
| - NetLog::TYPE_DNS_TRANSACTION_ATTEMPT_STARTED,
|
| - make_scoped_refptr(
|
| - new DnsTransactionRetryParameters(attempts_,
|
| - socket_->NetLog().source())));
|
| -
|
| - return socket_->Connect(dns_server_);
|
| -}
|
| -
|
| -int DnsTransaction::DoConnectComplete(int rv) {
|
| - if (rv < 0)
|
| - return rv;
|
| - next_state_ = STATE_SEND_QUERY;
|
| - return OK;
|
| -}
|
| -
|
| -int DnsTransaction::DoSendQuery() {
|
| - next_state_ = STATE_SEND_QUERY_COMPLETE;
|
| - return socket_->Write(query_->io_buffer(),
|
| - query_->io_buffer()->size(),
|
| - base::Bind(&DnsTransaction::OnIOComplete,
|
| - base::Unretained(this)));
|
| -}
|
| -
|
| -int DnsTransaction::DoSendQueryComplete(int rv) {
|
| - if (rv < 0)
|
| - return rv;
|
| -
|
| - // Writing to UDP should not result in a partial datagram.
|
| - if (rv != query_->io_buffer()->size())
|
| - return ERR_MSG_TOO_BIG;
|
| -
|
| - next_state_ = STATE_READ_RESPONSE;
|
| - return OK;
|
| -}
|
| -
|
| -int DnsTransaction::DoReadResponse() {
|
| - next_state_ = STATE_READ_RESPONSE_COMPLETE;
|
| - response_.reset(new DnsResponse());
|
| - return socket_->Read(response_->io_buffer(),
|
| - response_->io_buffer()->size(),
|
| - base::Bind(&DnsTransaction::OnIOComplete,
|
| - base::Unretained(this)));
|
| -}
|
| -
|
| -int DnsTransaction::DoReadResponseComplete(int rv) {
|
| - DCHECK_NE(ERR_IO_PENDING, rv);
|
| - RevokeTimer();
|
| - if (rv < 0)
|
| - return rv;
|
| -
|
| - DCHECK(rv);
|
| - if (!response_->InitParse(rv, *query_))
|
| - return ERR_DNS_MALFORMED_RESPONSE;
|
| - // TODO(szym): define this flag value in dns_protocol
|
| - if (response_->flags1() & 2)
|
| - return ERR_DNS_SERVER_REQUIRES_TCP;
|
| - // TODO(szym): move this handling out of DnsTransaction?
|
| - if (response_->rcode() != dns_protocol::kRcodeNOERROR &&
|
| - response_->rcode() != dns_protocol::kRcodeNXDOMAIN) {
|
| - return ERR_DNS_SERVER_FAILED;
|
| - }
|
| - // TODO(szym): add ERR_DNS_RR_NOT_FOUND?
|
| - if (response_->answer_count() == 0)
|
| - return ERR_NAME_NOT_RESOLVED;
|
| -
|
| - return OK;
|
| -}
|
| -
|
| -void DnsTransaction::StartTimer(base::TimeDelta delay) {
|
| - timer_.Start(FROM_HERE, delay, this, &DnsTransaction::OnTimeout);
|
| -}
|
| -
|
| -void DnsTransaction::RevokeTimer() {
|
| - timer_.Stop();
|
| -}
|
| -
|
| -void DnsTransaction::OnTimeout() {
|
| - DCHECK(next_state_ == STATE_SEND_QUERY_COMPLETE ||
|
| - next_state_ == STATE_READ_RESPONSE_COMPLETE);
|
| - if (attempts_ == session_->config().attempts) {
|
| - DoCallback(ERR_DNS_TIMED_OUT);
|
| - return;
|
| - }
|
| - next_state_ = STATE_CONNECT;
|
| - query_.reset(query_->CloneWithNewId(session_->NextId()));
|
| - int rv = DoLoop(OK);
|
| - if (rv != ERR_IO_PENDING)
|
| - DoCallback(rv);
|
| -}
|
| -
|
| -} // namespace net
|
|
|