View Javadoc
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&lt;String, String&gt; 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 &lt;guinetik@gmail.com&gt;
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  }