rack-cors 1.0.2 → 1.0.6
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 +5 -5
- data/.travis.yml +5 -3
- data/{CHANGELOG → CHANGELOG.md} +21 -0
- data/Gemfile +1 -1
- data/README.md +15 -11
- data/lib/rack/cors/version.rb +1 -1
- data/lib/rack/cors.rb +22 -16
- data/rack-cors.gemspec +7 -6
- data/test/cors/test.cors.coffee +5 -0
- data/test/cors/test.cors.js +16 -8
- data/test/unit/cors_test.rb +51 -11
- data/test/unit/test.ru +2 -0
- metadata +45 -27
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 617a90d9047dfbbe55196b77139e176298c20011ae3378e0f83dda392cd295b9
|
|
4
|
+
data.tar.gz: 72285f6b83f9daf70d46924344f5f3fabcedf3f2e68357d4824930de4f925769
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c39a63b2f2b3046aa35d8c8a8d095ab9c8f5627bd1e78e07ca284b382ffd8cc5d02454ec1ab7ffaa158d70dba58ce9e6adeca51b86725c39fd265042e85832b9
|
|
7
|
+
data.tar.gz: 364a108b061a98c35d958a25ce9cabd88da14f1f7b212a50d437663fe8398a312f62924ac62bd82be8c70e9b952e431e905fa47661aa2cf299f6b0e5fcfaf422
|
data/.travis.yml
CHANGED
data/{CHANGELOG → CHANGELOG.md}
RENAMED
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
|
3
3
|
|
|
4
|
+
## 1.0.6 - 2019-11-14
|
|
5
|
+
### Changed
|
|
6
|
+
- Use Rack::Utils.escape to make compat with Rack 1.6.0
|
|
7
|
+
|
|
8
|
+
## 1.0.5 - 2019-11-14
|
|
9
|
+
### Changed
|
|
10
|
+
- Update Gem spec to require rack >= 1.6.0
|
|
11
|
+
|
|
12
|
+
## 1.0.4 - 2019-11-13
|
|
13
|
+
### Security
|
|
14
|
+
- Escape and resolve path before evaluating resource rules (thanks to Colby Morgan)
|
|
15
|
+
|
|
16
|
+
## 1.0.3 - 2019-03-24
|
|
17
|
+
### Changed
|
|
18
|
+
- Don't send 'Content-Type' header with pre-flight requests
|
|
19
|
+
- Allow ruby array for vary header config
|
|
20
|
+
|
|
21
|
+
## 1.0.2 - 2017-10-22
|
|
22
|
+
### Fixed
|
|
23
|
+
- Automatically allow simple headers when headers are set
|
|
24
|
+
|
|
4
25
|
## 1.0.1 - 2017-07-18
|
|
5
26
|
### Fixed
|
|
6
27
|
- Allow lambda origin configuration
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -13,7 +13,7 @@ Install the gem:
|
|
|
13
13
|
Or in your Gemfile:
|
|
14
14
|
|
|
15
15
|
```ruby
|
|
16
|
-
gem 'rack-cors'
|
|
16
|
+
gem 'rack-cors'
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
|
|
@@ -25,7 +25,6 @@ Put something like the code below in `config/application.rb` of your Rails appli
|
|
|
25
25
|
```ruby
|
|
26
26
|
module YourApp
|
|
27
27
|
class Application < Rails::Application
|
|
28
|
-
|
|
29
28
|
# ...
|
|
30
29
|
|
|
31
30
|
# Rails 5
|
|
@@ -33,7 +32,7 @@ module YourApp
|
|
|
33
32
|
config.middleware.insert_before 0, Rack::Cors do
|
|
34
33
|
allow do
|
|
35
34
|
origins '*'
|
|
36
|
-
resource '*', :
|
|
35
|
+
resource '*', headers: :any, methods: [:get, :post, :options]
|
|
37
36
|
end
|
|
38
37
|
end
|
|
39
38
|
|
|
@@ -42,15 +41,14 @@ module YourApp
|
|
|
42
41
|
config.middleware.insert_before 0, "Rack::Cors" do
|
|
43
42
|
allow do
|
|
44
43
|
origins '*'
|
|
45
|
-
resource '*', :
|
|
44
|
+
resource '*', headers: :any, methods: [:get, :post, :options]
|
|
46
45
|
end
|
|
47
46
|
end
|
|
48
|
-
|
|
49
47
|
end
|
|
50
48
|
end
|
|
51
49
|
```
|
|
52
50
|
|
|
53
|
-
We use `insert_before` to make sure `Rack::Cors` runs at the beginning of the stack to make sure it isn't interfered with
|
|
51
|
+
We use `insert_before` to make sure `Rack::Cors` runs at the beginning of the stack to make sure it isn't interfered with by other middleware (see `Rack::Cache` note in **Common Gotchas** section). Check out the [rails 4 example](https://github.com/cyu/rack-cors/tree/master/examples/rails4) and [rails 3 example](https://github.com/cyu/rack-cors/tree/master/examples/rails3).
|
|
54
52
|
|
|
55
53
|
See The [Rails Guide to Rack](http://guides.rubyonrails.org/rails_on_rack.html) for more details on rack middlewares or watch the [railscast](http://railscasts.com/episodes/151-rack-middleware).
|
|
56
54
|
|
|
@@ -69,16 +67,22 @@ use Rack::Cors do
|
|
|
69
67
|
|
|
70
68
|
resource '/file/list_all/', :headers => 'x-domain-token'
|
|
71
69
|
resource '/file/at/*',
|
|
72
|
-
:
|
|
73
|
-
:
|
|
74
|
-
:
|
|
75
|
-
:
|
|
70
|
+
methods: [:get, :post, :delete, :put, :patch, :options, :head],
|
|
71
|
+
headers: 'x-domain-token',
|
|
72
|
+
expose: ['Some-Custom-Response-Header'],
|
|
73
|
+
max_age: 600
|
|
76
74
|
# headers to expose
|
|
77
75
|
end
|
|
78
76
|
|
|
79
77
|
allow do
|
|
80
78
|
origins '*'
|
|
81
|
-
resource '/public/*', :
|
|
79
|
+
resource '/public/*', headers: :any, methods: :get
|
|
80
|
+
|
|
81
|
+
# Only allow a request for a specific host
|
|
82
|
+
resource '/api/v1/*',
|
|
83
|
+
headers: :any,
|
|
84
|
+
methods: :get,
|
|
85
|
+
if: proc { |env| env['HTTP_HOST'] == 'api.example.com' }
|
|
82
86
|
end
|
|
83
87
|
end
|
|
84
88
|
```
|
data/lib/rack/cors/version.rb
CHANGED
data/lib/rack/cors.rb
CHANGED
|
@@ -16,10 +16,8 @@ module Rack
|
|
|
16
16
|
# retaining the old key for backwards compatibility
|
|
17
17
|
ENV_KEY = 'rack.cors'.freeze
|
|
18
18
|
|
|
19
|
-
OPTIONS
|
|
20
|
-
VARY
|
|
21
|
-
CONTENT_TYPE = 'Content-Type'.freeze
|
|
22
|
-
TEXT_PLAIN = 'text/plain'.freeze
|
|
19
|
+
OPTIONS = 'OPTIONS'.freeze
|
|
20
|
+
VARY = 'Vary'.freeze
|
|
23
21
|
|
|
24
22
|
DEFAULT_VARY_HEADERS = ['Origin'].freeze
|
|
25
23
|
|
|
@@ -66,24 +64,27 @@ module Rack
|
|
|
66
64
|
def call(env)
|
|
67
65
|
env[HTTP_ORIGIN] ||= env[HTTP_X_ORIGIN] if env[HTTP_X_ORIGIN]
|
|
68
66
|
|
|
67
|
+
path = evaluate_path(env)
|
|
68
|
+
|
|
69
69
|
add_headers = nil
|
|
70
70
|
if env[HTTP_ORIGIN]
|
|
71
71
|
debug(env) do
|
|
72
72
|
[ 'Incoming Headers:',
|
|
73
73
|
" Origin: #{env[HTTP_ORIGIN]}",
|
|
74
|
+
" Path-Info: #{path}",
|
|
74
75
|
" Access-Control-Request-Method: #{env[HTTP_ACCESS_CONTROL_REQUEST_METHOD]}",
|
|
75
76
|
" Access-Control-Request-Headers: #{env[HTTP_ACCESS_CONTROL_REQUEST_HEADERS]}"
|
|
76
77
|
].join("\n")
|
|
77
78
|
end
|
|
78
79
|
if env[REQUEST_METHOD] == OPTIONS and env[HTTP_ACCESS_CONTROL_REQUEST_METHOD]
|
|
79
|
-
headers = process_preflight(env)
|
|
80
|
+
headers = process_preflight(env, path)
|
|
80
81
|
debug(env) do
|
|
81
82
|
"Preflight Headers:\n" +
|
|
82
83
|
headers.collect{|kv| " #{kv.join(': ')}"}.join("\n")
|
|
83
84
|
end
|
|
84
85
|
return [200, headers, []]
|
|
85
86
|
else
|
|
86
|
-
add_headers = process_cors(env)
|
|
87
|
+
add_headers = process_cors(env, path)
|
|
87
88
|
end
|
|
88
89
|
else
|
|
89
90
|
Result.miss(env, Result::MISS_NO_ORIGIN)
|
|
@@ -92,7 +93,7 @@ module Rack
|
|
|
92
93
|
# This call must be done BEFORE calling the app because for some reason
|
|
93
94
|
# env[PATH_INFO] gets changed after that and it won't match. (At least
|
|
94
95
|
# in rails 4.1.6)
|
|
95
|
-
vary_resource = resource_for_path(
|
|
96
|
+
vary_resource = resource_for_path(path)
|
|
96
97
|
|
|
97
98
|
status, headers, body = @app.call env
|
|
98
99
|
|
|
@@ -117,7 +118,7 @@ module Rack
|
|
|
117
118
|
else
|
|
118
119
|
DEFAULT_VARY_HEADERS
|
|
119
120
|
end
|
|
120
|
-
headers[VARY] = ((vary ? vary.split(/,\s*/) : []) + cors_vary_headers).uniq.join(', ')
|
|
121
|
+
headers[VARY] = ((vary ? ([vary].flatten.map { |v| v.split(/,\s*/) }.flatten) : []) + cors_vary_headers).uniq.join(', ')
|
|
121
122
|
end
|
|
122
123
|
|
|
123
124
|
if debug? && result = env[RACK_CORS]
|
|
@@ -149,14 +150,20 @@ module Rack
|
|
|
149
150
|
end
|
|
150
151
|
end
|
|
151
152
|
|
|
153
|
+
def evaluate_path(env)
|
|
154
|
+
path = env[PATH_INFO]
|
|
155
|
+
path = Rack::Utils.clean_path_info(Rack::Utils.unescape(path)) if path
|
|
156
|
+
path
|
|
157
|
+
end
|
|
158
|
+
|
|
152
159
|
def all_resources
|
|
153
160
|
@all_resources ||= []
|
|
154
161
|
end
|
|
155
162
|
|
|
156
|
-
def process_preflight(env)
|
|
163
|
+
def process_preflight(env, path)
|
|
157
164
|
result = Result.preflight(env)
|
|
158
165
|
|
|
159
|
-
resource, error = match_resource(env)
|
|
166
|
+
resource, error = match_resource(path, env)
|
|
160
167
|
unless resource
|
|
161
168
|
result.miss(error)
|
|
162
169
|
return {}
|
|
@@ -165,8 +172,8 @@ module Rack
|
|
|
165
172
|
return resource.process_preflight(env, result)
|
|
166
173
|
end
|
|
167
174
|
|
|
168
|
-
def process_cors(env)
|
|
169
|
-
resource, error = match_resource(env)
|
|
175
|
+
def process_cors(env, path)
|
|
176
|
+
resource, error = match_resource(path, env)
|
|
170
177
|
if resource
|
|
171
178
|
Result.hit(env)
|
|
172
179
|
cors = resource.to_headers(env)
|
|
@@ -187,8 +194,7 @@ module Rack
|
|
|
187
194
|
nil
|
|
188
195
|
end
|
|
189
196
|
|
|
190
|
-
def match_resource(env)
|
|
191
|
-
path = env[PATH_INFO]
|
|
197
|
+
def match_resource(path, env)
|
|
192
198
|
origin = env[HTTP_ORIGIN]
|
|
193
199
|
|
|
194
200
|
origin_matched = false
|
|
@@ -332,7 +338,7 @@ module Rack
|
|
|
332
338
|
|
|
333
339
|
self.path = path
|
|
334
340
|
self.credentials = public_resource ? false : (opts[:credentials] == true)
|
|
335
|
-
self.max_age = opts[:max_age] ||
|
|
341
|
+
self.max_age = opts[:max_age] || 7200
|
|
336
342
|
self.pattern = compile(path)
|
|
337
343
|
self.if_proc = opts[:if]
|
|
338
344
|
self.vary_headers = opts[:vary] && [opts[:vary]].flatten
|
|
@@ -363,7 +369,7 @@ module Rack
|
|
|
363
369
|
end
|
|
364
370
|
|
|
365
371
|
def process_preflight(env, result)
|
|
366
|
-
headers = {
|
|
372
|
+
headers = {}
|
|
367
373
|
|
|
368
374
|
request_method = env[HTTP_ACCESS_CONTROL_REQUEST_METHOD]
|
|
369
375
|
if request_method.nil?
|
data/rack-cors.gemspec
CHANGED
|
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
|
8
8
|
spec.version = Rack::Cors::VERSION
|
|
9
9
|
spec.authors = ["Calvin Yu"]
|
|
10
10
|
spec.email = ["me@sourcebender.com"]
|
|
11
|
-
spec.description = %q{Middleware that will make Rack-based apps CORS compatible.
|
|
11
|
+
spec.description = %q{Middleware that will make Rack-based apps CORS compatible. Fork the project here: https://github.com/cyu/rack-cors}
|
|
12
12
|
spec.summary = %q{Middleware for enabling Cross-Origin Resource Sharing in Rack apps}
|
|
13
13
|
spec.homepage = "https://github.com/cyu/rack-cors"
|
|
14
14
|
spec.license = "MIT"
|
|
@@ -18,9 +18,10 @@ Gem::Specification.new do |spec|
|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
19
|
spec.require_paths = ["lib"]
|
|
20
20
|
|
|
21
|
-
spec.
|
|
22
|
-
spec.add_development_dependency "
|
|
23
|
-
spec.add_development_dependency "
|
|
24
|
-
spec.add_development_dependency "
|
|
25
|
-
spec.add_development_dependency "
|
|
21
|
+
spec.add_dependency "rack", ">= 1.6.0"
|
|
22
|
+
spec.add_development_dependency "bundler", ">= 1.16.0", '< 3'
|
|
23
|
+
spec.add_development_dependency "rake", "~> 12.3.0"
|
|
24
|
+
spec.add_development_dependency "minitest", "~> 5.11.0"
|
|
25
|
+
spec.add_development_dependency "mocha", "~> 1.6.0"
|
|
26
|
+
spec.add_development_dependency "rack-test", "~> 1.1.0"
|
|
26
27
|
end
|
data/test/cors/test.cors.coffee
CHANGED
|
@@ -12,6 +12,11 @@ describe 'CORS', ->
|
|
|
12
12
|
expect(data).to.eql('Hello world')
|
|
13
13
|
done()
|
|
14
14
|
|
|
15
|
+
it 'should allow PATCH access to dynamic resource', (done) ->
|
|
16
|
+
$.ajax("http://#{CORS_SERVER}/", type: 'PATCH').done (data, textStatus, jqXHR) ->
|
|
17
|
+
expect(data).to.eql('Hello world')
|
|
18
|
+
done()
|
|
19
|
+
|
|
15
20
|
it 'should allow HEAD access to dynamic resource', (done) ->
|
|
16
21
|
$.ajax("http://#{CORS_SERVER}/", type: 'HEAD').done (data, textStatus, jqXHR) ->
|
|
17
22
|
expect(jqXHR.status).to.eql(200)
|
data/test/cors/test.cors.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Generated by CoffeeScript
|
|
1
|
+
// Generated by CoffeeScript 2.3.1
|
|
2
2
|
(function() {
|
|
3
3
|
var CORS_SERVER;
|
|
4
4
|
|
|
@@ -6,21 +6,29 @@
|
|
|
6
6
|
|
|
7
7
|
describe('CORS', function() {
|
|
8
8
|
it('should allow access to dynamic resource', function(done) {
|
|
9
|
-
return $.get(
|
|
9
|
+
return $.get(`http://${CORS_SERVER}/`, function(data, status, xhr) {
|
|
10
10
|
expect(data).to.eql('Hello world');
|
|
11
11
|
return done();
|
|
12
12
|
});
|
|
13
13
|
});
|
|
14
14
|
it('should allow PUT access to dynamic resource', function(done) {
|
|
15
|
-
return $.ajax(
|
|
15
|
+
return $.ajax(`http://${CORS_SERVER}/`, {
|
|
16
16
|
type: 'PUT'
|
|
17
17
|
}).done(function(data, textStatus, jqXHR) {
|
|
18
18
|
expect(data).to.eql('Hello world');
|
|
19
19
|
return done();
|
|
20
20
|
});
|
|
21
21
|
});
|
|
22
|
+
it('should allow PATCH access to dynamic resource', function(done) {
|
|
23
|
+
return $.ajax(`http://${CORS_SERVER}/`, {
|
|
24
|
+
type: 'PATCH'
|
|
25
|
+
}).done(function(data, textStatus, jqXHR) {
|
|
26
|
+
expect(data).to.eql('Hello world');
|
|
27
|
+
return done();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
22
30
|
it('should allow HEAD access to dynamic resource', function(done) {
|
|
23
|
-
return $.ajax(
|
|
31
|
+
return $.ajax(`http://${CORS_SERVER}/`, {
|
|
24
32
|
type: 'HEAD'
|
|
25
33
|
}).done(function(data, textStatus, jqXHR) {
|
|
26
34
|
expect(jqXHR.status).to.eql(200);
|
|
@@ -28,7 +36,7 @@
|
|
|
28
36
|
});
|
|
29
37
|
});
|
|
30
38
|
it('should allow DELETE access to dynamic resource', function(done) {
|
|
31
|
-
return $.ajax(
|
|
39
|
+
return $.ajax(`http://${CORS_SERVER}/`, {
|
|
32
40
|
type: 'DELETE'
|
|
33
41
|
}).done(function(data, textStatus, jqXHR) {
|
|
34
42
|
expect(data).to.eql('Hello world');
|
|
@@ -36,7 +44,7 @@
|
|
|
36
44
|
});
|
|
37
45
|
});
|
|
38
46
|
it('should allow OPTIONS access to dynamic resource', function(done) {
|
|
39
|
-
return $.ajax(
|
|
47
|
+
return $.ajax(`http://${CORS_SERVER}/`, {
|
|
40
48
|
type: 'OPTIONS'
|
|
41
49
|
}).done(function(data, textStatus, jqXHR) {
|
|
42
50
|
expect(jqXHR.status).to.eql(200);
|
|
@@ -44,7 +52,7 @@
|
|
|
44
52
|
});
|
|
45
53
|
});
|
|
46
54
|
it('should allow access to static resource', function(done) {
|
|
47
|
-
return $.get(
|
|
55
|
+
return $.get(`http://${CORS_SERVER}/static.txt`, function(data, status, xhr) {
|
|
48
56
|
expect($.trim(data)).to.eql("hello world");
|
|
49
57
|
return done();
|
|
50
58
|
});
|
|
@@ -52,7 +60,7 @@
|
|
|
52
60
|
return it('should allow post resource', function(done) {
|
|
53
61
|
return $.ajax({
|
|
54
62
|
type: 'POST',
|
|
55
|
-
url:
|
|
63
|
+
url: `http://${CORS_SERVER}/cors`,
|
|
56
64
|
beforeSend: function(xhr) {
|
|
57
65
|
return xhr.setRequestHeader('X-Requested-With', 'XMLHTTPRequest');
|
|
58
66
|
},
|
data/test/unit/cors_test.rb
CHANGED
|
@@ -19,11 +19,11 @@ end
|
|
|
19
19
|
|
|
20
20
|
module MiniTest::Assertions
|
|
21
21
|
def assert_cors_success(response)
|
|
22
|
-
|
|
22
|
+
assert !response.headers['Access-Control-Allow-Origin'].nil?, "Expected a successful CORS response"
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def assert_not_cors_success(response)
|
|
26
|
-
|
|
26
|
+
assert response.headers['Access-Control-Allow-Origin'].nil?, "Expected a failed CORS response"
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
@@ -40,6 +40,18 @@ class CaptureResult
|
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
+
class FakeProxy
|
|
44
|
+
def initialize(app, options = {})
|
|
45
|
+
@app = app
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def call(env)
|
|
49
|
+
status, headers, body = @app.call(env)
|
|
50
|
+
headers['Vary'] = %w(Origin User-Agent)
|
|
51
|
+
[status, headers, body]
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
43
55
|
Rack::MockResponse.infect_an_assertion :assert_cors_success, :must_render_cors_success, :only_one_argument
|
|
44
56
|
Rack::MockResponse.infect_an_assertion :assert_not_cors_success, :wont_render_cors_success, :only_one_argument
|
|
45
57
|
|
|
@@ -48,11 +60,12 @@ describe Rack::Cors do
|
|
|
48
60
|
|
|
49
61
|
attr_accessor :cors_result
|
|
50
62
|
|
|
51
|
-
def load_app(name)
|
|
63
|
+
def load_app(name, options = {})
|
|
52
64
|
test = self
|
|
53
65
|
Rack::Builder.new do
|
|
54
66
|
use CaptureResult, :holder => test
|
|
55
67
|
eval File.read(File.dirname(__FILE__) + "/#{name}.ru")
|
|
68
|
+
use FakeProxy if options[:proxy]
|
|
56
69
|
map('/') do
|
|
57
70
|
run proc { |env|
|
|
58
71
|
[200, {'Content-Type' => 'text/html'}, ['success']]
|
|
@@ -133,6 +146,21 @@ describe Rack::Cors do
|
|
|
133
146
|
last_response.headers['Vary'].must_equal 'Origin, Host'
|
|
134
147
|
end
|
|
135
148
|
|
|
149
|
+
it "decode URL and resolve paths before resource matching" do
|
|
150
|
+
header 'Origin', 'http://localhost:3000'
|
|
151
|
+
get '/public/a/..%2F..%2Fprivate/stuff'
|
|
152
|
+
last_response.wont_render_cors_success
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
describe 'with array of upstream Vary headers' do
|
|
156
|
+
let(:app) { load_app('test', { proxy: true }) }
|
|
157
|
+
|
|
158
|
+
it 'should add to them' do
|
|
159
|
+
successful_cors_request '/vary_test'
|
|
160
|
+
last_response.headers['Vary'].must_equal 'Origin, User-Agent, Host'
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
136
164
|
it 'should add Vary header if Access-Control-Allow-Origin header was added and if it is specific' do
|
|
137
165
|
successful_cors_request '/', :origin => "http://192.168.0.3:8080"
|
|
138
166
|
last_response.headers['Access-Control-Allow-Origin'].must_equal 'http://192.168.0.3:8080'
|
|
@@ -244,6 +272,19 @@ describe Rack::Cors do
|
|
|
244
272
|
cors.call({'HTTP_ORIGIN' => 'test.com'})
|
|
245
273
|
end
|
|
246
274
|
end
|
|
275
|
+
|
|
276
|
+
it 'should use Logger if none is set' do
|
|
277
|
+
app = mock
|
|
278
|
+
app.stubs(:call).returns([200, {}, ['']])
|
|
279
|
+
|
|
280
|
+
logger = mock
|
|
281
|
+
Logger.expects(:new).returns(logger)
|
|
282
|
+
logger.expects(:tap).returns(logger)
|
|
283
|
+
logger.expects(:debug)
|
|
284
|
+
|
|
285
|
+
cors = Rack::Cors.new(app, :debug => true) {}
|
|
286
|
+
cors.call({'HTTP_ORIGIN' => 'test.com'})
|
|
287
|
+
end
|
|
247
288
|
end
|
|
248
289
|
|
|
249
290
|
describe 'preflight requests' do
|
|
@@ -280,6 +321,11 @@ describe Rack::Cors do
|
|
|
280
321
|
last_response.must_render_cors_success
|
|
281
322
|
end
|
|
282
323
|
|
|
324
|
+
it 'allows PATCH method' do
|
|
325
|
+
preflight_request('http://localhost:3000', '/', :methods => [ :patch ])
|
|
326
|
+
last_response.must_render_cors_success
|
|
327
|
+
end
|
|
328
|
+
|
|
283
329
|
it 'should allow header case insensitive match' do
|
|
284
330
|
preflight_request('http://localhost:3000', '/single_header', :headers => 'X-Domain-Token')
|
|
285
331
|
last_response.must_render_cors_success
|
|
@@ -313,12 +359,6 @@ describe Rack::Cors do
|
|
|
313
359
|
last_response.headers['Access-Control-Allow-Origin'].must_equal 'file://'
|
|
314
360
|
end
|
|
315
361
|
|
|
316
|
-
it 'should return a Content-Type' do
|
|
317
|
-
preflight_request('http://localhost:3000', '/')
|
|
318
|
-
last_response.must_render_cors_success
|
|
319
|
-
last_response.headers['Content-Type'].wont_be_nil
|
|
320
|
-
end
|
|
321
|
-
|
|
322
362
|
describe '' do
|
|
323
363
|
|
|
324
364
|
let(:app) do
|
|
@@ -332,7 +372,7 @@ describe Rack::Cors do
|
|
|
332
372
|
end
|
|
333
373
|
end
|
|
334
374
|
map('/') do
|
|
335
|
-
run ->(env) { [500, {
|
|
375
|
+
run ->(env) { [500, {}, ['FAIL!']] }
|
|
336
376
|
end
|
|
337
377
|
end
|
|
338
378
|
end
|
|
@@ -389,7 +429,7 @@ describe Rack::Cors do
|
|
|
389
429
|
end
|
|
390
430
|
end
|
|
391
431
|
map('/') do
|
|
392
|
-
run ->(env) { [200, {'
|
|
432
|
+
run ->(env) { [200, {'Access-Control-Allow-Origin' => 'http://foo.net'}, ['success']] }
|
|
393
433
|
end
|
|
394
434
|
end
|
|
395
435
|
end
|
data/test/unit/test.ru
CHANGED
|
@@ -19,6 +19,7 @@ use Rack::Cors do
|
|
|
19
19
|
resource '/expose_multiple_headers', :expose => %w{expose-test-1 expose-test-2}
|
|
20
20
|
resource '/conditional', :methods => :get, :if => proc { |env| !!env['HTTP_X_OK'] }
|
|
21
21
|
resource '/vary_test', :methods => :get, :vary => %w{ Origin Host }
|
|
22
|
+
resource '/patch_test', :methods => :patch
|
|
22
23
|
# resource '/file/at/*',
|
|
23
24
|
# :methods => [:get, :post, :put, :delete],
|
|
24
25
|
# :headers => :any,
|
|
@@ -40,6 +41,7 @@ use Rack::Cors do
|
|
|
40
41
|
allow do
|
|
41
42
|
origins '*'
|
|
42
43
|
resource '/public'
|
|
44
|
+
resource '/public/*'
|
|
43
45
|
resource '/public_without_credentials', :credentials => false
|
|
44
46
|
end
|
|
45
47
|
|
metadata
CHANGED
|
@@ -1,87 +1,106 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rack-cors
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Calvin Yu
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2019-11-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rack
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 1.6.0
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 1.6.0
|
|
13
27
|
- !ruby/object:Gem::Dependency
|
|
14
28
|
name: bundler
|
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
|
16
30
|
requirements:
|
|
17
|
-
- - "
|
|
31
|
+
- - ">="
|
|
18
32
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
33
|
+
version: 1.16.0
|
|
34
|
+
- - "<"
|
|
35
|
+
- !ruby/object:Gem::Version
|
|
36
|
+
version: '3'
|
|
20
37
|
type: :development
|
|
21
38
|
prerelease: false
|
|
22
39
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
40
|
requirements:
|
|
24
|
-
- - "
|
|
41
|
+
- - ">="
|
|
42
|
+
- !ruby/object:Gem::Version
|
|
43
|
+
version: 1.16.0
|
|
44
|
+
- - "<"
|
|
25
45
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
46
|
+
version: '3'
|
|
27
47
|
- !ruby/object:Gem::Dependency
|
|
28
48
|
name: rake
|
|
29
49
|
requirement: !ruby/object:Gem::Requirement
|
|
30
50
|
requirements:
|
|
31
|
-
- - "
|
|
51
|
+
- - "~>"
|
|
32
52
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
53
|
+
version: 12.3.0
|
|
34
54
|
type: :development
|
|
35
55
|
prerelease: false
|
|
36
56
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
57
|
requirements:
|
|
38
|
-
- - "
|
|
58
|
+
- - "~>"
|
|
39
59
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
60
|
+
version: 12.3.0
|
|
41
61
|
- !ruby/object:Gem::Dependency
|
|
42
62
|
name: minitest
|
|
43
63
|
requirement: !ruby/object:Gem::Requirement
|
|
44
64
|
requirements:
|
|
45
|
-
- - "
|
|
65
|
+
- - "~>"
|
|
46
66
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: 5.
|
|
67
|
+
version: 5.11.0
|
|
48
68
|
type: :development
|
|
49
69
|
prerelease: false
|
|
50
70
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
71
|
requirements:
|
|
52
|
-
- - "
|
|
72
|
+
- - "~>"
|
|
53
73
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 5.
|
|
74
|
+
version: 5.11.0
|
|
55
75
|
- !ruby/object:Gem::Dependency
|
|
56
76
|
name: mocha
|
|
57
77
|
requirement: !ruby/object:Gem::Requirement
|
|
58
78
|
requirements:
|
|
59
|
-
- - "
|
|
79
|
+
- - "~>"
|
|
60
80
|
- !ruby/object:Gem::Version
|
|
61
|
-
version:
|
|
81
|
+
version: 1.6.0
|
|
62
82
|
type: :development
|
|
63
83
|
prerelease: false
|
|
64
84
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
85
|
requirements:
|
|
66
|
-
- - "
|
|
86
|
+
- - "~>"
|
|
67
87
|
- !ruby/object:Gem::Version
|
|
68
|
-
version:
|
|
88
|
+
version: 1.6.0
|
|
69
89
|
- !ruby/object:Gem::Dependency
|
|
70
90
|
name: rack-test
|
|
71
91
|
requirement: !ruby/object:Gem::Requirement
|
|
72
92
|
requirements:
|
|
73
|
-
- - "
|
|
93
|
+
- - "~>"
|
|
74
94
|
- !ruby/object:Gem::Version
|
|
75
|
-
version:
|
|
95
|
+
version: 1.1.0
|
|
76
96
|
type: :development
|
|
77
97
|
prerelease: false
|
|
78
98
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
99
|
requirements:
|
|
80
|
-
- - "
|
|
100
|
+
- - "~>"
|
|
81
101
|
- !ruby/object:Gem::Version
|
|
82
|
-
version:
|
|
83
|
-
description: 'Middleware that will make Rack-based apps CORS compatible.
|
|
84
|
-
here: http://blog.sourcebender.com/2010/06/09/introducin-rack-cors.html. Fork the
|
|
102
|
+
version: 1.1.0
|
|
103
|
+
description: 'Middleware that will make Rack-based apps CORS compatible. Fork the
|
|
85
104
|
project here: https://github.com/cyu/rack-cors'
|
|
86
105
|
email:
|
|
87
106
|
- me@sourcebender.com
|
|
@@ -90,7 +109,7 @@ extensions: []
|
|
|
90
109
|
extra_rdoc_files: []
|
|
91
110
|
files:
|
|
92
111
|
- ".travis.yml"
|
|
93
|
-
- CHANGELOG
|
|
112
|
+
- CHANGELOG.md
|
|
94
113
|
- Gemfile
|
|
95
114
|
- LICENSE.txt
|
|
96
115
|
- README.md
|
|
@@ -128,8 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
128
147
|
- !ruby/object:Gem::Version
|
|
129
148
|
version: '0'
|
|
130
149
|
requirements: []
|
|
131
|
-
|
|
132
|
-
rubygems_version: 2.5.2
|
|
150
|
+
rubygems_version: 3.0.6
|
|
133
151
|
signing_key:
|
|
134
152
|
specification_version: 4
|
|
135
153
|
summary: Middleware for enabling Cross-Origin Resource Sharing in Rack apps
|