| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <deque> | 7 #include <deque> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 } | 387 } |
| 388 return rv; | 388 return rv; |
| 389 } | 389 } |
| 390 | 390 |
| 391 int DoConnectComplete(int rv) { | 391 int DoConnectComplete(int rv) { |
| 392 DCHECK_NE(ERR_IO_PENDING, rv); | 392 DCHECK_NE(ERR_IO_PENDING, rv); |
| 393 if (rv < 0) | 393 if (rv < 0) |
| 394 return rv; | 394 return rv; |
| 395 | 395 |
| 396 WriteBigEndian<uint16>(length_buffer_->data(), query_->io_buffer()->size()); | 396 WriteBigEndian<uint16>(length_buffer_->data(), query_->io_buffer()->size()); |
| 397 buffer_ = new DrainableIOBuffer(length_buffer_, length_buffer_->size()); | 397 buffer_ = |
| 398 new DrainableIOBuffer(length_buffer_.get(), length_buffer_->size()); |
| 398 next_state_ = STATE_SEND_LENGTH; | 399 next_state_ = STATE_SEND_LENGTH; |
| 399 return OK; | 400 return OK; |
| 400 } | 401 } |
| 401 | 402 |
| 402 int DoSendLength(int rv) { | 403 int DoSendLength(int rv) { |
| 403 DCHECK_NE(ERR_IO_PENDING, rv); | 404 DCHECK_NE(ERR_IO_PENDING, rv); |
| 404 if (rv < 0) | 405 if (rv < 0) |
| 405 return rv; | 406 return rv; |
| 406 | 407 |
| 407 buffer_->DidConsume(rv); | 408 buffer_->DidConsume(rv); |
| 408 if (buffer_->BytesRemaining() > 0) { | 409 if (buffer_->BytesRemaining() > 0) { |
| 409 next_state_ = STATE_SEND_LENGTH; | 410 next_state_ = STATE_SEND_LENGTH; |
| 410 return socket_->Write(buffer_, | 411 return socket_->Write( |
| 411 buffer_->BytesRemaining(), | 412 buffer_.get(), |
| 412 base::Bind(&DnsTCPAttempt::OnIOComplete, | 413 buffer_->BytesRemaining(), |
| 413 base::Unretained(this))); | 414 base::Bind(&DnsTCPAttempt::OnIOComplete, base::Unretained(this))); |
| 414 } | 415 } |
| 415 buffer_ = new DrainableIOBuffer(query_->io_buffer(), | 416 buffer_ = new DrainableIOBuffer(query_->io_buffer(), |
| 416 query_->io_buffer()->size()); | 417 query_->io_buffer()->size()); |
| 417 next_state_ = STATE_SEND_QUERY; | 418 next_state_ = STATE_SEND_QUERY; |
| 418 return OK; | 419 return OK; |
| 419 } | 420 } |
| 420 | 421 |
| 421 int DoSendQuery(int rv) { | 422 int DoSendQuery(int rv) { |
| 422 DCHECK_NE(ERR_IO_PENDING, rv); | 423 DCHECK_NE(ERR_IO_PENDING, rv); |
| 423 if (rv < 0) | 424 if (rv < 0) |
| 424 return rv; | 425 return rv; |
| 425 | 426 |
| 426 buffer_->DidConsume(rv); | 427 buffer_->DidConsume(rv); |
| 427 if (buffer_->BytesRemaining() > 0) { | 428 if (buffer_->BytesRemaining() > 0) { |
| 428 next_state_ = STATE_SEND_QUERY; | 429 next_state_ = STATE_SEND_QUERY; |
| 429 return socket_->Write(buffer_, | 430 return socket_->Write( |
| 430 buffer_->BytesRemaining(), | 431 buffer_.get(), |
| 431 base::Bind(&DnsTCPAttempt::OnIOComplete, | 432 buffer_->BytesRemaining(), |
| 432 base::Unretained(this))); | 433 base::Bind(&DnsTCPAttempt::OnIOComplete, base::Unretained(this))); |
| 433 } | 434 } |
| 434 buffer_ = new DrainableIOBuffer(length_buffer_, length_buffer_->size()); | 435 buffer_ = |
| 436 new DrainableIOBuffer(length_buffer_.get(), length_buffer_->size()); |
| 435 next_state_ = STATE_READ_LENGTH; | 437 next_state_ = STATE_READ_LENGTH; |
| 436 return OK; | 438 return OK; |
| 437 } | 439 } |
| 438 | 440 |
| 439 int DoReadLength(int rv) { | 441 int DoReadLength(int rv) { |
| 440 DCHECK_NE(ERR_IO_PENDING, rv); | 442 DCHECK_NE(ERR_IO_PENDING, rv); |
| 441 if (rv < 0) | 443 if (rv < 0) |
| 442 return rv; | 444 return rv; |
| 443 | 445 |
| 444 buffer_->DidConsume(rv); | 446 buffer_->DidConsume(rv); |
| 445 if (buffer_->BytesRemaining() > 0) { | 447 if (buffer_->BytesRemaining() > 0) { |
| 446 next_state_ = STATE_READ_LENGTH; | 448 next_state_ = STATE_READ_LENGTH; |
| 447 return socket_->Read(buffer_, | 449 return socket_->Read( |
| 448 buffer_->BytesRemaining(), | 450 buffer_.get(), |
| 449 base::Bind(&DnsTCPAttempt::OnIOComplete, | 451 buffer_->BytesRemaining(), |
| 450 base::Unretained(this))); | 452 base::Bind(&DnsTCPAttempt::OnIOComplete, base::Unretained(this))); |
| 451 } | 453 } |
| 452 ReadBigEndian<uint16>(length_buffer_->data(), &response_length_); | 454 ReadBigEndian<uint16>(length_buffer_->data(), &response_length_); |
| 453 // Check if advertised response is too short. (Optimization only.) | 455 // Check if advertised response is too short. (Optimization only.) |
| 454 if (response_length_ < query_->io_buffer()->size()) | 456 if (response_length_ < query_->io_buffer()->size()) |
| 455 return ERR_DNS_MALFORMED_RESPONSE; | 457 return ERR_DNS_MALFORMED_RESPONSE; |
| 456 // Allocate more space so that DnsResponse::InitParse sanity check passes. | 458 // Allocate more space so that DnsResponse::InitParse sanity check passes. |
| 457 response_.reset(new DnsResponse(response_length_ + 1)); | 459 response_.reset(new DnsResponse(response_length_ + 1)); |
| 458 buffer_ = new DrainableIOBuffer(response_->io_buffer(), response_length_); | 460 buffer_ = new DrainableIOBuffer(response_->io_buffer(), response_length_); |
| 459 next_state_ = STATE_READ_RESPONSE; | 461 next_state_ = STATE_READ_RESPONSE; |
| 460 return OK; | 462 return OK; |
| 461 } | 463 } |
| 462 | 464 |
| 463 int DoReadResponse(int rv) { | 465 int DoReadResponse(int rv) { |
| 464 DCHECK_NE(ERR_IO_PENDING, rv); | 466 DCHECK_NE(ERR_IO_PENDING, rv); |
| 465 if (rv < 0) | 467 if (rv < 0) |
| 466 return rv; | 468 return rv; |
| 467 | 469 |
| 468 buffer_->DidConsume(rv); | 470 buffer_->DidConsume(rv); |
| 469 if (buffer_->BytesRemaining() > 0) { | 471 if (buffer_->BytesRemaining() > 0) { |
| 470 next_state_ = STATE_READ_RESPONSE; | 472 next_state_ = STATE_READ_RESPONSE; |
| 471 return socket_->Read(buffer_, | 473 return socket_->Read( |
| 472 buffer_->BytesRemaining(), | 474 buffer_.get(), |
| 473 base::Bind(&DnsTCPAttempt::OnIOComplete, | 475 buffer_->BytesRemaining(), |
| 474 base::Unretained(this))); | 476 base::Bind(&DnsTCPAttempt::OnIOComplete, base::Unretained(this))); |
| 475 } | 477 } |
| 476 if (!response_->InitParse(buffer_->BytesConsumed(), *query_)) | 478 if (!response_->InitParse(buffer_->BytesConsumed(), *query_)) |
| 477 return ERR_DNS_MALFORMED_RESPONSE; | 479 return ERR_DNS_MALFORMED_RESPONSE; |
| 478 if (response_->flags() & dns_protocol::kFlagTC) | 480 if (response_->flags() & dns_protocol::kFlagTC) |
| 479 return ERR_UNEXPECTED; | 481 return ERR_UNEXPECTED; |
| 480 // TODO(szym): Frankly, none of these are expected. | 482 // TODO(szym): Frankly, none of these are expected. |
| 481 if (response_->rcode() == dns_protocol::kRcodeNXDOMAIN) | 483 if (response_->rcode() == dns_protocol::kRcodeNXDOMAIN) |
| 482 return ERR_NAME_NOT_RESOLVED; | 484 return ERR_NAME_NOT_RESOLVED; |
| 483 if (response_->rcode() != dns_protocol::kRcodeNOERROR) | 485 if (response_->rcode() != dns_protocol::kRcodeNOERROR) |
| 484 return ERR_DNS_SERVER_FAILED; | 486 return ERR_DNS_SERVER_FAILED; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 const DnsTransactionFactory::CallbackType& callback, | 529 const DnsTransactionFactory::CallbackType& callback, |
| 528 const BoundNetLog& net_log) | 530 const BoundNetLog& net_log) |
| 529 : session_(session), | 531 : session_(session), |
| 530 hostname_(hostname), | 532 hostname_(hostname), |
| 531 qtype_(qtype), | 533 qtype_(qtype), |
| 532 callback_(callback), | 534 callback_(callback), |
| 533 net_log_(net_log), | 535 net_log_(net_log), |
| 534 qnames_initial_size_(0), | 536 qnames_initial_size_(0), |
| 535 had_tcp_attempt_(false), | 537 had_tcp_attempt_(false), |
| 536 first_server_index_(0) { | 538 first_server_index_(0) { |
| 537 DCHECK(session_); | 539 DCHECK(session_.get()); |
| 538 DCHECK(!hostname_.empty()); | 540 DCHECK(!hostname_.empty()); |
| 539 DCHECK(!callback_.is_null()); | 541 DCHECK(!callback_.is_null()); |
| 540 DCHECK(!IsIPLiteral(hostname_)); | 542 DCHECK(!IsIPLiteral(hostname_)); |
| 541 } | 543 } |
| 542 | 544 |
| 543 virtual ~DnsTransactionImpl() { | 545 virtual ~DnsTransactionImpl() { |
| 544 if (!callback_.is_null()) { | 546 if (!callback_.is_null()) { |
| 545 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_DNS_TRANSACTION, | 547 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_DNS_TRANSACTION, |
| 546 ERR_ABORTED); | 548 ERR_ABORTED); |
| 547 } // otherwise logged in DoCallback or Start | 549 } // otherwise logged in DoCallback or Start |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 930 public: | 932 public: |
| 931 explicit DnsTransactionFactoryImpl(DnsSession* session) { | 933 explicit DnsTransactionFactoryImpl(DnsSession* session) { |
| 932 session_ = session; | 934 session_ = session; |
| 933 } | 935 } |
| 934 | 936 |
| 935 virtual scoped_ptr<DnsTransaction> CreateTransaction( | 937 virtual scoped_ptr<DnsTransaction> CreateTransaction( |
| 936 const std::string& hostname, | 938 const std::string& hostname, |
| 937 uint16 qtype, | 939 uint16 qtype, |
| 938 const CallbackType& callback, | 940 const CallbackType& callback, |
| 939 const BoundNetLog& net_log) OVERRIDE { | 941 const BoundNetLog& net_log) OVERRIDE { |
| 940 return scoped_ptr<DnsTransaction>(new DnsTransactionImpl(session_, | 942 return scoped_ptr<DnsTransaction>(new DnsTransactionImpl( |
| 941 hostname, | 943 session_.get(), hostname, qtype, callback, net_log)); |
| 942 qtype, | |
| 943 callback, | |
| 944 net_log)); | |
| 945 } | 944 } |
| 946 | 945 |
| 947 private: | 946 private: |
| 948 scoped_refptr<DnsSession> session_; | 947 scoped_refptr<DnsSession> session_; |
| 949 }; | 948 }; |
| 950 | 949 |
| 951 } // namespace | 950 } // namespace |
| 952 | 951 |
| 953 // static | 952 // static |
| 954 scoped_ptr<DnsTransactionFactory> DnsTransactionFactory::CreateFactory( | 953 scoped_ptr<DnsTransactionFactory> DnsTransactionFactory::CreateFactory( |
| 955 DnsSession* session) { | 954 DnsSession* session) { |
| 956 return scoped_ptr<DnsTransactionFactory>( | 955 return scoped_ptr<DnsTransactionFactory>( |
| 957 new DnsTransactionFactoryImpl(session)); | 956 new DnsTransactionFactoryImpl(session)); |
| 958 } | 957 } |
| 959 | 958 |
| 960 } // namespace net | 959 } // namespace net |
| OLD | NEW |