puffing-billy 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +2 -2
- data/Guardfile +5 -5
- data/README.md +19 -1
- data/Rakefile +1 -1
- data/lib/billy.rb +17 -17
- data/lib/billy/cache.rb +30 -31
- data/lib/billy/config.rb +4 -2
- data/lib/billy/handlers/cache_handler.rb +5 -7
- data/lib/billy/handlers/handler.rb +2 -2
- data/lib/billy/handlers/proxy_handler.rb +16 -16
- data/lib/billy/handlers/request_handler.rb +6 -8
- data/lib/billy/handlers/stub_handler.rb +2 -2
- data/lib/billy/json_utils.rb +1 -2
- data/lib/billy/proxy_connection.rb +5 -5
- data/lib/billy/proxy_request_stub.rb +7 -7
- data/lib/billy/version.rb +1 -1
- data/lib/tasks/billy.rake +13 -15
- data/puffing-billy.gemspec +28 -28
- data/spec/features/examples/facebook_api_spec.rb +7 -7
- data/spec/features/examples/tumblr_api_spec.rb +6 -6
- data/spec/lib/billy/cache_spec.rb +14 -16
- data/spec/lib/billy/handlers/cache_handler_spec.rb +26 -24
- data/spec/lib/billy/handlers/handler_spec.rb +3 -3
- data/spec/lib/billy/handlers/proxy_handler_spec.rb +18 -16
- data/spec/lib/billy/handlers/request_handler_spec.rb +44 -42
- data/spec/lib/billy/handlers/stub_handler_spec.rb +14 -12
- data/spec/lib/billy/proxy_request_stub_spec.rb +55 -42
- data/spec/lib/billy/resource_utils_spec.rb +17 -17
- data/spec/lib/proxy_spec.rb +62 -70
- data/spec/spec_helper.rb +3 -3
- data/spec/support/test_server.rb +2 -2
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 556d5bc9c625544467f4dfcfcde6a1e5666b3c24
|
4
|
+
data.tar.gz: 5ef5ee675e69541bde2bb75807db1c252a154f5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12b4fe682ddd846585f468dfe16f54dce866d4e14a5176d4bf5a409a0e5d4553e701fad2c956887ea207142072e7ed7f6a1dd9ab738f4ea89ed2909e1b883652
|
7
|
+
data.tar.gz: 773d1bbd8d4aac55a7f67bd1903e86e801d21bc7619b55cbf7a3e19bac6efa12e8d95e5bea444f5484164b1bb4ccdda12a872579fb3fd4fc936637112b4750fe
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/Guardfile
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# A sample Guardfile
|
2
2
|
# More info at https://github.com/guard/guard#readme
|
3
3
|
|
4
|
-
guard 'rspec', :
|
4
|
+
guard 'rspec', version: 2 do
|
5
5
|
watch(%r{^spec/.+_spec\.rb$})
|
6
6
|
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
-
watch('spec/spec_helper.rb') {
|
7
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
8
8
|
|
9
9
|
# Rails example
|
10
10
|
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
11
11
|
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
12
12
|
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
13
|
-
watch(%r{^spec/support/(.+)\.rb$}) {
|
14
|
-
watch('config/routes.rb') {
|
15
|
-
watch('app/controllers/application_controller.rb') {
|
13
|
+
watch(%r{^spec/support/(.+)\.rb$}) { 'spec' }
|
14
|
+
watch('config/routes.rb') { 'spec/routing' }
|
15
|
+
watch('app/controllers/application_controller.rb') { 'spec/controllers' }
|
16
16
|
|
17
17
|
# Capybara request specs
|
18
18
|
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
|
data/README.md
CHANGED
@@ -137,6 +137,12 @@ It's good practice to reset the driver after each scenario, so having an
|
|
137
137
|
stubs are reset after each step, so any usage of a stub should be in the
|
138
138
|
same step that it was created in.
|
139
139
|
|
140
|
+
## Minitest Usage
|
141
|
+
|
142
|
+
Please see [this link](https://gist.github.com/sauy7/1b081266dd453a1b737b) for
|
143
|
+
details and report back to [Issue #49](https://github.com/oesmith/puffing-billy/issues/49)
|
144
|
+
if you get it fully working.
|
145
|
+
|
140
146
|
## Caching
|
141
147
|
|
142
148
|
Requests routed through the external proxy are cached.
|
@@ -202,6 +208,12 @@ caching. You should mostly use this for analytics and various social buttons as
|
|
202
208
|
they use cache avoidance techniques, but return practically the same response
|
203
209
|
that most often does not affect your test results.
|
204
210
|
|
211
|
+
`c.strip_query_params` is used to strip query parameters when you stub some requests
|
212
|
+
with query parameters. Default value is true. For example, `proxy.stub('http://myapi.com/user/?country=FOO')`
|
213
|
+
is considered the same as: `proxy.stub('http://myapi.com/user/?anything=FOO')` and
|
214
|
+
generally the same as: `proxy.stub('http://myapi.com/user/')`. When you need to distinguish between all these requests,
|
215
|
+
you may set this config value to false.
|
216
|
+
|
205
217
|
`c.dynamic_jsonp` is used to rewrite the body of JSONP responses based on the
|
206
218
|
callback parameter. For example, if a request to `http://example.com/foo?callback=bar`
|
207
219
|
returns `bar({"some": "json"});` and is recorded, then a later request to
|
@@ -327,7 +339,7 @@ and tell it to ignore SSL certificate warnings. See
|
|
327
339
|
to see how Billy's default drivers are configured.
|
328
340
|
|
329
341
|
## Working with VCR and Webmock
|
330
|
-
If you use VCR and Webmock elsewhere in your specs, you
|
342
|
+
If you use VCR and Webmock elsewhere in your specs, you may need to disable them
|
331
343
|
for your specs utilizing Puffing Billy. To do so, you can configure your `spec_helper.rb`
|
332
344
|
as shown below:
|
333
345
|
|
@@ -341,6 +353,12 @@ RSpec.configure do |config|
|
|
341
353
|
end
|
342
354
|
```
|
343
355
|
|
356
|
+
## Resources
|
357
|
+
|
358
|
+
[Bring Ruby VCR to Javascript testing with Capybara and puffing-billy](http://architects.dzone.com/articles/bring-ruby-vcr-javascript)
|
359
|
+
[Integration Testing Stripe.js With Mocked Network Requests](http://dev.contractual.ly/testing-stripe-js-with-mocked-network/)
|
360
|
+
[Clean-up unused cache files periodically with this config](https://github.com/oesmith/puffing-billy/pull/26#issuecomment-29905030)
|
361
|
+
|
344
362
|
## FAQ
|
345
363
|
|
346
364
|
1. Why name it after a train?
|
data/Rakefile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
|
-
require
|
2
|
+
require 'bundler/gem_tasks'
|
data/lib/billy.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
1
|
+
require 'billy/version'
|
2
|
+
require 'billy/config'
|
3
|
+
require 'billy/handlers/handler'
|
4
|
+
require 'billy/handlers/request_handler'
|
5
|
+
require 'billy/handlers/stub_handler'
|
6
|
+
require 'billy/handlers/proxy_handler'
|
7
|
+
require 'billy/handlers/cache_handler'
|
8
|
+
require 'billy/proxy_request_stub'
|
9
|
+
require 'billy/cache'
|
10
|
+
require 'billy/proxy'
|
11
|
+
require 'billy/proxy_connection'
|
12
|
+
require 'billy/railtie' if defined?(Rails)
|
13
13
|
|
14
14
|
module Billy
|
15
15
|
def self.proxy
|
@@ -44,8 +44,8 @@ module Billy
|
|
44
44
|
Capybara.register_driver :webkit_billy do |app|
|
45
45
|
driver = Capybara::Webkit::Driver.new(app)
|
46
46
|
driver.browser.ignore_ssl_errors
|
47
|
-
driver.browser.set_proxy(:
|
48
|
-
:
|
47
|
+
driver.browser.set_proxy(host: Billy.proxy.host,
|
48
|
+
port: Billy.proxy.port)
|
49
49
|
driver
|
50
50
|
end
|
51
51
|
end
|
@@ -55,9 +55,9 @@ module Billy
|
|
55
55
|
profile = Selenium::WebDriver::Firefox::Profile.new
|
56
56
|
profile.assume_untrusted_certificate_issuer = false
|
57
57
|
profile.proxy = Selenium::WebDriver::Proxy.new(
|
58
|
-
:
|
59
|
-
:
|
60
|
-
Capybara::Selenium::Driver.new(app, :
|
58
|
+
http: "#{Billy.proxy.host}:#{Billy.proxy.port}",
|
59
|
+
ssl: "#{Billy.proxy.host}:#{Billy.proxy.port}")
|
60
|
+
Capybara::Selenium::Driver.new(app, profile: profile)
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
data/lib/billy/cache.rb
CHANGED
@@ -17,51 +17,50 @@ module Billy
|
|
17
17
|
def cached?(method, url, body)
|
18
18
|
# Only log the key the first time it's looked up (in this method)
|
19
19
|
key = key(method, url, body, true)
|
20
|
-
!@cache[key].nil?
|
20
|
+
!@cache[key].nil? || persisted?(key)
|
21
21
|
end
|
22
22
|
|
23
23
|
def persisted?(key)
|
24
|
-
Billy.config.persist_cache
|
24
|
+
Billy.config.persist_cache && File.exist?(cache_file(key))
|
25
25
|
end
|
26
26
|
|
27
27
|
def fetch(method, url, body)
|
28
28
|
key = key(method, url, body)
|
29
|
-
@cache[key]
|
29
|
+
@cache[key] || fetch_from_persistence(key)
|
30
30
|
end
|
31
31
|
|
32
32
|
def fetch_from_persistence(key)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
nil
|
38
|
-
end
|
33
|
+
@cache[key] = YAML.load(File.open(cache_file(key))) if persisted?(key)
|
34
|
+
rescue ArgumentError => e
|
35
|
+
Billy.log :error, "Could not parse YAML: #{e.message}"
|
36
|
+
nil
|
39
37
|
end
|
40
38
|
|
41
39
|
def store(method, url, request_headers, body, response_headers, status, content)
|
42
40
|
cached = {
|
43
|
-
:
|
44
|
-
:
|
45
|
-
:
|
46
|
-
:
|
47
|
-
:
|
48
|
-
:
|
49
|
-
:
|
41
|
+
scope: scope,
|
42
|
+
url: format_url(url),
|
43
|
+
body: body,
|
44
|
+
status: status,
|
45
|
+
method: method,
|
46
|
+
headers: response_headers,
|
47
|
+
content: content
|
50
48
|
}
|
51
49
|
|
52
|
-
cached.merge!(
|
50
|
+
cached.merge!(request_headers: request_headers) if Billy.config.cache_request_headers
|
53
51
|
|
54
52
|
key = key(method, url, body)
|
55
53
|
@cache[key] = cached
|
56
54
|
|
57
55
|
if Billy.config.persist_cache
|
58
|
-
Dir.mkdir(Billy.config.cache_path) unless File.
|
56
|
+
Dir.mkdir(Billy.config.cache_path) unless File.exist?(Billy.config.cache_path)
|
59
57
|
|
60
58
|
begin
|
61
59
|
File.open(cache_file(key), 'w') do |f|
|
62
|
-
f.write(cached.to_yaml(:
|
60
|
+
f.write(cached.to_yaml(Encoding: :Utf8))
|
63
61
|
end
|
64
62
|
rescue StandardError => e
|
63
|
+
Billy.log :error, "Error storing cache file: #{e.message}"
|
65
64
|
end
|
66
65
|
end
|
67
66
|
end
|
@@ -75,33 +74,33 @@ module Billy
|
|
75
74
|
merge_cached_response_key = _merge_cached_response_key(orig_url)
|
76
75
|
url = Addressable::URI.parse(format_url(orig_url, ignore_params))
|
77
76
|
key = if merge_cached_response_key
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
77
|
+
method + '_' + Digest::SHA1.hexdigest(scope.to_s + merge_cached_response_key)
|
78
|
+
else
|
79
|
+
method + '_' + url.host + '_' + Digest::SHA1.hexdigest(scope.to_s + url.to_s)
|
80
|
+
end
|
82
81
|
body_msg = ''
|
83
82
|
|
84
83
|
if method == 'post' && !ignore_params && !merge_cached_response_key
|
85
|
-
body_formatted = JSONUtils
|
84
|
+
body_formatted = JSONUtils.json?(body.to_s) ? JSONUtils.sort_json(body.to_s) : body.to_s
|
86
85
|
body_msg = " with body '#{body_formatted}'"
|
87
|
-
key += '_'+Digest::SHA1.hexdigest(body_formatted)
|
86
|
+
key += '_' + Digest::SHA1.hexdigest(body_formatted)
|
88
87
|
end
|
89
88
|
|
90
89
|
Billy.log(:info, "puffing-billy: CACHE KEY for '#{orig_url}#{body_msg}' is '#{key}'") if log_key
|
91
90
|
key
|
92
91
|
end
|
93
92
|
|
94
|
-
def format_url(url, ignore_params=false, dynamic_jsonp=Billy.config.dynamic_jsonp)
|
93
|
+
def format_url(url, ignore_params = false, dynamic_jsonp = Billy.config.dynamic_jsonp)
|
95
94
|
url = Addressable::URI.parse(url)
|
96
95
|
port_to_include = Billy.config.ignore_cache_port ? '' : ":#{url.port}"
|
97
|
-
formatted_url = url.scheme+'://'+url.host+port_to_include+url.path
|
96
|
+
formatted_url = url.scheme + '://' + url.host + port_to_include + url.path
|
98
97
|
|
99
98
|
return formatted_url if ignore_params
|
100
99
|
|
101
100
|
if url.query
|
102
101
|
query_string = if dynamic_jsonp
|
103
102
|
query_hash = Rack::Utils.parse_query(url.query)
|
104
|
-
Billy.config.dynamic_jsonp_keys.each{|k| query_hash.delete(k) }
|
103
|
+
Billy.config.dynamic_jsonp_keys.each { |k| query_hash.delete(k) }
|
105
104
|
Rack::Utils.build_query(query_hash)
|
106
105
|
else
|
107
106
|
url.query
|
@@ -110,7 +109,7 @@ module Billy
|
|
110
109
|
formatted_url += "?#{query_string}"
|
111
110
|
end
|
112
111
|
|
113
|
-
formatted_url += '#'+url.fragment if url.fragment
|
112
|
+
formatted_url += '#' + url.fragment if url.fragment
|
114
113
|
|
115
114
|
formatted_url
|
116
115
|
end
|
@@ -124,10 +123,10 @@ module Billy
|
|
124
123
|
end
|
125
124
|
|
126
125
|
def with_scope(use_scope = nil, &block)
|
127
|
-
|
126
|
+
fail ArgumentError, 'Expected a block but none was received.' if block.nil?
|
128
127
|
original_scope = scope
|
129
128
|
scope_to use_scope
|
130
|
-
block.call
|
129
|
+
block.call
|
131
130
|
ensure
|
132
131
|
scope_to original_scope
|
133
132
|
end
|
data/lib/billy/config.rb
CHANGED
@@ -9,7 +9,8 @@ module Billy
|
|
9
9
|
attr_accessor :logger, :cache, :cache_request_headers, :whitelist, :path_blacklist, :ignore_params,
|
10
10
|
:persist_cache, :ignore_cache_port, :non_successful_cache_disabled, :non_successful_error_level,
|
11
11
|
:non_whitelisted_requests_disabled, :cache_path, :proxy_port, :proxied_request_inactivity_timeout,
|
12
|
-
:proxied_request_connect_timeout, :dynamic_jsonp, :dynamic_jsonp_keys, :merge_cached_responses_whitelist
|
12
|
+
:proxied_request_connect_timeout, :dynamic_jsonp, :dynamic_jsonp_keys, :merge_cached_responses_whitelist,
|
13
|
+
:strip_query_params
|
13
14
|
|
14
15
|
def initialize
|
15
16
|
@logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
|
@@ -25,7 +26,7 @@ module Billy
|
|
25
26
|
@ignore_params = []
|
26
27
|
@persist_cache = false
|
27
28
|
@dynamic_jsonp = false
|
28
|
-
@dynamic_jsonp_keys = [
|
29
|
+
@dynamic_jsonp_keys = ['callback']
|
29
30
|
@ignore_cache_port = true
|
30
31
|
@non_successful_cache_disabled = false
|
31
32
|
@non_successful_error_level = :warn
|
@@ -34,6 +35,7 @@ module Billy
|
|
34
35
|
@proxy_port = RANDOM_AVAILABLE_PORT
|
35
36
|
@proxied_request_inactivity_timeout = 10 # defaults from https://github.com/igrigorik/em-http-request/wiki/Redirects-and-Timeouts
|
36
37
|
@proxied_request_connect_timeout = 5
|
38
|
+
@strip_query_params = true
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
@@ -7,6 +7,8 @@ module Billy
|
|
7
7
|
extend Forwardable
|
8
8
|
include Handler
|
9
9
|
|
10
|
+
attr_reader :cache
|
11
|
+
|
10
12
|
def_delegators :cache, :reset, :cached?
|
11
13
|
|
12
14
|
def initialize
|
@@ -29,7 +31,7 @@ module Billy
|
|
29
31
|
nil
|
30
32
|
end
|
31
33
|
|
32
|
-
def handles_request?(method, url,
|
34
|
+
def handles_request?(method, url, _headers, body)
|
33
35
|
cached?(method, url, body)
|
34
36
|
end
|
35
37
|
|
@@ -38,15 +40,11 @@ module Billy
|
|
38
40
|
def replace_response_callback(response, url)
|
39
41
|
request_uri = Addressable::URI.parse(url)
|
40
42
|
if request_uri.query
|
41
|
-
params = CGI
|
42
|
-
if params['callback'].any?
|
43
|
+
params = CGI.parse(request_uri.query)
|
44
|
+
if params['callback'].any? && response[:content].match(/\w+\(/)
|
43
45
|
response[:content].sub!(/\w+\(/, params['callback'].first + '(')
|
44
46
|
end
|
45
47
|
end
|
46
48
|
end
|
47
|
-
|
48
|
-
def cache
|
49
|
-
@cache
|
50
|
-
end
|
51
49
|
end
|
52
50
|
end
|
@@ -15,7 +15,7 @@ module Billy
|
|
15
15
|
# @return [Hash] A hash with the keys [:status, :headers, :content]
|
16
16
|
# Returns {:error => "Some error message"} if a failure occurs.
|
17
17
|
# Returns nil if the request cannot be fulfilled.
|
18
|
-
def handle_request(
|
18
|
+
def handle_request(_http_method, _url, _headers, _body)
|
19
19
|
{ error: 'The handler has not overridden the handle_request method!' }
|
20
20
|
end
|
21
21
|
|
@@ -29,7 +29,7 @@ module Billy
|
|
29
29
|
# @param [String] body The body of the HTTP request.
|
30
30
|
# @return [Boolean] True if the Handler can respond to the request, else false.
|
31
31
|
#
|
32
|
-
def handles_request?(
|
32
|
+
def handles_request?(_http_method, _url, _headers, _body)
|
33
33
|
false
|
34
34
|
end
|
35
35
|
|
@@ -7,20 +7,20 @@ module Billy
|
|
7
7
|
class ProxyHandler
|
8
8
|
include Handler
|
9
9
|
|
10
|
-
def handles_request?(
|
10
|
+
def handles_request?(_method, url, _headers, _body)
|
11
11
|
!disabled_request?(url)
|
12
12
|
end
|
13
13
|
|
14
14
|
def handle_request(method, url, headers, body)
|
15
15
|
if handles_request?(method, url, headers, body)
|
16
|
-
req = EventMachine::HttpRequest.new(url,
|
17
|
-
|
18
|
-
|
16
|
+
req = EventMachine::HttpRequest.new(url,
|
17
|
+
inactivity_timeout: Billy.config.proxied_request_inactivity_timeout,
|
18
|
+
connect_timeout: Billy.config.proxied_request_connect_timeout)
|
19
19
|
|
20
20
|
req = req.send(method.downcase, build_request_options(headers, body))
|
21
21
|
|
22
22
|
if req.error
|
23
|
-
return { :
|
23
|
+
return { error: "Request to #{url} failed with error: #{req.error}" }
|
24
24
|
end
|
25
25
|
|
26
26
|
if req.response
|
@@ -28,7 +28,7 @@ module Billy
|
|
28
28
|
|
29
29
|
unless allowed_response_code?(response[:status])
|
30
30
|
if Billy.config.non_successful_error_level == :error
|
31
|
-
return { :
|
31
|
+
return { error: "Request failed due to response status #{response[:status]} for '#{url}' which was not allowed." }
|
32
32
|
else
|
33
33
|
Billy.log(:warn, "puffing-billy: Received response status code #{response[:status]} for '#{url}'")
|
34
34
|
end
|
@@ -48,14 +48,14 @@ module Billy
|
|
48
48
|
private
|
49
49
|
|
50
50
|
def build_request_options(headers, body)
|
51
|
-
headers = Hash[headers.map { |k,v| [k.downcase, v] }]
|
51
|
+
headers = Hash[headers.map { |k, v| [k.downcase, v] }]
|
52
52
|
headers.delete('accept-encoding')
|
53
53
|
|
54
54
|
req_opts = {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
redirects: 0,
|
56
|
+
keepalive: false,
|
57
|
+
head: headers,
|
58
|
+
ssl: { verify: false }
|
59
59
|
}
|
60
60
|
req_opts[:body] = body if body
|
61
61
|
req_opts
|
@@ -63,9 +63,9 @@ module Billy
|
|
63
63
|
|
64
64
|
def process_response(req)
|
65
65
|
response = {
|
66
|
-
|
67
|
-
|
68
|
-
|
66
|
+
status: req.response_header.status,
|
67
|
+
headers: req.response_header.raw,
|
68
|
+
content: req.response.force_encoding('BINARY') }
|
69
69
|
response[:headers].merge!('Connection' => 'close')
|
70
70
|
response[:headers].delete('Transfer-Encoding')
|
71
71
|
response
|
@@ -84,7 +84,7 @@ module Billy
|
|
84
84
|
successful_status?(status)
|
85
85
|
end
|
86
86
|
|
87
|
-
def cacheable?(url,
|
87
|
+
def cacheable?(url, _headers, status)
|
88
88
|
return false unless Billy.config.cache
|
89
89
|
|
90
90
|
url = Addressable::URI.parse(url)
|
@@ -99,7 +99,7 @@ module Billy
|
|
99
99
|
end
|
100
100
|
|
101
101
|
def blacklisted_path?(path)
|
102
|
-
!Billy.config.path_blacklist.index{|bl| path.include?(bl)}.nil?
|
102
|
+
!Billy.config.path_blacklist.index { |bl| path.include?(bl) }.nil?
|
103
103
|
end
|
104
104
|
|
105
105
|
def successful_status?(status)
|