11"""OpenAPI core validators module"""
22from six import iteritems
3+ from yarl import URL
34
45from openapi_core .exceptions import (
56 OpenAPIMappingError , MissingParameter , MissingBody , InvalidResponse ,
@@ -51,6 +52,16 @@ def __init__(self, errors, data=None, headers=None):
5152 self .headers = headers
5253
5354
55+ def get_operation_pattern (server_url , request_url_pattern ):
56+ """Return an updated request URL pattern with the server URL removed."""
57+ if server_url [- 1 ] == "/" :
58+ # operations have to start with a slash, so do not remove it
59+ server_url = server_url [:- 1 ]
60+ if URL (server_url ).is_absolute ():
61+ return request_url_pattern .replace (server_url , "" , 1 )
62+ return URL (request_url_pattern ).path_qs .replace (server_url , "" , 1 )
63+
64+
5465class RequestValidator (object ):
5566
5667 def __init__ (self , spec ):
@@ -68,8 +79,9 @@ def validate(self, request):
6879 errors .append (exc )
6980 return RequestValidationResult (errors , body , parameters )
7081
71- operation_pattern = request .full_url_pattern .replace (
72- server .default_url , '' )
82+ operation_pattern = get_operation_pattern (
83+ server .default_url , request .full_url_pattern
84+ )
7385
7486 try :
7587 operation = self .spec .get_operation (
@@ -154,8 +166,9 @@ def validate(self, request, response):
154166 errors .append (exc )
155167 return ResponseValidationResult (errors , data , headers )
156168
157- operation_pattern = request .full_url_pattern .replace (
158- server .default_url , '' )
169+ operation_pattern = get_operation_pattern (
170+ server .default_url , request .full_url_pattern
171+ )
159172
160173 try :
161174 operation = self .spec .get_operation (
0 commit comments