Add tests and docs.
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
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],
arguments[4], arguments[5]);
} else {
var dns = process.binding('cares');
+var net = process.binding('net');
var watchers = {};
updateTimer();
}});
-exports.isIP = dns.isIP;
-
exports.resolve = function (domain, type_, callback_) {
var type, callback;
if (typeof(type_) == 'string') {
callback(null, null, family === 6 ? 6 : 4);
return;
}
- var matchedFamily = dns.isIP(domain);
+ var matchedFamily = net.isIP(domain);
if (matchedFamily) {
callback(null, domain, matchedFamily);
} else {
var af = familyToSym(family);
channel.getHostByName(domain, af, function (err, domains) {
if (!err && domains && domains.length) {
- if (family !== dns.isIP(domains[0])) {
+ if (family !== net.isIP(domains[0])) {
callback(new Error('not found'), []);
} else {
callback(null, domains[0], family);
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.
var pool = null;
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 {
public:
static void Initialize(Handle<Object> target);
target->Set(String::NewSymbol("EREFUSED"), Integer::New(ARES_EREFUSED));
target->Set(String::NewSymbol("SERVFAIL"), Integer::New(ARES_ESERVFAIL));
- NODE_SET_METHOD(target, "isIP", IsIP);
-
Channel::Initialize(target);
}
--- /dev/null
+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);
+