Better exception for bad URL parse (#2415)

This commit is contained in:
Adam Hopkins 2022-03-25 00:22:12 +02:00 committed by GitHub
parent 030987480c
commit 0cb342aef4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 3 deletions

View File

@ -51,6 +51,10 @@ class InvalidUsage(SanicException):
quiet = True quiet = True
class BadURL(InvalidUsage):
...
class MethodNotSupported(SanicException): class MethodNotSupported(SanicException):
""" """
**Status**: 405 Method Not Allowed **Status**: 405 Method Not Allowed

View File

@ -30,10 +30,11 @@ from types import SimpleNamespace
from urllib.parse import parse_qs, parse_qsl, unquote, urlunparse from urllib.parse import parse_qs, parse_qsl, unquote, urlunparse
from httptools import parse_url # type: ignore from httptools import parse_url # type: ignore
from httptools.parser.errors import HttpParserInvalidURLError # type: ignore
from sanic.compat import CancelledErrors, Header from sanic.compat import CancelledErrors, Header
from sanic.constants import DEFAULT_HTTP_CONTENT_TYPE from sanic.constants import DEFAULT_HTTP_CONTENT_TYPE
from sanic.exceptions import InvalidUsage, ServerError from sanic.exceptions import BadURL, InvalidUsage, ServerError
from sanic.headers import ( from sanic.headers import (
AcceptContainer, AcceptContainer,
Options, Options,
@ -129,8 +130,10 @@ class Request:
): ):
self.raw_url = url_bytes self.raw_url = url_bytes
# TODO: Content-Encoding detection try:
self._parsed_url = parse_url(url_bytes) self._parsed_url = parse_url(url_bytes)
except HttpParserInvalidURLError:
raise BadURL(f"Bad URL: {url_bytes.decode()}")
self._id: Optional[Union[uuid.UUID, str, int]] = None self._id: Optional[Union[uuid.UUID, str, int]] = None
self._name: Optional[str] = None self._name: Optional[str] = None
self.app = app self.app = app

View File

@ -4,6 +4,7 @@ from uuid import UUID, uuid4
import pytest import pytest
from sanic import Sanic, response from sanic import Sanic, response
from sanic.exceptions import BadURL
from sanic.request import Request, uuid from sanic.request import Request, uuid
from sanic.server import HttpProtocol from sanic.server import HttpProtocol
@ -176,3 +177,17 @@ def test_request_accept():
"text/x-dvi; q=0.8", "text/x-dvi; q=0.8",
"text/plain; q=0.5", "text/plain; q=0.5",
] ]
def test_bad_url_parse():
message = "Bad URL: my.redacted-domain.com:443"
with pytest.raises(BadURL, match=message):
Request(
b"my.redacted-domain.com:443",
Mock(),
Mock(),
Mock(),
Mock(),
Mock(),
Mock(),
)