33from openapi_core .deserializing .exceptions import DeserializeError
44from openapi_core .schema .operations .exceptions import InvalidOperation
55from openapi_core .schema .media_types .exceptions import InvalidContentType
6+ from openapi_core .schema .paths .exceptions import InvalidPath
67from openapi_core .schema .responses .exceptions import (
78 InvalidResponse , MissingResponseContent ,
89)
1314)
1415from openapi_core .validation .response .datatypes import ResponseValidationResult
1516from openapi_core .validation .util import get_operation_pattern
17+ from openapi_core .validation .validators import BaseValidator
1618
1719
18- class ResponseValidator (object ):
19-
20- def __init__ (
21- self , spec ,
22- custom_formatters = None , custom_media_type_deserializers = None ,
23- ):
24- self .spec = spec
25- self .custom_formatters = custom_formatters
26- self .custom_media_type_deserializers = custom_media_type_deserializers
20+ class ResponseValidator (BaseValidator ):
2721
2822 def validate (self , request , response ):
23+ try :
24+ _ , operation , _ , _ , _ = self ._find_path (request )
25+ # don't process if operation errors
26+ except (InvalidServer , InvalidPath , InvalidOperation ) as exc :
27+ return ResponseValidationResult ([exc , ], None , None )
28+
2929 try :
3030 operation_response = self ._get_operation_response (
31- request , response )
31+ operation , response )
3232 # don't process if operation errors
33- except ( InvalidServer , InvalidOperation , InvalidResponse ) as exc :
33+ except InvalidResponse as exc :
3434 return ResponseValidationResult ([exc , ], None , None )
3535
3636 data , data_errors = self ._get_data (response , operation_response )
@@ -41,28 +41,21 @@ def validate(self, request, response):
4141 errors = data_errors + headers_errors
4242 return ResponseValidationResult (errors , data , headers )
4343
44- def _get_operation_pattern (self , request ):
45- server = self .spec .get_server (request .full_url_pattern )
46-
47- return get_operation_pattern (
48- server .default_url , request .full_url_pattern
49- )
50-
51- def _get_operation (self , request ):
52- operation_pattern = self ._get_operation_pattern (request )
53-
54- return self .spec .get_operation (operation_pattern , request .method )
55-
56- def _get_operation_response (self , request , response ):
57- operation = self ._get_operation (request )
58-
44+ def _get_operation_response (self , operation , response ):
5945 return operation .get_response (str (response .status_code ))
6046
6147 def _validate_data (self , request , response ):
48+ try :
49+ _ , operation , _ , _ , _ = self ._find_path (request )
50+ # don't process if operation errors
51+ except (InvalidServer , InvalidPath , InvalidOperation ) as exc :
52+ return ResponseValidationResult ([exc , ], None , None )
53+
6254 try :
6355 operation_response = self ._get_operation_response (
64- request , response )
65- except (InvalidServer , InvalidOperation , InvalidResponse ) as exc :
56+ operation , response )
57+ # don't process if operation errors
58+ except InvalidResponse as exc :
6659 return ResponseValidationResult ([exc , ], None , None )
6760
6861 data , data_errors = self ._get_data (response , operation_response )
@@ -113,36 +106,7 @@ def _get_data_value(self, response):
113106
114107 return response .data
115108
116- def _deserialise_media_type (self , media_type , value ):
117- from openapi_core .deserializing .media_types .factories import (
118- MediaTypeDeserializersFactory ,
119- )
120- deserializers_factory = MediaTypeDeserializersFactory (
121- self .custom_media_type_deserializers )
122- deserializer = deserializers_factory .create (media_type )
123- return deserializer (value )
124-
125- def _cast (self , param_or_media_type , value ):
126- # return param_or_media_type.cast(value)
127- if not param_or_media_type .schema :
128- return value
129-
130- from openapi_core .casting .schemas .factories import SchemaCastersFactory
131- casters_factory = SchemaCastersFactory ()
132- caster = casters_factory .create (param_or_media_type .schema )
133- return caster (value )
134-
135109 def _unmarshal (self , param_or_media_type , value ):
136- if not param_or_media_type .schema :
137- return value
138-
139- from openapi_core .unmarshalling .schemas .factories import (
140- SchemaUnmarshallersFactory ,
141- )
142- unmarshallers_factory = SchemaUnmarshallersFactory (
143- self .spec ._resolver , self .custom_formatters ,
144- context = UnmarshalContext .RESPONSE ,
110+ return super (ResponseValidator , self )._unmarshal (
111+ param_or_media_type , value , context = UnmarshalContext .RESPONSE ,
145112 )
146- unmarshaller = unmarshallers_factory .create (
147- param_or_media_type .schema )
148- return unmarshaller (value )
0 commit comments