11"""OpenAPI core wrappers module"""
22from six import iteritems
3+ from six .moves .urllib .parse import urljoin
34
45from openapi_core .exceptions import (
56 OpenAPIMappingError , MissingParameterError , InvalidContentTypeError ,
7+ InvalidServerError ,
68)
79
810SPEC_LOCATION_TO_REQUEST_LOCATION_MAPPING = {
@@ -32,13 +34,32 @@ def validate_location(cls, location):
3234 "Unknown parameter location: {0}" .format (str (location )))
3335
3436
35- class RequestParametersFactory (object ):
37+ class BaseRequestFactory (object ):
38+
39+ def get_operation (self , request , spec ):
40+ server = self ._get_server (request , spec )
41+
42+ operation_pattern = request .full_url_pattern .replace (
43+ server .default_url , '' )
44+
45+ return spec .get_operation (operation_pattern , request .method )
46+
47+ def _get_server (self , request , spec ):
48+ for server in spec .servers :
49+ if server .default_url in request .full_url_pattern :
50+ return server
51+
52+ raise InvalidServerError (
53+ "Invalid request server {0}" .format (request .full_url_pattern ))
54+
55+
56+ class RequestParametersFactory (BaseRequestFactory ):
3657
3758 def __init__ (self , attr_mapping = SPEC_LOCATION_TO_REQUEST_LOCATION_MAPPING ):
3859 self .attr_mapping = attr_mapping
3960
4061 def create (self , request , spec ):
41- operation = spec .get_operation (request . path_pattern , request . method )
62+ operation = self .get_operation (request , spec )
4263
4364 params = RequestParameters ()
4465 for param_name , param in iteritems (operation .parameters ):
@@ -65,10 +86,10 @@ def _unmarshal_param(self, request, param):
6586 return param .unmarshal (raw_value )
6687
6788
68- class RequestBodyFactory (object ):
89+ class RequestBodyFactory (BaseRequestFactory ):
6990
7091 def create (self , request , spec ):
71- operation = spec .get_operation (request . path_pattern , request . method )
92+ operation = self .get_operation (request , spec )
7293
7394 try :
7495 media_type = operation .request_body [request .content_type ]
@@ -78,9 +99,13 @@ def create(self, request, spec):
7899
79100 return media_type .unmarshal (request .data )
80101
102+ def _get_operation (self , request , spec ):
103+ return spec .get_operation (request .path_pattern , request .method )
104+
81105
82106class BaseOpenAPIRequest (object ):
83107
108+ host_url = NotImplemented
84109 path = NotImplemented
85110 path_pattern = NotImplemented
86111 method = NotImplemented
@@ -94,6 +119,10 @@ class BaseOpenAPIRequest(object):
94119
95120 content_type = NotImplemented
96121
122+ @property
123+ def full_url_pattern (self ):
124+ return urljoin (self .host_url , self .path_pattern )
125+
97126 def get_parameters (self , spec ):
98127 return RequestParametersFactory ().create (self , spec )
99128
0 commit comments