Skip to content

Commit d9bd9fb

Browse files
committed
Introduce transports as a module
1 parent fe053e6 commit d9bd9fb

6 files changed

Lines changed: 102 additions & 88 deletions

File tree

‎src/hip/_client.py‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import types
22
import typing
33

4-
from ._connection import ResponseStream, Transport
54
from ._content import HTML, JSON, Binary, Content, Text, select_media
65
from ._headers import Headers
7-
from ._pool import ConnectionPool
86
from ._request import Method, Request
97
from ._response import Response
108
from ._urls import URL
9+
from .transports import ConnectionPool, ResponseStream, Transport
1110

1211
__all__ = ["Client"]
1312

‎src/hip/transports.py‎

Lines changed: 0 additions & 10 deletions
This file was deleted.

‎src/hip/transports/__init__.py‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from .base import ResponseStream, Transport
2+
from .connection import Connection, open_connection
3+
from .pool import ConnectionPool
4+
5+
__all__ = [
6+
"Connection",
7+
"ConnectionPool",
8+
"ResponseStream",
9+
"Transport",
10+
"open_connection",
11+
]

‎src/hip/transports/base.py‎

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import types
2+
3+
from .._content import Content
4+
from .._headers import Headers
5+
from .._request import Method, Request
6+
from .._response import Response, StatusCode
7+
from .._streams import Stream
8+
from .._urls import URL
9+
10+
__all__ = ["ResponseStream", "Transport"]
11+
12+
13+
class ResponseStream(Stream):
14+
def __init__(
15+
self, status_code: StatusCode, headers: Headers, stream: Stream
16+
) -> None:
17+
self.status_code = status_code
18+
self.headers = headers
19+
self.stream = stream
20+
21+
def read(self, size: int = -1) -> bytes:
22+
return self.stream.read(size)
23+
24+
def close(self):
25+
self.stream.close()
26+
27+
def __enter__(self):
28+
return self
29+
30+
def __exit__(
31+
self,
32+
exc_type: type[BaseException] | None = None,
33+
exc_value: BaseException | None = None,
34+
traceback: types.TracebackType | None = None,
35+
) -> None:
36+
self.close()
37+
38+
39+
class Transport:
40+
def send(self, request: Request) -> ResponseStream:
41+
raise NotImplementedError()
42+
43+
def close(self):
44+
pass
45+
46+
def request(
47+
self,
48+
method: Method | str,
49+
url: URL | str,
50+
headers: Headers | dict[str, str] | None = None,
51+
content: Content | bytes | None = None,
52+
) -> Response:
53+
request = Request(method, url, headers=headers, content=content)
54+
with self.send(request) as stream:
55+
body = stream.read()
56+
return Response(stream.status_code, headers=stream.headers, content=body)
57+
58+
def stream(
59+
self,
60+
method: Method | str,
61+
url: URL | str,
62+
headers: Headers | dict[str, str] | None = None,
63+
content: Content | bytes | None = None,
64+
) -> ResponseStream:
65+
request = Request(method, url, headers=headers, content=content)
66+
return self.send(request)
Lines changed: 12 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -5,78 +5,18 @@
55
# Once we drop 3.10 support, we can use 'typing.Self'.
66
from typing_extensions import Self
77

8-
from ._body import GZipStream, HTTPStream
9-
from ._content import Content
10-
from ._headers import Headers
11-
from ._parsers import HTTPParser
12-
from ._request import Method, Request
13-
from ._response import Response, StatusCode
14-
from ._streams import Stream
15-
from ._urls import URL
16-
from .backends.sync import Lock, NetworkBackend
17-
18-
__all__ = [
19-
"Connection",
20-
"ResponseStream",
21-
"Transport",
22-
"open_connection",
23-
]
24-
25-
26-
class ResponseStream(Stream):
27-
def __init__(
28-
self, status_code: StatusCode, headers: Headers, stream: Stream
29-
) -> None:
30-
self.status_code = status_code
31-
self.headers = headers
32-
self.stream = stream
33-
34-
def read(self, size: int = -1) -> bytes:
35-
return self.stream.read(size)
36-
37-
def close(self):
38-
self.stream.close()
39-
40-
def __enter__(self):
41-
return self
42-
43-
def __exit__(
44-
self,
45-
exc_type: type[BaseException] | None = None,
46-
exc_value: BaseException | None = None,
47-
traceback: types.TracebackType | None = None,
48-
) -> None:
49-
self.close()
50-
51-
52-
class Transport:
53-
def send(self, request: Request) -> ResponseStream:
54-
raise NotImplementedError()
55-
56-
def close(self):
57-
pass
58-
59-
def request(
60-
self,
61-
method: Method | str,
62-
url: URL | str,
63-
headers: Headers | dict[str, str] | None = None,
64-
content: Content | bytes | None = None,
65-
) -> Response:
66-
request = Request(method, url, headers=headers, content=content)
67-
with self.send(request) as stream:
68-
body = stream.read()
69-
return Response(stream.status_code, headers=stream.headers, content=body)
70-
71-
def stream(
72-
self,
73-
method: Method | str,
74-
url: URL | str,
75-
headers: Headers | dict[str, str] | None = None,
76-
content: Content | bytes | None = None,
77-
) -> ResponseStream:
78-
request = Request(method, url, headers=headers, content=content)
79-
return self.send(request)
8+
from .._body import GZipStream, HTTPStream
9+
from .._content import Content
10+
from .._headers import Headers
11+
from .._parsers import HTTPParser
12+
from .._request import Method, Request
13+
from .._response import Response, StatusCode
14+
from .._streams import Stream
15+
from .._urls import URL
16+
from ..backends.sync import Lock, NetworkBackend
17+
from .base import ResponseStream, Transport
18+
19+
__all__ = ["Connection", "open_connection"]
8020

8121

8222
class Connection(Transport):
Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,18 @@
66
# Once we drop 3.10 support, we can use 'typing.Self'.
77
from typing_extensions import Self
88

9-
from ._connection import Connection, ResponseStream, Transport, open_connection
10-
from ._request import Request
11-
from ._urls import URL
12-
from .backends.sync import NetworkBackend, Semaphore
9+
from ..backends.sync import NetworkBackend, Semaphore
10+
from .._request import Request
11+
from .._urls import URL
12+
from .base import ResponseStream, Transport
13+
from .connection import (
14+
Connection,
15+
open_connection,
16+
Connection,
17+
ResponseStream,
18+
Transport,
19+
open_connection,
20+
)
1321

1422
__all__ = [
1523
"ConnectionPool",

0 commit comments

Comments
 (0)