Skip to content

Commit d237cfb

Browse files
author
Yeray Diaz Diaz
committed
Add trace logging calls
1 parent f2ce7df commit d237cfb

File tree

11 files changed

+140
-3
lines changed

11 files changed

+140
-3
lines changed

httpcore/_async/connection.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from .._backends.auto import AsyncLock, AsyncSocketStream, AutoBackend
55
from .._types import URL, Headers, Origin, TimeoutDict
6+
from .._utils import get_logger
67
from .base import (
78
AsyncByteStream,
89
AsyncHTTPTransport,
@@ -12,6 +13,8 @@
1213
from .http2 import AsyncHTTP2Connection
1314
from .http11 import AsyncHTTP11Connection
1415

16+
logger = get_logger(__name__)
17+
1518

1619
class AsyncHTTPConnection(AsyncHTTPTransport):
1720
def __init__(
@@ -56,6 +59,9 @@ async def request(
5659
async with self.request_lock:
5760
if self.state == ConnectionState.PENDING:
5861
if not self.socket:
62+
logger.trace(
63+
"open_socket origin=%r timeout=%r", self.origin, timeout
64+
)
5965
self.socket = await self._open_socket(timeout)
6066
self._create_connection(self.socket)
6167
elif self.state in (ConnectionState.READY, ConnectionState.IDLE):
@@ -66,6 +72,9 @@ async def request(
6672
raise NewConnectionRequired()
6773

6874
assert self.connection is not None
75+
logger.trace(
76+
"connection.request method=%r url=%r headers=%r", method, url, headers
77+
)
6978
return await self.connection.request(method, url, headers, stream, timeout)
7079

7180
async def _open_socket(self, timeout: TimeoutDict = None) -> AsyncSocketStream:
@@ -82,6 +91,9 @@ async def _open_socket(self, timeout: TimeoutDict = None) -> AsyncSocketStream:
8291

8392
def _create_connection(self, socket: AsyncSocketStream) -> None:
8493
http_version = socket.get_http_version()
94+
logger.trace(
95+
"create_connection socket=%r http_version=%r", socket, http_version
96+
)
8597
if http_version == "HTTP/2":
8698
self.is_http2 = True
8799
self.connection = AsyncHTTP2Connection(
@@ -110,5 +122,7 @@ def mark_as_ready(self) -> None:
110122

111123
async def start_tls(self, hostname: bytes, timeout: TimeoutDict = None) -> None:
112124
if self.connection is not None:
125+
logger.trace("start_tls hostname=%r timeout=%r", hostname, timeout)
113126
await self.connection.start_tls(hostname, timeout)
127+
logger.trace("start_tls complete hostname=%r timeout=%r", hostname, timeout)
114128
self.socket = self.connection.socket

httpcore/_async/connection_pool.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from .._exceptions import PoolTimeout
66
from .._threadlock import ThreadLock
77
from .._types import URL, Headers, Origin, TimeoutDict
8+
from .._utils import get_logger
89
from .base import (
910
AsyncByteStream,
1011
AsyncHTTPTransport,
@@ -13,6 +14,8 @@
1314
)
1415
from .connection import AsyncHTTPConnection
1516

17+
logger = get_logger(__name__)
18+
1619

1720
class NullSemaphore(AsyncSemaphore):
1821
def __init__(self) -> None:
@@ -133,13 +136,17 @@ async def request(
133136
# We get-or-create a connection as an atomic operation, to ensure
134137
# that HTTP/2 requests issued in close concurrency will end up
135138
# on the same connection.
139+
logger.trace("get_connection_from_pool=%r", origin)
136140
connection = await self._get_connection_from_pool(origin)
137141

138142
if connection is None:
139143
connection = AsyncHTTPConnection(
140144
origin=origin, http2=self._http2, ssl_context=self._ssl_context,
141145
)
146+
logger.trace("created connection=%r", connection)
142147
await self._add_to_pool(connection, timeout=timeout)
148+
else:
149+
logger.trace("reuse connection=%r", connection)
143150

144151
try:
145152
response = await connection.request(
@@ -148,6 +155,7 @@ async def request(
148155
except NewConnectionRequired:
149156
connection = None
150157
except Exception:
158+
logger.trace("remove from pool connection=%r", connection)
151159
await self._remove_from_pool(connection)
152160
raise
153161

httpcore/_async/http11.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from .._backends.auto import AsyncSocketStream
77
from .._exceptions import ProtocolError, map_exceptions
88
from .._types import URL, Headers, TimeoutDict
9+
from .._utils import get_logger
910
from .base import AsyncByteStream, AsyncHTTPTransport, ConnectionState
1011

1112
H11Event = Union[
@@ -17,6 +18,8 @@
1718
h11.ConnectionClosed,
1819
]
1920

21+
logger = get_logger(__name__)
22+
2023

2124
class AsyncHTTP11Connection(AsyncHTTPTransport):
2225
READ_NUM_BYTES = 4096
@@ -73,6 +76,7 @@ async def _send_request(
7376
"""
7477
Send the request line and headers.
7578
"""
79+
logger.trace("send_request method=%r url=%r headers=%s", method, url, headers)
7680
_scheme, _host, _port, target = url
7781
event = h11.Request(method=method, target=target, headers=headers)
7882
await self._send_event(event, timeout)
@@ -85,6 +89,7 @@ async def _send_request_body(
8589
"""
8690
# Send the request body.
8791
async for chunk in stream:
92+
logger.trace("send_data=Data(<%d bytes>)", len(chunk))
8893
event = h11.Data(data=chunk)
8994
await self._send_event(event, timeout)
9095

@@ -122,8 +127,10 @@ async def _receive_response_data(
122127
while True:
123128
event = await self._receive_event(timeout)
124129
if isinstance(event, h11.Data):
130+
logger.trace("receive_event=Data(<%d bytes>)", len(event.data))
125131
yield bytes(event.data)
126132
elif isinstance(event, (h11.EndOfMessage, h11.PAUSED)):
133+
logger.trace("receive_event=%r", event)
127134
break
128135

129136
async def _receive_event(self, timeout: TimeoutDict) -> H11Event:
@@ -132,6 +139,10 @@ async def _receive_event(self, timeout: TimeoutDict) -> H11Event:
132139
"""
133140
while True:
134141
with map_exceptions({h11.RemoteProtocolError: ProtocolError}):
142+
logger.debug(
143+
"h11.RemoteProtocolError exception their_state=%r",
144+
self.h11_state.their_state,
145+
)
135146
event = self.h11_state.next_event()
136147

137148
if event is h11.NEED_DATA:
@@ -143,6 +154,11 @@ async def _receive_event(self, timeout: TimeoutDict) -> H11Event:
143154
return event
144155

145156
async def _response_closed(self) -> None:
157+
logger.trace(
158+
"response_closed our_state=%r their_state=%r",
159+
self.h11_state.our_state,
160+
self.h11_state.their_state,
161+
)
146162
if (
147163
self.h11_state.our_state is h11.DONE
148164
and self.h11_state.their_state is h11.DONE

httpcore/_async/http2.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@
1111
from .._backends.auto import AsyncLock, AsyncSocketStream, AutoBackend
1212
from .._exceptions import ProtocolError
1313
from .._types import URL, Headers, TimeoutDict
14+
from .._utils import get_logger
1415
from .base import (
1516
AsyncByteStream,
1617
AsyncHTTPTransport,
1718
ConnectionState,
1819
NewConnectionRequired,
1920
)
2021

22+
logger = get_logger(__name__)
23+
2124

2225
def get_reason_phrase(status_code: int) -> bytes:
2326
try:
@@ -128,6 +131,7 @@ async def send_connection_init(self, timeout: TimeoutDict) -> None:
128131
h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL
129132
]
130133

134+
logger.trace("initiate_connection=%r", self)
131135
self.h2_state.initiate_connection()
132136
self.h2_state.increment_flow_control_window(2 ** 24)
133137
data_to_send = self.h2_state.data_to_send()
@@ -141,6 +145,7 @@ def is_connection_dropped(self) -> bool:
141145
return self.socket.is_connection_dropped()
142146

143147
async def aclose(self) -> None:
148+
logger.trace("close_connection=%r", self)
144149
if self.state != ConnectionState.CLOSED:
145150
self.state = ConnectionState.CLOSED
146151

@@ -184,6 +189,7 @@ async def receive_events(self, timeout: TimeoutDict) -> None:
184189
events = self.h2_state.receive_data(data)
185190
for event in events:
186191
event_stream_id = getattr(event, "stream_id", 0)
192+
logger.trace("receive_event stream_id=%r event=%s", event_stream_id, event)
187193

188194
if hasattr(event, "error_code"):
189195
raise ProtocolError(event)
@@ -197,6 +203,7 @@ async def receive_events(self, timeout: TimeoutDict) -> None:
197203
async def send_headers(
198204
self, stream_id: int, headers: Headers, end_stream: bool, timeout: TimeoutDict,
199205
) -> None:
206+
logger.trace("send_headers stream_id=%r headers=%r", stream_id, headers)
200207
self.h2_state.send_headers(stream_id, headers, end_stream=end_stream)
201208
self.h2_state.increment_flow_control_window(2 ** 24, stream_id=stream_id)
202209
data_to_send = self.h2_state.data_to_send()
@@ -205,11 +212,13 @@ async def send_headers(
205212
async def send_data(
206213
self, stream_id: int, chunk: bytes, timeout: TimeoutDict
207214
) -> None:
215+
logger.trace("send_data stream_id=%r chunk=%r", stream_id, chunk)
208216
self.h2_state.send_data(stream_id, chunk)
209217
data_to_send = self.h2_state.data_to_send()
210218
await self.socket.write(data_to_send, timeout)
211219

212220
async def end_stream(self, stream_id: int, timeout: TimeoutDict) -> None:
221+
logger.trace("end_stream stream_id=%r", stream_id)
213222
self.h2_state.end_stream(stream_id)
214223
data_to_send = self.h2_state.data_to_send()
215224
await self.socket.write(data_to_send, timeout)
@@ -222,6 +231,7 @@ async def acknowledge_received_data(
222231
await self.socket.write(data_to_send, timeout)
223232

224233
async def close_stream(self, stream_id: int) -> None:
234+
logger.trace("close_stream stream_id=%r", stream_id)
225235
del self.streams[stream_id]
226236
del self.events[stream_id]
227237

httpcore/_async/http_proxy.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33

44
from .._exceptions import ProxyError
55
from .._types import URL, Headers, Origin, TimeoutDict
6+
from .._utils import get_logger
67
from .base import AsyncByteStream
78
from .connection import AsyncHTTPConnection
89
from .connection_pool import AsyncConnectionPool, ResponseByteStream
910

11+
logger = get_logger(__name__)
12+
1013

1114
def merge_headers(
1215
default_headers: Headers = None, override_headers: Headers = None
@@ -85,11 +88,25 @@ async def request(
8588
self.proxy_mode == "DEFAULT" and url[0] == b"http"
8689
) or self.proxy_mode == "FORWARD_ONLY":
8790
# By default HTTP requests should be forwarded.
91+
logger.trace(
92+
"forward_request proxy_origin=%r proxy_headers=%r method=%r url=%r",
93+
self.proxy_origin,
94+
self.proxy_headers,
95+
method,
96+
url,
97+
)
8898
return await self._forward_request(
8999
method, url, headers=headers, stream=stream, timeout=timeout
90100
)
91101
else:
92102
# By default HTTPS should be tunnelled.
103+
logger.trace(
104+
"tunnel_request proxy_origin=%r proxy_headers=%r method=%r url=%r",
105+
self.proxy_origin,
106+
self.proxy_headers,
107+
method,
108+
url,
109+
)
93110
return await self._tunnel_request(
94111
method, url, headers=headers, stream=stream, timeout=timeout
95112
)
@@ -169,7 +186,11 @@ async def _tunnel_request(
169186
proxy_status_code = proxy_response[1]
170187
proxy_reason_phrase = proxy_response[2]
171188
proxy_stream = proxy_response[4]
172-
189+
logger.trace(
190+
"tunnel_response proxy_status_code=%r proxy_reason=%r ",
191+
proxy_status_code,
192+
proxy_reason_phrase,
193+
)
173194
# Read the response data without closing the socket
174195
async for _ in proxy_stream:
175196
pass

httpcore/_sync/connection.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from .._backends.auto import SyncLock, SyncSocketStream, SyncBackend
55
from .._types import URL, Headers, Origin, TimeoutDict
6+
from .._utils import get_logger
67
from .base import (
78
SyncByteStream,
89
SyncHTTPTransport,
@@ -12,6 +13,8 @@
1213
from .http2 import SyncHTTP2Connection
1314
from .http11 import SyncHTTP11Connection
1415

16+
logger = get_logger(__name__)
17+
1518

1619
class SyncHTTPConnection(SyncHTTPTransport):
1720
def __init__(
@@ -56,6 +59,9 @@ def request(
5659
with self.request_lock:
5760
if self.state == ConnectionState.PENDING:
5861
if not self.socket:
62+
logger.trace(
63+
"open_socket origin=%r timeout=%r", self.origin, timeout
64+
)
5965
self.socket = self._open_socket(timeout)
6066
self._create_connection(self.socket)
6167
elif self.state in (ConnectionState.READY, ConnectionState.IDLE):
@@ -66,6 +72,9 @@ def request(
6672
raise NewConnectionRequired()
6773

6874
assert self.connection is not None
75+
logger.trace(
76+
"connection.request method=%r url=%r headers=%r", method, url, headers
77+
)
6978
return self.connection.request(method, url, headers, stream, timeout)
7079

7180
def _open_socket(self, timeout: TimeoutDict = None) -> SyncSocketStream:
@@ -82,6 +91,9 @@ def _open_socket(self, timeout: TimeoutDict = None) -> SyncSocketStream:
8291

8392
def _create_connection(self, socket: SyncSocketStream) -> None:
8493
http_version = socket.get_http_version()
94+
logger.trace(
95+
"create_connection socket=%r http_version=%r", socket, http_version
96+
)
8597
if http_version == "HTTP/2":
8698
self.is_http2 = True
8799
self.connection = SyncHTTP2Connection(
@@ -110,5 +122,7 @@ def mark_as_ready(self) -> None:
110122

111123
def start_tls(self, hostname: bytes, timeout: TimeoutDict = None) -> None:
112124
if self.connection is not None:
125+
logger.trace("start_tls hostname=%r timeout=%r", hostname, timeout)
113126
self.connection.start_tls(hostname, timeout)
127+
logger.trace("start_tls complete hostname=%r timeout=%r", hostname, timeout)
114128
self.socket = self.connection.socket

httpcore/_sync/connection_pool.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from .._exceptions import PoolTimeout
66
from .._threadlock import ThreadLock
77
from .._types import URL, Headers, Origin, TimeoutDict
8+
from .._utils import get_logger
89
from .base import (
910
SyncByteStream,
1011
SyncHTTPTransport,
@@ -13,6 +14,8 @@
1314
)
1415
from .connection import SyncHTTPConnection
1516

17+
logger = get_logger(__name__)
18+
1619

1720
class NullSemaphore(SyncSemaphore):
1821
def __init__(self) -> None:
@@ -133,13 +136,17 @@ def request(
133136
# We get-or-create a connection as an atomic operation, to ensure
134137
# that HTTP/2 requests issued in close concurrency will end up
135138
# on the same connection.
139+
logger.trace("get_connection_from_pool=%r", origin)
136140
connection = self._get_connection_from_pool(origin)
137141

138142
if connection is None:
139143
connection = SyncHTTPConnection(
140144
origin=origin, http2=self._http2, ssl_context=self._ssl_context,
141145
)
146+
logger.trace("created connection=%r", connection)
142147
self._add_to_pool(connection, timeout=timeout)
148+
else:
149+
logger.trace("reuse connection=%r", connection)
143150

144151
try:
145152
response = connection.request(
@@ -148,6 +155,7 @@ def request(
148155
except NewConnectionRequired:
149156
connection = None
150157
except Exception:
158+
logger.trace("remove from pool connection=%r", connection)
151159
self._remove_from_pool(connection)
152160
raise
153161

0 commit comments

Comments
 (0)