proxy_pac_rb 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,77 +1,87 @@
1
1
  module ProxyPacRb
2
- module Runtimes
3
- class RubyRhinoRuntime
4
- class Context
5
- def initialize(source = "")
6
- source = source.encode("UTF-8") if source.respond_to?(:encode)
2
+ class RubyRhinoRuntime < Runtime
3
+ class Context < Runtime::Context
4
+ def initialize(runtime, source = "")
5
+ source = encode(source)
7
6
 
8
- @rhino_context = Rhino::Context.new
9
- fix_memory_limit! @rhino_context
10
- @rhino_context.eval(source)
11
- end
7
+ self.context = ::Rhino::Context.new
8
+ fix_memory_limit! context
9
+ context.eval(source)
10
+ end
12
11
 
13
- def include(mod)
14
- (mod.methods - Module.methods).each do |name|
15
- @rhino_context[name] = mod.method(name)
16
- end
12
+ def exec(source, options = {})
13
+ source = encode(source)
14
+
15
+ if /\S/ =~ source
16
+ eval "(function(){#{source}})()", options
17
17
  end
18
+ end
18
19
 
19
- def call(properties, *args)
20
- unbox @rhino_context.eval(properties).call(*args)
21
- rescue ::Rhino::JavascriptError => e
22
- if e.message == "syntax error"
23
- raise RuntimeError, e.message
24
- else
25
- raise Exceptions::ProgramError, e.message
26
- end
20
+ def eval(source, options = {})
21
+ source = encode(source)
22
+
23
+ if /\S/ =~ source
24
+ unbox context.eval("(#{source})")
25
+ end
26
+ rescue ::Rhino::JSError => e
27
+ if e.message =~ /^syntax error/
28
+ raise RuntimeError, e.message
29
+ else
30
+ raise Exceptions::ProgramError, e.message
27
31
  end
32
+ end
28
33
 
29
- def unbox(value)
30
- case value = ::Rhino::To.ruby(value)
31
- when ::Rhino::NativeFunction
32
- nil
33
- when ::Rhino::NativeObject
34
- value.inject({}) do |vs, (k, v)|
35
- case v
36
- when ::Rhino::NativeFunction, ::Rhino::J::Function
37
- nil
38
- else
39
- vs[k] = unbox(v)
40
- end
41
- vs
42
- end
43
- when Array
44
- value.map { |v| unbox(v) }
45
- else
46
- value
47
- end
34
+ def call(properties, *args)
35
+ unbox context.eval(properties).call(*args)
36
+ rescue ::Rhino::JSError => e
37
+ if e.message == "syntax error"
38
+ raise RuntimeError, e.message
39
+ else
40
+ raise Exceptions::ProgramError, e.message
48
41
  end
42
+ end
49
43
 
50
- private
51
- # Disables bytecode compiling which limits you to 64K scripts
52
- def fix_memory_limit!(context)
53
- if context.respond_to?(:optimization_level=)
54
- context.optimization_level = -1
44
+ def unbox(value)
45
+ case value = ::Rhino::to_ruby(value)
46
+ when Java::OrgMozillaJavascript::NativeFunction
47
+ nil
48
+ when Java::OrgMozillaJavascript::NativeObject
49
+ value.inject({}) do |vs, (k, v)|
50
+ case v
51
+ when Java::OrgMozillaJavascript::NativeFunction, ::Rhino::JS::Function
52
+ nil
55
53
  else
56
- context.instance_eval { @native.setOptimizationLevel(-1) }
54
+ vs[k] = unbox(v)
57
55
  end
56
+ vs
58
57
  end
58
+ when Array
59
+ value.map { |v| unbox(v) }
60
+ else
61
+ value
62
+ end
59
63
  end
60
64
 
61
- def name
62
- "therubyrhino (Rhino)"
63
- end
65
+ private
66
+ # Disables bytecode compiling which limits you to 64K scripts
67
+ def fix_memory_limit!(cxt)
68
+ if cxt.respond_to?(:optimization_level=)
69
+ cxt.optimization_level = -1
70
+ else
71
+ cxt.instance_eval { @native.setOptimizationLevel(-1) }
72
+ end
73
+ end
74
+ end
64
75
 
65
- def compile(source)
66
- Context.new(source)
67
- end
76
+ def name
77
+ "therubyrhino (Rhino)"
78
+ end
68
79
 
69
- def available?
70
- require "rhino"
71
- true
72
- rescue LoadError
73
- false
74
- end
80
+ def available?
81
+ require "rhino"
82
+ true
83
+ rescue LoadError
84
+ false
75
85
  end
76
86
  end
77
87
  end
@@ -1,4 +1,4 @@
1
1
  #main ProxyPacRb
2
2
  module ProxyPacRb
3
- VERSION = '0.0.2'
3
+ VERSION = '0.0.3'
4
4
  end
data/proxy_pac_rb.gemspec CHANGED
@@ -23,4 +23,7 @@ DESC
23
23
  spec.executables = spec.files.grep(%r{^bin/}) { |f| ::File.basename(f) }
24
24
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
25
25
  spec.require_paths = ['lib']
26
+
27
+ spec.add_runtime_dependency 'addressable'
28
+ spec.add_runtime_dependency 'activesupport'
26
29
  end
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec cucumber
4
+ bundle exec rspec spec/features
data/script/bootstrap ADDED
@@ -0,0 +1,5 @@
1
+ #!/bin/sh
2
+
3
+ echo "Bootstrapping development environment for application.." >&2
4
+
5
+ gem install bundler && bundle install
data/script/ci ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec rake test:coveralls
data/script/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH << ::File.expand_path('../../lib', __FILE__)
4
+
5
+ # Pull in all of the gems including those in the `test` group
6
+ require 'bundler'
7
+ Bundler.require :default, :test, :development, :therubyracer
8
+
9
+ require 'irb'
10
+ require 'irb/completion'
11
+ require 'proxy_pac_rb'
12
+
13
+ ARGV.clear
14
+ IRB.start
data/script/release ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec rake gem:release
data/script/unit_test ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec rspec
@@ -0,0 +1,193 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe ProxyPacRb::Environment do
5
+ let(:environment) do
6
+ Environment.new(my_ip_address: '127.0.0.1', time: Time.now)
7
+ end
8
+
9
+ describe "#isResolvable()" do
10
+ it "should return true for localhost" do
11
+ expect(environment.isResolvable("localhost")).to be_true
12
+ end
13
+
14
+ it "should return false for awidhaowuhuiuhiuug" do
15
+ expect(environment.isResolvable('asdfasdfasdfasdf')).to be_false
16
+ end
17
+ end
18
+
19
+ describe '#isPlainHostName' do
20
+ it 'returns true for google' do
21
+ result = environment.isPlainHostName('google')
22
+ expect(result).to be_true
23
+ end
24
+
25
+ it 'returns false for google.com' do
26
+ result = environment.isPlainHostName('google.com')
27
+ expect(result).to be_false
28
+ end
29
+ end
30
+
31
+ describe '#dnsDomainIs' do
32
+ it 'returns true for maps.google.com' do
33
+ result = environment.dnsDomainIs('maps.google.com', '.google.com')
34
+ expect(result).to be_true
35
+ end
36
+
37
+ it 'returns false for maps.ms.com' do
38
+ result = environment.dnsDomainIs('maps.ms.com', '.google.com')
39
+ expect(result).to be_false
40
+ end
41
+ end
42
+
43
+ describe '#localHostOrDomainIs' do
44
+ it 'returns true for maps.google.com' do
45
+ result = environment.localHostOrDomainIs('maps.google.com', 'maps.google.com')
46
+ expect(result).to be_true
47
+ end
48
+
49
+ it 'returns true for maps' do
50
+ result = environment.localHostOrDomainIs('maps', 'maps.google.com')
51
+ expect(result).to be_true
52
+ end
53
+
54
+ it 'returns false for maps.ms.com' do
55
+ result = environment.dnsDomainIs('maps.ms.com', '.google.com')
56
+ expect(result).to be_false
57
+ end
58
+ end
59
+
60
+ describe '#isInNet' do
61
+ it 'returns true for 127.0.0.1' do
62
+ result = environment.isInNet('127.0.0.1', '127.0.0.0', '255.255.255.0')
63
+ expect(result).to be_true
64
+ end
65
+
66
+ it 'returns false for 10.0.0.1' do
67
+ result = environment.isInNet('10.0.0.1', '127.0.0.0', '255.255.255.0')
68
+ expect(result).to be_false
69
+ end
70
+ end
71
+
72
+ describe '#dnsResolve' do
73
+ it 'returns the ip address for domain' do
74
+ ip = '8.8.8.8'
75
+ name = 'google-public-dns-a.google.com'
76
+ expect(environment.dnsResolve(name)).to eq(ip)
77
+ end
78
+ end
79
+
80
+ describe '#MyIpAddress ' do
81
+ it 'returns the given ip address' do
82
+ ip = '127.0.0.1'
83
+ environment = Environment.new(my_ip_address: ip, time: Time.now)
84
+
85
+ expect(environment.MyIpAddress).to eq(ip)
86
+ end
87
+ end
88
+
89
+ describe '#dnsDomainLevels' do
90
+ it 'returns the count of domain levels (dots)' do
91
+ result = environment.dnsDomainLevels('maps.google.com')
92
+ expect(result).to eq(2)
93
+ end
94
+ end
95
+
96
+ describe '#shExpMatch' do
97
+ it 'returns true for maps.google.com' do
98
+ result = environment.shExpMatch('maps.google.com', '*.com')
99
+ expect(result).to be_true
100
+ end
101
+
102
+ it 'returns false for maps.ms.com' do
103
+ result = environment.shExpMatch('maps.ms.com', '*.de')
104
+ expect(result).to be_false
105
+ end
106
+ end
107
+
108
+ describe '#weekdayRange' do
109
+ let(:environment) { Environment.new(my_ip_address: '127.0.0.1', time: Time.parse('1991-08-25 12:00')) }
110
+
111
+ it 'returns true for SUN - MON' do
112
+ result = environment.weekdayRange("SUN", "MON")
113
+ expect(result).to be_true
114
+ end
115
+
116
+ it 'returns false for FR' do
117
+ result = environment.weekdayRange("FRI")
118
+ expect(result).to be_false
119
+ end
120
+
121
+ it 'fails if wd1 or wd2 are not valid, e.g. German SO for Sunday' do
122
+ expect {
123
+ environment.weekdayRange("SO")
124
+ }.to raise_error Exceptions::InvalidArgument
125
+ end
126
+
127
+ end
128
+
129
+ describe '#dateRange' do
130
+ let(:environment) { Environment.new(my_ip_address: '127.0.0.1', time: Time.parse('1991-08-25 12:00')) }
131
+
132
+ it 'returns true for JUL - SEP' do
133
+ result = environment.dateRange("JUL", "SEP")
134
+ expect(result).to be_true
135
+ end
136
+
137
+ it 'returns false for MAR' do
138
+ result = environment.dateRange("MAR")
139
+ expect(result).to be_false
140
+ end
141
+
142
+ it 'fails if range is not valid' do
143
+ expect {
144
+ environment.dateRange("SEPT")
145
+ }.to raise_error Exceptions::InvalidArgument
146
+ end
147
+ end
148
+
149
+ describe '#timeRange' do
150
+ let(:environment) { Environment.new(my_ip_address: '127.0.0.1', time: Time.parse('1991-08-25 12:00')) }
151
+
152
+ it 'returns true for 8 - 18h' do
153
+ result = environment.timeRange(8, 18)
154
+ expect(result).to be_true
155
+ end
156
+
157
+ it 'returns false for MAR' do
158
+ result = environment.timeRange(13,14)
159
+ expect(result).to be_false
160
+ end
161
+
162
+ it 'fails if range is not valid' do
163
+ expect {
164
+ environment.timeRange("SEPT")
165
+ }.to raise_error Exceptions::InvalidArgument
166
+ end
167
+ end
168
+
169
+ describe '#alert' do
170
+ it 'outputs msg' do
171
+ result = capture(:stderr) do
172
+ environment.alert('message')
173
+ end
174
+
175
+ expect(result.chomp).to eq('message')
176
+ end
177
+ end
178
+
179
+ describe '#prepare' do
180
+ it 'adds neccessary functions to source file' do
181
+ string = ''
182
+ environment.prepare(string)
183
+
184
+ %w[
185
+ MyIpAddress
186
+ weekdayRange
187
+ dateRange
188
+ timeRange
189
+ ].each { |f| expect(string).to include(f) }
190
+
191
+ end
192
+ end
193
+ end
data/spec/file_spec.rb ADDED
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe File do
5
+ let(:simple) do
6
+ <<-EOS.strip_heredoc
7
+ function FindProxyForURL(url, host) {
8
+ return "DIRECT";
9
+ }
10
+ EOS
11
+ end
12
+
13
+ let(:client_ip_pac) do
14
+ <<-EOS.strip_heredoc
15
+ function FindProxyForURL(url, host) {
16
+ if ( MyIpAddress() == '127.0.0.2' ) {
17
+ return "DIRECT";
18
+ } else {
19
+ return "PROXY localhost:8080";
20
+ }
21
+ }
22
+ EOS
23
+ end
24
+
25
+ let(:time_pac) do
26
+ <<-EOS.strip_heredoc
27
+ function FindProxyForURL(url, host) {
28
+ if ( timeRange(8, 18) ) {
29
+ return "PROXY localhost:8080";
30
+ } else {
31
+ return "DIRECT";
32
+ }
33
+ }
34
+ EOS
35
+ end
36
+
37
+ context '#find' do
38
+ it 'returns result of proxy.pac' do
39
+ javascript = double('javascript')
40
+ expect(javascript).to receive(:call).with("FindProxyForURL", "http://localhost", "localhost")
41
+
42
+ ProxyPacRb::File.new(javascript).find("http://localhost")
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,116 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe ProxyPacRb::Parser do
5
+ let(:sample_pac) do
6
+ create_file 'sample.pac', <<-EOS.strip_heredoc
7
+ function FindProxyForURL(url, host) {
8
+ return "DIRECT";
9
+ }
10
+ EOS
11
+ end
12
+
13
+ context ".read" do
14
+ it "should load a file from a path" do
15
+ pac = ProxyPacRb::Parser.new.read(sample_pac)
16
+ expect(pac).not_to be_nil
17
+ end
18
+ end
19
+
20
+ context ".source" do
21
+ let(:source) do <<-JS.strip_heredoc
22
+ function FindProxyForURL(url, host) {
23
+ return "DIRECT";
24
+ }
25
+ JS
26
+ end
27
+
28
+ it "should load source" do
29
+ pac = ProxyPacRb::Parser.new.source(source)
30
+ expect(pac).not_to be_nil
31
+ end
32
+ end
33
+
34
+ context 'compile' do
35
+ it 'supports a changeable ip address' do
36
+ string = <<-EOS
37
+ function FindProxyForURL(url, host) {
38
+ if ( MyIpAddress() == '127.0.0.2' ) {
39
+ return "DIRECT";
40
+ } else {
41
+ return "PROXY localhost:8080";
42
+ }
43
+ }
44
+ EOS
45
+
46
+ environment = ProxyPacRb::Environment.new(my_ip_address: '127.0.0.1')
47
+ file = ProxyPacRb::Parser.new(environment).source(string)
48
+ expect(file.find('http://localhost')).to eq('PROXY localhost:8080')
49
+
50
+ environment = ProxyPacRb::Environment.new(my_ip_address: '127.0.0.2')
51
+ file = ProxyPacRb::Parser.new(environment).source(string)
52
+ expect(file.find('http://localhost')).to eq('DIRECT')
53
+ end
54
+
55
+ it 'supports a changeable date' do
56
+ string = <<-EOS
57
+ function FindProxyForURL(url, host) {
58
+ if (weekdayRange("FRI", "SAT")) {
59
+ return "PROXY localhost:8080";
60
+ } else {
61
+ return "DIRECT";
62
+ }
63
+ }
64
+ EOS
65
+
66
+ environment = Environment.new(time: Time.parse('2014-03-08 12:00'))
67
+ file = ProxyPacRb::Parser.new(environment).source(string)
68
+ expect(file.find('http://localhost')).to eq('PROXY localhost:8080')
69
+
70
+ environment = Environment.new(time: Time.parse('2014-03-06 12:00'))
71
+ file = ProxyPacRb::Parser.new(environment).source(string)
72
+ expect(file.find('http://localhost')).to eq('DIRECT')
73
+ end
74
+
75
+ it 'supports time range' do
76
+ string = <<-EOS
77
+ function FindProxyForURL(url, host) {
78
+ if (timeRange(8, 18)) {
79
+ return "PROXY localhost:8080";
80
+ } else {
81
+ return "DIRECT";
82
+ }
83
+ }
84
+ EOS
85
+
86
+ environment = ProxyPacRb::Environment.new(time: Time.parse('2014-03-06 12:00'))
87
+ file = ProxyPacRb::Parser.new(environment).source(string)
88
+ expect(file.find('http://localhost')).to eq('PROXY localhost:8080')
89
+
90
+ environment = ProxyPacRb::Environment.new(time: Time.parse('2014-03-08 6:00'))
91
+ file = ProxyPacRb::Parser.new(environment).source(string)
92
+ expect(file.find('http://localhost')).to eq('DIRECT')
93
+ end
94
+
95
+ it 'supports a date range' do
96
+ string = <<-EOS
97
+ function FindProxyForURL(url, host) {
98
+ if (dateRange("JUL", "SEP")) {
99
+ return "PROXY localhost:8080";
100
+ } else {
101
+ return "DIRECT";
102
+ }
103
+ }
104
+ EOS
105
+
106
+ environment = ProxyPacRb::Environment.new(time: Time.parse('2014-07-06 12:00'))
107
+ file = ProxyPacRb::Parser.new(environment).source(string)
108
+ expect(file.find('http://localhost')).to eq('PROXY localhost:8080')
109
+
110
+ environment = ProxyPacRb::Environment.new(time: Time.parse('2014-03-08 6:00'))
111
+ file = ProxyPacRb::Parser.new(environment).source(string)
112
+ expect(file.find('http://localhost')).to eq('DIRECT')
113
+ end
114
+
115
+ end
116
+ end