unwind 0.9.6 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
1
  module Unwind
2
- VERSION = "0.9.6"
2
+ VERSION = "0.10.0"
3
3
  end
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 [301, 302, 303].include?(response.status)
33
- @redirects << current_url.to_s
34
- @redirect_limit -= 1
35
- resolve(redirect_url(response).normalize, apply_cookie(response, headers))
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
- @final_url = current_url.to_s
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
- body_match = response.body.match(/<meta http-equiv=\"refresh\" content=\"0; URL=(.*)\">/i)
72
- body_match ? Addressable::URI.parse(body_match[1]) : false
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.config do |c|
6
- c.stub_with :fakeweb
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