|
14 | 14 | from starlette.datastructures import Headers |
15 | 15 | from starlette.types import Scope |
16 | 16 | from mcpgateway.middleware.request_logging_middleware import ( |
| 17 | + _load_rust_request_logging_module, |
| 18 | + _mask_json_payload_for_logging, |
17 | 19 | mask_sensitive_data, |
18 | 20 | mask_jwt_in_cookies, |
19 | 21 | mask_sensitive_headers, |
@@ -250,6 +252,39 @@ def test_mask_sensitive_headers_fall_back_to_python_when_native_extension_import |
250 | 252 | assert len(dummy_logger.warnings) == 1 |
251 | 253 |
|
252 | 254 |
|
| 255 | +def test_mask_json_payload_for_logging_returns_native_string_result(monkeypatch): |
| 256 | + native_extension = MagicMock() |
| 257 | + native_extension.mask_sensitive_json_bytes.return_value = '{"password":"******","data":"ok"}' # pragma: allowlist secret |
| 258 | + monkeypatch.setattr("mcpgateway.middleware.request_logging_middleware.settings.experimental_rust_request_logging_masking_enabled", True, raising=False) |
| 259 | + |
| 260 | + with patch("mcpgateway.middleware.request_logging_middleware._load_rust_request_logging_module", return_value=native_extension): |
| 261 | + masked = _mask_json_payload_for_logging(orjson.dumps({"password": "123", "data": "ok"})) |
| 262 | + |
| 263 | + assert masked == '{"password":"******","data":"ok"}' # pragma: allowlist secret |
| 264 | + |
| 265 | + |
| 266 | +def test_mask_json_payload_for_logging_falls_back_when_native_json_masking_raises(monkeypatch): |
| 267 | + native_extension = MagicMock() |
| 268 | + native_extension.mask_sensitive_json_bytes.side_effect = RuntimeError("boom") |
| 269 | + monkeypatch.setattr("mcpgateway.middleware.request_logging_middleware.settings.experimental_rust_request_logging_masking_enabled", True, raising=False) |
| 270 | + |
| 271 | + with ( |
| 272 | + patch("mcpgateway.middleware.request_logging_middleware._load_rust_request_logging_module", return_value=native_extension), |
| 273 | + patch("mcpgateway.middleware.request_logging_middleware.mask_sensitive_data", return_value={"password": "******", "data": "ok"}), # pragma: allowlist secret |
| 274 | + ): |
| 275 | + masked = _mask_json_payload_for_logging(orjson.dumps({"password": "123", "data": "ok"})) |
| 276 | + |
| 277 | + assert masked == '{"password":"******","data":"ok"}' # pragma: allowlist secret |
| 278 | + |
| 279 | + |
| 280 | +def test_load_rust_request_logging_module_returns_cached_module(monkeypatch): |
| 281 | + cached_module = object() |
| 282 | + monkeypatch.setattr("mcpgateway.middleware.request_logging_middleware._RUST_REQUEST_LOGGING_MODULE", cached_module) |
| 283 | + monkeypatch.setattr("mcpgateway.middleware.request_logging_middleware._RUST_REQUEST_LOGGING_IMPORT_FAILED", False) |
| 284 | + |
| 285 | + assert _load_rust_request_logging_module() is cached_module |
| 286 | + |
| 287 | + |
253 | 288 | # --- RequestLoggingMiddleware tests --- |
254 | 289 |
|
255 | 290 |
|
|
0 commit comments