Move dns.isIP to net.isIP
Add tests and docs.
This commit is contained in:
parent
251d03197f
commit
c8f9728de7
@ -2228,6 +2228,25 @@ Set this property to reject connections when the server's connection count gets
|
|||||||
The number of concurrent connections on the server.
|
The number of concurrent connections on the server.
|
||||||
|
|
||||||
|
|
||||||
|
## net.isIP
|
||||||
|
|
||||||
|
### net.isIP(input)
|
||||||
|
|
||||||
|
Tests if input is an IP address. Returns 0 for invalid strings,
|
||||||
|
returns 4 for IP version 4 addresses, and returns 6 for IP version 6 addresses.
|
||||||
|
|
||||||
|
|
||||||
|
### net.isIPv4(input)
|
||||||
|
|
||||||
|
Returns true if input is a version 4 IP address, otherwise returns false.
|
||||||
|
|
||||||
|
|
||||||
|
### net.isIPv6(input)
|
||||||
|
|
||||||
|
Returns true if input is a version 6 IP address, otherwise returns false.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## net.Stream
|
## net.Stream
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ Socket.prototype.send = function(buffer, offset, length) {
|
|||||||
throw new Error(this.type + " sockets must send to port, address");
|
throw new Error(this.type + " sockets must send to port, address");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dns.isIP(arguments[4])) {
|
if (binding.isIP(arguments[4])) {
|
||||||
self.sendto(arguments[0], arguments[1], arguments[2], arguments[3],
|
self.sendto(arguments[0], arguments[1], arguments[2], arguments[3],
|
||||||
arguments[4], arguments[5]);
|
arguments[4], arguments[5]);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
var dns = process.binding('cares');
|
var dns = process.binding('cares');
|
||||||
|
var net = process.binding('net');
|
||||||
|
|
||||||
|
|
||||||
var watchers = {};
|
var watchers = {};
|
||||||
@ -71,8 +72,6 @@ var channel = new dns.Channel({SOCK_STATE_CB: function (socket, read, write) {
|
|||||||
updateTimer();
|
updateTimer();
|
||||||
}});
|
}});
|
||||||
|
|
||||||
exports.isIP = dns.isIP;
|
|
||||||
|
|
||||||
exports.resolve = function (domain, type_, callback_) {
|
exports.resolve = function (domain, type_, callback_) {
|
||||||
var type, callback;
|
var type, callback;
|
||||||
if (typeof(type_) == 'string') {
|
if (typeof(type_) == 'string') {
|
||||||
@ -133,7 +132,7 @@ exports.lookup = function (domain, family, callback) {
|
|||||||
callback(null, null, family === 6 ? 6 : 4);
|
callback(null, null, family === 6 ? 6 : 4);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var matchedFamily = dns.isIP(domain);
|
var matchedFamily = net.isIP(domain);
|
||||||
if (matchedFamily) {
|
if (matchedFamily) {
|
||||||
callback(null, domain, matchedFamily);
|
callback(null, domain, matchedFamily);
|
||||||
} else {
|
} else {
|
||||||
@ -149,7 +148,7 @@ exports.lookup = function (domain, family, callback) {
|
|||||||
var af = familyToSym(family);
|
var af = familyToSym(family);
|
||||||
channel.getHostByName(domain, af, function (err, domains) {
|
channel.getHostByName(domain, af, function (err, domains) {
|
||||||
if (!err && domains && domains.length) {
|
if (!err && domains && domains.length) {
|
||||||
if (family !== dns.isIP(domains[0])) {
|
if (family !== net.isIP(domains[0])) {
|
||||||
callback(new Error('not found'), []);
|
callback(new Error('not found'), []);
|
||||||
} else {
|
} else {
|
||||||
callback(null, domains[0], family);
|
callback(null, domains[0], family);
|
||||||
|
15
lib/net.js
15
lib/net.js
@ -219,6 +219,21 @@ var ioWatchers = new FreeList("iowatcher", 100, function () {
|
|||||||
return new IOWatcher();
|
return new IOWatcher();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
exports.isIP = binding.isIP;
|
||||||
|
|
||||||
|
exports.isIPv4 = function(input) {
|
||||||
|
if (binding.isIP(input) === 4) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.isIPv6 = function(input) {
|
||||||
|
if (binding.isIP(input) === 6) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
// Allocated on demand.
|
// Allocated on demand.
|
||||||
var pool = null;
|
var pool = null;
|
||||||
|
@ -22,31 +22,6 @@ namespace node {
|
|||||||
using namespace v8;
|
using namespace v8;
|
||||||
|
|
||||||
|
|
||||||
static Handle<Value> IsIP(const Arguments& args) {
|
|
||||||
HandleScope scope;
|
|
||||||
|
|
||||||
if (!args[0]->IsString()) {
|
|
||||||
return scope.Close(Integer::New(4));
|
|
||||||
}
|
|
||||||
|
|
||||||
String::Utf8Value s(args[0]->ToString());
|
|
||||||
|
|
||||||
// avoiding buffer overflows in the following strcat
|
|
||||||
// 2001:0db8:85a3:08d3:1319:8a2e:0370:7334
|
|
||||||
// 39 = max ipv6 address.
|
|
||||||
if (s.length() > INET6_ADDRSTRLEN) {
|
|
||||||
return scope.Close(Integer::New(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sockaddr_in6 a;
|
|
||||||
|
|
||||||
if (inet_pton(AF_INET, *s, &(a.sin6_addr)) > 0) return scope.Close(Integer::New(4));
|
|
||||||
if (inet_pton(AF_INET6, *s, &(a.sin6_addr)) > 0) return scope.Close(Integer::New(6));
|
|
||||||
|
|
||||||
return scope.Close(Integer::New(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class Channel : public ObjectWrap {
|
class Channel : public ObjectWrap {
|
||||||
public:
|
public:
|
||||||
static void Initialize(Handle<Object> target);
|
static void Initialize(Handle<Object> target);
|
||||||
@ -139,8 +114,6 @@ void Cares::Initialize(Handle<Object> target) {
|
|||||||
target->Set(String::NewSymbol("EREFUSED"), Integer::New(ARES_EREFUSED));
|
target->Set(String::NewSymbol("EREFUSED"), Integer::New(ARES_EREFUSED));
|
||||||
target->Set(String::NewSymbol("SERVFAIL"), Integer::New(ARES_ESERVFAIL));
|
target->Set(String::NewSymbol("SERVFAIL"), Integer::New(ARES_ESERVFAIL));
|
||||||
|
|
||||||
NODE_SET_METHOD(target, "isIP", IsIP);
|
|
||||||
|
|
||||||
Channel::Initialize(target);
|
Channel::Initialize(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
22
test/simple/test-net-isip.js
Normal file
22
test/simple/test-net-isip.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
common = require("../common");
|
||||||
|
assert = common.assert
|
||||||
|
net = require("net");
|
||||||
|
|
||||||
|
assert.equal(net.isIP("127.0.0.1"), 4);
|
||||||
|
assert.equal(net.isIP("x127.0.0.1"), 0);
|
||||||
|
assert.equal(net.isIP("example.com"), 0);
|
||||||
|
assert.equal(net.isIP("0000:0000:0000:0000:0000:0000:0000:0000"), 6);
|
||||||
|
assert.equal(net.isIP("0000:0000:0000:0000:0000:0000:0000:0000::0000"), 0);
|
||||||
|
assert.equal(net.isIP("1050:0:0:0:5:600:300c:326b"), 6);
|
||||||
|
assert.equal(net.isIP("2001:252:0:1::2008:6"), 6);
|
||||||
|
assert.equal(net.isIP("2001:dead:beef:1::2008:6"), 6);
|
||||||
|
assert.equal(net.isIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), 6);
|
||||||
|
|
||||||
|
assert.equal(net.isIPv4("127.0.0.1"), true);
|
||||||
|
assert.equal(net.isIPv4("example.com"), false);
|
||||||
|
assert.equal(net.isIPv4("2001:252:0:1::2008:6"), false);
|
||||||
|
|
||||||
|
assert.equal(net.isIPv6("127.0.0.1"), false);
|
||||||
|
assert.equal(net.isIPv4("example.com"), false);
|
||||||
|
assert.equal(net.isIPv6("2001:252:0:1::2008:6"), true);
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user