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.
@@ -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