Browse Source

Move dns.isIP to net.isIP

Add tests and docs.
v0.7.4-release
Paul Querna 14 years ago
committed by Ryan Dahl
parent
commit
c8f9728de7
  1. 19
      doc/api.markdown
  2. 2
      lib/dgram.js
  3. 7
      lib/dns.js
  4. 15
      lib/net.js
  5. 27
      src/node_cares.cc
  6. 22
      test/simple/test-net-isip.js

19
doc/api.markdown

@ -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

2
lib/dgram.js

@ -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 {

7
lib/dns.js

@ -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

@ -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;

27
src/node_cares.cc

@ -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

@ -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…
Cancel
Save