request_handler 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/request_handler/base.rb +16 -1
- data/lib/request_handler/builder/headers_builder.rb +23 -0
- data/lib/request_handler/builder/options_builder.rb +10 -1
- data/lib/request_handler/header_parser.rb +30 -3
- data/lib/request_handler/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7fb382a3a9c578b69efee4f3f24371d3f1539cb9695057130ec60f04c7be858e
|
4
|
+
data.tar.gz: b5b4e80acb25c29c8e2cf1f139b9ec902750a0f46b0ac31311d9d144272f24f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ff65ee31333500b115f8b15e3f60561740e647f9c6171d51516aa7c8db0f369b85c7af44fe61b47ebab77888d74d7fec8e774c04cbd3833c2204e7565af28cb
|
7
|
+
data.tar.gz: b30401b3c56285040c493e5c4c8e80165ed6e1226d6d058906cf93b1ddf4a6226164325a6931ec73e81a42e8463d2a288689a41ee94e71f0af71b671154ec4ec
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [2.1.0] - 2020-04-01
|
8
|
+
### Added
|
9
|
+
- Headers validation
|
10
|
+
|
7
11
|
## [2.0.0] - 2019-11-19
|
8
12
|
### Changed
|
9
13
|
- BREAKING: Required configuration of validation engine
|
data/lib/request_handler/base.rb
CHANGED
@@ -51,7 +51,7 @@ module RequestHandler
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def headers
|
54
|
-
@headers ||=
|
54
|
+
@headers ||= parse_headers
|
55
55
|
end
|
56
56
|
|
57
57
|
def body_params
|
@@ -105,6 +105,21 @@ module RequestHandler
|
|
105
105
|
result.empty? ? defaults : result
|
106
106
|
end
|
107
107
|
|
108
|
+
def parse_headers
|
109
|
+
HeaderParser.new(header_parser_params).run
|
110
|
+
end
|
111
|
+
|
112
|
+
def header_parser_params
|
113
|
+
params = { env: request.env }
|
114
|
+
|
115
|
+
return params if config.nil?
|
116
|
+
|
117
|
+
params.merge(
|
118
|
+
schema: config.lookup('headers.schema'),
|
119
|
+
schema_options: execute_options(config.lookup('headers.options'))
|
120
|
+
)
|
121
|
+
end
|
122
|
+
|
108
123
|
def parse_body_params
|
109
124
|
BodyParser.new(
|
110
125
|
request: request,
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'request_handler/builder/base'
|
4
|
+
|
5
|
+
module RequestHandler
|
6
|
+
module Builder
|
7
|
+
class HeadersBuilder < Base
|
8
|
+
Headers = Struct.new(:schema, :options)
|
9
|
+
|
10
|
+
def create_klass_struct
|
11
|
+
@result = Headers.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def schema(value)
|
15
|
+
@result.schema = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def options(value)
|
19
|
+
@result.options = value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'request_handler/builder/base'
|
4
|
+
require 'request_handler/builder/headers_builder'
|
4
5
|
require 'request_handler/builder/page_builder'
|
5
6
|
require 'request_handler/builder/include_options_builder'
|
6
7
|
require 'request_handler/builder/sort_options_builder'
|
@@ -14,7 +15,7 @@ module RequestHandler
|
|
14
15
|
module Builder
|
15
16
|
class OptionsBuilder < Base
|
16
17
|
Options = Struct.new(:page, :include_options, :sort_options, :filter, :query, :body,
|
17
|
-
:multipart, :fieldsets)
|
18
|
+
:multipart, :fieldsets, :headers)
|
18
19
|
|
19
20
|
def create_klass_struct
|
20
21
|
@result = Options.new
|
@@ -52,6 +53,10 @@ module RequestHandler
|
|
52
53
|
@result.fieldsets = build_fieldsets(&block)
|
53
54
|
end
|
54
55
|
|
56
|
+
def headers(&block)
|
57
|
+
@result.headers = build_headers(&block)
|
58
|
+
end
|
59
|
+
|
55
60
|
def build_page(&block)
|
56
61
|
Docile.dsl_eval(PageBuilder.new, &block).build
|
57
62
|
end
|
@@ -83,6 +88,10 @@ module RequestHandler
|
|
83
88
|
def build_fieldsets(&block)
|
84
89
|
Docile.dsl_eval(FieldsetsBuilder.new, &block).build
|
85
90
|
end
|
91
|
+
|
92
|
+
def build_headers(&block)
|
93
|
+
Docile.dsl_eval(HeadersBuilder.new, &block).build
|
94
|
+
end
|
86
95
|
end
|
87
96
|
end
|
88
97
|
end
|
@@ -1,9 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'request_handler/schema_parser'
|
3
4
|
require 'request_handler/error'
|
5
|
+
|
4
6
|
module RequestHandler
|
5
|
-
class HeaderParser
|
6
|
-
def initialize(env:)
|
7
|
+
class HeaderParser < SchemaParser
|
8
|
+
def initialize(env:, schema: nil, schema_options: {})
|
9
|
+
super(schema: schema, schema_options: schema_options) unless schema.nil?
|
10
|
+
|
7
11
|
raise MissingArgumentError, env: 'is missing' if env.nil?
|
8
12
|
@headers = Helper.deep_transform_keys_in_object(env.select { |k, _v| k.start_with?('HTTP_') }) do |k|
|
9
13
|
k[5..-1].downcase.to_sym
|
@@ -11,11 +15,34 @@ module RequestHandler
|
|
11
15
|
end
|
12
16
|
|
13
17
|
def run
|
14
|
-
headers
|
18
|
+
return headers if schema.nil?
|
19
|
+
|
20
|
+
validate_headers!
|
15
21
|
end
|
16
22
|
|
17
23
|
private
|
18
24
|
|
25
|
+
def validate_headers!
|
26
|
+
validate_schema(headers)
|
27
|
+
rescue SchemaValidationError => e
|
28
|
+
raise ExternalArgumentError, external_argument_error_params(e)
|
29
|
+
end
|
30
|
+
|
31
|
+
def external_argument_error_params(error)
|
32
|
+
error.errors.map do |schema_error|
|
33
|
+
header = schema_error[:source][:pointer]
|
34
|
+
{
|
35
|
+
status: '400',
|
36
|
+
code: "#{headers[header.to_sym] ? 'INVALID' : 'MISSING'}_HEADER",
|
37
|
+
detail: "#{format_header_name(header)} #{schema_error[:detail]}"
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def format_header_name(name)
|
43
|
+
name.split('_').map(&:capitalize).join('-')
|
44
|
+
end
|
45
|
+
|
19
46
|
attr_reader :headers
|
20
47
|
end
|
21
48
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: request_handler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Eger
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-04-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: docile
|
@@ -281,6 +281,7 @@ files:
|
|
281
281
|
- lib/request_handler/builder/fieldsets_builder.rb
|
282
282
|
- lib/request_handler/builder/fieldsets_resource_builder.rb
|
283
283
|
- lib/request_handler/builder/filter_builder.rb
|
284
|
+
- lib/request_handler/builder/headers_builder.rb
|
284
285
|
- lib/request_handler/builder/include_options_builder.rb
|
285
286
|
- lib/request_handler/builder/multipart_builder.rb
|
286
287
|
- lib/request_handler/builder/multipart_resource_builder.rb
|