From 39de601e1c3eda92eb2e37eca4e6aa960f206f39 Mon Sep 17 00:00:00 2001 From: Colin Ihrig Date: Fri, 1 Apr 2016 16:59:09 -0400 Subject: [PATCH] net: support DNS hints in createConnection() This commit adds support for passing DNS lookup hints to createConnection(). PR-URL: https://github.com/nodejs/node/pull/6000 Reviewed-By: Ben Noordhuis Reviewed-By: James M Snell --- doc/api/net.markdown | 3 +++ lib/net.js | 4 ++-- test/parallel/test-net-create-connection.js | 17 +++++++++++------ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/doc/api/net.markdown b/doc/api/net.markdown index 451b5f44ab36ac..10129c13b8944f 100644 --- a/doc/api/net.markdown +++ b/doc/api/net.markdown @@ -375,6 +375,8 @@ For TCP sockets, `options` argument should be an object which specifies: - `family` : Version of IP stack. Defaults to `4`. + - `hints`: [`dns.lookup()` hints][]. Defaults to `0`. + - `lookup` : Custom lookup function. Defaults to `dns.lookup`. For local domain sockets, `options` argument should be an object which @@ -720,6 +722,7 @@ Returns true if input is a version 6 IP address, otherwise returns false. [`connect()`]: #net_socket_connect_options_connectlistener [`destroy()`]: #net_socket_destroy [`dns.lookup()`]: dns.html#dns_dns_lookup_hostname_options_callback +[`dns.lookup()` hints]: #dns_supported_getaddrinfo_flags [`end()`]: #net_socket_end_data_encoding [`EventEmitter`]: events.html#events_class_events_eventemitter [`net.Socket`]: #net_class_net_socket diff --git a/lib/net.js b/lib/net.js index 09c582d9d7a2c4..37797bedbc182d 100644 --- a/lib/net.js +++ b/lib/net.js @@ -946,10 +946,10 @@ function lookupAndConnect(self, options) { var dnsopts = { family: options.family, - hints: 0 + hints: options.hints || 0 }; - if (dnsopts.family !== 4 && dnsopts.family !== 6) { + if (dnsopts.family !== 4 && dnsopts.family !== 6 && dnsopts.hints === 0) { dnsopts.hints = dns.ADDRCONFIG; // The AI_V4MAPPED hint is not supported on FreeBSD or Android, // and getaddrinfo returns EAI_BADFLAGS. However, it seems to be diff --git a/test/parallel/test-net-create-connection.js b/test/parallel/test-net-create-connection.js index 44ae62b343736b..6cc71c7afa8b73 100644 --- a/test/parallel/test-net-create-connection.js +++ b/test/parallel/test-net-create-connection.js @@ -1,14 +1,15 @@ 'use strict'; -var common = require('../common'); -var assert = require('assert'); -var net = require('net'); +const common = require('../common'); +const assert = require('assert'); +const dns = require('dns'); +const net = require('net'); -var tcpPort = common.PORT; -var expectedConnections = 7; +const tcpPort = common.PORT; +const expectedConnections = 7; var clientConnected = 0; var serverConnected = 0; -var server = net.createServer(function(socket) { +const server = net.createServer(function(socket) { socket.end(); if (++serverConnected === expectedConnections) { server.close(); @@ -87,6 +88,10 @@ server.listen(tcpPort, 'localhost', function() { fail({ port: 65536 }, RangeError, '"port" option should be >= 0 and < 65536: 65536'); + + fail({ + hints: (dns.ADDRCONFIG | dns.V4MAPPED) + 42, + }, TypeError, 'Invalid argument: hints must use valid flags'); }); // Try connecting to random ports, but do so once the server is closed