diff --git a/json_logging/framework/fastapi/implementation.py b/json_logging/framework/fastapi/implementation.py index 71bd85e..dca4644 100644 --- a/json_logging/framework/fastapi/implementation.py +++ b/json_logging/framework/fastapi/implementation.py @@ -111,10 +111,14 @@ def get_method(self, request: starlette.requests.Request): return request.method def get_remote_ip(self, request: starlette.requests.Request): - return request.client.host + if request.client is not None: + return request.client.host + return json_logging.EMPTY_VALUE def get_remote_port(self, request: starlette.requests.Request): - return request.client.port + if request.client is not None: + return request.client.port + return json_logging.EMPTY_VALUE class FastAPIResponseInfoExtractor(BaseResponseInfoExtractor): diff --git a/tests/test_fastapi.py b/tests/test_fastapi.py index 73b5750..3cd3493 100644 --- a/tests/test_fastapi.py +++ b/tests/test_fastapi.py @@ -215,3 +215,22 @@ def test_excluded_from_request_instrumentation(client_and_log_handler): assert response.status_code == 200 assert len(handler.messages) == 0 + + +def test_request_info_extractor_handles_missing_client(): + """Test if missing request client information falls back to empty values""" + import json_logging + from json_logging.framework.fastapi.implementation import FastAPIRequestInfoExtractor + + request = fastapi.Request({ + "type": "http", + "method": "GET", + "path": "/", + "headers": [], + "query_string": b"", + "client": None, + }) + extractor = FastAPIRequestInfoExtractor() + + assert extractor.get_remote_ip(request) == json_logging.EMPTY_VALUE + assert extractor.get_remote_port(request) == json_logging.EMPTY_VALUE