Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 2 additions & 7 deletions src/ahttpx/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from ._pool import * # Connection, ConnectionPool, Transport
from ._quickstart import * # get, post, put, patch, delete
from ._response import * # Response
from ._request import * # Request
from ._request import * # Method, Request
from ._streams import * # ByteStream, DuplexStream, FileStream, Stream
from ._server import * # serve_http, run
from ._urlencode import * # quote, unquote, urldecode, urlencode
Expand All @@ -34,6 +34,7 @@
"HTTPParser",
"HTTPStream",
"JSON",
"Method",
"MultiPart",
"NetworkBackend",
"NetworkStream",
Expand All @@ -57,9 +58,3 @@
"urldecode",
"urlencode",
]


__locals = locals()
for __name in __all__:
if not __name.startswith('__'):
setattr(__locals[__name], "__module__", "httpx")
8 changes: 4 additions & 4 deletions src/ahttpx/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from ._content import Content
from ._headers import Headers
from ._pool import ConnectionPool, Transport
from ._request import Request
from ._request import Method, Request
from ._response import Response
from ._streams import Stream
from ._urls import URL
Expand Down Expand Up @@ -33,7 +33,7 @@ def __init__(

def build_request(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand All @@ -47,7 +47,7 @@ def build_request(

async def request(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand All @@ -59,7 +59,7 @@ async def request(

async def stream(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand Down
14 changes: 7 additions & 7 deletions src/ahttpx/_pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from ._network import Lock, NetworkBackend, Semaphore
from ._parsers import HTTPParser, HTTPStream
from ._response import Response
from ._request import Request
from ._request import Method, Request
from ._streams import Stream
from ._urls import URL

Expand All @@ -29,7 +29,7 @@ async def close(self):

async def request(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | dict[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand All @@ -41,7 +41,7 @@ async def request(

async def stream(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | dict[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand Down Expand Up @@ -141,7 +141,7 @@ async def __aexit__(
class Connection(Transport):
def __init__(self, stream: Stream, origin: URL | str):
self._stream = stream
self._origin = URL(origin)
self._origin = URL(origin) if not isinstance(origin, URL) else origin
self._keepalive_duration = 5.0
self._idle_expiry = time.monotonic() + self._keepalive_duration
self._request_lock = Lock()
Expand Down Expand Up @@ -183,7 +183,7 @@ async def close(self) -> None:
# Top-level API for working directly with a connection.
async def request(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand All @@ -196,7 +196,7 @@ async def request(

async def stream(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand All @@ -207,7 +207,7 @@ async def stream(

# Send the request...
async def _send_head(self, request: Request) -> None:
method = request.method.encode('ascii')
method = bytes(request.method)
target = request.url.target.encode('ascii')
protocol = b'HTTP/1.1'
await self._parser.send_method_line(method, target, protocol)
Expand Down
29 changes: 25 additions & 4 deletions src/ahttpx/_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,38 @@
__all__ = ["Request"]


class Method:
def __init__(self, method: str, standard=True):
if standard:
method = method.upper()
if method not in ("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE"):
raise ValueError("Non-standard method {method!r}")
self._method = method

def __eq__(self, other) -> bool:
return str(self) == str(other)

def __bytes__(self) -> bytes:
return self._method.encode('ascii')

def __str__(self) -> str:
return self._method

def __repr__(self):
return "<Method {self._method}>"


class Request:
def __init__(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
):
self.method = method
self.url = URL(url)
self.headers = Headers(headers)
self.method = Method(method) if not isinstance(method, Method) else method
self.url = URL(url) if not isinstance(url, URL) else url
self.headers = Headers(headers) if not isinstance(headers, Headers) else headers
self.stream: Stream = ByteStream(b"")

# https://datatracker.ietf.org/doc/html/rfc2616#section-14.23
Expand Down
2 changes: 1 addition & 1 deletion src/ahttpx/_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def __init__(
content: Content | Stream | bytes | None = None,
):
self.status_code = status_code
self.headers = Headers(headers)
self.headers = Headers(headers) if not isinstance(headers, Headers) else headers
self.stream: Stream = ByteStream(b"")

if content is not None:
Expand Down
9 changes: 2 additions & 7 deletions src/httpx/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from ._pool import * # Connection, ConnectionPool, Transport
from ._quickstart import * # get, post, put, patch, delete
from ._response import * # Response
from ._request import * # Request
from ._request import * # Method, Request
from ._streams import * # ByteStream, DuplexStream, FileStream, Stream
from ._server import * # serve_http, run
from ._urlencode import * # quote, unquote, urldecode, urlencode
Expand All @@ -34,6 +34,7 @@
"HTTPParser",
"HTTPStream",
"JSON",
"Method",
"MultiPart",
"NetworkBackend",
"NetworkStream",
Expand All @@ -57,9 +58,3 @@
"urldecode",
"urlencode",
]


__locals = locals()
for __name in __all__:
if not __name.startswith('__'):
setattr(__locals[__name], "__module__", "httpx")
8 changes: 4 additions & 4 deletions src/httpx/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from ._content import Content
from ._headers import Headers
from ._pool import ConnectionPool, Transport
from ._request import Request
from ._request import Method, Request
from ._response import Response
from ._streams import Stream
from ._urls import URL
Expand Down Expand Up @@ -33,7 +33,7 @@ def __init__(

def build_request(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand All @@ -47,7 +47,7 @@ def build_request(

def request(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand All @@ -59,7 +59,7 @@ def request(

def stream(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand Down
14 changes: 7 additions & 7 deletions src/httpx/_pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from ._network import Lock, NetworkBackend, Semaphore
from ._parsers import HTTPParser, HTTPStream
from ._response import Response
from ._request import Request
from ._request import Method, Request
from ._streams import Stream
from ._urls import URL

Expand All @@ -29,7 +29,7 @@ def close(self):

def request(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | dict[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand All @@ -41,7 +41,7 @@ def request(

def stream(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | dict[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand Down Expand Up @@ -141,7 +141,7 @@ def __exit__(
class Connection(Transport):
def __init__(self, stream: Stream, origin: URL | str):
self._stream = stream
self._origin = URL(origin)
self._origin = URL(origin) if not isinstance(origin, URL) else origin
self._keepalive_duration = 5.0
self._idle_expiry = time.monotonic() + self._keepalive_duration
self._request_lock = Lock()
Expand Down Expand Up @@ -183,7 +183,7 @@ def close(self) -> None:
# Top-level API for working directly with a connection.
def request(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand All @@ -196,7 +196,7 @@ def request(

def stream(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
Expand All @@ -207,7 +207,7 @@ def stream(

# Send the request...
def _send_head(self, request: Request) -> None:
method = request.method.encode('ascii')
method = bytes(request.method)
target = request.url.target.encode('ascii')
protocol = b'HTTP/1.1'
self._parser.send_method_line(method, target, protocol)
Expand Down
29 changes: 25 additions & 4 deletions src/httpx/_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,38 @@
__all__ = ["Request"]


class Method:
def __init__(self, method: str, standard=True):
if standard:
method = method.upper()
if method not in ("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE"):
raise ValueError("Non-standard method {method!r}")
self._method = method

def __eq__(self, other) -> bool:
return str(self) == str(other)

def __bytes__(self) -> bytes:
return self._method.encode('ascii')

def __str__(self) -> str:
return self._method

def __repr__(self):
return "<Method {self._method}>"


class Request:
def __init__(
self,
method: str,
method: Method | str,
url: URL | str,
headers: Headers | typing.Mapping[str, str] | None = None,
content: Content | Stream | bytes | None = None,
):
self.method = method
self.url = URL(url)
self.headers = Headers(headers)
self.method = Method(method) if not isinstance(method, Method) else method
self.url = URL(url) if not isinstance(url, URL) else url
self.headers = Headers(headers) if not isinstance(headers, Headers) else headers
self.stream: Stream = ByteStream(b"")

# https://datatracker.ietf.org/doc/html/rfc2616#section-14.23
Expand Down
2 changes: 1 addition & 1 deletion src/httpx/_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def __init__(
content: Content | Stream | bytes | None = None,
):
self.status_code = status_code
self.headers = Headers(headers)
self.headers = Headers(headers) if not isinstance(headers, Headers) else headers
self.stream: Stream = ByteStream(b"")

if content is not None:
Expand Down
2 changes: 1 addition & 1 deletion tests/test_ahttpx/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
async def echo(request):
await request.read()
response = ahttpx.Response(200, content=ahttpx.JSON({
'method': request.method,
'method': str(request.method),
'query-params': dict(request.url.params.items()),
'content-type': request.headers.get('Content-Type'),
'json': json.loads(request.body) if request.body else None,
Expand Down
2 changes: 1 addition & 1 deletion tests/test_ahttpx/test_quickstart.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
async def echo(request):
await request.read()
response = ahttpx.Response(200, content=ahttpx.JSON({
'method': request.method,
'method': str(request.method),
'query-params': dict(request.url.params.items()),
'content-type': request.headers.get('Content-Type'),
'json': json.loads(request.body) if request.body else None,
Expand Down
2 changes: 1 addition & 1 deletion tests/test_httpx/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
def echo(request):
request.read()
response = httpx.Response(200, content=httpx.JSON({
'method': request.method,
'method': str(request.method),
'query-params': dict(request.url.params.items()),
'content-type': request.headers.get('Content-Type'),
'json': json.loads(request.body) if request.body else None,
Expand Down
2 changes: 1 addition & 1 deletion tests/test_httpx/test_quickstart.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
def echo(request):
request.read()
response = httpx.Response(200, content=httpx.JSON({
'method': request.method,
'method': str(request.method),
'query-params': dict(request.url.params.items()),
'content-type': request.headers.get('Content-Type'),
'json': json.loads(request.body) if request.body else None,
Expand Down