From 247cb85a2e9da3a3ef4296e6825ff36142016c87 Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Thu, 28 Mar 2024 17:30:33 +0200 Subject: [PATCH] Introduce option for multipartPostEncoderMode in REST Client builder (cherry picked from commit 137c028db670986c993858c34a7213e74a944700) --- .../reactive/QuarkusRestClientBuilder.java | 8 +++++++ .../runtime/QuarkusRestClientBuilderImpl.java | 6 +++++ .../runtime/RestClientBuilderImpl.java | 23 +++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/QuarkusRestClientBuilder.java b/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/QuarkusRestClientBuilder.java index a7c66165bea7f..c67adff8fa9e9 100644 --- a/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/QuarkusRestClientBuilder.java +++ b/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/QuarkusRestClientBuilder.java @@ -178,6 +178,14 @@ static QuarkusRestClientBuilder newBuilder() { */ QuarkusRestClientBuilder followRedirects(boolean follow); + /** + * Mode in which the form data are encoded. Possible values are `HTML5`, `RFC1738` and `RFC3986`. + * The modes are described in the + * Netty + * documentation + */ + QuarkusRestClientBuilder multipartPostEncoderMode(String mode); + /** * Specifies the HTTP proxy hostname/IP address and port to use for requests from client instances. * diff --git a/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/runtime/QuarkusRestClientBuilderImpl.java b/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/runtime/QuarkusRestClientBuilderImpl.java index 3ba9ad115f961..5a663f92641c4 100644 --- a/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/runtime/QuarkusRestClientBuilderImpl.java +++ b/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/runtime/QuarkusRestClientBuilderImpl.java @@ -120,6 +120,12 @@ public QuarkusRestClientBuilder nonProxyHosts(String nonProxyHosts) { return this; } + @Override + public QuarkusRestClientBuilder multipartPostEncoderMode(String mode) { + proxy.multipartPostEncoderMode(mode); + return this; + } + @Override public QuarkusRestClientBuilder queryParamStyle(QueryParamStyle style) { proxy.queryParamStyle(style); diff --git a/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/runtime/RestClientBuilderImpl.java b/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/runtime/RestClientBuilderImpl.java index 3920c8db594c1..daa221114c341 100644 --- a/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/runtime/RestClientBuilderImpl.java +++ b/extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/runtime/RestClientBuilderImpl.java @@ -10,6 +10,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; @@ -34,6 +35,7 @@ import org.jboss.resteasy.reactive.client.impl.ClientBuilderImpl; import org.jboss.resteasy.reactive.client.impl.ClientImpl; import org.jboss.resteasy.reactive.client.impl.WebTargetImpl; +import org.jboss.resteasy.reactive.client.impl.multipart.PausableHttpPostRequestEncoder; import org.jboss.resteasy.reactive.common.jaxrs.ConfigurationImpl; import org.jboss.resteasy.reactive.common.jaxrs.MultiQueryParamMode; @@ -63,6 +65,7 @@ public class RestClientBuilderImpl implements RestClientBuilder { private boolean followRedirects; private QueryParamStyle queryParamStyle; + private String multipartPostEncoderMode; private String proxyHost; private Integer proxyPort; private String proxyUser; @@ -167,6 +170,11 @@ public RestClientBuilderImpl nonProxyHosts(String nonProxyHosts) { return this; } + public RestClientBuilderImpl multipartPostEncoderMode(String mode) { + this.multipartPostEncoderMode = mode; + return this; + } + public RestClientBuilderImpl clientLogger(ClientLogger clientLogger) { this.clientLogger = clientLogger; return this; @@ -435,6 +443,21 @@ public T build(Class aClass) throws IllegalStateException, RestClientDefi configureProxy(globalProxy.host, globalProxy.port, restClientsConfig.proxyUser.orElse(null), restClientsConfig.proxyPassword.orElse(null), restClientsConfig.nonProxyHosts.orElse(null)); } + + if (!clientBuilder.getConfiguration().hasProperty(QuarkusRestClientProperties.MULTIPART_ENCODER_MODE)) { + PausableHttpPostRequestEncoder.EncoderMode multipartPostEncoderMode = null; + if (this.multipartPostEncoderMode != null) { + multipartPostEncoderMode = PausableHttpPostRequestEncoder.EncoderMode + .valueOf(this.multipartPostEncoderMode.toUpperCase(Locale.ROOT)); + } else if (restClientsConfig.multipartPostEncoderMode.isPresent()) { + multipartPostEncoderMode = PausableHttpPostRequestEncoder.EncoderMode + .valueOf(restClientsConfig.multipartPostEncoderMode.get().toUpperCase(Locale.ROOT)); + } + if (multipartPostEncoderMode != null) { + clientBuilder.property(QuarkusRestClientProperties.MULTIPART_ENCODER_MODE, multipartPostEncoderMode); + } + } + ClientImpl client = clientBuilder.build(); WebTargetImpl target = (WebTargetImpl) client.target(uri); target.setParamConverterProviders(paramConverterProviders);