unwind 0.9.6 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|