12
12
from openapi_core .schema .paths .exceptions import InvalidPath
13
13
from openapi_core .schema .request_bodies .exceptions import MissingRequestBody
14
14
from openapi_core .schema .servers .exceptions import InvalidServer
15
+ from openapi_core .unmarshalling .schemas .exceptions import (
16
+ UnmarshalError , ValidateError ,
17
+ )
15
18
from openapi_core .validation .request .datatypes import (
16
19
RequestParameters , RequestValidationResult ,
17
20
)
@@ -26,25 +29,29 @@ def __init__(self, spec, custom_formatters=None):
26
29
27
30
def validate (self , request ):
28
31
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 :
32
36
return RequestValidationResult ([exc , ], None , None )
33
37
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
+ )
36
43
)
37
44
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 )
42
46
47
+ errors = params_errors + body_errors
48
+ return RequestValidationResult (errors , body , params )
49
+
50
+ def _validate_parameters (self , request ):
43
51
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 :
48
55
return RequestValidationResult ([exc , ], None , None )
49
56
50
57
params , params_errors = self ._get_parameters (
@@ -53,11 +60,33 @@ def validate(self, request):
53
60
iteritems (path .parameters )
54
61
)
55
62
)
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 )
56
70
57
71
body , body_errors = self ._get_body (request , operation )
72
+ return RequestValidationResult (body_errors , body , None )
58
73
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 )
61
90
62
91
def _get_parameters (self , request , params ):
63
92
errors = []
@@ -86,11 +115,8 @@ def _get_parameters(self, request, params):
86
115
continue
87
116
88
117
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 :
94
120
errors .append (exc )
95
121
else :
96
122
locations .setdefault (param .location .value , {})
@@ -121,11 +147,18 @@ def _get_body(self, request, operation):
121
147
errors .append (exc )
122
148
else :
123
149
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 :
129
152
errors .append (exc )
130
153
131
154
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