diff options
author | sergeyu <sergeyu@chromium.org> | 2015-07-08 18:46:00 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-07-09 01:46:41 +0000 |
commit | a113092147851769526ab89197b64d10d221c9d4 (patch) | |
tree | aa0546a1c03588f7b618b5f80ce627123aac46b5 /extensions/browser/api/socket/udp_socket.cc | |
parent | 3e7847fcfb33dd0aa06fea2ccbf02f5c07e2b5ea (diff) | |
download | chromium_src-a113092147851769526ab89197b64d10d221c9d4.zip chromium_src-a113092147851769526ab89197b64d10d221c9d4.tar.gz chromium_src-a113092147851769526ab89197b64d10d221c9d4.tar.bz2 |
Fix chrome.socket.tcp API to use all addresses received from DNS.
Previously chrome.socket.tcp API was using only one IP address it
receives from DNS. Fixed it to pass all addresses to TCPClientSocket so
it attempts to connect to all of them before failing.
BUG=508210
Review URL: https://codereview.chromium.org/1229763002
Cr-Commit-Position: refs/heads/master@{#337962}
Diffstat (limited to 'extensions/browser/api/socket/udp_socket.cc')
-rw-r--r-- | extensions/browser/api/socket/udp_socket.cc | 25 |
1 files changed, 6 insertions, 19 deletions
diff --git a/extensions/browser/api/socket/udp_socket.cc b/extensions/browser/api/socket/udp_socket.cc index 2822046..47eae2d 100644 --- a/extensions/browser/api/socket/udp_socket.cc +++ b/extensions/browser/api/socket/udp_socket.cc @@ -35,20 +35,16 @@ UDPSocket::UDPSocket(const std::string& owner_extension_id) UDPSocket::~UDPSocket() { Disconnect(); } -void UDPSocket::Connect(const std::string& address, - uint16 port, +void UDPSocket::Connect(const net::AddressList& address, const CompletionCallback& callback) { int result = net::ERR_CONNECTION_FAILED; do { if (is_connected_) break; - net::IPEndPoint ip_end_point; - if (!StringAndPortToIPEndPoint(address, port, &ip_end_point)) { - result = net::ERR_ADDRESS_INVALID; - break; - } - + // UDP API only connects to the first address received from DNS so + // connection may not work even if other addresses are reachable. + net::IPEndPoint ip_end_point = address.front(); result = socket_.Open(ip_end_point.GetFamily()); if (result != net::OK) break; @@ -177,8 +173,7 @@ void UDPSocket::RecvFrom(int count, void UDPSocket::SendTo(scoped_refptr<net::IOBuffer> io_buffer, int byte_count, - const std::string& address, - uint16 port, + const net::IPEndPoint& address, const CompletionCallback& callback) { DCHECK(!callback.is_null()); @@ -193,21 +188,13 @@ void UDPSocket::SendTo(scoped_refptr<net::IOBuffer> io_buffer, int result = net::ERR_FAILED; do { - net::IPEndPoint ip_end_point; - if (!StringAndPortToIPEndPoint(address, port, &ip_end_point)) { - result = net::ERR_ADDRESS_INVALID; - break; - } - if (!socket_.is_connected()) { result = net::ERR_SOCKET_NOT_CONNECTED; break; } result = socket_.SendTo( - io_buffer.get(), - byte_count, - ip_end_point, + io_buffer.get(), byte_count, address, base::Bind(&UDPSocket::OnSendToComplete, base::Unretained(this))); } while (false); |