1 package com.guinetik.rr.util;
2
3 import com.guinetik.rr.RocketRestOptions;
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
6
7 /**
8 * Utility class for configurable HTTP response logging.
9 *
10 * <p>This class provides methods for logging HTTP response details based on
11 * {@link RocketRestOptions} configuration. It supports logging status codes,
12 * headers, and response bodies with configurable truncation for large responses.
13 *
14 * <h2>Logging Configuration</h2>
15 * <pre class="language-java"><code>
16 * RocketRestOptions options = new RocketRestOptions();
17 *
18 * // Enable/disable logging
19 * options.set(RocketRestOptions.LOGGING_ENABLED, true);
20 *
21 * // Enable raw response logging (status + headers)
22 * options.set(RocketRestOptions.LOG_RAW_RESPONSE, true);
23 *
24 * // Enable body logging
25 * options.set(RocketRestOptions.LOG_RESPONSE_BODY, true);
26 *
27 * // Set max body length before truncation
28 * options.set(RocketRestOptions.MAX_LOGGED_BODY_LENGTH, 4000);
29 * </code></pre>
30 *
31 * <h2>Usage in HTTP Clients</h2>
32 * <pre class="language-java"><code>
33 * // After receiving response
34 * Map<String, String> headers = parseHeaders(connection);
35 * ResponseLogger.logRawResponse(statusCode, headers, options);
36 *
37 * String body = readResponseBody(connection);
38 * ResponseLogger.logResponseBody(body, options);
39 * </code></pre>
40 *
41 * @author guinetik <guinetik@gmail.com>
42 * @see RocketRestOptions
43 * @since 1.0.0
44 */
45 public final class ResponseLogger {
46
47 private static final Logger logger = LoggerFactory.getLogger(ResponseLogger.class);
48
49 private ResponseLogger() {
50 // Utility class, no instantiation
51 }
52
53 /**
54 * Logs the raw HTTP response if enabled in the client options.
55 *
56 * @param statusCode The HTTP status code
57 * @param headers The response headers
58 * @param clientOptions The client options
59 */
60 public static void logRawResponse(int statusCode, java.util.Map<String, String> headers, RocketRestOptions clientOptions) {
61 if (clientOptions.getBoolean(RocketRestOptions.LOG_RAW_RESPONSE, true) &&
62 clientOptions.getBoolean(RocketRestOptions.LOGGING_ENABLED, true)) {
63 logger.debug("HTTP Response: Status={}", statusCode);
64 headers.forEach((key, value) -> logger.debug("Response Header: {}={}", key, value));
65 }
66 }
67
68 /**
69 * Logs the response body if enabled in the client options.
70 *
71 * @param responseBody The response body as a string
72 * @param clientOptions The client options
73 */
74 public static void logResponseBody(String responseBody, RocketRestOptions clientOptions) {
75 if (clientOptions.getBoolean(RocketRestOptions.LOG_RESPONSE_BODY, false) &&
76 clientOptions.getBoolean(RocketRestOptions.LOGGING_ENABLED, true) &&
77 responseBody != null) {
78
79 int maxLength = clientOptions.getInt(RocketRestOptions.MAX_LOGGED_BODY_LENGTH, 4000);
80
81 if (responseBody.length() <= maxLength) {
82 logger.debug("Response Body: {}", responseBody);
83 } else {
84 logger.debug("Response Body (truncated): {}...", responseBody.substring(0, maxLength));
85 logger.debug("Response Body length: {}", responseBody.length());
86 }
87 }
88 }
89 }