proxy_pac_rb 0.3.4 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +0 -1
  3. data/.rubocop.yml +4 -0
  4. data/Gemfile +30 -19
  5. data/Gemfile.lock +220 -0
  6. data/README.md +3 -0
  7. data/Rakefile +49 -13
  8. data/bin/pprb +1 -116
  9. data/config/license_finder.yml +12 -0
  10. data/config/rubocop/exclude.yml +8 -0
  11. data/config/rubocop/include.yml +27 -0
  12. data/cucumber.yml +2 -0
  13. data/doc/dependencies/dependencies.db +0 -0
  14. data/features/resolve_proxy.feature +17 -0
  15. data/features/support/aruba.rb +13 -0
  16. data/features/support/env.rb +10 -1
  17. data/features/support/fixtures.rb +15 -0
  18. data/features/support/reporting.rb +2 -0
  19. data/lib/proxy_pac_rb/cli.rb +75 -0
  20. data/lib/proxy_pac_rb/cli_validator.rb +34 -0
  21. data/lib/proxy_pac_rb/encoding.rb +1 -1
  22. data/lib/proxy_pac_rb/environment.rb +10 -8
  23. data/lib/proxy_pac_rb/exceptions.rb +4 -4
  24. data/lib/proxy_pac_rb/file.rb +3 -3
  25. data/lib/proxy_pac_rb/parser.rb +11 -2
  26. data/lib/proxy_pac_rb/proxy_pac_js.rb +5 -5
  27. data/lib/proxy_pac_rb/runtime.rb +6 -5
  28. data/lib/proxy_pac_rb/runtimes/rubyracer.rb +42 -35
  29. data/lib/proxy_pac_rb/runtimes/rubyrhino.rb +27 -22
  30. data/lib/proxy_pac_rb/runtimes.rb +13 -15
  31. data/lib/proxy_pac_rb/version.rb +3 -2
  32. data/lib/proxy_pac_rb.rb +7 -3
  33. data/proxy_pac_rb.gemspec +1 -1
  34. data/script/ci +0 -4
  35. data/script/test_web +2 -1
  36. data/spec/environment_spec.rb +23 -23
  37. data/spec/file_spec.rb +5 -5
  38. data/spec/parser_spec.rb +16 -13
  39. data/spec/support/aruba.rb +50 -0
  40. data/spec/support/rspec.rb +18 -4
  41. data/spec/support/{string.rb → strip.rb} +0 -0
  42. data/tmp/script.rb +0 -2
  43. metadata +37 -29
  44. data/spec/support/environment.rb +0 -17
  45. data/spec/support/filesystem.rb +0 -20
data/bin/pprb CHANGED
@@ -1,124 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
  # encoding: utf-8
3
-
4
3
  $LOAD_PATH << File.expand_path('../../lib', __FILE__)
5
4
 
6
5
  require 'proxy_pac_rb'
7
- require 'ostruct'
8
- require 'ipaddr'
9
- require 'optparse'
10
- require 'addressable/uri'
11
- require 'open-uri'
12
-
13
- module ProxyPacRb
14
- class Cli
15
-
16
- class Validator
17
- private
18
-
19
- attr_reader :options
20
-
21
- public
22
-
23
- def initialize(options)
24
- @options = options
25
- end
26
-
27
- def validate
28
- exit_with_message 'You need to provide at least one url. Multiple urls need to be separated by a space.' if empty_url?
29
- exit_with_message 'You need to provide a proxy pac file.' if empty_pac_file?
30
- end
31
-
32
- private
33
-
34
- def empty_url?
35
- options.urls.empty?
36
- end
37
-
38
- def empty_pac_file?
39
- options.proxy_pac_file.nil?
40
- end
41
-
42
- def exit_with_message(msg)
43
- $stderr.puts msg
44
- exit 1
45
- end
46
-
47
- end
48
-
49
- attr_accessor :options
50
-
51
- def self.start(argv = $*)
52
- cli = new
53
- cli.parse(argv)
54
-
55
- Validator.new(cli.options).validate
56
-
57
- environment = ProxyPacRb::Environment.new(client_ip: cli.options.client_ip, time: cli.options.time)
58
- file = ProxyPacRb::Parser.new(environment).source(cli.options.proxy_pac_file)
59
-
60
- $stderr.printf("%30s: %-s\n", 'url', 'result')
61
- cli.options.urls.each do |u|
62
- begin
63
- $stderr.printf("%30s: %-s\n", u, file.find(u))
64
- rescue Exceptions::UrlInvalid
65
- $stderr.puts "You provide an invalid url \"#{u}\". Please use a correct one."
66
- end
67
- end
68
- end
69
-
70
- def initialize
71
- @options = OpenStruct.new
72
-
73
- @options.client_ip = IPAddr.new('127.0.0.1')
74
- @options.time = Time.now
75
- end
76
-
77
- def parse(argv)
78
- parser = OptionParser.new do |opts|
79
- opts.banner = "Usage: parsepac [options] url1 [url2..urln]"
80
-
81
- opts.on('-c', '--client-ip IP', 'Client ip address') do |i|
82
- options.client_ip = IPAddr.new(i)
83
- end
84
-
85
- opts.on('-t', '--time YYYY-MM-DD HH:MM:SS', 'Time to use during lookup url') do |t|
86
- options.time = Time.parse(t)
87
- end
88
-
89
- opts.on('-p', '--proxy-pac FILE|URL', 'Proxy.pac-file') do |f|
90
- uri = Addressable::URI.parse(f)
91
-
92
- if uri.host.nil?
93
- uri.path = ::File.expand_path(uri.path)
94
- end
95
-
96
- ENV.delete 'HTTP_PROXY'
97
- ENV.delete 'HTTPS_PROXY'
98
- ENV.delete 'http_proxy'
99
- ENV.delete 'https_proxy'
100
-
101
- options.proxy_pac_file = open(uri, { proxy: false }).read
102
- end
103
-
104
- opts.on_tail("-h", "--help", "Show this message") do
105
- $stderr.puts opts
106
- exit
107
- end
108
-
109
- opts.on_tail("--version", "Show version") do
110
- $stderr.puts ProxyPacRb::VERSION
111
- exit
112
- end
113
- end
114
-
115
- $stderr.puts parser.help if argv.empty?
116
-
117
- parser.parse!(argv)
118
- options.urls = argv
119
- end
120
- end
121
- end
122
6
 
123
7
  ProxyPacRb::Cli.start
8
+
124
9
  exit 0
@@ -0,0 +1,12 @@
1
+ ---
2
+ whitelist:
3
+ #- MIT
4
+ #- Apache 2.0
5
+ ignore_groups:
6
+ #- test
7
+ #- development
8
+ ignore_dependencies:
9
+ #- bundler
10
+ dependencies_file_dir: './doc/dependencies'
11
+ project_name: # project name
12
+ gradle_command: # only meaningful if used with a Java/gradle project. Defaults to "gradle".
@@ -0,0 +1,8 @@
1
+ AllCops:
2
+ Exclude:
3
+ - 'tmp/**/*'
4
+
5
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
6
+ Style/MethodName:
7
+ Exclude:
8
+ - lib/proxy_pac_rb/environment.rb
@@ -0,0 +1,27 @@
1
+ # Configuration parameters: AllowURI.
2
+ Metrics/LineLength:
3
+ Max: 225
4
+
5
+ # Configuration parameters: CountKeywordArgs.
6
+ Metrics/ParameterLists:
7
+ Max: 6
8
+
9
+ Metrics/BlockNesting:
10
+ Max: 4
11
+
12
+ # Configuration parameters: CountComments.
13
+ Metrics/ClassLength:
14
+ Max: 174
15
+
16
+ Metrics/CyclomaticComplexity:
17
+ Max: 7
18
+
19
+ # Configuration parameters: CountComments.
20
+ Metrics/MethodLength:
21
+ Max: 76
22
+
23
+ Metrics/PerceivedComplexity:
24
+ Max: 8
25
+
26
+ Style/RegexpLiteral:
27
+ MaxSlashes: 0
data/cucumber.yml ADDED
@@ -0,0 +1,2 @@
1
+ default: --tags @wip:3 --tags ~@broken --tags ~@broken-external
2
+ all: --tags ~@wip --tags ~@broken --tags ~@broken-external
Binary file
@@ -136,3 +136,20 @@ Feature: Resolve proxy
136
136
  """
137
137
  DIRECT
138
138
  """
139
+
140
+ Scenario: dnsResolve + isInNet
141
+ Given a file named "proxy.pac" with:
142
+ """
143
+ function FindProxyForURL(url, host) {
144
+ hostip = dnsResolve(host);
145
+ if (isInNet(hostip, "127.0.0.1", "255.255.255.255") ||
146
+ isInNet(hostip, "127.0.0.1", "255.255.255.255") ||
147
+ isInNet(hostip, "127.0.0.1", "255.255.255.255") ||
148
+ isInNet(hostip, "127.0.0.1", "255.255.255.255")) return 'proxy.example.com';
149
+ }
150
+ """
151
+ When I successfully run `pprb -p proxy.pac http://localhost`
152
+ Then the output should contain:
153
+ """
154
+ proxy.example.com
155
+ """
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+ require 'aruba/cucumber'
3
+
4
+ module FeatureHelper
5
+ # Helpers for aruba
6
+ module Aruba
7
+ def dirs
8
+ @dirs ||= %w(tmp cucumber)
9
+ end
10
+ end
11
+ end
12
+
13
+ World(FeatureHelper::Aruba)
@@ -1,3 +1,12 @@
1
1
  # encoding: utf-8
2
-
3
2
  require 'aruba/cucumber'
3
+
4
+ require 'simplecov'
5
+ SimpleCov.command_name 'cucumber'
6
+ SimpleCov.start
7
+
8
+ # Pull in all of the gems including those in the `test` group
9
+ require 'bundler'
10
+ Bundler.require :default, :test, :development
11
+
12
+ ENV['TEST'] = 'true'
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ module FeatureHelper
3
+ # Helper for fixtures
4
+ module Fixtures
5
+ def fixtures_manager
6
+ @fixtures_manager ||= FeduxOrgStdlib::FixturesManagement::FixturesManager.new
7
+
8
+ @fixtures_manager.load_fixtures(File.expand_path('../../../fixtures', __FILE__))
9
+
10
+ @fixtures_manager
11
+ end
12
+ end
13
+ end
14
+
15
+ World(FeatureHelper::Fixtures)
@@ -0,0 +1,2 @@
1
+ # encoding: utf-8
2
+ require 'active_support/core_ext/kernel/reporting'
@@ -0,0 +1,75 @@
1
+ # encoding: utf-8
2
+ module ProxyPacRb
3
+ # Command line interface
4
+ class Cli
5
+ attr_accessor :options
6
+
7
+ def self.start(argv = ARGV)
8
+ cli = new
9
+ cli.parse(argv)
10
+
11
+ CliValidator.new(cli.options).validate
12
+
13
+ environment = ProxyPacRb::Environment.new(client_ip: cli.options.client_ip, time: cli.options.time)
14
+ file = ProxyPacRb::Parser.new(environment).source(cli.options.proxy_pac_file)
15
+
16
+ $stderr.printf("%30s: %-s\n", 'url', 'result')
17
+ cli.options.urls.each do |u|
18
+ begin
19
+ $stderr.printf("%30s: %-s\n", u, file.find(u))
20
+ rescue Exceptions::UrlInvalid
21
+ $stderr.puts "You provide an invalid url \"#{u}\". Please use a correct one."
22
+ end
23
+ end
24
+ end
25
+
26
+ def initialize
27
+ @options = OpenStruct.new
28
+
29
+ @options.client_ip = IPAddr.new('127.0.0.1')
30
+ @options.time = Time.now
31
+ end
32
+
33
+ def parse(argv)
34
+ parser = OptionParser.new do |opts|
35
+ opts.banner = 'Usage: pprb [options] url1 [url2..urln]'
36
+
37
+ opts.on('-c', '--client-ip IP', 'Client ip address') do |i|
38
+ options.client_ip = IPAddr.new(i)
39
+ end
40
+
41
+ opts.on('-t', '--time YYYY-MM-DD HH:MM:SS', 'Time to use during lookup url') do |t|
42
+ options.time = Time.parse(t)
43
+ end
44
+
45
+ opts.on('-p', '--proxy-pac FILE|URL', 'Proxy.pac-file') do |f|
46
+ uri = Addressable::URI.parse(f)
47
+
48
+ uri.path = ::File.expand_path(uri.path) if uri.host.nil?
49
+
50
+ ENV.delete 'HTTP_PROXY'
51
+ ENV.delete 'HTTPS_PROXY'
52
+ ENV.delete 'http_proxy'
53
+ ENV.delete 'https_proxy'
54
+
55
+ options.proxy_pac_file = open(uri, proxy: false).read
56
+ end
57
+
58
+ opts.on_tail('-h', '--help', 'Show this message') do
59
+ $stderr.puts opts
60
+ exit
61
+ end
62
+
63
+ opts.on_tail('--version', 'Show version') do
64
+ $stderr.puts ProxyPacRb::VERSION
65
+ exit
66
+ end
67
+ end
68
+
69
+ $stderr.puts parser.help if argv.blank?
70
+
71
+ parser.parse!(argv)
72
+ options.urls = argv
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,34 @@
1
+ module ProxyPacRb
2
+ # Validator for commandline options
3
+ class CliValidator
4
+ private
5
+
6
+ attr_reader :options
7
+
8
+ public
9
+
10
+ def initialize(options)
11
+ @options = options
12
+ end
13
+
14
+ def validate
15
+ exit_with_message 'You need to provide at least one url. Multiple urls need to be separated by a space.' if empty_url?
16
+ exit_with_message 'You need to provide a proxy pac file.' if empty_pac_file?
17
+ end
18
+
19
+ private
20
+
21
+ def empty_url?
22
+ options.urls.blank?
23
+ end
24
+
25
+ def empty_pac_file?
26
+ options.proxy_pac_file.blank?
27
+ end
28
+
29
+ def exit_with_message(msg)
30
+ $stderr.puts msg
31
+ exit 1
32
+ end
33
+ end
34
+ end
@@ -1,7 +1,7 @@
1
1
  module ProxyPacRb
2
2
  # Encodes strings as UTF-8
3
3
  module Encoding
4
- if "".respond_to?(:encode)
4
+ if ''.respond_to?(:encode)
5
5
  if RUBY_ENGINE == 'jruby' || RUBY_ENGINE == 'rbx'
6
6
  # workaround for jruby bug http://jira.codehaus.org/browse/JRUBY-6588
7
7
  # workaround for rbx bug https://github.com/rubinius/rubinius/issues/1729
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  module ProxyPacRb
3
+ # Environment in which a proxy.pac will be evaluated
3
4
  class Environment
4
-
5
5
  private
6
6
 
7
7
  attr_reader :days, :months, :client_ip, :time, :io, :javascript_function_templates
@@ -11,8 +11,8 @@ module ProxyPacRb
11
11
  attr_reader :available_methods
12
12
 
13
13
  def initialize(options = {})
14
- @days = { "MON" => 1, "TUE" => 2, "WED" => 3, "THU" => 4, "FRI" => 5, "SAT" => 6, "SUN" => 0 }
15
- @months = { "JAN" => 1, "FEB" => 2, "MAR" => 3, "APR" => 4, "MAY" => 5, "JUN" => 6, "JUL" => 7, "AUG" => 8, "SEP" => 9, "OCT" => 10, "NOV" => 11, "DEC" => 12 }
14
+ @days = { 'MON' => 1, 'TUE' => 2, 'WED' => 3, 'THU' => 4, 'FRI' => 5, 'SAT' => 6, 'SUN' => 0 }
15
+ @months = { 'JAN' => 1, 'FEB' => 2, 'MAR' => 3, 'APR' => 4, 'MAY' => 5, 'JUN' => 6, 'JUL' => 7, 'AUG' => 8, 'SEP' => 9, 'OCT' => 10, 'NOV' => 11, 'DEC' => 12 }
16
16
 
17
17
  @client_ip = options.fetch(:client_ip, '127.0.0.1')
18
18
  @time = options.fetch(:time, Time.now)
@@ -29,7 +29,7 @@ module ProxyPacRb
29
29
  :isInNet,
30
30
  :dnsResolve,
31
31
  :dnsDomainLevels,
32
- :shExpMatch,
32
+ :shExpMatch
33
33
  ]
34
34
  end
35
35
 
@@ -38,7 +38,7 @@ module ProxyPacRb
38
38
  end
39
39
 
40
40
  def isPlainHostName(host)
41
- not host.include? "."
41
+ !host.include? '.'
42
42
  end
43
43
 
44
44
  def dnsDomainIs(host, domain)
@@ -46,11 +46,11 @@ module ProxyPacRb
46
46
  end
47
47
 
48
48
  def localHostOrDomainIs(host, hostdom)
49
- host == hostdom or hostdom.include? host
49
+ host == hostdom || hostdom.include?(host)
50
50
  end
51
51
 
52
52
  def isResolvable(host)
53
- !!resolve_host(host)
53
+ !resolve_host(host).blank?
54
54
  end
55
55
 
56
56
  def isInNet(host, pattern, mask)
@@ -62,7 +62,7 @@ module ProxyPacRb
62
62
  end
63
63
 
64
64
  def dnsDomainLevels(host)
65
- host.scan(".").size
65
+ host.scan('.').size
66
66
  end
67
67
 
68
68
  def shExpMatch(str, shexp)
@@ -77,8 +77,10 @@ module ProxyPacRb
77
77
  Resolv.each_address(host.force_encoding('ASCII-8BIT')) do |address|
78
78
  begin
79
79
  return address if IPAddr.new(address).ipv4?
80
+ # rubocop:disable Lint/HandleExceptions
80
81
  rescue ArgumentError
81
82
  end
83
+ # rubocop:enable Lint/HandleExceptions
82
84
  end
83
85
 
84
86
  # We couldn't find an IPv4 address for the host