Last active
December 31, 2015 11:58
-
-
Save VenkataRaju/6b314823cb0e336c1775 to your computer and use it in GitHub Desktop.
Finds proxy for the given url from pac file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var debug = false; | |
start(); | |
function start() | |
{ | |
if (typeof $ARG === "undefined" || $ARG.length !== 2) | |
{ | |
log("Usage: jjs -scripting proxy_from_pac.js -- <pacfile> <url>"); | |
return; | |
} | |
var proxy = findProxy($ARG[0], $ARG[1]); | |
print("\nProxy: " + proxy); | |
} | |
function findProxy(pacFilePath, url) | |
{ | |
load(pacFilePath); | |
var startIndex = url.indexOf(":") + 1; | |
for (var ob = {"/": true, w: true, ".": true}; ob[url.charAt(startIndex)]; startIndex++); | |
var endIndex = url.indexOf("/", startIndex + 1); | |
endIndex = endIndex === -1 ? url.length() : endIndex; | |
var host = url.substring(startIndex, endIndex); | |
log("url: " + url + ", deduced host: " + host); | |
return FindProxyForURL(url, host); | |
} | |
function shExpMatch(host, shellExpression /* e.g. *.local */) | |
{ | |
var regExByShell = | |
{ | |
".": "\\.", | |
"?": ".", | |
"*": ".*" | |
}; | |
var regExStr = "^" + shellExpression.replace(/./g, function(character) { return regExByShell[character] || character; }) + "$"; | |
var matched = new RegExp(regExStr).test(host); | |
log("shExpMatch() shellExpression: " + shellExpression + ", modified regex: " + regExStr + ", host: " + host + ", matched: " + matched); | |
return matched; | |
} | |
function _resolveHostNameToIp(hostOrIp) | |
{ | |
return java.net.InetAddress.getByName(hostOrIp).getHostAddress(); | |
} | |
function isPlainHostName(host) | |
{ | |
var plainHostName = host.indexOf(".") == -1; | |
log("isPlainHostName() host: " + host + ", plainHostName: " + plainHostName); | |
return plainHostName; | |
} | |
function myIpAddress() | |
{ | |
var myIp = java.net.InetAddress.getLocalHost().getHostAddress(); | |
log("myIpAddress() myIp: " + myIp); | |
return myIp; | |
} | |
function isInNet(hostOrIp, pattern, mask) | |
{ | |
var isInNetFlag = _isInNet(hostOrIp, pattern, mask); | |
log("isInNet() hostOrIp: " + hostOrIp + ", pattern: " + pattern + ", mask: " + mask + ", isInNet: " + isInNetFlag); | |
return isInNetFlag; | |
} | |
function _isInNet(hostOrIp, pattern, mask) | |
{ | |
log("_isInNet() hostOrIp: " + hostOrIp + ", pattern: " + pattern + ", mask: " + mask); | |
var ip = _resolveHostNameToIp(hostOrIp); | |
var ipArr = ip.split("."); | |
var patternArr = pattern.split("."); | |
var maskArr = mask.split("."); | |
for (var i = 0; i < ipArr.length; i++) | |
{ | |
log("_isInNet() ipArr: " + ipArr[i] + " & maskArr: " + maskArr[i] + " (" + (ipArr[i] & maskArr[i]) + ") !== " + patternArr[i]); | |
if ((+ipArr[i] & +maskArr[i]) !== +patternArr[i]) | |
return false; | |
} | |
return true; | |
} | |
function isResolvable(host) | |
{ | |
log("isResolvable() host: " + host); | |
var startTime = Date.now(); | |
// var resolvable = !(new java.net.InetSocketAddress(host, 80).isUnresolved()) // This waits for upto 14s if network is not reacheable; | |
var resolvable = false; | |
try { resolvable = java.net.InetAddress.getByName(host /* Can be ip also */).isReachable(4000); } | |
catch(e) { /* Unresolvable */ } | |
log("isResolvable() host: " + host + ", resolvable: " + resolvable + ", timeTaken: " + ((Date.now() - startTime)/1000).toFixed(2) + "s"); | |
return resolvable; | |
} | |
function dnsResolve(host) | |
{ | |
log("dnsResolve()"); | |
var startTime = Date.now(); | |
var ip = _resolveHostNameToIp(host); | |
log("dnsResolve() host: " + host + ", ip: " + ip + ", timeTaken: " + ((Date.now() - startTime)/1000).toFixed(2) + "s"); | |
return ip; | |
} | |
function dnsDomainIs(host /* e.g. maps.google.com, www.google.com */, domain /* .google.com */) | |
{ | |
return host.endsWith(domain); | |
} | |
function localHostOrDomainIs(host, exactMatch) | |
{ | |
return host === exactMatch; // TODO: Need to check | |
} | |
// Returns number of dots(.) in hostname | |
function dnsDomainLevels(host) | |
{ | |
var noOfDots = 0; | |
for (var i = -1; (i = host.indexOf(".", i + 1)) !== -1; noOfDots++); | |
return noOfDots; | |
} | |
function weekdayRange(startDay /* MON */, endDay /* FRI */) | |
{ | |
var dayNames = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]; | |
var todayNameIndex = (new Date()).getDay(); | |
var startDayIndex = dayNames.indexOf(startDay); | |
var endDayIndex = dayNames.indexOf(endDay, startDayIndex); | |
return (startDayIndex <= todayNameIndex) && (todayNameIndex <= endDayIndex); | |
} | |
function dateRange(startMonth, endMonth) // TODO: Should this not be monthRange ?????????? | |
{ | |
var monthNames = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"]; | |
var thisMonthIndex = (new Date()).getMonth(); | |
var startMonthIndex = monthNames.indexOf(startMonth); | |
var endMonthIndex = monthNames.indexOf(endMonth, startMonthIndex); | |
return (startMonthIndex <= thisMonthIndex) && (thisMonthIndex <= endMonthIndex); | |
} | |
function timeRange(startHour, endHour) | |
{ | |
var thisHour = (new Date()).getHours(); | |
return (startHour <= thisHour) && (thisHour <= endHour); | |
} | |
function log(msg) | |
{ | |
if (debug) | |
print(msg); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Requires Java 8
Usage:
jjs -scripting proxy_from_pac.js -- <pacfile> <url>