From 6d896dc4f712a4bcfb9d135f4d74fabb94c352c1 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Mon, 26 Aug 2024 21:18:56 +0800 Subject: [PATCH 1/2] Add check_ascii_printable function to reduce duplicated code --- httpx/_urlparse.py | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/httpx/_urlparse.py b/httpx/_urlparse.py index 479c2ef8a1..ad09170585 100644 --- a/httpx/_urlparse.py +++ b/httpx/_urlparse.py @@ -149,6 +149,17 @@ def __str__(self) -> str: ) +def _check_ascii_printable(url: str, key=None) -> None: + for idx, char in enumerate(url): + if char.isascii() and not char.isprintable(): + error = "Invalid non-printable ASCII character in URL" + if key is None: + error += f", {char!r} at position {idx}." + else: + error += f" {key} component, {char!r} at position {idx}." + raise InvalidURL(error) + + def urlparse(url: str = "", **kwargs: str | None) -> ParseResult: # Initial basic checks on allowable URLs. # --------------------------------------- @@ -159,13 +170,7 @@ def urlparse(url: str = "", **kwargs: str | None) -> ParseResult: # If a URL includes any ASCII control characters including \t, \r, \n, # then treat it as invalid. - if any(char.isascii() and not char.isprintable() for char in url): - char = next(char for char in url if char.isascii() and not char.isprintable()) - idx = url.find(char) - error = ( - f"Invalid non-printable ASCII character in URL, {char!r} at position {idx}." - ) - raise InvalidURL(error) + _check_ascii_printable(url) # Some keyword arguments require special handling. # ------------------------------------------------ @@ -209,16 +214,7 @@ def urlparse(url: str = "", **kwargs: str | None) -> ParseResult: # If a component includes any ASCII control characters including \t, \r, \n, # then treat it as invalid. - if any(char.isascii() and not char.isprintable() for char in value): - char = next( - char for char in value if char.isascii() and not char.isprintable() - ) - idx = value.find(char) - error = ( - f"Invalid non-printable ASCII character in URL {key} component, " - f"{char!r} at position {idx}." - ) - raise InvalidURL(error) + _check_ascii_printable(value, key) # Ensure that keyword arguments match as a valid regex. if not COMPONENT_REGEX[key].fullmatch(value): From c92f587d50af183777f6471dd0a78f903c1babfc Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Mon, 26 Aug 2024 21:29:49 +0800 Subject: [PATCH 2/2] Make style --- httpx/_urlparse.py | 2 +- scripts/lint | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/httpx/_urlparse.py b/httpx/_urlparse.py index ad09170585..16c130351d 100644 --- a/httpx/_urlparse.py +++ b/httpx/_urlparse.py @@ -149,7 +149,7 @@ def __str__(self) -> str: ) -def _check_ascii_printable(url: str, key=None) -> None: +def _check_ascii_printable(url: str, key: str | None = None) -> None: for idx, char in enumerate(url): if char.isascii() and not char.isprintable(): error = "Invalid non-printable ASCII character in URL" diff --git a/scripts/lint b/scripts/lint index 3d8685a065..6d096d760b 100755 --- a/scripts/lint +++ b/scripts/lint @@ -8,5 +8,5 @@ export SOURCE_FILES="httpx tests" set -x -${PREFIX}ruff --fix $SOURCE_FILES +${PREFIX}ruff check --fix $SOURCE_FILES ${PREFIX}ruff format $SOURCE_FILES