From cfb91d3991d58ea4e9fa0e8810f0fdf6cbc1ed20 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Mon, 13 Oct 2025 22:30:44 -0400 Subject: [PATCH 1/2] [client] Allow Custom Headers to be Suppressed - use a set to determine if a header should be suppressed - adds a method to the client builder to add to that set --- .../io/avaje/http/client/DHttpClientBuilder.java | 11 ++++++++++- .../java/io/avaje/http/client/HttpClient.java | 7 +++++++ .../java/io/avaje/http/client/RequestLogger.java | 15 ++++++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java index f7e8a9ced..0a3d5decf 100644 --- a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java +++ b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java @@ -10,8 +10,10 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -50,6 +52,7 @@ final class DHttpClientBuilder implements HttpClient.Builder, HttpClient.Builder private final List interceptors = new ArrayList<>(); private final List listeners = new ArrayList<>(); + private final Set suppressed = new HashSet<>(); private void configureRetryHandler(BeanScope beanScope) { beanScope.getOptional(RetryHandler.class) @@ -170,7 +173,7 @@ private DHttpClientContext buildClient() { final var httpClient = client != null ? client : defaultClient(); if (requestLogging) { // register the built-in request/response logging - this.listeners.add(new RequestLogger()); + this.listeners.add(new RequestLogger("\n", suppressed)); } if (bodyAdapter == null) { bodyAdapter = defaultBodyAdapter(); @@ -317,6 +320,12 @@ public HttpClient.Builder priority(int priority) { return this; } + @Override + public HttpClient.Builder suppressHeader(String header) { + this.suppressed.add(header); + return this; + } + @Override public HttpClient.Builder.State state() { return this; diff --git a/http-client/src/main/java/io/avaje/http/client/HttpClient.java b/http-client/src/main/java/io/avaje/http/client/HttpClient.java index 2543d967d..7d7e97459 100644 --- a/http-client/src/main/java/io/avaje/http/client/HttpClient.java +++ b/http-client/src/main/java/io/avaje/http/client/HttpClient.java @@ -321,6 +321,13 @@ interface Builder { */ Builder configureWith(BeanScope beanScope); + /** + * Suppress logging of the given header name. + * + *

Authorization headers are suppressed by default. + */ + Builder suppressHeader(String header); + /** * Return the state of the builder. */ diff --git a/http-client/src/main/java/io/avaje/http/client/RequestLogger.java b/http-client/src/main/java/io/avaje/http/client/RequestLogger.java index 391d04b60..3de0a1acf 100644 --- a/http-client/src/main/java/io/avaje/http/client/RequestLogger.java +++ b/http-client/src/main/java/io/avaje/http/client/RequestLogger.java @@ -1,15 +1,17 @@ package io.avaje.http.client; -import io.avaje.applog.AppLog; - import java.lang.System.Logger.Level; import java.net.http.HttpHeaders; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import io.avaje.applog.AppLog; + /** * Logs request and response details for debug logging purposes using System.Logger. *

@@ -31,6 +33,7 @@ public class RequestLogger implements RequestListener { private static final System.Logger log = AppLog.getLogger("io.avaje.http.client.RequestLogger"); private final String delimiter; + private final Set suppressedHeaders = new HashSet<>(); /** * Create using the {@literal \n} new line character. @@ -43,7 +46,13 @@ public RequestLogger() { * Create with a given line delimiter. */ public RequestLogger(String delimiter) { + this(delimiter, List.of()); + } + + public RequestLogger(String delimiter, Collection suppressedHeaders) { this.delimiter = delimiter; + this.suppressedHeaders.add(DHttpClientContext.AUTHORIZATION); + this.suppressedHeaders.addAll(suppressedHeaders); } @Override @@ -91,6 +100,6 @@ private void headers(StringBuilder sb, String label, HttpHeaders headers) { } boolean obfuscate(String key) { - return DHttpClientContext.AUTHORIZATION.equals(key); + return suppressedHeaders.contains(key); } } From 6d8917191221d4819ccd38364d5b71e019f8a47f Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Wed, 15 Oct 2025 08:05:27 +1300 Subject: [PATCH 2/2] Add javadoc to RequestLogger constructor --- .../src/main/java/io/avaje/http/client/RequestLogger.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/http-client/src/main/java/io/avaje/http/client/RequestLogger.java b/http-client/src/main/java/io/avaje/http/client/RequestLogger.java index 3de0a1acf..c3c3de421 100644 --- a/http-client/src/main/java/io/avaje/http/client/RequestLogger.java +++ b/http-client/src/main/java/io/avaje/http/client/RequestLogger.java @@ -49,6 +49,9 @@ public RequestLogger(String delimiter) { this(delimiter, List.of()); } + /** + * Create with a given line delimiter and set of headers to suppress. + */ public RequestLogger(String delimiter, Collection suppressedHeaders) { this.delimiter = delimiter; this.suppressedHeaders.add(DHttpClientContext.AUTHORIZATION);