Skip to content

Commit 7449f2a

Browse files
gyeo009Kehrlann
authored andcommitted
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
1 parent ed02736 commit 7449f2a

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

mcp-core/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,10 +241,24 @@ public Builder requestBuilder(HttpRequest.Builder requestBuilder) {
241241
}
242242

243243
/**
244-
* Customizes the HTTP client builder.
244+
* Applies the given consumer to the shared {@link HttpRequest.Builder} <b>once,
245+
* at build time</b>. Any headers set here (e.g., {@code Authorization}) are
246+
* frozen into the template and copied to every subsequent request via
247+
* {@code requestBuilder.copy()}. They <b>cannot be updated</b> after the
248+
* transport is built.
249+
* <p>
250+
* For dynamic, per-request customization (e.g., OAuth token refresh), use
251+
* {@link #httpRequestCustomizer(McpSyncHttpClientRequestCustomizer)} or
252+
* {@link #asyncHttpRequestCustomizer(McpAsyncHttpClientRequestCustomizer)}
253+
* instead.
245254
* @param requestCustomizer the consumer to customize the HTTP request builder
246255
* @return this builder
256+
* @deprecated Use
257+
* {@link #httpRequestCustomizer(McpSyncHttpClientRequestCustomizer)} or
258+
* {@link #asyncHttpRequestCustomizer(McpAsyncHttpClientRequestCustomizer)} which
259+
* run on every request and support dynamic headers.
247260
*/
261+
@Deprecated
248262
public Builder customizeRequest(final Consumer<HttpRequest.Builder> requestCustomizer) {
249263
Assert.notNull(requestCustomizer, "requestCustomizer must not be null");
250264
requestCustomizer.accept(requestBuilder);

mcp-core/src/main/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransport.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,10 +707,24 @@ public Builder requestBuilder(HttpRequest.Builder requestBuilder) {
707707
}
708708

709709
/**
710-
* Customizes the HTTP client builder.
710+
* Applies the given consumer to the shared {@link HttpRequest.Builder} <b>once,
711+
* at build time</b>. Any headers set here (e.g., {@code Authorization}) are
712+
* frozen into the template and copied to every subsequent request via
713+
* {@code requestBuilder.copy()}. They <b>cannot be updated</b> after the
714+
* transport is built.
715+
* <p>
716+
* For dynamic, per-request customization (e.g., OAuth token refresh), use
717+
* {@link #httpRequestCustomizer(McpSyncHttpClientRequestCustomizer)} or
718+
* {@link #asyncHttpRequestCustomizer(McpAsyncHttpClientRequestCustomizer)}
719+
* instead.
711720
* @param requestCustomizer the consumer to customize the HTTP request builder
712721
* @return this builder
722+
* @deprecated Use
723+
* {@link #httpRequestCustomizer(McpSyncHttpClientRequestCustomizer)} or
724+
* {@link #asyncHttpRequestCustomizer(McpAsyncHttpClientRequestCustomizer)} which
725+
* run on every request and support dynamic headers.
713726
*/
727+
@Deprecated
714728
public Builder customizeRequest(final Consumer<HttpRequest.Builder> requestCustomizer) {
715729
Assert.notNull(requestCustomizer, "requestCustomizer must not be null");
716730
requestCustomizer.accept(requestBuilder);

0 commit comments

Comments
 (0)