diff --git a/dom/network/TCPSocket.cpp b/dom/network/TCPSocket.cpp index ef8e80420e1b..9af1e6f702db 100644 --- a/dom/network/TCPSocket.cpp +++ b/dom/network/TCPSocket.cpp @@ -893,9 +893,12 @@ nsresult TCPSocket::ResolveProxy() { nsCOMPtr uri; nsCString spec = mSsl ? "https://"_ns : "http://"_ns; + bool maybeIPv6 = mHost.FindChar(':') != -1; + if (maybeIPv6) spec.Append('['); if (!AppendUTF16toUTF8(mHost, spec, fallible)) { return NS_ERROR_OUT_OF_MEMORY; } + if (maybeIPv6) spec.Append(']'); rv = NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID) .SetSpec(spec) .SetPort(mPort) diff --git a/dom/network/tests/test_tcpsocket_client_and_server_basics.js b/dom/network/tests/test_tcpsocket_client_and_server_basics.js index 653f543bc524..79f431cecaa5 100644 --- a/dom/network/tests/test_tcpsocket_client_and_server_basics.js +++ b/dom/network/tests/test_tcpsocket_client_and_server_basics.js @@ -589,3 +589,26 @@ async function test_basics() { } add_task(test_basics); + +/** + * Test that TCPSocket works with ipv6 address. + */ +add_task(async function test_ipv6() { + const { HttpServer } = ChromeUtils.import( + "resource://testing-common/httpd.js" + ); + let deferred = defer(); + let serverPort = 8086; + let httpServer = new HttpServer(); + httpServer.start_ipv6(serverPort); + let clientSocket = new TCPSocket("::1", serverPort); + clientSocket.onopen = () => { + ok(true, "Connect to ipv6 address succeeded"); + deferred.resolve(); + }; + clientSocket.onerror = () => { + ok(false, "Connect to ipv6 address failed"); + deferred.reject(); + }; + return deferred.promise; +});