Index: net/dns/dns_transaction.h |
=================================================================== |
--- net/dns/dns_transaction.h (revision 113383) |
+++ net/dns/dns_transaction.h (working copy) |
@@ -6,10 +6,12 @@ |
#define NET_DNS_DNS_TRANSACTION_H_ |
#pragma once |
+#include <set> |
#include <string> |
+#include <utility> |
#include <vector> |
-#include "base/memory/ref_counted.h" |
+#include "base/gtest_prod_util.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/timer.h" |
#include "base/threading/non_thread_safe.h" |
@@ -21,39 +23,70 @@ |
namespace net { |
+class ClientSocketFactory; |
class DatagramClientSocket; |
class DnsQuery; |
class DnsResponse; |
-class DnsSession; |
-// Performs a single asynchronous DNS transaction over UDP, |
+// Performs (with fixed retries) a single asynchronous DNS transaction, |
// which consists of sending out a DNS query, waiting for a response, and |
-// returning the response that it matches. |
+// parsing and returning the IP addresses that it matches. |
class NET_EXPORT_PRIVATE DnsTransaction : |
NON_EXPORTED_BASE(public base::NonThreadSafe) { |
public: |
- typedef base::Callback<void(DnsTransaction*, int)> ResultCallback; |
+ typedef std::pair<std::string, uint16> Key; |
- // Create new transaction using the parameters and state in |session|. |
- // Issues query for name |qname| (in DNS format) type |qtype| and class IN. |
- // Calls |callback| on completion or timeout. |
- // TODO(szym): change dependency to (IPEndPoint, Socket, DnsQuery, callback) |
- DnsTransaction(DnsSession* session, |
- const base::StringPiece& qname, |
- uint16 qtype, |
- const ResultCallback& callback, |
- const BoundNetLog& source_net_log); |
- ~DnsTransaction(); |
+ // Interface that should be implemented by DnsTransaction consumers and |
+ // passed to the |Start| method to be notified when the transaction has |
+ // completed. |
+ class NET_EXPORT_PRIVATE Delegate { |
+ public: |
+ Delegate(); |
+ virtual ~Delegate(); |
- const DnsQuery* query() const { return query_.get(); } |
+ // A consumer of DnsTransaction should override |OnTransactionComplete| |
+ // and call |set_delegate(this)|. The method will be called once the |
+ // resolution has completed, results passed in as arguments. |
+ virtual void OnTransactionComplete( |
+ int result, |
+ const DnsTransaction* transaction, |
+ const IPAddressList& ip_addresses); |
- const DnsResponse* response() const { return response_.get(); } |
+ private: |
+ friend class DnsTransaction; |
+ void Attach(DnsTransaction* transaction); |
+ void Detach(DnsTransaction* transaction); |
+ |
+ std::set<DnsTransaction*> registered_transactions_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Delegate); |
+ }; |
+ |
+ // |dns_server| is the address of the DNS server, |dns_name| is the |
+ // hostname (in DNS format) to be resolved, |query_type| is the type of |
+ // the query, either kDNS_A or kDNS_AAAA, |rand_int| is the PRNG used for |
+ // generating DNS query. |
+ DnsTransaction(const IPEndPoint& dns_server, |
+ const std::string& dns_name, |
+ uint16 query_type, |
+ const RandIntCallback& rand_int, |
+ ClientSocketFactory* socket_factory, |
+ const BoundNetLog& source_net_log, |
+ NetLog* net_log); |
+ ~DnsTransaction(); |
+ void SetDelegate(Delegate* delegate); |
+ const Key& key() const { return key_; } |
+ |
// Starts the resolution process. Will return ERR_IO_PENDING and will |
// notify the caller via |delegate|. Should only be called once. |
int Start(); |
private: |
+ FRIEND_TEST_ALL_PREFIXES(DnsTransactionTest, FirstTimeoutTest); |
+ FRIEND_TEST_ALL_PREFIXES(DnsTransactionTest, SecondTimeoutTest); |
+ FRIEND_TEST_ALL_PREFIXES(DnsTransactionTest, ThirdTimeoutTest); |
+ |
enum State { |
STATE_CONNECT, |
STATE_CONNECT_COMPLETE, |
@@ -81,17 +114,26 @@ |
void RevokeTimer(); |
void OnTimeout(); |
- scoped_refptr<DnsSession> session_; |
- IPEndPoint dns_server_; |
+ // This is to be used by unit tests only. |
+ void set_timeouts_ms(const std::vector<base::TimeDelta>& timeouts_ms); |
+ |
+ const IPEndPoint dns_server_; |
+ Key key_; |
+ IPAddressList ip_addresses_; |
+ Delegate* delegate_; |
+ |
scoped_ptr<DnsQuery> query_; |
- ResultCallback callback_; |
scoped_ptr<DnsResponse> response_; |
scoped_ptr<DatagramClientSocket> socket_; |
// Number of retry attempts so far. |
- int attempts_; |
+ size_t attempts_; |
+ // Timeouts in milliseconds. |
+ std::vector<base::TimeDelta> timeouts_ms_; |
+ |
State next_state_; |
+ ClientSocketFactory* socket_factory_; |
base::OneShotTimer<DnsTransaction> timer_; |
OldCompletionCallbackImpl<DnsTransaction> io_callback_; |