failed WRONG_FIX UNSUBMITTED wrong_fix_unsubmitted(None) · None tool calls · 0 s · encode/httpx
(not found in data/tasks.jsonl)
| # | Tool | Arguments | Result |
|---|---|---|---|
| No trace captured. | |||
--- a/httpx/_urlparse.py
+++ b/httpx/_urlparse.py
@@ -97,6 +97,7 @@ USERINFO_SAFE = "".join(
]
)
+
# {scheme}: (optional)
# //{authority} (optional)
# {path}
@@ -478,7 +479,7 @@ def PERCENT(string: str) -> str:
return "".join([f"%{byte:02X}" for byte in string.encode("utf-8")])
-def percent_encoded(string: str, safe: str = "/") -> str:
+def percent_encoded(string: str, safe: str) -> str:
"""
Use percent-encoding to quote a string.
"""
@@ -493,7 +494,7 @@ def percent_encoded(string: str, safe: str = "/") -> str:
)
-def quote(string: str, safe: str = "/") -> str:
+def quote(string: str, safe: str) -> str:
"""
Use percent-encoding to quote a string, omitting existing '%xx' escape sequences.
@@ -524,26 +525,3 @@ def quote(string: str, safe: str = "/") -> str:
parts.append(percent_encoded(trailing_text, safe=safe))
return "".join(parts)
-
-
-def urlencode(items: list[tuple[str, str]]) -> str:
- """
- We can use a much simpler version of the stdlib urlencode here because
- we don't need to handle a bunch of different typing cases, such as bytes vs str.
-
- https://github.com/python/cpython/blob/b2f7b2ef0b5421e01efb8c7bee2ef95d3bab77eb/Lib/urllib/parse.py#L926
-
- Note that we use '%20' encoding for spaces. and '%2F for '/'.
- This is slightly different than `requests`, but is the behaviour that browsers use.
-
- See
- - https://github.com/encode/httpx/issues/2536
- - https://github.com/encode/httpx/issues/2721
- - https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode
- """
- return "&".join(
- [
- percent_encoded(k, safe="") + "=" + percent_encoded(v, safe="")
- for k, v in items
- ]
- )
--- a/httpx/_urls.py
+++ b/httpx/_urls.py
@@ -1,17 +1,31 @@
from __future__ import annotations
import typing
-from urllib.parse import parse_qs, unquote
+from urllib.parse import parse_qs, unquote, urlencode
import idna
from ._types import QueryParamTypes
-from ._urlparse import urlencode, urlparse
+from ._urlparse import urlparse
from ._utils import primitive_value_to_str
__all__ = ["URL", "QueryParams"]
+# To urlencode query parameters, we use the whatwg query percent-encode set
+# and additionally escape U+0025 (%), U+0026 (&), U+002B (+) and U+003D (=).
+
+# https://url.spec.whatwg.org/#percent-encoded-bytes
+
+URLENCODE_SAFE = "".join(
+ [
+ chr(i)
+ for i in range(0x20, 0x7F)
+ if i not in (0x20, 0x22, 0x23, 0x25, 0x26, 0x2B, 0x3C, 0x3D, 0x3E)
+ ]
+)
+
+
class URL:
"""
url = httpx.URL("HTTPS://jo%40email.com:a%20secret@müller.de:1234/pa%20th?search=ab#anchorlink")
@@ -605,14 +619,7 @@ class QueryParams(typing.Mapping[str, str]):
return sorted(self.multi_items()) == sorted(other.multi_items())
def __str__(self) -> str:
- """
- Note that we use '%20' encoding for spaces, and treat '/' as a safe
- character.
-
- See https://github.com/encode/httpx/issues/2536 and
- https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode
- """
- return urlencode(self.multi_items())
+ return urlencode(self.multi_items(), safe=URLENCODE_SAFE)
def __repr__(self) -> str:
class_name = self.__class__.__name__
ImportError while loading conftest '/private/tmp/swe_work/mined_oracle/httpx_3373/b/workspace/tests/conftest.py'.
tests/conftest.py:9: in <module>
import trustme
E ModuleNotFoundError: No module named 'trustme'