open_uri_redirections 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc4b17aba7d8dceb5ba1ddc29af49955c6e91b58
4
- data.tar.gz: 236a88b135504f1d26594073b0749f2ff7a3a825
3
+ metadata.gz: 700a295a62e1dcaa24dbb77e2c73cdfb99b25f26
4
+ data.tar.gz: 9e4e1ce91c9443fbb229ee34b6de90bdc9aba6b5
5
5
  SHA512:
6
- metadata.gz: fa7c16dfd95c36a7ac291a2b6505eb7f576b8bf0610616352866507bf8fd51b591bbd7eb71475ab9b058db2799c996884a3744ea96619e8b6fa1f71bb90e9a58
7
- data.tar.gz: 1b2ea3d8b764a3b16610417f3e55bc4cad8e00dd43d51fc9f3f3976229187f78eba3bd8b814dc040bd6ce11768061db1e53b67c9f146c5d4502ed74f8b35c775
6
+ metadata.gz: 60ceb82cdbded3b4af61108efa78342a8e9971bcebc2a3ddc718769e5abe2b653c846c1759a740c35a633ffab84d54049d95b1890338ef83d0363b2142801567
7
+ data.tar.gz: d166c07b860618625f4dd0a67aeb251d9cf4f73bbe54642553c56cda007a2d6b3381f31b98342ab4316aa8dda4908373864e01018d58403d63464f1dc2179eef
data/.travis.yml CHANGED
@@ -1,5 +1,15 @@
1
+ language: ruby
1
2
  rvm:
2
- - 1.8.7
3
- - 1.9.2
4
- - 1.9.3
5
- - 2.0.0
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - 2.1.0
8
+ - 2.1.1
9
+ - 2.1.2
10
+ - 2.1.3
11
+ - 2.1.4
12
+ - 2.1.5
13
+ - ruby-head
14
+ - rbx-2
15
+ - jruby
data/LICENSE.txt CHANGED
@@ -1,4 +1,5 @@
1
- Copyright (c) 2012 Jaime Iniesta
1
+ Copyright (c) 2012-2014 Jaime Iniesta
2
+ Copyright (c) 2014 Felix C. Stegerman
2
3
 
3
4
  MIT License
4
5
 
data/README.md CHANGED
@@ -2,25 +2,29 @@
2
2
 
3
3
  This gem applies a patch to OpenURI to optionally allow redirections from HTTP to HTTPS, or from HTTPS to HTTP.
4
4
 
5
- This is based on [this patch](http://bugs.ruby-lang.org/issues/859), and modified to allow redirections in both directions.
5
+ This is based on [this patch](http://bugs.ruby-lang.org/issues/859) and [this gem](https://github.com/obfusk/open_uri_w_redirect_to_https), and modified to allow redirections in both directions.
6
6
 
7
7
  Here is the problem it tries to solve:
8
8
 
9
- $ irb
10
- 1.9.2p320 :001 > require 'open-uri'
11
- => true
12
- 1.9.2p320 :002 > open('http://github.com')
13
- RuntimeError: redirection forbidden: http://github.com -> https://github.com/
9
+ ```sh
10
+ $ irb
11
+ 1.9.2p320 :001 > require 'open-uri'
12
+ => true
13
+ 1.9.2p320 :002 > open('http://github.com')
14
+ RuntimeError: redirection forbidden: http://github.com -> https://github.com/
15
+ ```
14
16
 
15
17
  And here is how you can use this patch to follow the redirections:
16
18
 
17
- $ irb
18
- 1.9.2p320 :001 > require 'open-uri'
19
- => true
20
- > require 'open_uri_redirections'
21
- => true
22
- 1.9.2p320 :002 > open('http://github.com', :allow_redirections => :safe)
23
- => #<File:/var/folders/...>
19
+ ```sh
20
+ $ irb
21
+ 1.9.2p320 :001 > require 'open-uri'
22
+ => true
23
+ > require 'open_uri_redirections'
24
+ => true
25
+ 1.9.2p320 :002 > open('http://github.com', :allow_redirections => :safe)
26
+ => #<File:/var/folders/...>
27
+ ```
24
28
 
25
29
  The patch contained in this gem adds the :allow_redirections option to `OpenURI#open`:
26
30
 
@@ -35,11 +39,14 @@ Before using this gem, read this:
35
39
  [https://gist.github.com/1271420](https://gist.github.com/1271420)
36
40
 
37
41
  ### Relevant issue:
38
- [http://redmine.ruby-lang.org/issues/3719](http://redmine.ruby-lang.org/issues/3719)
42
+ [https://bugs.ruby-lang.org/issues/3719](https://bugs.ruby-lang.org/issues/3719)
39
43
 
40
44
  ### Source here:
41
45
  [https://github.com/ruby/ruby/blob/trunk/lib/open-uri.rb](https://github.com/ruby/ruby/blob/trunk/lib/open-uri.rb)
42
46
 
47
+ ### Thread-safe implementation adapted from this gem:
48
+ [https://github.com/obfusk/open_uri_w_redirect_to_https](https://github.com/obfusk/open_uri_w_redirect_to_https)
49
+
43
50
  Use it at your own risk!
44
51
 
45
52
  ## Installation
@@ -50,11 +57,15 @@ Add this line to your application's Gemfile:
50
57
 
51
58
  And then execute:
52
59
 
53
- $ bundle install
60
+ ```sh
61
+ $ bundle install
62
+ ```
54
63
 
55
64
  Or install it yourself as:
56
65
 
57
- $ gem install open_uri_redirections
66
+ ```sh
67
+ $ gem install open_uri_redirections
68
+ ```
58
69
 
59
70
  ## Contributing
60
71
 
@@ -7,14 +7,33 @@
7
7
  #
8
8
  # Source here:
9
9
  # https://github.com/ruby/ruby/blob/trunk/lib/open-uri.rb
10
+ #
11
+ # Thread-safe implementation adapted from:
12
+ # https://github.com/obfusk/open_uri_w_redirect_to_https
10
13
 
11
14
  module OpenURI
12
15
  class <<self
13
16
  alias_method :open_uri_original, :open_uri
14
17
  alias_method :redirectable_cautious?, :redirectable?
15
18
 
19
+ def redirectable?(uri1, uri2)
20
+ allow_redirections = Thread.current[:__open_uri_redirections__]
21
+
22
+ # clear to prevent leaking (e.g. to block)
23
+ Thread.current[:__open_uri_redirections__] = nil
24
+
25
+ case allow_redirections
26
+ when :safe
27
+ redirectable_safe? uri1, uri2
28
+ when :all
29
+ redirectable_all? uri1, uri2
30
+ else
31
+ redirectable_cautious? uri1, uri2
32
+ end
33
+ end
34
+
16
35
  def redirectable_safe?(uri1, uri2)
17
- uri1.scheme.downcase == uri2.scheme.downcase || (uri1.scheme.downcase == "http" && uri2.scheme.downcase == "https")
36
+ redirectable_cautious?(uri1, uri2) || (uri1.scheme.downcase == "http" && uri2.scheme.downcase == "https")
18
37
  end
19
38
 
20
39
  def redirectable_all?(uri1, uri2)
@@ -29,27 +48,15 @@ module OpenURI
29
48
  #
30
49
  def self.open_uri(name, *rest, &block)
31
50
  options = self.first_hash_argument(rest)
32
-
33
51
  allow_redirections = options.delete :allow_redirections if options
34
- case allow_redirections
35
- when :safe
36
- class << self
37
- remove_method :redirectable?
38
- alias_method :redirectable?, :redirectable_safe?
39
- end
40
- when :all
41
- class << self
42
- remove_method :redirectable?
43
- alias_method :redirectable?, :redirectable_all?
44
- end
45
- else
46
- class << self
47
- remove_method :redirectable?
48
- alias_method :redirectable?, :redirectable_cautious?
49
- end
50
- end
52
+ Thread.current[:__open_uri_redirections__] = allow_redirections
51
53
 
52
- self.open_uri_original name, *rest, &block
54
+ begin
55
+ self.open_uri_original name, *rest, &block
56
+ ensure
57
+ # clear (redirectable? might not be called due to an exception)
58
+ Thread.current[:__open_uri_redirections__] = nil
59
+ end
53
60
  end
54
61
 
55
62
  private
@@ -1,3 +1,3 @@
1
1
  module OpenUriRedirections
2
- VERSION = "0.1.4"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -6,7 +6,7 @@ require 'open_uri_redirections/version'
6
6
  Gem::Specification.new do |gem|
7
7
  gem.name = "open_uri_redirections"
8
8
  gem.version = OpenUriRedirections::VERSION
9
- gem.authors = ["Jaime Iniesta", "Gabriel Cebrian"]
9
+ gem.authors = ["Jaime Iniesta", "Gabriel Cebrian", "Felix C. Stegerman"]
10
10
  gem.email = ["jaimeiniesta@gmail.com"]
11
11
  gem.description = %q{OpenURI patch to allow redirections between HTTP and HTTPS}
12
12
  gem.summary = %q{OpenURI patch to allow redirections between HTTP and HTTPS}
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(%r{^(spec)/})
18
18
  gem.require_paths = ["lib"]
19
19
 
20
- gem.add_development_dependency 'rspec', '~> 2.13.0'
20
+ gem.add_development_dependency 'rspec', '~> 3.1.0'
21
21
  gem.add_development_dependency 'fakeweb', '~> 1.3.0'
22
- gem.add_development_dependency 'rake', '~> 10.0.3'
22
+ gem.add_development_dependency 'rake', '~> 10.3.2'
23
23
  end
@@ -2,6 +2,10 @@
2
2
 
3
3
  require File.join(File.dirname(__FILE__), "/spec_helper")
4
4
 
5
+ class << OpenURI
6
+ alias_method :open_uri_original__, :open_uri_original
7
+ end
8
+
5
9
  describe "OpenURI" do
6
10
  describe "#open" do
7
11
  describe "Default settings" do
@@ -32,7 +36,9 @@ describe "OpenURI" do
32
36
  end
33
37
 
34
38
  it "should follow safe redirections" do
35
- open("http://safe.com", :allow_redirections => :safe).read.should == "Hello, this is Safe."
39
+ expect(
40
+ open("http://safe.com", :allow_redirections => :safe).read
41
+ ).to eq("Hello, this is Safe.")
36
42
  end
37
43
 
38
44
  it "should follow safe redirections with block" do
@@ -56,11 +62,15 @@ describe "OpenURI" do
56
62
  end
57
63
 
58
64
  it "should follow safe redirections" do
59
- open("http://safe.com", :allow_redirections => :all).read.should == "Hello, this is Safe."
65
+ expect(
66
+ open("http://safe.com", :allow_redirections => :all).read
67
+ ).to eq("Hello, this is Safe.")
60
68
  end
61
69
 
62
70
  it "should follow unsafe redirections" do
63
- open("https://unsafe.com", :allow_redirections => :all).read.should == "Hello, this is Unsafe."
71
+ expect(
72
+ open("https://unsafe.com", :allow_redirections => :all).read
73
+ ).to eq("Hello, this is Unsafe.")
64
74
  end
65
75
 
66
76
  it "should follow safe redirections with block" do
@@ -90,10 +100,44 @@ describe "OpenURI" do
90
100
  end
91
101
 
92
102
  it "should pass the arguments down the stack" do
93
- OpenURI.should_receive(:open_uri_original).with(an_instance_of(URI::HTTP), "r", 0444, { "User-Agent" => "Mozilla/5.0" })
103
+ expect(OpenURI).to receive(:open_uri_original).with(an_instance_of(URI::HTTP), "r", 0444, { "User-Agent" => "Mozilla/5.0" })
94
104
 
95
105
  open("http://safe.com", 'r', 0444, "User-Agent" => "Mozilla/5.0", :allow_redirections => :safe)
96
106
  end
97
107
  end
108
+
109
+ describe "threads" do
110
+ it "works" do
111
+ allow(OpenURI).to receive(:open_uri_original) { |*a,&b| sleep rand; OpenURI.open_uri_original__ *a, &b }
112
+ ts = []
113
+ Thread.abort_on_exception = true
114
+ begin
115
+ 100.times {
116
+ ts << Thread.new {
117
+ expect {
118
+ open("http://safe.com")
119
+ }.to raise_error(RuntimeError, "redirection forbidden: http://safe.com -> https://safe.com/")
120
+ }
121
+ ts << Thread.new {
122
+ expect {
123
+ open("http://safe.com", :allow_redirections => :safe)
124
+ }.to_not raise_error
125
+ }
126
+ ts << Thread.new {
127
+ expect {
128
+ open("https://unsafe.com")
129
+ }.to raise_error(RuntimeError, "redirection forbidden: https://unsafe.com -> http://unsafe.com/")
130
+ }
131
+ ts << Thread.new {
132
+ expect {
133
+ open("https://unsafe.com", :allow_redirections => :safe)
134
+ }.to raise_error(RuntimeError, "redirection forbidden: https://unsafe.com -> http://unsafe.com/")
135
+ }
136
+ }
137
+ ensure
138
+ ts.each(&:join)
139
+ end
140
+ end
141
+ end
98
142
  end
99
143
  end
metadata CHANGED
@@ -1,58 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open_uri_redirections
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jaime Iniesta
8
8
  - Gabriel Cebrian
9
+ - Felix C. Stegerman
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2013-11-19 00:00:00.000000000 Z
13
+ date: 2014-11-24 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: rspec
16
17
  requirement: !ruby/object:Gem::Requirement
17
18
  requirements:
18
- - - ~>
19
+ - - "~>"
19
20
  - !ruby/object:Gem::Version
20
- version: 2.13.0
21
+ version: 3.1.0
21
22
  type: :development
22
23
  prerelease: false
23
24
  version_requirements: !ruby/object:Gem::Requirement
24
25
  requirements:
25
- - - ~>
26
+ - - "~>"
26
27
  - !ruby/object:Gem::Version
27
- version: 2.13.0
28
+ version: 3.1.0
28
29
  - !ruby/object:Gem::Dependency
29
30
  name: fakeweb
30
31
  requirement: !ruby/object:Gem::Requirement
31
32
  requirements:
32
- - - ~>
33
+ - - "~>"
33
34
  - !ruby/object:Gem::Version
34
35
  version: 1.3.0
35
36
  type: :development
36
37
  prerelease: false
37
38
  version_requirements: !ruby/object:Gem::Requirement
38
39
  requirements:
39
- - - ~>
40
+ - - "~>"
40
41
  - !ruby/object:Gem::Version
41
42
  version: 1.3.0
42
43
  - !ruby/object:Gem::Dependency
43
44
  name: rake
44
45
  requirement: !ruby/object:Gem::Requirement
45
46
  requirements:
46
- - - ~>
47
+ - - "~>"
47
48
  - !ruby/object:Gem::Version
48
- version: 10.0.3
49
+ version: 10.3.2
49
50
  type: :development
50
51
  prerelease: false
51
52
  version_requirements: !ruby/object:Gem::Requirement
52
53
  requirements:
53
- - - ~>
54
+ - - "~>"
54
55
  - !ruby/object:Gem::Version
55
- version: 10.0.3
56
+ version: 10.3.2
56
57
  description: OpenURI patch to allow redirections between HTTP and HTTPS
57
58
  email:
58
59
  - jaimeiniesta@gmail.com
@@ -60,8 +61,8 @@ executables: []
60
61
  extensions: []
61
62
  extra_rdoc_files: []
62
63
  files:
63
- - .gitignore
64
- - .travis.yml
64
+ - ".gitignore"
65
+ - ".travis.yml"
65
66
  - Gemfile
66
67
  - LICENSE.txt
67
68
  - README.md
@@ -86,17 +87,17 @@ require_paths:
86
87
  - lib
87
88
  required_ruby_version: !ruby/object:Gem::Requirement
88
89
  requirements:
89
- - - '>='
90
+ - - ">="
90
91
  - !ruby/object:Gem::Version
91
92
  version: '0'
92
93
  required_rubygems_version: !ruby/object:Gem::Requirement
93
94
  requirements:
94
- - - '>='
95
+ - - ">="
95
96
  - !ruby/object:Gem::Version
96
97
  version: '0'
97
98
  requirements: []
98
99
  rubyforge_project:
99
- rubygems_version: 2.0.6
100
+ rubygems_version: 2.2.2
100
101
  signing_key:
101
102
  specification_version: 4
102
103
  summary: OpenURI patch to allow redirections between HTTP and HTTPS