unwind 0.11.0 → 0.11.1
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 +25 -7
- data/test/redirect_follower_test.rb +16 -0
- data/vcr_cassettes/relative_canonical_url.yml +1228 -0
- data/vcr_cassettes/relative_meta_refresh.yml +1895 -0
- metadata +4 -2
data/lib/unwind/version.rb
CHANGED
data/lib/unwind.rb
CHANGED
|
@@ -32,7 +32,7 @@ module Unwind
|
|
|
32
32
|
|
|
33
33
|
if is_response_redirect?(response)
|
|
34
34
|
handle_redirect(redirect_url(response), current_url, response, headers)
|
|
35
|
-
elsif meta_uri = meta_refresh?(response)
|
|
35
|
+
elsif meta_uri = meta_refresh?(current_url, response)
|
|
36
36
|
handle_redirect(meta_uri, current_url, response, headers)
|
|
37
37
|
else
|
|
38
38
|
handle_final_response(current_url, response)
|
|
@@ -66,9 +66,7 @@ module Unwind
|
|
|
66
66
|
if response.status == 200 && canonical = canonical_link?(response)
|
|
67
67
|
@redirects << current_url
|
|
68
68
|
if Addressable::URI.parse(canonical).relative?
|
|
69
|
-
|
|
70
|
-
# Is there a cleaner way of doing this?
|
|
71
|
-
@final_url = "#{current_uri.scheme}://#{current_uri.host}#{canonical}"
|
|
69
|
+
@final_url = make_url_absolute(current_url, Addressable::URI.parse(canonical)).to_s
|
|
72
70
|
else
|
|
73
71
|
@final_url = canonical
|
|
74
72
|
end
|
|
@@ -94,10 +92,13 @@ module Unwind
|
|
|
94
92
|
end
|
|
95
93
|
end
|
|
96
94
|
|
|
97
|
-
def meta_refresh?(response)
|
|
95
|
+
def meta_refresh?(current_url, response)
|
|
98
96
|
if response.status == 200
|
|
99
|
-
body_match = response.body.match(/<meta http-equiv=\"refresh\" content=\"0; URL=(
|
|
100
|
-
|
|
97
|
+
body_match = response.body.match(/<meta http-equiv=\"refresh\" content=\"0; URL=(.*?)\"\s*\/*>/i)
|
|
98
|
+
if body_match
|
|
99
|
+
uri = Addressable::URI.parse(body_match[1])
|
|
100
|
+
make_url_absolute(current_url, uri)
|
|
101
|
+
end
|
|
101
102
|
end
|
|
102
103
|
end
|
|
103
104
|
|
|
@@ -115,6 +116,23 @@ module Unwind
|
|
|
115
116
|
end
|
|
116
117
|
end
|
|
117
118
|
|
|
119
|
+
def make_url_absolute(current_url, relative_url)
|
|
120
|
+
current_uri = Addressable::URI.parse(current_url)
|
|
121
|
+
if (relative_url.relative?)
|
|
122
|
+
url = Addressable::URI.new(
|
|
123
|
+
:scheme => current_uri.scheme,
|
|
124
|
+
:user => current_uri.user,
|
|
125
|
+
:password => current_uri.password,
|
|
126
|
+
:host => current_uri.host,
|
|
127
|
+
:port => current_uri.port,
|
|
128
|
+
:path => relative_url.path,
|
|
129
|
+
:query => relative_url.query,
|
|
130
|
+
:fragment => relative_url.fragment)
|
|
131
|
+
else
|
|
132
|
+
relative_url
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
118
136
|
end
|
|
119
137
|
|
|
120
138
|
#borrowed (stolen) from HTTParty with minor updates
|
|
@@ -109,5 +109,21 @@ describe Unwind::RedirectFollower do
|
|
|
109
109
|
assert_equal 'http://www.google.com/', follower.final_url
|
|
110
110
|
end
|
|
111
111
|
end
|
|
112
|
+
|
|
113
|
+
it 'should handle a relative meta-refresh' do
|
|
114
|
+
VCR.use_cassette('relative meta refresh') do
|
|
115
|
+
follower = Unwind::RedirectFollower.resolve('http://fb.me/2JYu23acx')
|
|
116
|
+
assert follower.redirected?
|
|
117
|
+
assert_equal 'https://www.facebook.com/londonswf/posts/696389650411604?_fb_noscript=1', follower.final_url
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it 'should handle a relative canonical url' do
|
|
122
|
+
VCR.use_cassette('relative canonical url') do
|
|
123
|
+
follower = Unwind::RedirectFollower.resolve('http://youtu.be/hPJ0oLahGDg')
|
|
124
|
+
assert follower.redirected?
|
|
125
|
+
assert_equal 'http://www.youtube.com/watch?v=hPJ0oLahGDg', follower.final_url
|
|
126
|
+
end
|
|
127
|
+
end
|
|
112
128
|
|
|
113
129
|
end
|