pac

pac is a gem to parse proxy auto-config files. pac uses a JavaScript runtime to evaulate a proxy auto-config file the same way a browser does to determine what proxy (if any at all) should a program use to connect to a server. You must install on of the supported JavaScript runtimes: therubyracer, therubyrhino, johnson or mustang.

Big thanks to sstephenson's execjs for the runtime wrapper code.

Installing

gem install pac

Edge

git clone https://github.com/samuelkadolph/ruby-pac
cd ruby-pac && rake install

Requirements

After installing the pac gem you must install a JavaScript runtime. Compatible runtimes include:

Usage

Command Line

parsepac https://github.com/downloads/samuelkadolph/ruby-pac/sample.pac https://github.com # => "PROXY proxy:8080"
parsepac https://github.com/downloads/samuelkadolph/ruby-pac/sample.pac http://ruby-lang.com # => "PROXY proxy:8080; DIRECT"
parsepac https://github.com/downloads/samuelkadolph/ruby-pac/sample.pac http://samuel.kadolph.com # => "DIRECT"

Ruby

require "rubygems"
require "pac"

pac = PAC.load("https://github.com/downloads/samuelkadolph/ruby-pac/sample.pac")
pac.find("https://github.com") # => "PROXY proxy:8080"
pac.find("http://ruby-lang.com") # => "PROXY proxy:8080; DIRECT"
pac.find("http://samuel.kadolph.com") # => "DIRECT"

pac = PAC.read("sample.pac")

pac = PAC.source <<-JS
  function FindProxyForURL(url, host) {
    return "DIRECT";
  }
JS
pac.find("http://localhost") # => "DIRECT"

Available JavaScript Functions

  • isPlainHostName(host)
  • dnsDomainIs(host, domain)
  • localHostOrDomainIs(host, hostdom)
  • isResolvable(host)
  • isInNet(host, pattern, mask)
  • dnsResolve(host)
  • myIpAddress()
  • dnsDomainLevels(host)
  • shExpMatch(str, shexp)
  • weekdayRange(wd1, wd2, gmt)
  • dateRange(*args)
  • timeRange(*args)

Developers

Contributing

If you want to contribute: fork, branch & pull request.

Running Tests

bundle install
rake test
rake test:rubyracer