in server/api/plugins/openapi.py [0:0]
def validate(self, method = "GET", path = "/foo", formdata = None):
""" Validate the request method and input data against the OpenAPI specification """
# Make sure we're not dealing with a dynamic URL.
# If we find /foo/{key}, we fold that into the form data
# and process as if it's a json input field for now.
if not self.API['paths'].get(path):
for xpath in self.API['paths']:
pathRE = re.sub(r"\{(.+?)\}", r"(?P<\1>[^/]+)", xpath)
m = re.match(pathRE, path)
if m:
for k,v in m.groupdict().items():
formdata[k] = v
path = xpath
break
if self.API['paths'].get(path):
defs = self.API['paths'].get(path)
method = method.lower()
if method in defs:
mdefs = defs[method]
if formdata and 'parameters' in mdefs:
self.validateParameters(mdefs['parameters'], formdata)
elif formdata and 'requestBody' not in mdefs:
raise OpenAPIException("OpenAPI mismatch: JSON data is now allowed for this request type")
elif formdata and 'requestBody' in mdefs and 'content' in mdefs['requestBody']:
# SHORTCUT: We only care about JSON input for Kibble! Disregard other types
if not 'application/json' in mdefs['requestBody']['content']:
raise OpenAPIException ("OpenAPI mismatch: API endpoint accepts input, but no application/json definitions found in api.yaml!")
jdefs = mdefs['requestBody']['content']['application/json']
# Check that required params are here
self.validateSchema(jdefs, formdata)
else:
raise OpenAPIException ("OpenAPI mismatch: Method %s is not registered for this API" % method)
else:
raise OpenAPIException("OpenAPI mismatch: Unknown API path '%s'!" % path)