HeaderTypes,
PrimitiveData,
QueryParamTypes,
+ RawURL,
RequestContent,
RequestData,
RequestFiles,
class URL:
- def __init__(self, url: URLTypes = "", params: QueryParamTypes = None) -> None:
- if isinstance(url, str):
+ def __init__(
+ self, url: typing.Union["URL", str, RawURL] = "", params: QueryParamTypes = None
+ ) -> None:
+ if isinstance(url, (str, tuple)):
+ if isinstance(url, tuple):
+ raw_scheme, raw_host, port, raw_path = url
+ scheme = raw_scheme.decode("ascii")
+ host = raw_host.decode("ascii")
+ port_str = "" if port is None else f":{port}"
+ path = raw_path.decode("ascii")
+ url = f"{scheme}://{host}{port_str}{path}"
+
try:
self._uri_reference = rfc3986.iri_reference(url).encode()
except rfc3986.exceptions.InvalidAuthority as exc:
return self._uri_reference.fragment or ""
@property
- def raw(self) -> typing.Tuple[bytes, bytes, typing.Optional[int], bytes]:
+ def raw(self) -> RawURL:
return (
self.scheme.encode("ascii"),
self.host.encode("ascii"),
class Request:
def __init__(
self,
- method: str,
- url: typing.Union[str, URL],
+ method: typing.Union[str, bytes],
+ url: typing.Union["URL", str, RawURL],
*,
params: QueryParamTypes = None,
headers: HeaderTypes = None,
json: typing.Any = None,
stream: ContentStream = None,
):
- self.method = method.upper()
+ if isinstance(method, bytes):
+ self.method = method.decode("ascii").upper()
+ else:
+ self.method = method.upper()
self.url = URL(url, params=params)
self.headers = Headers(headers)
if cookies:
stream: httpcore.SyncByteStream = None,
timeout: Mapping[str, Optional[float]] = None,
) -> Tuple[bytes, int, bytes, List[Tuple[bytes, bytes]], httpcore.SyncByteStream]:
- raw_scheme, raw_host, port, raw_path = url
- scheme = raw_scheme.decode("ascii")
- host = raw_host.decode("ascii")
- port_str = "" if port is None else f":{port}"
- path = raw_path.decode("ascii")
-
request_headers = httpx.Headers(headers)
content = (
(item for item in stream)
)
request = httpx.Request(
- method=method.decode("ascii"),
- url=f"{scheme}://{host}{port_str}{path}",
+ method=method,
+ url=url,
headers=request_headers,
content=content,
)
request.read()
response = self.handler(request)
return (
- response.http_version.encode("ascii")
- if response.http_version
- else b"HTTP/1.1",
+ (response.http_version or "HTTP/1.1").encode("ascii"),
response.status_code,
response.reason_phrase.encode("ascii"),
response.headers.raw,