Skip to content
This repository was archived by the owner on Mar 6, 2026. It is now read-only.

Commit 878d7c7

Browse files
committed
chore: add request-response log helpers
1 parent 1da8307 commit 878d7c7

6 files changed

Lines changed: 61 additions & 13 deletions

File tree

google/auth/_helpers.py

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
import datetime
2020
from email.message import Message
2121
import hashlib
22+
import logging
2223
import sys
24+
from typing import Optional, Dict, Any
2325
import urllib
2426

2527
from google.auth import exceptions
@@ -28,15 +30,8 @@
2830
# expiry.
2931
REFRESH_THRESHOLD = datetime.timedelta(minutes=3, seconds=45)
3032

31-
_SENSITIVE_FIELDS = {
32-
"accessToken",
33-
"access_token",
34-
"id_token",
35-
"client_id",
36-
"refresh_token",
37-
"client_secret",
38-
}
39-
33+
# TODO(https://github.com/googleapis/google-auth-library-python/issues/1684): Audit and update the list below.
34+
_SENSITIVE_FIELDS = {"accessToken", "access_token", "id_token", "client_id", "refresh_token", "client_secret"}
4035

4136
def copy_docstring(source_class):
4237
"""Decorator that copies a method's docstring from another class.
@@ -311,3 +306,34 @@ def _hash_value(value, field_name: str) -> str:
311306
hash_object.update(encoded_value)
312307
hex_digest = hash_object.hexdigest()
313308
return f"hashed_{field_name}-{hex_digest}"
309+
310+
311+
def request_log(logger: logging.Logger, method: str, url: str, body: Optional[Any], headers: Optional[Dict[str, str]]) -> None:
312+
"""
313+
Logs an HTTP request at the DEBUG level.
314+
315+
Args:
316+
logger: The logging.Logger instance to use.
317+
method: The HTTP method (e.g., "GET", "POST").
318+
url: The URL of the request.
319+
body: The request body (can be None).
320+
headers: The request headers (can be None).
321+
"""
322+
# TODO(https://github.com/googleapis/google-auth-library-python/issues/1680): Log only if enabled.
323+
# TODO(https://github.com/googleapis/google-auth-library-python/issues/1682): Add httpRequest extra to log event.
324+
# TODO(https://github.com/googleapis/google-auth-library-python/issues/1681): Hash sensitive information.
325+
logger.debug("Making request: %s %s", method, url)
326+
327+
328+
def response_log(logger: logging.Logger, response: Any) -> None:
329+
"""
330+
Logs an HTTP response at the DEBUG level.
331+
332+
Args:
333+
logger: The logging.Logger instance to use.
334+
response: The HTTP response object to log.
335+
"""
336+
# TODO(https://github.com/googleapis/google-auth-library-python/issues/1680): Log only if enabled.
337+
# TODO(https://github.com/googleapis/google-auth-library-python/issues/1683): Add httpResponse extra to log event.
338+
# TODO(https://github.com/googleapis/google-auth-library-python/issues/1681): Hash sensitive information.
339+
logger.debug("Response received...")

google/auth/aio/transport/aiohttp.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"""
1717

1818
import asyncio
19+
import logging
1920
from typing import AsyncGenerator, Mapping, Optional
2021

2122
try:
@@ -29,6 +30,10 @@
2930
from google.auth import exceptions
3031
from google.auth.aio import transport
3132

33+
from _helpers import request_log, response_log
34+
35+
_LOGGER = logging.getLogger(__name__)
36+
3237

3338
class Response(transport.Response):
3439
"""
@@ -155,6 +160,7 @@ async def __call__(
155160
self._session = aiohttp.ClientSession()
156161

157162
client_timeout = aiohttp.ClientTimeout(total=timeout)
163+
request_log(_LOGGER, method, url, body, headers)
158164
response = await self._session.request(
159165
method,
160166
url,
@@ -163,6 +169,7 @@ async def __call__(
163169
timeout=client_timeout,
164170
**kwargs,
165171
)
172+
response_log(_LOGGER, response)
166173
return Response(response)
167174

168175
except aiohttp.ClientError as caught_exc:

google/auth/transport/_aiohttp_requests.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,17 @@
2424
import functools
2525

2626
import aiohttp # type: ignore
27+
import logging
2728
import urllib3 # type: ignore
2829

2930
from google.auth import exceptions
3031
from google.auth import transport
3132
from google.auth.transport import requests
3233

34+
from _helpers import request_log, response_log
35+
36+
_LOGGER = logging.getLogger(__name__)
37+
3338
# Timeout can be re-defined depending on async requirement. Currently made 60s more than
3439
# sync timeout.
3540
_DEFAULT_TIMEOUT = 180 # in seconds
@@ -182,10 +187,11 @@ async def __call__(
182187
self.session = aiohttp.ClientSession(
183188
auto_decompress=False
184189
) # pragma: NO COVER
185-
requests._LOGGER.debug("Making request: %s %s", method, url)
190+
request_log(_LOGGER, method, url, body, headers)
186191
response = await self.session.request(
187192
method, url, data=body, headers=headers, timeout=timeout, **kwargs
188193
)
194+
response_log(_LOGGER, response)
189195
return _CombinedResponse(response)
190196

191197
except aiohttp.ClientError as caught_exc:

google/auth/transport/_http_client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
from google.auth import exceptions
2323
from google.auth import transport
2424

25+
from _helpers import request_log, response_log
26+
2527
_LOGGER = logging.getLogger(__name__)
2628

2729

@@ -99,10 +101,11 @@ def __call__(
99101
connection = http_client.HTTPConnection(parts.netloc, timeout=timeout)
100102

101103
try:
102-
_LOGGER.debug("Making request: %s %s", method, url)
103104

105+
request_log(_LOGGER, method, url, body, headers)
104106
connection.request(method, path, body=body, headers=headers, **kwargs)
105107
response = connection.getresponse()
108+
response_log(_LOGGER, response)
106109
return Response(response)
107110

108111
except (http_client.HTTPException, socket.error) as caught_exc:

google/auth/transport/requests.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import google.auth.transport._mtls_helper
4141
from google.oauth2 import service_account
4242

43+
from _helpers import request_log, response_log
44+
4345
_LOGGER = logging.getLogger(__name__)
4446

4547
_DEFAULT_TIMEOUT = 120 # in seconds
@@ -182,10 +184,11 @@ def __call__(
182184
google.auth.exceptions.TransportError: If any exception occurred.
183185
"""
184186
try:
185-
_LOGGER.debug("Making request: %s %s", method, url)
187+
request_log(_LOGGER, method, url, body, headers)
186188
response = self.session.request(
187189
method, url, data=body, headers=headers, timeout=timeout, **kwargs
188190
)
191+
response_log(_LOGGER, response)
189192
return _Response(response)
190193
except requests.exceptions.RequestException as caught_exc:
191194
new_exc = exceptions.TransportError(caught_exc)

google/auth/transport/urllib3.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
else: # pragma: NO COVER
5353
RequestMethods = urllib3.request.RequestMethods # type: ignore
5454

55+
from _helpers import request_log, response_log
56+
5557
_LOGGER = logging.getLogger(__name__)
5658

5759

@@ -136,10 +138,11 @@ def __call__(
136138
kwargs["timeout"] = timeout
137139

138140
try:
139-
_LOGGER.debug("Making request: %s %s", method, url)
141+
request_log(_LOGGER, method, url, body, headers)
140142
response = self.http.request(
141143
method, url, body=body, headers=headers, **kwargs
142144
)
145+
response_log(_LOGGER, response)
143146
return _Response(response)
144147
except urllib3.exceptions.HTTPError as caught_exc:
145148
new_exc = exceptions.TransportError(caught_exc)

0 commit comments

Comments
 (0)