1212from openapi_core .schema .paths .exceptions import InvalidPath
1313from openapi_core .schema .request_bodies .exceptions import MissingRequestBody
1414from openapi_core .schema .servers .exceptions import InvalidServer
15+ from openapi_core .unmarshalling .schemas .exceptions import (
16+ UnmarshalError , ValidateError ,
17+ )
1518from openapi_core .validation .request .datatypes import (
1619 RequestParameters , RequestValidationResult ,
1720)
@@ -26,25 +29,29 @@ def __init__(self, spec, custom_formatters=None):
2629
2730 def validate (self , request ):
2831 try :
29- server = self .spec .get_server (request .full_url_pattern )
30- # don't process if server errors
31- except InvalidServer as exc :
32+ path = self ._get_path (request )
33+ operation = self ._get_operation (request )
34+ # don't process if operation errors
35+ except (InvalidServer , InvalidPath , InvalidOperation ) as exc :
3236 return RequestValidationResult ([exc , ], None , None )
3337
34- operation_pattern = get_operation_pattern (
35- server .default_url , request .full_url_pattern
38+ params , params_errors = self ._get_parameters (
39+ request , chain (
40+ iteritems (operation .parameters ),
41+ iteritems (path .parameters )
42+ )
3643 )
3744
38- try :
39- path = self .spec [operation_pattern ]
40- except InvalidPath as exc :
41- return RequestValidationResult ([exc , ], None , None )
45+ body , body_errors = self ._get_body (request , operation )
4246
47+ errors = params_errors + body_errors
48+ return RequestValidationResult (errors , body , params )
49+
50+ def _validate_parameters (self , request ):
4351 try :
44- operation = self .spec .get_operation (
45- operation_pattern , request .method )
46- # don't process if operation errors
47- except InvalidOperation as exc :
52+ path = self ._get_path (request )
53+ operation = self ._get_operation (request )
54+ except (InvalidServer , InvalidPath , InvalidOperation ) as exc :
4855 return RequestValidationResult ([exc , ], None , None )
4956
5057 params , params_errors = self ._get_parameters (
@@ -53,11 +60,33 @@ def validate(self, request):
5360 iteritems (path .parameters )
5461 )
5562 )
63+ return RequestValidationResult (params_errors , None , params )
64+
65+ def _validate_body (self , request ):
66+ try :
67+ operation = self ._get_operation (request )
68+ except (InvalidServer , InvalidOperation ) as exc :
69+ return RequestValidationResult ([exc , ], None , None )
5670
5771 body , body_errors = self ._get_body (request , operation )
72+ return RequestValidationResult (body_errors , body , None )
5873
59- errors = params_errors + body_errors
60- return RequestValidationResult (errors , body , params )
74+ def _get_operation_pattern (self , request ):
75+ server = self .spec .get_server (request .full_url_pattern )
76+
77+ return get_operation_pattern (
78+ server .default_url , request .full_url_pattern
79+ )
80+
81+ def _get_path (self , request ):
82+ operation_pattern = self ._get_operation_pattern (request )
83+
84+ return self .spec [operation_pattern ]
85+
86+ def _get_operation (self , request ):
87+ operation_pattern = self ._get_operation_pattern (request )
88+
89+ return self .spec .get_operation (operation_pattern , request .method )
6190
6291 def _get_parameters (self , request , params ):
6392 errors = []
@@ -86,11 +115,8 @@ def _get_parameters(self, request, params):
86115 continue
87116
88117 try :
89- unmarshalled = param .unmarshal (
90- casted , self .custom_formatters ,
91- resolver = self .spec ._resolver ,
92- )
93- except OpenAPIParameterError as exc :
118+ unmarshalled = self ._unmarshal (param , casted )
119+ except (ValidateError , UnmarshalError ) as exc :
94120 errors .append (exc )
95121 else :
96122 locations .setdefault (param .location .value , {})
@@ -121,11 +147,18 @@ def _get_body(self, request, operation):
121147 errors .append (exc )
122148 else :
123149 try :
124- body = media_type .unmarshal (
125- casted , self .custom_formatters ,
126- resolver = self .spec ._resolver ,
127- )
128- except InvalidMediaTypeValue as exc :
150+ body = self ._unmarshal (media_type , casted )
151+ except (ValidateError , UnmarshalError ) as exc :
129152 errors .append (exc )
130153
131154 return body , errors
155+
156+ def _unmarshal (self , param_or_media_type , value ):
157+ if not param_or_media_type .schema :
158+ return value
159+
160+ return param_or_media_type .schema .unmarshal (
161+ value ,
162+ resolver = self .spec ._resolver ,
163+ custom_formatters = self .custom_formatters ,
164+ )
0 commit comments