Skip to content

Instantly share code, notes, and snippets.

@VenkataRaju
Last active December 31, 2015 11:58
Show Gist options
  • Save VenkataRaju/6b314823cb0e336c1775 to your computer and use it in GitHub Desktop.
Save VenkataRaju/6b314823cb0e336c1775 to your computer and use it in GitHub Desktop.
Finds proxy for the given url from pac file.
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);
}
@VenkataRaju
Copy link
Author

Requires Java 8

Usage: jjs -scripting proxy_from_pac.js -- <pacfile> <url>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment