55from openapi_core .casting .schemas .exceptions import CastError
66from openapi_core .deserializing .exceptions import DeserializeError
77from openapi_core .schema .media_types .exceptions import InvalidContentType
8- from openapi_core .schema .operations .exceptions import InvalidOperation
98from openapi_core .schema .parameters .exceptions import (
109 MissingRequiredParameter , MissingParameter ,
1110)
12- from openapi_core .schema .paths .exceptions import InvalidPath
1311from openapi_core .schema .request_bodies .exceptions import MissingRequestBody
14- from openapi_core .schema .servers .exceptions import InvalidServer
1512from openapi_core .security .exceptions import SecurityError
13+ from openapi_core .templating .paths .exceptions import PathError
1614from openapi_core .unmarshalling .schemas .enums import UnmarshalContext
1715from openapi_core .unmarshalling .schemas .exceptions import (
1816 UnmarshalError , ValidateError ,
2119from openapi_core .validation .request .datatypes import (
2220 RequestParameters , RequestValidationResult ,
2321)
24- from openapi_core .validation .util import get_operation_pattern
22+ from openapi_core .validation .validators import BaseValidator
2523
2624
27- class RequestValidator (object ):
28-
29- def __init__ (
30- self , spec ,
31- custom_formatters = None , custom_media_type_deserializers = None ,
32- ):
33- self .spec = spec
34- self .custom_formatters = custom_formatters
35- self .custom_media_type_deserializers = custom_media_type_deserializers
25+ class RequestValidator (BaseValidator ):
3626
3727 def validate (self , request ):
3828 try :
39- path = self ._get_path (request )
40- operation = self ._get_operation (request )
29+ path , operation , _ , _ , _ = self ._find_path (request )
4130 # don't process if operation errors
42- except ( InvalidServer , InvalidPath , InvalidOperation ) as exc :
31+ except PathError as exc :
4332 return RequestValidationResult ([exc , ], None , None , None )
4433
4534 try :
@@ -61,9 +50,8 @@ def validate(self, request):
6150
6251 def _validate_parameters (self , request ):
6352 try :
64- path = self ._get_path (request )
65- operation = self ._get_operation (request )
66- except (InvalidServer , InvalidPath , InvalidOperation ) as exc :
53+ path , operation , _ , _ , _ = self ._find_path (request )
54+ except PathError as exc :
6755 return RequestValidationResult ([exc , ], None , None )
6856
6957 params , params_errors = self ._get_parameters (
@@ -76,30 +64,13 @@ def _validate_parameters(self, request):
7664
7765 def _validate_body (self , request ):
7866 try :
79- operation = self ._get_operation (request )
80- except ( InvalidServer , InvalidOperation ) as exc :
67+ _ , operation , _ , _ , _ = self ._find_path (request )
68+ except PathError as exc :
8169 return RequestValidationResult ([exc , ], None , None )
8270
8371 body , body_errors = self ._get_body (request , operation )
8472 return RequestValidationResult (body_errors , body , None , None )
8573
86- def _get_operation_pattern (self , request ):
87- server = self .spec .get_server (request .full_url_pattern )
88-
89- return get_operation_pattern (
90- server .default_url , request .full_url_pattern
91- )
92-
93- def _get_path (self , request ):
94- operation_pattern = self ._get_operation_pattern (request )
95-
96- return self .spec [operation_pattern ]
97-
98- def _get_operation (self , request ):
99- operation_pattern = self ._get_operation_pattern (request )
100-
101- return self .spec .get_operation (operation_pattern , request .method )
102-
10374 def _get_security (self , request , operation ):
10475 security = operation .security or self .spec .security
10576 if not security :
@@ -222,15 +193,6 @@ def _get_body_value(self, request_body, request):
222193 raise MissingRequestBody (request )
223194 return request .body
224195
225- def _deserialise_media_type (self , media_type , value ):
226- from openapi_core .deserializing .media_types .factories import (
227- MediaTypeDeserializersFactory ,
228- )
229- deserializers_factory = MediaTypeDeserializersFactory (
230- self .custom_media_type_deserializers )
231- deserializer = deserializers_factory .create (media_type )
232- return deserializer (value )
233-
234196 def _deserialise_parameter (self , param , value ):
235197 from openapi_core .deserializing .parameters .factories import (
236198 ParameterDeserializersFactory ,
@@ -239,27 +201,7 @@ def _deserialise_parameter(self, param, value):
239201 deserializer = deserializers_factory .create (param )
240202 return deserializer (value )
241203
242- def _cast (self , param_or_media_type , value ):
243- # return param_or_media_type.cast(value)
244- if not param_or_media_type .schema :
245- return value
246-
247- from openapi_core .casting .schemas .factories import SchemaCastersFactory
248- casters_factory = SchemaCastersFactory ()
249- caster = casters_factory .create (param_or_media_type .schema )
250- return caster (value )
251-
252204 def _unmarshal (self , param_or_media_type , value ):
253- if not param_or_media_type .schema :
254- return value
255-
256- from openapi_core .unmarshalling .schemas .factories import (
257- SchemaUnmarshallersFactory ,
258- )
259- unmarshallers_factory = SchemaUnmarshallersFactory (
260- self .spec ._resolver , self .custom_formatters ,
261- context = UnmarshalContext .REQUEST ,
205+ return super (RequestValidator , self )._unmarshal (
206+ param_or_media_type , value , context = UnmarshalContext .REQUEST ,
262207 )
263- unmarshaller = unmarshallers_factory .create (
264- param_or_media_type .schema )
265- return unmarshaller (value )
0 commit comments