committee 1.5.0 → 1.5.1
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 +4 -4
- data/lib/committee/middleware/request_validation.rb +8 -6
- data/lib/committee/middleware/response_validation.rb +1 -1
- data/lib/committee/request_unpacker.rb +10 -3
- data/lib/committee/response_validator.rb +4 -2
- data/lib/committee/test/methods.rb +1 -1
- data/test/request_unpacker_test.rb +21 -0
- data/test/request_validator_test.rb +13 -1
- data/test/response_validator_test.rb +9 -3
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b5866c6d0e099206a30958c836ad4b49473f68cd
|
|
4
|
+
data.tar.gz: d05049dcb5e2970c4451ce7e163790fb8199e95e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0c4c4c60032ef9e6b7874e9078f6be8a6d3aee3d32949591abf7b4569057cbd4498c55b1d8d4a10ccd9d0970e7c422dc26933b171bb4efb5a72a9635b90a0247
|
|
7
|
+
data.tar.gz: 20acabc46e24f3eb85dc8b3dcce37794988a0dd559a534c46b2be17bb8861051f1927914df7f6b28bb4271b813a7228f69c03d9051baa0ae724e307d8dce697a
|
|
@@ -2,10 +2,11 @@ module Committee::Middleware
|
|
|
2
2
|
class RequestValidation < Base
|
|
3
3
|
def initialize(app, options={})
|
|
4
4
|
super
|
|
5
|
-
@allow_form_params
|
|
6
|
-
@
|
|
7
|
-
@
|
|
8
|
-
@
|
|
5
|
+
@allow_form_params = options.fetch(:allow_form_params, true)
|
|
6
|
+
@allow_query_params = options.fetch(:allow_query_params, true)
|
|
7
|
+
@optimistic_json = options.fetch(:optimistic_json, false)
|
|
8
|
+
@raise = options[:raise]
|
|
9
|
+
@strict = options[:strict]
|
|
9
10
|
|
|
10
11
|
# deprecated
|
|
11
12
|
@allow_extra = options[:allow_extra]
|
|
@@ -14,8 +15,9 @@ module Committee::Middleware
|
|
|
14
15
|
def handle(request)
|
|
15
16
|
request.env[@params_key] = Committee::RequestUnpacker.new(
|
|
16
17
|
request,
|
|
17
|
-
allow_form_params:
|
|
18
|
-
|
|
18
|
+
allow_form_params: @allow_form_params,
|
|
19
|
+
allow_query_params: @allow_query_params,
|
|
20
|
+
optimistic_json: @optimistic_json
|
|
19
21
|
).call
|
|
20
22
|
|
|
21
23
|
if link = @router.find_request_link(request)
|
|
@@ -15,7 +15,7 @@ module Committee::Middleware
|
|
|
15
15
|
full_body << chunk
|
|
16
16
|
end
|
|
17
17
|
data = MultiJson.decode(full_body)
|
|
18
|
-
Committee::ResponseValidator.new(link).call(headers, data)
|
|
18
|
+
Committee::ResponseValidator.new(link).call(status, headers, data)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
[status, headers, response]
|
|
@@ -3,8 +3,9 @@ module Committee
|
|
|
3
3
|
def initialize(request, options={})
|
|
4
4
|
@request = request
|
|
5
5
|
|
|
6
|
-
@allow_form_params
|
|
7
|
-
@
|
|
6
|
+
@allow_form_params = options[:allow_form_params]
|
|
7
|
+
@allow_query_params = options[:allow_query_params]
|
|
8
|
+
@optimistic_json = options[:optimistic_json]
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
def call
|
|
@@ -16,7 +17,7 @@ module Committee
|
|
|
16
17
|
parse_json rescue MultiJson::LoadError nil
|
|
17
18
|
end
|
|
18
19
|
|
|
19
|
-
if params
|
|
20
|
+
params = if params
|
|
20
21
|
params
|
|
21
22
|
elsif @allow_form_params && @request.content_type == "application/x-www-form-urlencoded"
|
|
22
23
|
# Actually, POST means anything in the request body, could be from
|
|
@@ -25,6 +26,12 @@ module Committee
|
|
|
25
26
|
else
|
|
26
27
|
{}
|
|
27
28
|
end
|
|
29
|
+
|
|
30
|
+
if @allow_query_params
|
|
31
|
+
indifferent_params(@request.GET).merge(params)
|
|
32
|
+
else
|
|
33
|
+
params
|
|
34
|
+
end
|
|
28
35
|
end
|
|
29
36
|
|
|
30
37
|
private
|
|
@@ -9,8 +9,10 @@ module Committee
|
|
|
9
9
|
@validator = JsonSchema::Validator.new(schema)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def call(headers, data)
|
|
13
|
-
|
|
12
|
+
def call(status, headers, data)
|
|
13
|
+
unless status == 204 # 204 No Content
|
|
14
|
+
check_content_type!(headers)
|
|
15
|
+
end
|
|
14
16
|
|
|
15
17
|
if @link.rel == "instances" && !@link.target_schema
|
|
16
18
|
if !data.is_a?(Array)
|
|
@@ -19,7 +19,7 @@ module Committee::Test
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
data = MultiJson.decode(last_response.body)
|
|
22
|
-
Committee::ResponseValidator.new(link).call(last_response.headers, data)
|
|
22
|
+
Committee::ResponseValidator.new(link).call(last_response.status, last_response.headers, data)
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def assert_schema_content_type
|
|
@@ -72,6 +72,27 @@ describe Committee::RequestUnpacker do
|
|
|
72
72
|
assert_equal({ "x" => "y" }, params)
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
+
it "unpacks form & query params with allow_form_params and allow_query_params" do
|
|
76
|
+
env = {
|
|
77
|
+
"CONTENT_TYPE" => "application/x-www-form-urlencoded",
|
|
78
|
+
"rack.input" => StringIO.new("x=y"),
|
|
79
|
+
"QUERY_STRING" => "a=b"
|
|
80
|
+
}
|
|
81
|
+
request = Rack::Request.new(env)
|
|
82
|
+
params = Committee::RequestUnpacker.new(request, allow_form_params: true, allow_query_params: true).call
|
|
83
|
+
assert_equal({ "x" => "y", "a" => "b" }, params)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "unpacks query params with allow_query_params" do
|
|
87
|
+
env = {
|
|
88
|
+
"rack.input" => StringIO.new(""),
|
|
89
|
+
"QUERY_STRING" => "a=b"
|
|
90
|
+
}
|
|
91
|
+
request = Rack::Request.new(env)
|
|
92
|
+
params = Committee::RequestUnpacker.new(request, allow_query_params: true).call
|
|
93
|
+
assert_equal({ "a" => "b" }, params)
|
|
94
|
+
end
|
|
95
|
+
|
|
75
96
|
it "errors if JSON is not an object" do
|
|
76
97
|
env = {
|
|
77
98
|
"CONTENT_TYPE" => "application/json",
|
|
@@ -37,6 +37,18 @@ describe Committee::RequestValidator do
|
|
|
37
37
|
assert_equal message, e.message
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
+
it "detects an missing parameter in GET requests" do
|
|
41
|
+
# GET /apps/search?query=...
|
|
42
|
+
@link = @link = @schema.properties["app"].links[5]
|
|
43
|
+
@request = Rack::Request.new({})
|
|
44
|
+
e = assert_raises(Committee::InvalidRequest) do
|
|
45
|
+
call({})
|
|
46
|
+
end
|
|
47
|
+
message =
|
|
48
|
+
%{Invalid request.\n\n#: failed schema #/definitions/app/links/5/schema: "query" wasn't supplied.}
|
|
49
|
+
assert_equal message, e.message
|
|
50
|
+
end
|
|
51
|
+
|
|
40
52
|
it "allows an invalid Content-Type with an empty body" do
|
|
41
53
|
@request =
|
|
42
54
|
Rack::Request.new({
|
|
@@ -53,7 +65,7 @@ describe Committee::RequestValidator do
|
|
|
53
65
|
e = assert_raises(Committee::InvalidRequest) do
|
|
54
66
|
call(data)
|
|
55
67
|
end
|
|
56
|
-
message = %{Invalid request.\n\n#/name: failed schema #/definitions/app/links/0/schema/properties/name:
|
|
68
|
+
message = %{Invalid request.\n\n#/name: failed schema #/definitions/app/links/0/schema/properties/name: %@! does not match /^[a-z][a-z0-9-]{3,30}$/.}
|
|
57
69
|
assert_equal message, e.message
|
|
58
70
|
end
|
|
59
71
|
|
|
@@ -2,10 +2,11 @@ require_relative "test_helper"
|
|
|
2
2
|
|
|
3
3
|
describe Committee::ResponseValidator do
|
|
4
4
|
before do
|
|
5
|
-
@
|
|
5
|
+
@status = 200
|
|
6
6
|
@headers = {
|
|
7
7
|
"Content-Type" => "application/json"
|
|
8
8
|
}
|
|
9
|
+
@data = ValidApp.dup
|
|
9
10
|
@schema =
|
|
10
11
|
JsonSchema.parse!(MultiJson.decode(File.read("./test/data/schema.json")))
|
|
11
12
|
@schema.expand_references!
|
|
@@ -42,6 +43,11 @@ describe Committee::ResponseValidator do
|
|
|
42
43
|
assert_equal message, e.message
|
|
43
44
|
end
|
|
44
45
|
|
|
46
|
+
it "allows no Content-Type for 204 No Content" do
|
|
47
|
+
@status, @headers = 204, {}
|
|
48
|
+
call
|
|
49
|
+
end
|
|
50
|
+
|
|
45
51
|
it "allows application/schema+json in responses as well" do
|
|
46
52
|
@headers = { "Content-Type" => "application/schema+json" }
|
|
47
53
|
call
|
|
@@ -50,13 +56,13 @@ describe Committee::ResponseValidator do
|
|
|
50
56
|
it "raises errors generated by json_schema" do
|
|
51
57
|
@data.merge!("name" => "%@!")
|
|
52
58
|
e = assert_raises(Committee::InvalidResponse) { call }
|
|
53
|
-
message = %{Invalid response.\n\n#/name: failed schema #/definitions/app/properties/name:
|
|
59
|
+
message = %{Invalid response.\n\n#/name: failed schema #/definitions/app/properties/name: %@! does not match /^[a-z][a-z0-9-]{3,30}$/.}
|
|
54
60
|
assert_equal message, e.message
|
|
55
61
|
end
|
|
56
62
|
|
|
57
63
|
private
|
|
58
64
|
|
|
59
65
|
def call
|
|
60
|
-
Committee::ResponseValidator.new(@link).call(@headers, @data)
|
|
66
|
+
Committee::ResponseValidator.new(@link).call(@status, @headers, @data)
|
|
61
67
|
end
|
|
62
68
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: committee
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.5.
|
|
4
|
+
version: 1.5.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Brandur
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2014-
|
|
12
|
+
date: 2014-10-08 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: json_schema
|