OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/rand_util.h" | 8 #include "base/rand_util.h" |
9 #include "base/values.h" | 9 #include "base/values.h" |
10 #include "net/base/dns_util.h" | 10 #include "net/base/dns_util.h" |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 const BoundNetLog& source_net_log, | 147 const BoundNetLog& source_net_log, |
148 NetLog* net_log) | 148 NetLog* net_log) |
149 : dns_server_(dns_server), | 149 : dns_server_(dns_server), |
150 key_(dns_name, query_type), | 150 key_(dns_name, query_type), |
151 delegate_(NULL), | 151 delegate_(NULL), |
152 query_(new DnsQuery(dns_name, query_type, rand_int)), | 152 query_(new DnsQuery(dns_name, query_type, rand_int)), |
153 attempts_(0), | 153 attempts_(0), |
154 next_state_(STATE_NONE), | 154 next_state_(STATE_NONE), |
155 socket_factory_(socket_factory ? socket_factory : | 155 socket_factory_(socket_factory ? socket_factory : |
156 ClientSocketFactory::GetDefaultFactory()), | 156 ClientSocketFactory::GetDefaultFactory()), |
157 ALLOW_THIS_IN_INITIALIZER_LIST( | |
158 io_callback_(this, &DnsTransaction::OnIOComplete)), | |
159 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_DNS_TRANSACTION)) { | 157 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_DNS_TRANSACTION)) { |
160 DCHECK(!rand_int.is_null()); | 158 DCHECK(!rand_int.is_null()); |
161 for (size_t i = 0; i < arraysize(kTimeoutsMs); ++i) | 159 for (size_t i = 0; i < arraysize(kTimeoutsMs); ++i) |
162 timeouts_ms_.push_back(base::TimeDelta::FromMilliseconds(kTimeoutsMs[i])); | 160 timeouts_ms_.push_back(base::TimeDelta::FromMilliseconds(kTimeoutsMs[i])); |
163 net_log_.BeginEvent( | 161 net_log_.BeginEvent( |
164 NetLog::TYPE_DNS_TRANSACTION, | 162 NetLog::TYPE_DNS_TRANSACTION, |
165 make_scoped_refptr( | 163 make_scoped_refptr( |
166 new DnsTransactionStartParameters(dns_server_, key_, | 164 new DnsTransactionStartParameters(dns_server_, key_, |
167 source_net_log.source()))); | 165 source_net_log.source()))); |
168 } | 166 } |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 if (rv < 0) | 263 if (rv < 0) |
266 return rv; | 264 return rv; |
267 next_state_ = STATE_SEND_QUERY; | 265 next_state_ = STATE_SEND_QUERY; |
268 return OK; | 266 return OK; |
269 } | 267 } |
270 | 268 |
271 int DnsTransaction::DoSendQuery() { | 269 int DnsTransaction::DoSendQuery() { |
272 next_state_ = STATE_SEND_QUERY_COMPLETE; | 270 next_state_ = STATE_SEND_QUERY_COMPLETE; |
273 return socket_->Write(query_->io_buffer(), | 271 return socket_->Write(query_->io_buffer(), |
274 query_->io_buffer()->size(), | 272 query_->io_buffer()->size(), |
275 &io_callback_); | 273 base::Bind(&DnsTransaction::OnIOComplete, |
| 274 base::Unretained(this))); |
276 } | 275 } |
277 | 276 |
278 int DnsTransaction::DoSendQueryComplete(int rv) { | 277 int DnsTransaction::DoSendQueryComplete(int rv) { |
279 if (rv < 0) | 278 if (rv < 0) |
280 return rv; | 279 return rv; |
281 | 280 |
282 // Writing to UDP should not result in a partial datagram. | 281 // Writing to UDP should not result in a partial datagram. |
283 if (rv != query_->io_buffer()->size()) | 282 if (rv != query_->io_buffer()->size()) |
284 return ERR_NAME_NOT_RESOLVED; | 283 return ERR_NAME_NOT_RESOLVED; |
285 | 284 |
286 next_state_ = STATE_READ_RESPONSE; | 285 next_state_ = STATE_READ_RESPONSE; |
287 return OK; | 286 return OK; |
288 } | 287 } |
289 | 288 |
290 int DnsTransaction::DoReadResponse() { | 289 int DnsTransaction::DoReadResponse() { |
291 next_state_ = STATE_READ_RESPONSE_COMPLETE; | 290 next_state_ = STATE_READ_RESPONSE_COMPLETE; |
292 response_.reset(new DnsResponse(query_.get())); | 291 response_.reset(new DnsResponse(query_.get())); |
293 return socket_->Read(response_->io_buffer(), | 292 return socket_->Read(response_->io_buffer(), |
294 response_->io_buffer()->size(), | 293 response_->io_buffer()->size(), |
295 &io_callback_); | 294 base::Bind(&DnsTransaction::OnIOComplete, |
| 295 base::Unretained(this))); |
296 } | 296 } |
297 | 297 |
298 int DnsTransaction::DoReadResponseComplete(int rv) { | 298 int DnsTransaction::DoReadResponseComplete(int rv) { |
299 DCHECK_NE(ERR_IO_PENDING, rv); | 299 DCHECK_NE(ERR_IO_PENDING, rv); |
300 RevokeTimer(); | 300 RevokeTimer(); |
301 if (rv < 0) | 301 if (rv < 0) |
302 return rv; | 302 return rv; |
303 | 303 |
304 DCHECK(rv); | 304 DCHECK(rv); |
305 // TODO(agayev): when supporting EDNS0 we may need to do multiple reads | 305 // TODO(agayev): when supporting EDNS0 we may need to do multiple reads |
(...skipping 23 matching lines...) Expand all Loading... |
329 DoCallback(rv); | 329 DoCallback(rv); |
330 } | 330 } |
331 | 331 |
332 void DnsTransaction::set_timeouts_ms( | 332 void DnsTransaction::set_timeouts_ms( |
333 const std::vector<base::TimeDelta>& timeouts_ms) { | 333 const std::vector<base::TimeDelta>& timeouts_ms) { |
334 DCHECK_EQ(0u, attempts_); | 334 DCHECK_EQ(0u, attempts_); |
335 timeouts_ms_ = timeouts_ms; | 335 timeouts_ms_ = timeouts_ms; |
336 } | 336 } |
337 | 337 |
338 } // namespace net | 338 } // namespace net |
OLD | NEW |