vigiles 0.1.3 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/.ruby-version +1 -0
- data/lib/generators/vigiles/initializer_generator.rb +1 -1
- data/lib/generators/vigiles/install_generator.rb +1 -1
- data/lib/generators/vigiles/migration_generator.rb +2 -1
- data/lib/vigiles/archive/extras.rb +1 -1
- data/lib/vigiles/archive/metadata.rb +1 -1
- data/lib/vigiles/archive/response.rb +31 -5
- data/lib/vigiles/archive.rb +1 -1
- data/lib/vigiles/constants.rb +161 -1
- data/lib/vigiles/conversation_recorder.rb +3 -0
- data/lib/vigiles/conversation_recorders/application_json.rb +11 -6
- data/lib/vigiles/conversation_recorders/unknown.rb +3 -0
- data/lib/vigiles/middleware/record_conversation.rb +2 -2
- data/lib/vigiles/options.rb +1 -0
- data/lib/vigiles/types.rb +6 -0
- data/lib/vigiles/utilities/http.rb +60 -0
- data/lib/vigiles/utilities/json.rb +3 -2
- data/lib/vigiles/version.rb +1 -1
- data/lib/vigiles.rb +15 -3
- data/sorbet/rbi/gems/concurrent-ruby@1.3.1.rbi +11627 -0
- data/sorbet/rbi/gems/{json@2.7.1.rbi → json@2.7.2.rbi} +73 -72
- data/sorbet/rbi/gems/{minitest@5.22.2.rbi → minitest@5.23.1.rbi} +841 -159
- data/sorbet/rbi/gems/{parser@3.3.0.5.rbi → parser@3.3.1.0.rbi} +233 -186
- data/sorbet/rbi/gems/{prism@0.24.0.rbi → prism@0.29.0.rbi} +19135 -12188
- data/sorbet/rbi/gems/{racc@1.7.3.rbi → racc@1.8.0.rbi} +34 -33
- data/sorbet/rbi/gems/{rake@13.1.0.rbi → rake@13.2.1.rbi} +77 -55
- data/sorbet/rbi/gems/{rbi@0.1.9.rbi → rbi@0.1.13.rbi} +226 -154
- data/sorbet/rbi/gems/{rdoc@6.6.3.1.rbi → rdoc@6.7.0.rbi} +333 -327
- data/sorbet/rbi/gems/{regexp_parser@2.9.0.rbi → regexp_parser@2.9.2.rbi} +3 -2
- data/sorbet/rbi/gems/{reline@0.5.7.rbi → reline@0.5.8.rbi} +1 -0
- data/sorbet/rbi/gems/{rexml@3.2.6.rbi → rexml@3.2.8.rbi} +121 -108
- data/sorbet/rbi/gems/{rubocop-ast@1.30.0.rbi → rubocop-ast@1.31.3.rbi} +92 -62
- data/sorbet/rbi/gems/{rubocop-minitest@0.34.5.rbi → rubocop-minitest@0.35.0.rbi} +35 -0
- data/sorbet/rbi/gems/{rubocop-sorbet@0.7.4.rbi → rubocop-sorbet@0.8.3.rbi} +327 -162
- data/sorbet/rbi/gems/{rubocop@1.60.2.rbi → rubocop@1.64.0.rbi} +1719 -1065
- data/sorbet/rbi/gems/{spoom@1.2.4.rbi → spoom@1.3.2.rbi} +1057 -413
- data/sorbet/rbi/gems/strscan@3.1.0.rbi +9 -0
- data/sorbet/rbi/gems/{tapioca@0.12.0.rbi → tapioca@0.14.2.rbi} +123 -448
- data/sorbet/rbi/gems/{thor@1.3.0.rbi → thor@1.3.1.rbi} +57 -50
- data/sorbet/rbi/gems/{yard@0.9.34.rbi → yard@0.9.36.rbi} +230 -37
- data/sorbet/rbi/gems/{zeitwerk@2.6.13.rbi → zeitwerk@2.6.15.rbi} +47 -36
- data/vigiles.gemspec +1 -1
- metadata +30 -29
- data/sorbet/rbi/gems/concurrent-ruby@1.2.3.rbi +0 -8
- data/sorbet/rbi/gems/prettier_print@1.2.1.rbi +0 -951
- data/sorbet/rbi/gems/syntax_tree@6.2.0.rbi +0 -23136
- /data/lib/generators/{templates → vigiles/templates}/archive_conversation_migration.rb.erb +0 -0
- /data/lib/generators/{templates → vigiles/templates}/initializer.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cad76457ae57c5b08da94044394a063e57f5d1e5ea5a8b9cea412876dce12bf
|
4
|
+
data.tar.gz: 6eb84b1766ef2e737652fc63e28924756b8d26d74b676d9f716f1db8e0744c8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23a0e61a11a529603eebc7e197961762b493c940a2b33cb510f0f81e419b2379a9a3e207eb236be1a1aae44009cf75f95aec401dc1b3ee95cefad6b678809505
|
7
|
+
data.tar.gz: 697eb918976d40ea0189d9b1de700caeae6931e28f41a6627d055c7c3d6eed4df44cf541d705f2ecb66931549c8af5825cf0177e9835eb2f2a7d2705dcf000b5
|
data/.rubocop.yml
CHANGED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.3.1
|
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
require "rails/generators"
|
5
5
|
require "rails/generators/active_record"
|
6
|
+
require "active_record"
|
6
7
|
|
7
8
|
module Vigiles
|
8
9
|
module Generators
|
@@ -12,7 +13,7 @@ module Vigiles
|
|
12
13
|
|
13
14
|
include ::Rails::Generators::Migration
|
14
15
|
|
15
|
-
source_root File.expand_path("
|
16
|
+
source_root File.expand_path("templates", __dir__)
|
16
17
|
|
17
18
|
def install
|
18
19
|
migration_template(
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Vigiles
|
@@ -10,6 +10,33 @@ module Vigiles
|
|
10
10
|
const :payload, Types::Payload
|
11
11
|
const :status, Integer
|
12
12
|
|
13
|
+
class ResponseBodyTooDeepError < StandardError
|
14
|
+
sig { returns(Integer) }
|
15
|
+
attr_reader :max_stack_depth
|
16
|
+
|
17
|
+
sig { returns(Integer) }
|
18
|
+
attr_reader :stack_depth
|
19
|
+
|
20
|
+
sig { params(stack_depth: Integer, max_stack_depth: Integer).void }
|
21
|
+
def initialize(stack_depth, max_stack_depth)
|
22
|
+
@max_stack_depth = max_stack_depth
|
23
|
+
@stack_depth = stack_depth
|
24
|
+
|
25
|
+
super()
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
sig { params(body: Rack::BodyProxy, stack_depth: Integer).returns(String) }
|
30
|
+
private_class_method def self.extract_body_from_rack_body_proxy(body, stack_depth = 1)
|
31
|
+
raise ResponseBodyTooDeepError.new(stack_depth, 5) unless stack_depth < 5
|
32
|
+
|
33
|
+
case (inner_body = body.instance_variable_get(:@body))
|
34
|
+
when Rack::BodyProxy then extract_body_from_rack_body_proxy(inner_body, stack_depth + 1)
|
35
|
+
when Array then inner_body[0] || "null"
|
36
|
+
else raise
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
13
40
|
sig { params(rack_response: Rack::Response).returns(Types::Payload) }
|
14
41
|
private_class_method def self.extract_payload(rack_response)
|
15
42
|
case (body = rack_response.body)
|
@@ -18,12 +45,11 @@ module Vigiles
|
|
18
45
|
|
19
46
|
{ __false_body: :not_empty_handle_later }
|
20
47
|
when Rack::BodyProxy
|
21
|
-
|
22
|
-
body_proxy = body_proxy.instance_variable_get(:@body) until body_proxy.is_a?(Array)
|
48
|
+
extracted_body = extract_body_from_rack_body_proxy(body)
|
23
49
|
begin
|
24
|
-
JSON.parse(
|
50
|
+
JSON.parse(extracted_body)
|
25
51
|
rescue StandardError
|
26
|
-
{ __false_body:
|
52
|
+
{ __false_body: extracted_body }
|
27
53
|
end
|
28
54
|
else
|
29
55
|
{ __false_body: :unknown_response_payload_type }
|
data/lib/vigiles/archive.rb
CHANGED
data/lib/vigiles/constants.rb
CHANGED
@@ -8,7 +8,167 @@ module Vigiles
|
|
8
8
|
%w[
|
9
9
|
application/json
|
10
10
|
]
|
11
|
-
),
|
11
|
+
).freeze,
|
12
|
+
T::Set[String]
|
13
|
+
)
|
14
|
+
|
15
|
+
ALL_IANA_CONTENT_TYPES = T.let(
|
16
|
+
{
|
17
|
+
Types::ContentType::ApplicationJson => Set.new(
|
18
|
+
%w[
|
19
|
+
application/3gppHal+json
|
20
|
+
application/3gppHalForms+json
|
21
|
+
application/ace+json
|
22
|
+
application/activity+json
|
23
|
+
application/aif+json
|
24
|
+
application/alto-cdni+json
|
25
|
+
application/alto-cdnifilter+json
|
26
|
+
application/alto-costmap+json
|
27
|
+
application/alto-costmapfilter+json
|
28
|
+
application/alto-directory+json
|
29
|
+
application/alto-endpointprop+json
|
30
|
+
application/alto-endpointpropparams+json
|
31
|
+
application/alto-endpointcost+json
|
32
|
+
application/alto-endpointcostparams+json
|
33
|
+
application/alto-error+json
|
34
|
+
application/alto-networkmapfilter+json
|
35
|
+
application/alto-networkmap+json
|
36
|
+
application/alto-propmap+json
|
37
|
+
application/alto-propmapparams+json
|
38
|
+
application/alto-tips+json
|
39
|
+
application/alto-tipsparams+json
|
40
|
+
application/alto-updatestreamcontrol+json
|
41
|
+
application/alto-updatestreamparams+json
|
42
|
+
application/atsc-rdt+json
|
43
|
+
application/calendar+json
|
44
|
+
application/captive+json
|
45
|
+
application/city+json
|
46
|
+
application/coap-group+json
|
47
|
+
application/csvm+json
|
48
|
+
application/cwl+json
|
49
|
+
application/dicom+json
|
50
|
+
application/dns+json
|
51
|
+
application/elm+json
|
52
|
+
application/EmergencyCallData.LegacyESN+json
|
53
|
+
application/expect-ct-report+json
|
54
|
+
application/fhir+json
|
55
|
+
application/geo+json
|
56
|
+
application/geo+json-seq
|
57
|
+
application/geoxacml+json
|
58
|
+
application/jf2feed+json
|
59
|
+
application/jose+json
|
60
|
+
application/jrd+json
|
61
|
+
application/jscalendar+json
|
62
|
+
application/jscontact+json
|
63
|
+
application/json
|
64
|
+
application/json-patch+json
|
65
|
+
application/json-seq
|
66
|
+
application/jsonpath
|
67
|
+
application/jwk+json
|
68
|
+
application/jwk-set+json
|
69
|
+
application/ld+json
|
70
|
+
application/linkset+json
|
71
|
+
application/manifest+json
|
72
|
+
application/merge-patch+json
|
73
|
+
application/mud+json
|
74
|
+
application/ppsp-tracker+json
|
75
|
+
application/problem+json
|
76
|
+
application/prs.implied-object+json
|
77
|
+
application/prs.implied-object+json-seq
|
78
|
+
application/pvd+json
|
79
|
+
application/rdap+json
|
80
|
+
application/reputon+json
|
81
|
+
application/sarif-external-properties+json
|
82
|
+
application/sarif+json
|
83
|
+
application/scim+json
|
84
|
+
application/senml-etch+json
|
85
|
+
application/senml+json
|
86
|
+
application/sensml+json
|
87
|
+
application/spdx+json
|
88
|
+
application/stix+json
|
89
|
+
application/taxii+json
|
90
|
+
application/td+json
|
91
|
+
application/tlsrpt+json
|
92
|
+
application/tm+json
|
93
|
+
application/vcard+json
|
94
|
+
application/vnd.acm.addressxfer+json
|
95
|
+
application/vnd.acm.chatbot+json
|
96
|
+
application/vnd.amadeus+json
|
97
|
+
application/vnd.apache.thrift.json
|
98
|
+
application/vnd.api+json
|
99
|
+
application/vnd.aplextor.warrp+json
|
100
|
+
application/vnd.apothekende.reservation+json
|
101
|
+
application/vnd.artisan+json
|
102
|
+
application/vnd.avalon+json
|
103
|
+
application/vnd.bbf.usp.msg+json
|
104
|
+
application/vnd.bekitzur-stech+json
|
105
|
+
application/vnd.byu.uapi+json
|
106
|
+
application/vnd.capasystems-pg+json
|
107
|
+
application/vnd.cncf.helm.config.v1+json
|
108
|
+
application/vnd.collection.doc+json
|
109
|
+
application/vnd.collection+json
|
110
|
+
application/vnd.collection.next+json
|
111
|
+
application/vnd.coreos.ignition+json
|
112
|
+
application/vnd.cryptii.pipe+json
|
113
|
+
application/vnd.cyclonedx+json
|
114
|
+
application/vnd.datapackage+json
|
115
|
+
application/vnd.dataresource+json
|
116
|
+
application/vnd.document+json
|
117
|
+
application/vnd.drive+json
|
118
|
+
application/vnd.eclipse.ditto+json
|
119
|
+
application/vnd.eu.kasparian.car+json
|
120
|
+
application/vnd.futoin+json
|
121
|
+
application/vnd.gentics.grd+json
|
122
|
+
application/vnd.geo+json
|
123
|
+
application/vnd.gnu.taler.exchange+json
|
124
|
+
application/vnd.gnu.taler.merchant+json
|
125
|
+
application/vnd.hal+json
|
126
|
+
application/vnd.hc+json
|
127
|
+
application/vnd.heroku+json
|
128
|
+
application/vnd.hyper-item+json
|
129
|
+
application/vnd.hyper+json
|
130
|
+
application/vnd.hyperdrive+json
|
131
|
+
application/vnd.ims.lis.v2.result+json
|
132
|
+
application/vnd.ims.lti.v2.toolconsumerprofile+json
|
133
|
+
application/vnd.ims.lti.v2.toolproxy.id+json
|
134
|
+
application/vnd.ims.lti.v2.toolproxy+json
|
135
|
+
application/vnd.ims.lti.v2.toolsettings+json
|
136
|
+
application/vnd.ims.lti.v2.toolsettings.simple+json
|
137
|
+
application/vnd.ipld.dag-json
|
138
|
+
application/vnd.las.las+json
|
139
|
+
application/vnd.leap+json
|
140
|
+
application/vnd.mason+json
|
141
|
+
application/vnd.micro+json
|
142
|
+
application/vnd.miele+json
|
143
|
+
application/vnd.nacamar.ybrid+json
|
144
|
+
application/vnd.nato.bindingdataobject+json
|
145
|
+
application/vnd.nearst.inv+json
|
146
|
+
application/vnd.oai.workflows+json
|
147
|
+
application/vnd.oci.image.manifest.v1+json
|
148
|
+
application/vnd.oftn.l10n+json
|
149
|
+
application/vnd.oma.lwm2m+json
|
150
|
+
application/vnd.oracle.resource+json
|
151
|
+
application/vnd.pagerduty+json
|
152
|
+
application/vnd.restful+json
|
153
|
+
application/vnd.seis+json
|
154
|
+
application/vnd.shootproof+json
|
155
|
+
application/vnd.shopkick+json
|
156
|
+
application/vnd.siren+json
|
157
|
+
application/vnd.syft+json
|
158
|
+
application/vnd.tableschema+json
|
159
|
+
application/vnd.think-cell.ppttc+json
|
160
|
+
application/vnd.vel+json
|
161
|
+
application/vnd.veritone.aion+json
|
162
|
+
application/vnd.xacml+json
|
163
|
+
application/voucher-cms+json
|
164
|
+
application/webpush-options+json
|
165
|
+
application/yang-data+json
|
166
|
+
application/yang-patch+json
|
167
|
+
application/yang-sid+json
|
168
|
+
].map(&:downcase)
|
169
|
+
).freeze
|
170
|
+
}.freeze,
|
171
|
+
T::Hash[Types::ContentType, T::Set[String]]
|
12
172
|
)
|
13
173
|
|
14
174
|
DEFAULT_CONTENT_TYPE_RECORDERS = T.let(
|
@@ -20,6 +20,9 @@ module Vigiles
|
|
20
20
|
|
21
21
|
abstract!
|
22
22
|
|
23
|
+
sig { abstract.params(req: ActionDispatch::Request).void }
|
24
|
+
def ensure_content_type_matches!(req); end
|
25
|
+
|
23
26
|
sig { abstract.params(req: ActionDispatch::Request, res: Rack::Response).returns(Archive::Conversation) }
|
24
27
|
def record(req:, res:); end
|
25
28
|
end
|
@@ -14,14 +14,19 @@ module Vigiles
|
|
14
14
|
Request = Vigiles::Archive::Request
|
15
15
|
Extras = Vigiles::Archive::Extras
|
16
16
|
|
17
|
+
sig { override.params(req: ActionDispatch::Request).void }
|
18
|
+
private def ensure_content_type_matches!(req)
|
19
|
+
return if req.content_type == ContentType::ApplicationJson.serialize
|
20
|
+
|
21
|
+
raise ConversationRecorder::MisconfiguredRecorderError.new(
|
22
|
+
expected: ContentType::ApplicationJson.serialize,
|
23
|
+
actual: req.content_type
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
17
27
|
sig { override.params(req: ActionDispatch::Request, res: Rack::Response).returns(Archive::Conversation) }
|
18
28
|
def record(req:, res:)
|
19
|
-
|
20
|
-
raise ConversationRecorder::MisconfiguredRecorderError.new(
|
21
|
-
expected: ContentType::ApplicationJson.serialize,
|
22
|
-
actual: req.content_type
|
23
|
-
)
|
24
|
-
end
|
29
|
+
ensure_content_type_matches!(req)
|
25
30
|
|
26
31
|
response = Response.from(res)
|
27
32
|
request = Request.from(req)
|
@@ -6,6 +6,9 @@ module Vigiles
|
|
6
6
|
class Unknown < ConversationRecorder
|
7
7
|
include Singleton
|
8
8
|
|
9
|
+
sig { override.params(req: ActionDispatch::Request).void }
|
10
|
+
def ensure_content_type_matches!(req); end
|
11
|
+
|
9
12
|
sig { override.params(req: ActionDispatch::Request, res: Rack::Response).returns(Archive::Conversation) }
|
10
13
|
def record(req:, res:) = Archive::Conversation.new
|
11
14
|
end
|
@@ -13,7 +13,7 @@ module Vigiles
|
|
13
13
|
to: :options
|
14
14
|
|
15
15
|
sig { params(app: T.untyped, options: Vigiles::Options).void }
|
16
|
-
def initialize(app, options=Vigiles::Options.make_default_options)
|
16
|
+
def initialize(app, options = Vigiles::Options.make_default_options)
|
17
17
|
@app = app
|
18
18
|
@options = options
|
19
19
|
end
|
@@ -36,7 +36,7 @@ module Vigiles
|
|
36
36
|
"[vigiles] conversation recorder: " \
|
37
37
|
"conversation=#{convo.nil? ? "not_recorded" : convo.id} " \
|
38
38
|
"request=#{req.request_id}"
|
39
|
-
rescue => e
|
39
|
+
rescue StandardError => e
|
40
40
|
capture_exception.call(e)
|
41
41
|
logger.warn \
|
42
42
|
"[vigiles] conversation recorder error: " \
|
data/lib/vigiles/options.rb
CHANGED
data/lib/vigiles/types.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Vigiles
|
5
|
+
module Utilities
|
6
|
+
module HTTP
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
WellKnownHttpHeader = Vigiles::Types::WellKnownHttpHeader
|
10
|
+
ContentType = Vigiles::Types::ContentType
|
11
|
+
|
12
|
+
# if http headers could be stemmed, this is what the
|
13
|
+
# method below would have done. at the moment, it works
|
14
|
+
# for only a few headers, and tries to clean up excesses
|
15
|
+
# that are not necessarily part of the value.
|
16
|
+
#
|
17
|
+
# since it raises, do not call unless you have explicitly
|
18
|
+
# handled the header. thanks!
|
19
|
+
sig { params(header: String, value: String).returns(String) }
|
20
|
+
def self.sanitize_header_value(header:, value:)
|
21
|
+
# don't attempt to sanitize values for relatively unknown
|
22
|
+
# headers. for example, custom headers (those with the x
|
23
|
+
# prefix). obviously if the value is blank then no sanitization
|
24
|
+
# is necessary.
|
25
|
+
return value if value.blank? || !well_known?(header)
|
26
|
+
|
27
|
+
case header.downcase
|
28
|
+
when "content-type" then sanitize_content_type(value.strip)
|
29
|
+
else raise ArgumentError, header
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
sig { params(header_value: String).returns(String) }
|
34
|
+
private_class_method def self.sanitize_content_type(header_value)
|
35
|
+
downcased_v = header_value.downcase
|
36
|
+
return ContentType::ApplicationJson.serialize if json?(downcased_v)
|
37
|
+
|
38
|
+
raise
|
39
|
+
end
|
40
|
+
|
41
|
+
sig { params(header: String).returns(T::Boolean) }
|
42
|
+
private_class_method def self.well_known?(header)
|
43
|
+
WellKnownHttpHeader.deserialize(header.downcase)
|
44
|
+
true
|
45
|
+
rescue StandardError
|
46
|
+
false
|
47
|
+
end
|
48
|
+
|
49
|
+
sig { params(header_value: String).returns(T::Boolean) }
|
50
|
+
private_class_method def self.json?(header_value)
|
51
|
+
return false if header_value.blank?
|
52
|
+
|
53
|
+
application_json = T.must(header_value.split(/;/).first)
|
54
|
+
T.must(
|
55
|
+
Constants::ALL_IANA_CONTENT_TYPES[ContentType::ApplicationJson]
|
56
|
+
).include?(application_json)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -8,11 +8,12 @@ module Vigiles
|
|
8
8
|
module JSON
|
9
9
|
extend T::Sig
|
10
10
|
|
11
|
-
sig { params(text: String).returns(T.
|
11
|
+
sig { params(text: String).returns(T.untyped) }
|
12
12
|
def self.parse_benignly(text)
|
13
13
|
::JSON.parse(text)
|
14
14
|
rescue StandardError
|
15
|
-
text
|
15
|
+
return text unless block_given?
|
16
|
+
yield text
|
16
17
|
end
|
17
18
|
end
|
18
19
|
end
|
data/lib/vigiles/version.rb
CHANGED
data/lib/vigiles.rb
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require "zeitwerk"
|
5
4
|
require "sorbet-runtime"
|
6
5
|
require "action_dispatch"
|
6
|
+
require "zeitwerk"
|
7
|
+
|
7
8
|
require_relative "core_ext"
|
8
9
|
|
9
10
|
loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
|
10
|
-
loader.inflector.inflect(
|
11
|
+
loader.inflector.inflect(
|
12
|
+
"json" => "JSON",
|
13
|
+
"http" => "HTTP",
|
14
|
+
"uri" => "URI"
|
15
|
+
)
|
11
16
|
loader.ignore("#{__dir__}/generators")
|
12
17
|
loader.ignore("#{__dir__}/core_ext.rb")
|
13
18
|
loader.ignore("#{__dir__}/core_ext")
|
@@ -49,7 +54,14 @@ module Vigiles
|
|
49
54
|
|
50
55
|
sig { params(request: ActionDispatch::Request).returns(T::Boolean) }
|
51
56
|
private_class_method def self.content_type_match?(request)
|
52
|
-
|
57
|
+
return false if (content_type = request.content_type).nil?
|
58
|
+
|
59
|
+
spec.request_content_types.include?(
|
60
|
+
Utilities::HTTP.sanitize_header_value(
|
61
|
+
header: "content-type",
|
62
|
+
value: content_type
|
63
|
+
)
|
64
|
+
)
|
53
65
|
end
|
54
66
|
|
55
67
|
sig { params(req: ActionDispatch::Request).returns(T::Boolean) }
|