rack-canonical-host 1.1.0 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 60b35e0827776d7a2e063e985a5239bd479314bcf9c5f4e14f36d68ee995c850
4
- data.tar.gz: 71463943b6c8707eb4a73db1f2f2e43f73539c5beddd03fd677112a13a26126b
3
+ metadata.gz: 8d04ccdf68037f3995ea1a93a9f7858d5363fa9e4eae2797d6b35eb14b00e0f2
4
+ data.tar.gz: 30f80af7f437c52e4bdbe61b3a95ee560bba6250546a4b02153d11565e0a9bc6
5
5
  SHA512:
6
- metadata.gz: a34e6a6850579a3d8f0cdd1244468b5cc5b392912879ba9733b0a76e4895eedae167f2b2219fdabc3abf8450bb60ced81141842e3ed1418ce84e6926dfd6adb1
7
- data.tar.gz: b8256000841f0bf5798f400e642b3f93e46abec2ae3a344306b5ad84f475cefb74c38cb0499965c2dd028d7f08391c9c38de3c7a5110167b25c7e7a1d27d7a1d
6
+ metadata.gz: 78b807b256f6683f3a8864e0f422208475cb03e4baa4bbce50a998000958f98b43f41deead8f400cb0ae78b9ee6b57b0bbb6d3d0504e9faf6b31db3ad13faccc
7
+ data.tar.gz: 3a7186d72cea3a465fece9c11d2e178f1e6f09fa29e39463b58b92440fba32ecc56f2ff42742f5ad1a9359f17a4bff8a2ad3344c47308fd16a71bc2abb540230
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.2.0 (2023-04-14)
4
+
5
+ * Add support for Rack 3.0 ([Vinny Diehl][vinnydiehl])
6
+ * Remove unneeded gem directives ([Olle Jonsson][olleolleolle])
7
+
3
8
  ## 1.1.0 (2021-11-10)
4
9
 
5
10
  * Support lambda/proc on `:if` and `:ignore` options ([Sean Huber][shuber])
@@ -27,7 +32,7 @@
27
32
  * Remove `:force_ssl` option in favor of using [rack-ssl][rack-ssl]
28
33
  ([Nathaniel Bibler][nbibler])
29
34
 
30
- [rack-ssl]: http://rubygems.org/gems/rack-ssl
35
+ [rack-ssl]: https://rubygems.org/gems/rack-ssl
31
36
 
32
37
  ## 0.1.0 (2014-04-16)
33
38
 
@@ -74,16 +79,18 @@
74
79
 
75
80
  * Initial release ([Tyler Hunt][tylerhunt])
76
81
 
77
- [Aupajo]: http://github.com/Aupajo
78
- [finack]: http://github.com/finack
79
- [firedev]: http://github.com/firedev
80
- [jcarbo]: http://github.com/jcarbo
81
- [jellybob]: http://github.com/jellybob
82
- [jschuur]: http://github.com/jschuur
83
- [nbibler]: http://github.com/nbibler
84
- [rubymaverick]: http://github.com/ericallam
85
- [shuber]: http://github.com/shuber
86
- [squaresurf]: https://github.com/squaresurf
87
- [tma]: http://github.com/tma
88
- [tylerhunt]: http://github.com/tylerhunt
89
- [zoso10]: http://github.com/zoso10
82
+ [Aupajo]: https://github.com/Aupajo
83
+ [finack]: https://github.com/finack
84
+ [firedev]: https://github.com/firedev
85
+ [jcarbo]: https://github.com/jcarbo
86
+ [jellybob]: https://github.com/jellybob
87
+ [jschuur]: https://github.com/jschuur
88
+ [nbibler]: https://github.com/nbibler
89
+ [rubymaverick]: https://github.com/ericallam
90
+ [shuber]: https://github.com/shuber
91
+ [squaresurf]: httpss://github.com/squaresurf
92
+ [tma]: https://github.com/tma
93
+ [tylerhunt]: https://github.com/tylerhunt
94
+ [zoso10]: https://github.com/zoso10
95
+ [olleolleolle]: https://github.com/olleolleolle
96
+ [vinnydiehl]: https://github.com/vinnydiehl
data/README.md CHANGED
@@ -145,6 +145,6 @@ suggestions:
145
145
 
146
146
  ## Copyright
147
147
 
148
- Copyright © 2009-2021 Tyler Hunt.
148
+ Copyright © 2009 Tyler Hunt.
149
149
 
150
150
  Released under the terms of the MIT license. See LICENSE for details.
@@ -55,9 +55,9 @@ module Rack
55
55
 
56
56
  def headers
57
57
  {
58
- 'Cache-Control' => cache_control,
59
- 'Content-Type' => 'text/html',
60
- 'Location' => new_url,
58
+ 'cache-control' => cache_control,
59
+ 'content-type' => 'text/html',
60
+ 'location' => new_url,
61
61
  }.reject { |_, value| !value }
62
62
  end
63
63
 
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class CanonicalHost
3
- VERSION = '1.1.0'
3
+ VERSION = '1.2.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-canonical-host
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Hunt
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-10 00:00:00.000000000 Z
11
+ date: 2023-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -36,20 +36,20 @@ dependencies:
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: 1.0.0
39
+ version: '1'
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
- version: '3'
42
+ version: '4'
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 1.0.0
49
+ version: '1'
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
- version: '3'
52
+ version: '4'
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: appraisal
55
55
  requirement: !ruby/object:Gem::Requirement
@@ -68,16 +68,16 @@ dependencies:
68
68
  name: rake
69
69
  requirement: !ruby/object:Gem::Requirement
70
70
  requirements:
71
- - - ">="
71
+ - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: '0'
73
+ version: '13.0'
74
74
  type: :development
75
75
  prerelease: false
76
76
  version_requirements: !ruby/object:Gem::Requirement
77
77
  requirements:
78
- - - ">="
78
+ - - "~>"
79
79
  - !ruby/object:Gem::Version
80
- version: '0'
80
+ version: '13.0'
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: rspec
83
83
  requirement: !ruby/object:Gem::Requirement
@@ -92,39 +92,24 @@ dependencies:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
94
  version: '3.0'
95
- description:
96
- email:
95
+ description:
96
+ email:
97
97
  executables: []
98
98
  extensions: []
99
99
  extra_rdoc_files: []
100
100
  files:
101
- - ".github/workflows/ci.yml"
102
- - ".gitignore"
103
- - ".rspec"
104
- - Appraisals
105
101
  - CHANGELOG.md
106
- - Gemfile
107
102
  - LICENSE
108
103
  - README.md
109
- - Rakefile
110
- - gemfiles/rack_1.5.gemfile
111
- - gemfiles/rack_1.6.gemfile
112
- - gemfiles/rack_2.0.gemfile
113
- - gemfiles/rack_2.1.gemfile
114
- - gemfiles/rack_2.2.gemfile
115
104
  - lib/rack-canonical-host.rb
116
105
  - lib/rack/canonical_host.rb
117
106
  - lib/rack/canonical_host/redirect.rb
118
107
  - lib/rack/canonical_host/version.rb
119
- - rack-canonical-host.gemspec
120
- - spec/rack/canonical_host_spec.rb
121
- - spec/spec_helper.rb
122
- - spec/support/matchers/have_header.rb
123
- - spec/support/matchers/redirect_to.rb
124
108
  homepage: https://github.com/tylerhunt/rack-canonical-host
125
- licenses: []
109
+ licenses:
110
+ - MIT
126
111
  metadata: {}
127
- post_install_message:
112
+ post_install_message:
128
113
  rdoc_options: []
129
114
  require_paths:
130
115
  - lib
@@ -139,12 +124,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
124
  - !ruby/object:Gem::Version
140
125
  version: '0'
141
126
  requirements: []
142
- rubygems_version: 3.0.3
143
- signing_key:
127
+ rubygems_version: 3.3.26
128
+ signing_key:
144
129
  specification_version: 4
145
130
  summary: Rack middleware for defining a canonical host name.
146
- test_files:
147
- - spec/rack/canonical_host_spec.rb
148
- - spec/spec_helper.rb
149
- - spec/support/matchers/have_header.rb
150
- - spec/support/matchers/redirect_to.rb
131
+ test_files: []
@@ -1,30 +0,0 @@
1
- name: CI
2
- on:
3
- - push
4
- - pull_request
5
- jobs:
6
- test:
7
- name: Ruby ${{ matrix.ruby }} & Rack ${{ matrix.rack }}
8
- runs-on: 'ubuntu-latest'
9
- strategy:
10
- matrix:
11
- ruby:
12
- - '3.0'
13
- - '2.7'
14
- - '2.6'
15
- rack:
16
- - '1.5'
17
- - '1.6'
18
- - '2.0'
19
- - '2.1'
20
- - '2.2'
21
- fail-fast: false
22
- env:
23
- BUNDLE_GEMFILE: "gemfiles/rack_${{ matrix.rack }}.gemfile"
24
- steps:
25
- - uses: actions/checkout@v2
26
- - uses: ruby/setup-ruby@v1
27
- with:
28
- ruby-version: ${{ matrix.ruby }}
29
- - run: bundle install
30
- - run: bundle exec rake
data/.gitignore DELETED
@@ -1,19 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .rvmrc
6
- .yardoc
7
- Gemfile.lock
8
- InstalledFiles
9
- _yardoc
10
- coverage
11
- doc
12
- gemfiles/*.lock
13
- lib/bundler/man
14
- pkg
15
- rdoc
16
- spec/reports
17
- test/tmp
18
- test/version_tmp
19
- tmp
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --color
2
- --warnings
3
- --require spec_helper
data/Appraisals DELETED
@@ -1,19 +0,0 @@
1
- appraise 'rack-1.5' do
2
- gem 'rack', '~> 1.5.0'
3
- end
4
-
5
- appraise 'rack-1.6' do
6
- gem 'rack', '~> 1.6.0'
7
- end
8
-
9
- appraise 'rack-2.0' do
10
- gem 'rack', '~> 2.0.0'
11
- end
12
-
13
- appraise 'rack-2.1' do
14
- gem 'rack', '~> 2.1.0'
15
- end
16
-
17
- appraise 'rack-2.2' do
18
- gem 'rack', '~> 2.2.0'
19
- end
data/Gemfile DELETED
@@ -1,3 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
data/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env rake
2
-
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- task default: :spec
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rack", "~> 1.5.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rack", "~> 1.6.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rack", "~> 2.0.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rack", "~> 2.1.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rack", "~> 2.2.0"
6
-
7
- gemspec path: "../"
@@ -1,20 +0,0 @@
1
- require './lib/rack/canonical_host/version'
2
-
3
- Gem::Specification.new do |gem|
4
- gem.name = 'rack-canonical-host'
5
- gem.version = Rack::CanonicalHost::VERSION
6
- gem.summary = 'Rack middleware for defining a canonical host name.'
7
- gem.homepage = 'https://github.com/tylerhunt/rack-canonical-host'
8
- gem.author = 'Tyler Hunt'
9
-
10
- gem.add_dependency 'addressable', '> 0', '< 3'
11
- gem.add_dependency 'rack', ['>= 1.0.0', '< 3']
12
- gem.add_development_dependency 'appraisal', '~> 2.2'
13
- gem.add_development_dependency 'rake'
14
- gem.add_development_dependency 'rspec', '~> 3.0'
15
-
16
- gem.files = `git ls-files`.split($\)
17
- gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
18
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
- gem.require_paths = ['lib']
20
- end
@@ -1,275 +0,0 @@
1
- RSpec.describe Rack::CanonicalHost do
2
- let(:app_response) { [200, { 'Content-Type' => 'text/plain' }, %w(OK)] }
3
- let(:inner_app) { ->(env) { response } }
4
-
5
- before do
6
- allow(inner_app)
7
- .to receive(:call)
8
- .with(env)
9
- .and_return(app_response)
10
- end
11
-
12
- def build_app(host=nil, options={}, inner_app=inner_app(), &block)
13
- Rack::Builder.new do
14
- use Rack::Lint
15
- use Rack::CanonicalHost, host, options, &block
16
- run inner_app
17
- end
18
- end
19
-
20
- shared_context 'a matching request' do
21
- context 'with a request to a matching host' do
22
- let(:url) { 'http://example.com/full/path' }
23
-
24
- it { should_not be_redirect }
25
-
26
- it 'calls the inner app' do
27
- expect(inner_app).to receive(:call).with(env)
28
- call_app
29
- end
30
- end
31
- end
32
-
33
- shared_context 'a non-matching request' do
34
- context 'with a request to a non-matching host' do
35
- let(:url) { 'http://www.example.com/full/path' }
36
-
37
- it { should redirect_to('http://example.com/full/path') }
38
-
39
- it 'does not call the inner app' do
40
- expect(inner_app).to_not receive(:call)
41
- call_app
42
- end
43
-
44
- it { expect(response).to_not have_header('Cache-Control') }
45
- end
46
- end
47
-
48
- shared_context 'matching and non-matching requests' do
49
- include_context 'a matching request'
50
- include_context 'a non-matching request'
51
- end
52
-
53
- context '#call' do
54
- let(:headers) { {} }
55
-
56
- let(:app) { build_app('example.com') }
57
- let(:env) { Rack::MockRequest.env_for(url, headers) }
58
-
59
- def call_app
60
- app.call(env)
61
- end
62
-
63
- subject(:response) { call_app }
64
-
65
- include_context 'a matching request'
66
- include_context 'a non-matching request'
67
-
68
- context 'when the request has a pipe in the URL' do
69
- let(:url) { 'https://example.com/full/path?value=withPIPE' }
70
-
71
- before { env['QUERY_STRING'].sub!('PIPE', '|') }
72
-
73
- it { expect { call_app }.to_not raise_error }
74
- end
75
-
76
- context 'when the request has JavaScript in the URL' do
77
- let(:url) { 'http://www.example.com/full/path' }
78
-
79
- let(:headers) {
80
- { 'QUERY_STRING' => '"><script>alert(73541);</script>' }
81
- }
82
-
83
- let(:app) { build_app('example.com') }
84
-
85
- it 'escapes the JavaScript' do
86
- expect(response)
87
- .to redirect_to('http://example.com/full/path?%22%3E%3Cscript%3Ealert(73541)%3B%3C/script%3E')
88
- end
89
- end
90
-
91
- context 'with an X-Forwarded-Host' do
92
- let(:url) { 'http://proxy.test/full/path' }
93
-
94
- context 'which matches the canonical host' do
95
- let(:headers) { { 'HTTP_X_FORWARDED_HOST' => 'example.com:80' } }
96
-
97
- include_context 'a matching request'
98
- end
99
-
100
- context 'which does not match the canonical host' do
101
- let(:headers) { { 'HTTP_X_FORWARDED_HOST' => 'www.example.com:80' } }
102
-
103
- include_context 'a non-matching request'
104
- end
105
- end
106
-
107
- context 'without a host' do
108
- let(:app) { build_app(nil) }
109
-
110
- include_context 'a matching request'
111
- end
112
-
113
- context 'with :ignore option' do
114
- context 'with lambda/proc' do
115
- let(:app) {
116
- build_app(
117
- 'example.com',
118
- ignore: ->(uri) { uri.host == 'example.net' }
119
- )
120
- }
121
-
122
- include_context 'a matching request'
123
- include_context 'a non-matching request'
124
-
125
- context 'with a request to an ignored host' do
126
- let(:url) { 'http://example.net/full/path' }
127
-
128
- it { should_not be_redirect }
129
-
130
- it 'calls the inner app' do
131
- expect(inner_app).to receive(:call).with(env)
132
- call_app
133
- end
134
- end
135
- end
136
-
137
- context 'with string' do
138
- let(:app) { build_app('example.com', ignore: 'example.net') }
139
-
140
- include_context 'a matching request'
141
- include_context 'a non-matching request'
142
-
143
- context 'with a request to an ignored host' do
144
- let(:url) { 'http://example.net/full/path' }
145
-
146
- it { should_not be_redirect }
147
-
148
- it 'calls the inner app' do
149
- expect(inner_app).to receive(:call).with(env)
150
- call_app
151
- end
152
- end
153
- end
154
-
155
- context 'with regular expression' do
156
- let(:app) { build_app('example.com', ignore: /ex.*\.net/) }
157
-
158
- include_context 'a matching request'
159
- include_context 'a non-matching request'
160
-
161
- context 'with a request to an ignored host' do
162
- let(:url) { 'http://example.net/full/path' }
163
-
164
- it { should_not be_redirect }
165
-
166
- it 'calls the inner app' do
167
- expect(inner_app).to receive(:call).with(env)
168
- call_app
169
- end
170
- end
171
- end
172
- end
173
-
174
- context 'with :if option' do
175
- context 'with a lambda/proc' do
176
- let(:app) {
177
- build_app(
178
- 'www.example.com',
179
- if: ->(uri) { uri.host == 'example.com' }
180
- )
181
- }
182
-
183
- context 'with a request to a matching host' do
184
- let(:url) { 'http://example.com/full/path' }
185
-
186
- it { should redirect_to('http://www.example.com/full/path') }
187
- end
188
-
189
- context 'with a request to a non-matching host' do
190
- let(:url) { 'http://api.example.com/full/path' }
191
-
192
- it { should_not be_redirect }
193
- end
194
- end
195
-
196
- context 'with string' do
197
- let(:app) { build_app('www.example.com', if: 'example.com') }
198
-
199
- context 'with a request to a matching host' do
200
- let(:url) { 'http://example.com/full/path' }
201
-
202
- it { should redirect_to('http://www.example.com/full/path') }
203
- end
204
-
205
- context 'with a request to a non-matching host' do
206
- let(:url) { 'http://api.example.com/full/path' }
207
-
208
- it { should_not be_redirect }
209
- end
210
- end
211
-
212
- context 'with a regular expression' do
213
- let(:app) { build_app('example.com', if: '.*\.example\.com') }
214
-
215
- context 'with a request to a matching host' do
216
- let(:url) { 'http://www.example.com/full/path' }
217
-
218
- it { should_not redirect_to('http://example.com/full/path') }
219
- end
220
-
221
- context 'with a request to a non-matching host' do
222
- let(:url) { 'http://www.example.net/full/path' }
223
-
224
- it { should_not be_redirect }
225
- end
226
- end
227
- end
228
-
229
- context 'with a :cache_control option' do
230
- let(:url) { 'http://subdomain.example.net/full/path' }
231
-
232
- context 'with a max-age value' do
233
- let(:app) {
234
- build_app('example.com', cache_control: 'max-age=3600')
235
- }
236
-
237
- it {
238
- expect(response).to have_header('Cache-Control').with('max-age=3600')
239
- }
240
- end
241
-
242
- context 'with a no-cache value' do
243
- let(:app) { build_app('example.com', cache_control: 'no-cache') }
244
-
245
- it { expect(subject).to have_header('Cache-Control').with('no-cache') }
246
- end
247
-
248
- context 'with a false value' do
249
- let(:app) { build_app('example.com', cache_control: false) }
250
-
251
- it { expect(subject).to_not have_header('Cache-Control') }
252
- end
253
-
254
- context 'with a nil value' do
255
- let(:app) { build_app('example.com', cache_control: false) }
256
-
257
- it { expect(subject).to_not have_header('Cache-Control') }
258
- end
259
- end
260
-
261
- context 'with a block' do
262
- let(:app) { build_app { 'example.com' } }
263
-
264
- include_context 'a matching request'
265
- include_context 'a non-matching request'
266
-
267
- context 'that returns nil' do
268
- let(:app) { build_app('example.com') { nil } }
269
-
270
- include_context 'a matching request'
271
- include_context 'a non-matching request'
272
- end
273
- end
274
- end
275
- end
data/spec/spec_helper.rb DELETED
@@ -1,26 +0,0 @@
1
- require 'rack/canonical_host'
2
-
3
- Dir[File.expand_path('../support/**/*.rb', __FILE__)].each do |file|
4
- require(file)
5
- end
6
-
7
- RSpec.configure do |config|
8
- config.filter_run :focus
9
- config.run_all_when_everything_filtered = true
10
-
11
- config.order = :random
12
- Kernel.srand config.seed
13
-
14
- if config.files_to_run.one?
15
- config.default_formatter = 'doc'
16
- end
17
-
18
- config.expect_with :rspec do |expectations|
19
- expectations.syntax = :expect
20
- end
21
-
22
- config.mock_with :rspec do |mocks|
23
- mocks.syntax = :expect
24
- mocks.verify_partial_doubles = true
25
- end
26
- end
@@ -1,56 +0,0 @@
1
- module HaveHeader
2
- class Matcher
3
- def initialize(expected_header)
4
- self.expected_header = expected_header
5
- end
6
-
7
- def matches?(response)
8
- _, self.actual_headers, _ = response
9
-
10
- if expected_value
11
- actual_header == expected_value
12
- else
13
- actual_header
14
- end
15
- end
16
-
17
- def with(expected_value)
18
- self.expected_value = expected_value
19
- self
20
- end
21
-
22
- def description
23
- sentence = "have header #{expected_header.inspect}"
24
- sentence << " with #{expected_value.inspect}" if expected_value
25
- sentence
26
- end
27
-
28
- def failure_message
29
- "Expected response to #{description}"
30
- end
31
-
32
- def failure_message_when_negated
33
- "Did not expect response to #{description}"
34
- end
35
-
36
- protected
37
-
38
- attr_accessor :actual_headers
39
- attr_accessor :expected_header
40
- attr_accessor :expected_value
41
-
42
- private
43
-
44
- def actual_header
45
- actual_headers[expected_header]
46
- end
47
- end
48
-
49
- def have_header(name)
50
- Matcher.new(name)
51
- end
52
- end
53
-
54
- RSpec.configure do |config|
55
- config.include HaveHeader
56
- end
@@ -1,81 +0,0 @@
1
- module RedirectTo
2
- class Matcher
3
- def initialize(expected_location)
4
- self.expected_location = expected_location
5
- self.expected_status_code = STATUS
6
- end
7
-
8
- def matches?(response)
9
- self.actual_status_code, self.actual_headers, _ = response
10
-
11
- status_code_matches? && location_matches?
12
- end
13
-
14
- def via(expected_status_code)
15
- self.expected_status_code = expected_status_code
16
- self
17
- end
18
-
19
- def description
20
- if expected_status_code && expected_location
21
- "redirect to #{expected_location.inspect} via #{expected_status_code}"
22
- elsif expected_status_code
23
- "redirect via #{expected_status_code}"
24
- elsif expected_location
25
- "redirect to #{expected_location.inspect}"
26
- else
27
- 'be a redirect'
28
- end
29
- end
30
-
31
- def failure_message
32
- "Expected response to #{description}"
33
- end
34
-
35
- def failure_message_when_negated
36
- "Did not expect response to #{description}"
37
- end
38
-
39
- protected
40
-
41
- attr_accessor :actual_headers
42
- attr_accessor :actual_status_code
43
- attr_accessor :expected_location
44
- attr_accessor :expected_status_code
45
-
46
- private
47
-
48
- LOCATION = 'Location'
49
- STATUS = 301
50
-
51
- def actual_location
52
- actual_headers[LOCATION]
53
- end
54
-
55
- def status_code_matches?
56
- if expected_status_code
57
- actual_status_code == expected_status_code
58
- else
59
- actual_status_code.to_s =~ /^30[1237]$/
60
- end
61
- end
62
-
63
- def location_matches?
64
- if expected_location
65
- expected_location == actual_location
66
- end
67
- end
68
- end
69
-
70
- def redirect_to(location)
71
- Matcher.new(location)
72
- end
73
-
74
- def be_redirect
75
- Matcher.new(nil).via(nil)
76
- end
77
- end
78
-
79
- RSpec.configure do |config|
80
- config.include RedirectTo
81
- end