unwind 0.9.6 → 0.10.0
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.
- data/lib/unwind/version.rb +1 -1
- data/lib/unwind.rb +40 -14
- data/test/redirect_follower_test.rb +11 -2
- data/unwind.gemspec +2 -2
- data/vcr_cassettes/amazon.yml +6860 -1524
- data/vcr_cassettes/canonical_url.yml +866 -0
- data/vcr_cassettes/meta_refresh.yml +170 -157
- data/vcr_cassettes/missing_redirect.yml +26 -12
- data/vcr_cassettes/no_redirect.yml +436 -208
- data/vcr_cassettes/pdf.yml +3711 -3675
- data/vcr_cassettes/relative_stackoverflow.yml +491 -444
- data/vcr_cassettes/relative_stackoverflow_2.yml +709 -324
- data/vcr_cassettes/ssl_tpope.yml +1136 -316
- data/vcr_cassettes/with_cookie.yml +817 -765
- data/vcr_cassettes/xZVND1.yml +456 -240
- metadata +65 -99
data/lib/unwind/version.rb
CHANGED
data/lib/unwind.rb
CHANGED
@@ -29,21 +29,16 @@ module Unwind
|
|
29
29
|
headers = (options || {}).merge({"accept-encoding" => "none"})
|
30
30
|
response = Faraday.get(current_url, headers)
|
31
31
|
|
32
|
-
if
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
elsif response.status == 200 && meta_uri = meta_refresh?(response)
|
37
|
-
@redirects << current_url.to_s
|
38
|
-
@redirect_limit -= 1
|
39
|
-
resolve(meta_uri.normalize, apply_cookie(response, headers))
|
32
|
+
if is_response_redirect?(response)
|
33
|
+
handle_redirect(redirect_url(response), current_url, response, headers)
|
34
|
+
elsif meta_uri = meta_refresh?(response)
|
35
|
+
handle_redirect(meta_uri, current_url, response, headers)
|
40
36
|
else
|
41
|
-
|
42
|
-
@response = response
|
43
|
-
self
|
37
|
+
handle_final_response(current_url, response)
|
44
38
|
end
|
45
|
-
end
|
46
39
|
|
40
|
+
self
|
41
|
+
end
|
47
42
|
|
48
43
|
def self.resolve(original_url, limit=5)
|
49
44
|
new(original_url, limit).resolve
|
@@ -51,6 +46,30 @@ module Unwind
|
|
51
46
|
|
52
47
|
private
|
53
48
|
|
49
|
+
def record_redirect(url)
|
50
|
+
@redirects << url.to_s
|
51
|
+
@redirect_limit -= 1
|
52
|
+
end
|
53
|
+
|
54
|
+
def is_response_redirect?(response)
|
55
|
+
[301, 302, 303].include?(response.status)
|
56
|
+
end
|
57
|
+
|
58
|
+
def handle_redirect(uri_to_redirect, url, response, headers)
|
59
|
+
record_redirect url
|
60
|
+
resolve(uri_to_redirect.normalize, apply_cookie(response, headers))
|
61
|
+
end
|
62
|
+
|
63
|
+
def handle_final_response(current_url, response)
|
64
|
+
current_url = current_url.dup.to_s
|
65
|
+
if response.status == 200 && canonical = canonical_link?(response)
|
66
|
+
@redirects << current_url
|
67
|
+
@final_url = canonical
|
68
|
+
else
|
69
|
+
@final_url = current_url
|
70
|
+
end
|
71
|
+
@response = response
|
72
|
+
end
|
54
73
|
|
55
74
|
def ok_to_continue?
|
56
75
|
raise TooManyRedirects if redirect_limit < 0
|
@@ -68,8 +87,15 @@ module Unwind
|
|
68
87
|
end
|
69
88
|
|
70
89
|
def meta_refresh?(response)
|
71
|
-
|
72
|
-
|
90
|
+
if response.status == 200
|
91
|
+
body_match = response.body.match(/<meta http-equiv=\"refresh\" content=\"0; URL=(.*)\">/i)
|
92
|
+
Addressable::URI.parse(body_match[1]) if body_match
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def canonical_link?(response)
|
97
|
+
body_match = response.body.match(/<link rel=[\'\"]canonical[\'\"] href=[\'\"](.*)[\'\"]/i)
|
98
|
+
body_match ? Addressable::URI.parse(body_match[1]).to_s : false
|
73
99
|
end
|
74
100
|
|
75
101
|
def apply_cookie(response, headers)
|
@@ -2,8 +2,8 @@ require 'minitest/autorun'
|
|
2
2
|
require 'vcr'
|
3
3
|
require './lib/unwind'
|
4
4
|
|
5
|
-
VCR.
|
6
|
-
c.
|
5
|
+
VCR.configure do |c|
|
6
|
+
c.hook_into :fakeweb
|
7
7
|
c.cassette_library_dir = 'vcr_cassettes'
|
8
8
|
end
|
9
9
|
|
@@ -76,6 +76,15 @@ describe Unwind::RedirectFollower do
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
+
it 'should set the final url as being the canonical url and treat it as s redirect' do
|
80
|
+
VCR.use_cassette('canonical url', :preserve_exact_body_bytes => true) do
|
81
|
+
follower = Unwind::RedirectFollower.resolve('http://www.scottw.com?test=abc')
|
82
|
+
assert follower.redirected?
|
83
|
+
assert 'http://www.scottw.com', follower.final_url
|
84
|
+
assert 'http://www.scottw?test=abc', follower.redirects[0]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
79
88
|
it 'should raise TooManyRedirects' do
|
80
89
|
VCR.use_cassette('xZVND1') do
|
81
90
|
follower = Unwind::RedirectFollower.new('http://j.mp/xZVND1', 1)
|
data/unwind.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
# specify any dependencies here; for example:
|
26
26
|
s.add_development_dependency "rake"
|
27
27
|
s.add_development_dependency "minitest"
|
28
|
-
s.add_development_dependency "vcr"
|
28
|
+
s.add_development_dependency "vcr", "~> 2.0.0"
|
29
29
|
s.add_development_dependency "fakeweb"
|
30
|
-
s.add_runtime_dependency "faraday", '~> 0.7'
|
30
|
+
s.add_runtime_dependency "faraday", '~> 0.7.0'
|
31
31
|
end
|