Skip to content

Commit 4364a77

Browse files
authored
chore: add request-response log helpers (#1685)
* chore: add request-response log helpers * fix presubmit
1 parent 1da8307 commit 4364a77

File tree

6 files changed

+56
-13
lines changed

6 files changed

+56
-13
lines changed

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: 5 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,8 @@
2930
from google.auth import exceptions
3031
from google.auth.aio import transport
3132

33+
_LOGGER = logging.getLogger(__name__)
34+
3235

3336
class Response(transport.Response):
3437
"""
@@ -155,6 +158,7 @@ async def __call__(
155158
self._session = aiohttp.ClientSession()
156159

157160
client_timeout = aiohttp.ClientTimeout(total=timeout)
161+
_helpers.request_log(_LOGGER, method, url, body, headers)
158162
response = await self._session.request(
159163
method,
160164
url,
@@ -163,6 +167,7 @@ async def __call__(
163167
timeout=client_timeout,
164168
**kwargs,
165169
)
170+
_helpers.response_log(_LOGGER, response)
166171
return Response(response)
167172

168173
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
32+
from google.auth import _helpers
3133
from google.auth.transport import requests
3234

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+
_helpers.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+
_helpers.response_log(_LOGGER, response)
189195
return _CombinedResponse(response)
190196

191197
except aiohttp.ClientError as caught_exc:

google/auth/transport/_http_client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
from google.auth import exceptions
2323
from google.auth import transport
24+
from google.auth import _helpers
2425

2526
_LOGGER = logging.getLogger(__name__)
2627

@@ -99,10 +100,11 @@ def __call__(
99100
connection = http_client.HTTPConnection(parts.netloc, timeout=timeout)
100101

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

104+
_helpers.request_log(_LOGGER, method, url, body, headers)
104105
connection.request(method, path, body=body, headers=headers, **kwargs)
105106
response = connection.getresponse()
107+
_helpers.response_log(_LOGGER, response)
106108
return Response(response)
107109

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

google/auth/transport/requests.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from google.auth import environment_vars
3838
from google.auth import exceptions
3939
from google.auth import transport
40+
from google.auth import _helpers
4041
import google.auth.transport._mtls_helper
4142
from google.oauth2 import service_account
4243

@@ -182,10 +183,11 @@ def __call__(
182183
google.auth.exceptions.TransportError: If any exception occurred.
183184
"""
184185
try:
185-
_LOGGER.debug("Making request: %s %s", method, url)
186+
_helpers.request_log(_LOGGER, method, url, body, headers)
186187
response = self.session.request(
187188
method, url, data=body, headers=headers, timeout=timeout, **kwargs
188189
)
190+
_helpers.response_log(_LOGGER, response)
189191
return _Response(response)
190192
except requests.exceptions.RequestException as caught_exc:
191193
new_exc = exceptions.TransportError(caught_exc)

google/auth/transport/urllib3.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
from google.auth import environment_vars
4646
from google.auth import exceptions
4747
from google.auth import transport
48+
from google.auth import _helpers
4849
from google.oauth2 import service_account
4950

5051
if version.parse(urllib3.__version__) >= version.parse("2.0.0"): # pragma: NO COVER
@@ -136,10 +137,11 @@ def __call__(
136137
kwargs["timeout"] = timeout
137138

138139
try:
139-
_LOGGER.debug("Making request: %s %s", method, url)
140+
_helpers.request_log(_LOGGER, method, url, body, headers)
140141
response = self.http.request(
141142
method, url, body=body, headers=headers, **kwargs
142143
)
144+
_helpers.response_log(_LOGGER, response)
143145
return _Response(response)
144146
except urllib3.exceptions.HTTPError as caught_exc:
145147
new_exc = exceptions.TransportError(caught_exc)

0 commit comments

Comments
 (0)