mirror of https://github.com/zulip/zulip.git
openapi: Switch to new openapi_core validation API.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
parent
60ce5e1955
commit
9bb3d15a79
|
@ -10,8 +10,9 @@ import os
|
|||
import re
|
||||
from typing import Any, Dict, List, Mapping, Optional, Set, Tuple, Union, cast
|
||||
|
||||
import openapi_core
|
||||
import orjson
|
||||
from openapi_core import Spec, openapi_request_validator, openapi_response_validator
|
||||
from openapi_core import Spec
|
||||
from openapi_core.protocols import Response
|
||||
from openapi_core.testing import MockRequest, MockResponse
|
||||
from openapi_core.validation.exceptions import ValidationError as OpenAPIValidationError
|
||||
|
@ -413,11 +414,10 @@ def validate_against_openapi_schema(
|
|||
orjson.dumps(content).decode(),
|
||||
status_code=int(status_code),
|
||||
)
|
||||
result = openapi_response_validator.validate(
|
||||
openapi_spec.spec(), mock_request, cast(Response, mock_response)
|
||||
)
|
||||
try:
|
||||
result.raise_for_errors()
|
||||
openapi_core.validate_response(
|
||||
mock_request, cast(Response, mock_response), spec=openapi_spec.spec()
|
||||
)
|
||||
except OpenAPIValidationError as error:
|
||||
message = f"Response validation error at {method} /api/v1{path} ({status_code}):"
|
||||
message += f"\n\n{type(error).__name__}: {error}"
|
||||
|
@ -497,19 +497,6 @@ def validate_request(
|
|||
if url == "/user_uploads" or url.startswith("/realm/emoji/"):
|
||||
return
|
||||
|
||||
# Now using the openapi_core APIs, validate the request schema
|
||||
# against the OpenAPI documentation.
|
||||
assert isinstance(data, dict)
|
||||
mock_request = MockRequest(
|
||||
"http://localhost:9991/", method, "/api/v1" + url, headers=http_headers, args=data
|
||||
)
|
||||
result = openapi_request_validator.validate(openapi_spec.spec(), mock_request)
|
||||
errors = list(result.errors)
|
||||
|
||||
# If no errors are raised, then validation is successful
|
||||
if not errors:
|
||||
return
|
||||
|
||||
# Requests that do not validate against the OpenAPI spec must either:
|
||||
# * Have returned a 400 (bad request) error
|
||||
# * Have returned a 200 (success) with this request marked as intentionally
|
||||
|
@ -519,8 +506,17 @@ def validate_request(
|
|||
if status_code.startswith("2") and intentionally_undocumented:
|
||||
return
|
||||
|
||||
# Show a block error message explaining the options for fixing it.
|
||||
msg = f"""
|
||||
# Now using the openapi_core APIs, validate the request schema
|
||||
# against the OpenAPI documentation.
|
||||
assert isinstance(data, dict)
|
||||
mock_request = MockRequest(
|
||||
"http://localhost:9991/", method, "/api/v1" + url, headers=http_headers, args=data
|
||||
)
|
||||
try:
|
||||
openapi_core.validate_request(mock_request, spec=openapi_spec.spec())
|
||||
except OpenAPIValidationError as error:
|
||||
# Show a block error message explaining the options for fixing it.
|
||||
msg = f"""
|
||||
|
||||
Error! The OpenAPI schema for {method} {url} is not consistent
|
||||
with the parameters passed in this HTTP request. Consider:
|
||||
|
@ -533,7 +529,7 @@ with the parameters passed in this HTTP request. Consider:
|
|||
|
||||
See https://zulip.readthedocs.io/en/latest/documentation/api.html for help.
|
||||
|
||||
The errors logged by the OpenAPI validator are below:\n"""
|
||||
for error in errors:
|
||||
msg += f"* {error}\n"
|
||||
raise SchemaError(msg)
|
||||
The error logged by the OpenAPI validator is below:
|
||||
{error}
|
||||
"""
|
||||
raise SchemaError(msg)
|
||||
|
|
Loading…
Reference in New Issue