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.
- checksums.yaml +5 -13
- data/.gitignore +0 -1
- data/.rubocop.yml +4 -0
- data/Gemfile +30 -19
- data/Gemfile.lock +220 -0
- data/README.md +3 -0
- data/Rakefile +49 -13
- data/bin/pprb +1 -116
- data/config/license_finder.yml +12 -0
- data/config/rubocop/exclude.yml +8 -0
- data/config/rubocop/include.yml +27 -0
- data/cucumber.yml +2 -0
- data/doc/dependencies/dependencies.db +0 -0
- data/features/resolve_proxy.feature +17 -0
- data/features/support/aruba.rb +13 -0
- data/features/support/env.rb +10 -1
- data/features/support/fixtures.rb +15 -0
- data/features/support/reporting.rb +2 -0
- data/lib/proxy_pac_rb/cli.rb +75 -0
- data/lib/proxy_pac_rb/cli_validator.rb +34 -0
- data/lib/proxy_pac_rb/encoding.rb +1 -1
- data/lib/proxy_pac_rb/environment.rb +10 -8
- data/lib/proxy_pac_rb/exceptions.rb +4 -4
- data/lib/proxy_pac_rb/file.rb +3 -3
- data/lib/proxy_pac_rb/parser.rb +11 -2
- data/lib/proxy_pac_rb/proxy_pac_js.rb +5 -5
- data/lib/proxy_pac_rb/runtime.rb +6 -5
- data/lib/proxy_pac_rb/runtimes/rubyracer.rb +42 -35
- data/lib/proxy_pac_rb/runtimes/rubyrhino.rb +27 -22
- data/lib/proxy_pac_rb/runtimes.rb +13 -15
- data/lib/proxy_pac_rb/version.rb +3 -2
- data/lib/proxy_pac_rb.rb +7 -3
- data/proxy_pac_rb.gemspec +1 -1
- data/script/ci +0 -4
- data/script/test_web +2 -1
- data/spec/environment_spec.rb +23 -23
- data/spec/file_spec.rb +5 -5
- data/spec/parser_spec.rb +16 -13
- data/spec/support/aruba.rb +50 -0
- data/spec/support/rspec.rb +18 -4
- data/spec/support/{string.rb → strip.rb} +0 -0
- data/tmp/script.rb +0 -2
- metadata +37 -29
- data/spec/support/environment.rb +0 -17
- data/spec/support/filesystem.rb +0 -20
@@ -1,16 +1,16 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module ProxyPacRb
|
3
3
|
module Exceptions
|
4
|
-
#raise on error
|
4
|
+
# raise on error
|
5
5
|
class ProgramError < StandardError; end
|
6
6
|
|
7
|
-
#raise on java script runtime error
|
7
|
+
# raise on java script runtime error
|
8
8
|
class RuntimeUnavailable < StandardError; end
|
9
9
|
|
10
|
-
#raise on invalid argument
|
10
|
+
# raise on invalid argument
|
11
11
|
class InvalidArgument < StandardError; end
|
12
12
|
|
13
|
-
#raise on invalid argument
|
13
|
+
# raise on invalid argument
|
14
14
|
class UrlInvalid < StandardError; end
|
15
15
|
end
|
16
16
|
end
|
data/lib/proxy_pac_rb/file.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module ProxyPacRb
|
2
|
+
# Proxy pac file
|
2
3
|
class File
|
3
|
-
|
4
4
|
private
|
5
5
|
|
6
6
|
attr_reader :javascript
|
@@ -13,9 +13,9 @@ module ProxyPacRb
|
|
13
13
|
|
14
14
|
def find(url)
|
15
15
|
uri = Addressable::URI.heuristic_parse(url)
|
16
|
-
fail Exceptions::UrlInvalid,
|
16
|
+
fail Exceptions::UrlInvalid, 'url is missing host' unless uri.host
|
17
17
|
|
18
|
-
javascript.call(
|
18
|
+
javascript.call('FindProxyForURL', url, uri.host)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
data/lib/proxy_pac_rb/parser.rb
CHANGED
@@ -1,7 +1,16 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module ProxyPacRb
|
3
|
+
# Proxy Pac parser
|
4
|
+
#
|
5
|
+
# @example Usage
|
6
|
+
#
|
7
|
+
# parser = Parser.new
|
8
|
+
# parser.load('http://example.com/proxy.pac')
|
9
|
+
# parser.read('file.pac')
|
10
|
+
#
|
11
|
+
# string = ''
|
12
|
+
# parser.source(string)
|
3
13
|
class Parser
|
4
|
-
|
5
14
|
private
|
6
15
|
|
7
16
|
attr_reader :runtime, :environment
|
@@ -16,7 +25,7 @@ module ProxyPacRb
|
|
16
25
|
end
|
17
26
|
|
18
27
|
def load(url, options = {})
|
19
|
-
create_file(open(url, { :
|
28
|
+
create_file(open(url, { proxy: false }.merge(options)).read)
|
20
29
|
end
|
21
30
|
|
22
31
|
def read(file)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module ProxyPacRb
|
3
|
+
# Javascript-Methods for evaluation of proxy.pac
|
3
4
|
class ProxyPacJs
|
4
5
|
class << self
|
5
6
|
def my_ip_address_template(value)
|
@@ -10,7 +11,6 @@ module ProxyPacRb
|
|
10
11
|
EOS
|
11
12
|
end
|
12
13
|
|
13
|
-
|
14
14
|
# taken from releases-mozilla-release / netwerk / base / src / ProxyAutoConfig.cpp @ bitbucket.org
|
15
15
|
# https://bitbucket.org/mozilla/releases-mozilla-release/raw/dece38633cf1adcab2071d69fea264580d24cc9e/netwerk/base/src/ProxyAutoConfig.cpp
|
16
16
|
def time_variables
|
@@ -21,7 +21,7 @@ module ProxyPacRb
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def week_day_range_template(value = nil)
|
24
|
-
value = %
|
24
|
+
value = %("#{value}") if value
|
25
25
|
|
26
26
|
<<-EOS.strip_heredoc
|
27
27
|
function weekdayRange() {
|
@@ -51,7 +51,7 @@ module ProxyPacRb
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def date_range_template(value = nil)
|
54
|
-
value = %
|
54
|
+
value = %("#{value}") if value
|
55
55
|
|
56
56
|
<<-EOS.strip_heredoc
|
57
57
|
function dateRange() {
|
@@ -79,7 +79,7 @@ module ProxyPacRb
|
|
79
79
|
getMonth(arguments[0]));
|
80
80
|
} else if (tmp < 32) {
|
81
81
|
return ((isGMT ? date.getUTCDate() : date.getDate()) == tmp);
|
82
|
-
} else {
|
82
|
+
} else {
|
83
83
|
return ((isGMT ? date.getUTCFullYear() : date.getFullYear()) ==
|
84
84
|
tmp);
|
85
85
|
}
|
@@ -132,7 +132,7 @@ module ProxyPacRb
|
|
132
132
|
end
|
133
133
|
|
134
134
|
def time_range_template(value = nil)
|
135
|
-
value = %
|
135
|
+
value = %("#{value}") if value
|
136
136
|
|
137
137
|
<<-EOS.strip_heredoc
|
138
138
|
function timeRange() {
|
data/lib/proxy_pac_rb/runtime.rb
CHANGED
@@ -1,29 +1,30 @@
|
|
1
1
|
module ProxyPacRb
|
2
2
|
# Abstract base class for runtimes
|
3
3
|
class Runtime
|
4
|
+
# Context
|
4
5
|
class Context
|
5
6
|
include Encoding
|
6
7
|
|
7
8
|
attr_accessor :context
|
8
9
|
|
9
10
|
def include(environment)
|
10
|
-
environment.available_methods.each do |name|
|
11
|
+
environment.available_methods.each do |name|
|
11
12
|
context[name] = environment.method(name)
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
15
|
-
def initialize(
|
16
|
+
def initialize(_runtime, _source = '')
|
16
17
|
end
|
17
18
|
|
18
|
-
def exec(
|
19
|
+
def exec(_source, _options = {})
|
19
20
|
fail NotImplementedError
|
20
21
|
end
|
21
22
|
|
22
|
-
def eval(
|
23
|
+
def eval(_source, _options = {})
|
23
24
|
fail NotImplementedError
|
24
25
|
end
|
25
26
|
|
26
|
-
def call(
|
27
|
+
def call(_properties, *_args)
|
27
28
|
fail NotImplementedError
|
28
29
|
end
|
29
30
|
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module ProxyPacRb
|
2
|
+
# Ruby Racer Runtime
|
2
3
|
class RubyRacerRuntime < Runtime
|
4
|
+
# Context
|
3
5
|
class Context < Runtime::Context
|
4
|
-
def initialize(
|
6
|
+
def initialize(_runtime, source = '', _environment = nil)
|
5
7
|
source = encode(source)
|
6
8
|
|
7
9
|
lock do
|
@@ -13,24 +15,24 @@ module ProxyPacRb
|
|
13
15
|
def exec(source, options = {})
|
14
16
|
source = encode(source)
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
# rubocop:disable Lint/Eval
|
19
|
+
eval "(function(){#{source}})()", options if /\S/ =~ source
|
20
|
+
# rubocop:enable Lint/Eval
|
19
21
|
end
|
20
22
|
|
21
|
-
def eval(source,
|
23
|
+
def eval(source, _options = {})
|
22
24
|
source = encode(source)
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
26
|
+
return nil unless /\S/ =~ source
|
27
|
+
|
28
|
+
lock do
|
29
|
+
begin
|
30
|
+
unbox context.eval("(#{source})")
|
31
|
+
rescue ::V8::JSError => e
|
32
|
+
if e.value['name'] == 'SyntaxError'
|
33
|
+
raise e.value.to_s
|
34
|
+
else
|
35
|
+
raise Exceptions::ProgramError, e.value.to_s
|
34
36
|
end
|
35
37
|
end
|
36
38
|
end
|
@@ -41,8 +43,8 @@ module ProxyPacRb
|
|
41
43
|
begin
|
42
44
|
unbox context.eval(properties).call(*args)
|
43
45
|
rescue ::V8::JSError => e
|
44
|
-
if e.value[
|
45
|
-
raise
|
46
|
+
if e.value['name'] == 'SyntaxError'
|
47
|
+
raise e.value.to_s
|
46
48
|
else
|
47
49
|
raise Exceptions::ProgramError, e.value.to_s
|
48
50
|
end
|
@@ -57,44 +59,49 @@ module ProxyPacRb
|
|
57
59
|
when ::V8::Array
|
58
60
|
value.map { |v| unbox(v) }
|
59
61
|
when ::V8::Object
|
60
|
-
|
62
|
+
# rubocop:disable Style/EachWithObject
|
63
|
+
value.reduce({}) do |vs, (k, v)|
|
61
64
|
vs[k] = unbox(v) unless v.is_a?(::V8::Function)
|
62
65
|
vs
|
63
66
|
end
|
67
|
+
# rubocop:enable Style/EachWithObject
|
64
68
|
when String
|
65
|
-
value.respond_to?(:force_encoding)
|
66
|
-
value.force_encoding('UTF-8')
|
69
|
+
if value.respond_to?(:force_encoding)
|
70
|
+
value.force_encoding('UTF-8')
|
71
|
+
else
|
67
72
|
value
|
73
|
+
end
|
68
74
|
else
|
69
75
|
value
|
70
76
|
end
|
71
77
|
end
|
72
78
|
|
73
79
|
private
|
74
|
-
def lock
|
75
|
-
result, exception = nil, nil
|
76
|
-
V8::C::Locker() do
|
77
|
-
begin
|
78
|
-
result = yield
|
79
|
-
rescue Exception => e
|
80
|
-
exception = e
|
81
|
-
end
|
82
|
-
end
|
83
80
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
81
|
+
def lock
|
82
|
+
result, exception = nil, nil
|
83
|
+
V8::C::Locker() do
|
84
|
+
begin
|
85
|
+
result = yield
|
86
|
+
rescue => e
|
87
|
+
exception = e
|
88
88
|
end
|
89
89
|
end
|
90
|
+
|
91
|
+
if exception
|
92
|
+
fail exception
|
93
|
+
else
|
94
|
+
result
|
95
|
+
end
|
96
|
+
end
|
90
97
|
end
|
91
98
|
|
92
99
|
def name
|
93
|
-
|
100
|
+
'therubyracer (V8)'
|
94
101
|
end
|
95
102
|
|
96
103
|
def available?
|
97
|
-
require
|
104
|
+
require 'v8'
|
98
105
|
true
|
99
106
|
rescue LoadError
|
100
107
|
false
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module ProxyPacRb
|
2
|
+
# Ruby Rhine Runtime
|
2
3
|
class RubyRhinoRuntime < Runtime
|
4
|
+
# Context
|
3
5
|
class Context < Runtime::Context
|
4
|
-
def initialize(
|
6
|
+
def initialize(_runtime, source = '')
|
5
7
|
source = encode(source)
|
6
8
|
|
7
9
|
self.context = ::Rhino::Context.new
|
@@ -12,20 +14,20 @@ module ProxyPacRb
|
|
12
14
|
def exec(source, options = {})
|
13
15
|
source = encode(source)
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
|
17
|
+
return nil unless /\S/ =~ source
|
18
|
+
|
19
|
+
# rubocop:disable Lint/Eval
|
20
|
+
eval "(function(){#{source}})()", options
|
21
|
+
# rubocop:enable Lint/Eval
|
18
22
|
end
|
19
23
|
|
20
|
-
def eval(source,
|
24
|
+
def eval(source, _options = {})
|
21
25
|
source = encode(source)
|
22
26
|
|
23
|
-
if /\S/ =~ source
|
24
|
-
unbox context.eval("(#{source})")
|
25
|
-
end
|
27
|
+
unbox context.eval("(#{source})") if /\S/ =~ source
|
26
28
|
rescue ::Rhino::JSError => e
|
27
29
|
if e.message =~ /^syntax error/
|
28
|
-
raise
|
30
|
+
raise e.message
|
29
31
|
else
|
30
32
|
raise Exceptions::ProgramError, e.message
|
31
33
|
end
|
@@ -34,19 +36,20 @@ module ProxyPacRb
|
|
34
36
|
def call(properties, *args)
|
35
37
|
unbox context.eval(properties).call(*args)
|
36
38
|
rescue ::Rhino::JSError => e
|
37
|
-
if e.message ==
|
38
|
-
raise
|
39
|
+
if e.message == 'syntax error'
|
40
|
+
raise e.message
|
39
41
|
else
|
40
42
|
raise Exceptions::ProgramError, e.message
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
44
46
|
def unbox(value)
|
45
|
-
case value = ::Rhino
|
47
|
+
case value = ::Rhino.to_ruby(value)
|
46
48
|
when Java::OrgMozillaJavascript::NativeFunction
|
47
49
|
nil
|
48
50
|
when Java::OrgMozillaJavascript::NativeObject
|
49
|
-
|
51
|
+
# rubocop:disable Style/EachWithObject
|
52
|
+
value.reduce({}) do |vs, (k, v)|
|
50
53
|
case v
|
51
54
|
when Java::OrgMozillaJavascript::NativeFunction, ::Rhino::JS::Function
|
52
55
|
nil
|
@@ -55,6 +58,7 @@ module ProxyPacRb
|
|
55
58
|
end
|
56
59
|
vs
|
57
60
|
end
|
61
|
+
# rubocop:enable Style/EachWithObject
|
58
62
|
when Array
|
59
63
|
value.map { |v| unbox(v) }
|
60
64
|
else
|
@@ -63,22 +67,23 @@ module ProxyPacRb
|
|
63
67
|
end
|
64
68
|
|
65
69
|
private
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
70
|
+
|
71
|
+
# Disables bytecode compiling which limits you to 64K scripts
|
72
|
+
def fix_memory_limit!(cxt)
|
73
|
+
if cxt.respond_to?(:optimization_level=)
|
74
|
+
cxt.optimization_level = -1
|
75
|
+
else
|
76
|
+
cxt.instance_eval { @native.setOptimizationLevel(-1) }
|
73
77
|
end
|
78
|
+
end
|
74
79
|
end
|
75
80
|
|
76
81
|
def name
|
77
|
-
|
82
|
+
'therubyrhino (Rhino)'
|
78
83
|
end
|
79
84
|
|
80
85
|
def available?
|
81
|
-
require
|
86
|
+
require 'rhino'
|
82
87
|
true
|
83
88
|
rescue LoadError
|
84
89
|
false
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module ProxyPacRb
|
2
|
+
# JavaScript Runtimes
|
2
3
|
module Runtimes
|
3
4
|
RubyRacer = RubyRacerRuntime.new
|
4
5
|
RubyRhino = RubyRhinoRuntime.new
|
@@ -6,8 +7,8 @@ module ProxyPacRb
|
|
6
7
|
class << self
|
7
8
|
def autodetect
|
8
9
|
from_environment || best_available ||
|
9
|
-
fail(Exceptions::RuntimeUnavailable,
|
10
|
-
|
10
|
+
fail(Exceptions::RuntimeUnavailable, 'Could not find a JavaScript runtime. ' \
|
11
|
+
'See https://github.com/sstephenson/execjs for a list of available runtimes.')
|
11
12
|
end
|
12
13
|
|
13
14
|
def best_available
|
@@ -15,27 +16,24 @@ module ProxyPacRb
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def from_environment
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
fail Exceptions::RuntimeUnavailable, "#{name} runtime is not defined"
|
27
|
-
end
|
28
|
-
end
|
19
|
+
return nil unless ENV['JS_RUNTIME']
|
20
|
+
|
21
|
+
runtime = const_get(ENV['JS_RUNTIME'])
|
22
|
+
|
23
|
+
fail Exceptions::RuntimeUnavailable, "#{ENV['JS_RUNTIME']} runtime is not defined" unless runtime
|
24
|
+
fail Exceptions::RuntimeUnavailable, "#{runtime.name} runtime is not available on this system" unless runtime.available?
|
25
|
+
|
26
|
+
runtime
|
29
27
|
end
|
30
28
|
|
31
29
|
def names
|
32
|
-
@names ||= constants.
|
30
|
+
@names ||= constants.reduce({}) { |a, e| a.merge(const_get(e) => e) }.values
|
33
31
|
end
|
34
32
|
|
35
33
|
def runtimes
|
36
34
|
@runtimes ||= [
|
37
35
|
RubyRacer,
|
38
|
-
RubyRhino
|
36
|
+
RubyRhino
|
39
37
|
]
|
40
38
|
end
|
41
39
|
end
|
data/lib/proxy_pac_rb/version.rb
CHANGED