Deprecate Builder.customizeRequest() in favor of httpRequestCustomizer() (#791)

Deprecate Builder.customizeRequest() in HttpClientSseClientTransport and HttpClientStreamableHttpTransport

customizeRequest() executes its consumer once at build time, freezing
headers into the shared requestBuilder. This silently breaks OAuth
token refresh scenarios where the Authorization header needs to be
updated after the transport is built.

Add @Deprecated and update Javadoc to clarify the build-time-only
semantics and guide users toward httpRequestCustomizer() or
asyncHttpRequestCustomizer() which run on every request.

Closes #788

Signed-off-by: Daniel Garnier-Moiroux <git@garnier.wf>
This commit is contained in:
300:29:1 2026-04-02 18:38:53 +09:00 • committed by Daniel Garnier-Moiroux
commit 7e4c179b77
2 changed files with 16 additions and 2 deletions

View file

@ -241,10 +241,17 @@ public class HttpClientSseClientTransport implements McpClientTransport {
}
/**
* Customizes the HTTP client builder.
* Applies the given consumer to the shared {@link HttpRequest.Builder} <b>once,
* at build time</b>. Any headers set here are frozen into the template and
* <b>cannot be updated</b> after the transport is built.
* @param requestCustomizer the consumer to customize the HTTP request builder
* @return this builder
* @deprecated Use {@link #requestBuilder(HttpRequest.Builder)} for stable
* headers, or {@link #httpRequestCustomizer(McpSyncHttpClientRequestCustomizer)}
* / {@link #asyncHttpRequestCustomizer(McpAsyncHttpClientRequestCustomizer)} for
* dynamic per-request customization.
*/
@Deprecated
public Builder customizeRequest(final Consumer<HttpRequest.Builder> requestCustomizer) {
Assert.notNull(requestCustomizer, "requestCustomizer must not be null");
requestCustomizer.accept(requestBuilder);

View file

@ -738,10 +738,17 @@ public class HttpClientStreamableHttpTransport implements McpClientTransport {
}
/**
* Customizes the HTTP client builder.
* Applies the given consumer to the shared {@link HttpRequest.Builder} <b>once,
* at build time</b>. Any headers set here are frozen into the template and
* <b>cannot be updated</b> after the transport is built.
* @param requestCustomizer the consumer to customize the HTTP request builder
* @return this builder
* @deprecated Use {@link #requestBuilder(HttpRequest.Builder)} for stable
* headers, or {@link #httpRequestCustomizer(McpSyncHttpClientRequestCustomizer)}
* / {@link #asyncHttpRequestCustomizer(McpAsyncHttpClientRequestCustomizer)} for
* dynamic per-request customization.
*/
@Deprecated
public Builder customizeRequest(final Consumer<HttpRequest.Builder> requestCustomizer) {
Assert.notNull(requestCustomizer, "requestCustomizer must not be null");
requestCustomizer.accept(requestBuilder);