-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathip2cc.js
More file actions
81 lines (73 loc) · 2.28 KB
/
ip2cc.js
File metadata and controls
81 lines (73 loc) · 2.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//
// ip2cc.js
//
// Copyright (c) 2011, Robert Kosara <rkosara@me.com>
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var http = require('http');
var path = require('path');
var fs = require('fs');
(function() {
var JSONFILENAME = 'ipccdata.json';
var ipList;
function lookUp(ipaddress, callback) {
var address;
if (typeof(ipaddress) === 'number') {
address = ipaddress;
} else {
if (ipaddress.indexOf('.') >= 0) {
var bytes = ipaddress.split('.');
address = parseInt(bytes[0], 10)*16777216 + parseInt(bytes[1], 10)*65536 +
parseInt(bytes[2], 10)*256 + parseInt(bytes[3], 10);
} else {
address = parseInt(ipaddress, 10);
}
}
var bottom = 0;
var top = ipList.length-1;
var mid = 0;
do {
mid = Math.floor((bottom+top)/2);
if (address > ipList[mid].end) {
bottom = mid + 1;
} else {
top = mid - 1;
}
} while (!(address >= ipList[mid].start && address <= ipList[mid].end) && (top >= bottom));
if (address >= ipList[mid].start && address <= ipList[mid].end) {
if (callback) {
callback(ipaddress, ipList[mid].cc);
}
return ipList[mid].cc;
} else {
if (callback) {
callback(ipaddress, null);
}
return null;
}
}
function listen(port) {
http.createServer(function (req, res) {
lookUp(req.url.substring(1), function(ip, cc) {
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify({
ip: ip,
cc: cc
}));
});
}).listen(port, '127.0.0.1');
}
ipList = JSON.parse(fs.readFileSync(path.join(__dirname, JSONFILENAME), 'utf8'));
exports.lookUp = lookUp;
exports.listen = listen;
})();