Skip to content

Commit 992699c

Browse files
authored
Adds Nima WebClient Shortcuts for media support (helidon-io#6951)
* Adds Nima WebClient Shortcuts for media support Signed-off-by: Laird Nelson <laird.nelson@oracle.com>
1 parent 24048d6 commit 992699c

4 files changed

Lines changed: 37 additions & 6 deletions

File tree

nima/webclient/webclient/src/main/java/io/helidon/nima/webclient/http1/ClientRequestImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import io.helidon.common.uri.UriQuery;
3838
import io.helidon.common.uri.UriQueryWriteable;
3939
import io.helidon.nima.common.tls.Tls;
40+
import io.helidon.nima.http.media.MediaContext;
4041
import io.helidon.nima.webclient.ClientConnection;
4142
import io.helidon.nima.webclient.UriHelper;
4243
import io.helidon.nima.webclient.WebClientServiceRequest;
@@ -52,6 +53,7 @@ class ClientRequestImpl implements Http1ClientRequest {
5253
private final UriHelper uri;
5354
private final String requestId;
5455
private final Http1ClientConfig clientConfig;
56+
private final MediaContext mediaContext;
5557

5658
private WritableHeaders<?> explicitHeaders = WritableHeaders.create();
5759
private boolean followRedirects;
@@ -70,6 +72,7 @@ class ClientRequestImpl implements Http1ClientRequest {
7072
this.uri = helper;
7173

7274
this.clientConfig = clientConfig;
75+
this.mediaContext = clientConfig.mediaContext();
7376
this.followRedirects = clientConfig.followRedirects();
7477
this.maxRedirects = clientConfig.maxRedirects();
7578
this.tls = clientConfig.tls().orElse(null);
@@ -85,7 +88,6 @@ private ClientRequestImpl(ClientRequestImpl request,
8588
UriHelper helper,
8689
UriQueryWriteable query) {
8790
this(request.clientConfig, method, helper, query);
88-
8991
this.followRedirects = request.followRedirects;
9092
this.maxRedirects = request.maxRedirects;
9193
this.tls = request.tls;
@@ -358,6 +360,7 @@ private ClientResponseImpl invokeServices(WebClientService.Chain callChain,
358360
serviceResponse.headers(),
359361
serviceResponse.connection(),
360362
serviceResponse.reader(),
363+
mediaContext,
361364
complete);
362365
}
363366

nima/webclient/webclient/src/main/java/io/helidon/nima/webclient/http1/ClientResponseImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class ClientResponseImpl implements Http1ClientResponse {
6262
private final DataReader reader;
6363
// todo configurable
6464
private final ContentEncodingContext encodingSupport = ContentEncodingContext.create();
65-
private final MediaContext mediaContext = MediaContext.create();
65+
private final MediaContext mediaContext;
6666
private final String channelId;
6767
private final CompletableFuture<Void> whenComplete;
6868
private final boolean hasTrailers;
@@ -78,12 +78,14 @@ class ClientResponseImpl implements Http1ClientResponse {
7878
ClientResponseHeaders responseHeaders,
7979
ClientConnection connection,
8080
DataReader reader,
81+
MediaContext mediaContext,
8182
CompletableFuture<Void> whenComplete) {
8283
this.responseStatus = responseStatus;
8384
this.requestHeaders = requestHeaders;
8485
this.responseHeaders = responseHeaders;
8586
this.connection = connection;
8687
this.reader = reader;
88+
this.mediaContext = mediaContext;
8789
this.channelId = connection.channelId();
8890
this.whenComplete = whenComplete;
8991

nima/webclient/webclient/src/main/java/io/helidon/nima/webclient/http1/Http1Client.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.helidon.common.socket.SocketOptions;
2828
import io.helidon.nima.common.tls.Tls;
2929
import io.helidon.nima.http.media.MediaContext;
30+
import io.helidon.nima.http.media.MediaSupport;
3031
import io.helidon.nima.webclient.DefaultDnsResolverProvider;
3132
import io.helidon.nima.webclient.DnsAddressLookup;
3233
import io.helidon.nima.webclient.HttpClient;
@@ -67,6 +68,8 @@ class Http1ClientBuilder extends WebClient.Builder<Http1ClientBuilder, Http1Clie
6768

6869
private static final SocketOptions EMPTY_OPTIONS = SocketOptions.builder().build();
6970

71+
private MediaContext.Builder mediaContextBuilder;
72+
7073
private final Http1ClientConfigDefault.Builder configBuilder = Http1ClientConfigDefault.builder()
7174
.mediaContext(MediaContext.create())
7275
.dnsResolver(DEFAULT_DNS_RESOLVER.get())
@@ -79,6 +82,9 @@ private Http1ClientBuilder() {
7982
@Override
8083
public Http1Client build() {
8184
configBuilder.defaultHeaders(defaultHeaders());
85+
if (mediaContextBuilder != null) {
86+
configBuilder.mediaContext(mediaContextBuilder.fallback(configBuilder.mediaContext()).build());
87+
}
8288
return new Http1ClientImpl(configBuilder.build());
8389
}
8490

@@ -188,8 +194,27 @@ public Http1ClientBuilder validateHeaders(boolean validateHeaders) {
188194
* @return updated builder
189195
*/
190196
public Http1ClientBuilder mediaContext(MediaContext mediaContext) {
191-
Objects.requireNonNull(mediaContext);
192-
configBuilder.mediaContext(mediaContext);
197+
configBuilder.mediaContext(Objects.requireNonNull(mediaContext, "mediaContext"));
198+
return this;
199+
}
200+
201+
/**
202+
* Add an explicit media support to the list.
203+
* By default, all discovered media supports will be available to the server. Use this method only when
204+
* the media support is not discoverable by service loader, or when using explicit
205+
* {@link #mediaContext(io.helidon.nima.http.media.MediaContext)}.
206+
*
207+
* @param mediaSupport media support to add
208+
* @return updated builder
209+
*/
210+
public Http1ClientBuilder addMediaSupport(MediaSupport mediaSupport) {
211+
Objects.requireNonNull(mediaSupport);
212+
if (mediaContextBuilder == null) {
213+
mediaContextBuilder = MediaContext.builder()
214+
.discoverServices(false);
215+
}
216+
217+
mediaContextBuilder.addMediaSupport(mediaSupport);
193218
return this;
194219
}
195220

nima/webclient/webclient/src/test/java/io/helidon/nima/webclient/http1/ClientRequestImplTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,8 +507,9 @@ public void write(GenericType<T> type,
507507
Headers requestHeaders,
508508
WritableHeaders<?> responseHeaders) {
509509
if (object instanceof String) {
510-
String maxLen5 = ((String) object).substring(0, 5);
511-
impl.write(type, (T) maxLen5, outputStream, requestHeaders, responseHeaders);
510+
@SuppressWarnings("unchecked")
511+
final T maxLen5 = (T)((String) object).substring(0, 5);
512+
impl.write(type, maxLen5, outputStream, requestHeaders, responseHeaders);
512513
} else {
513514
impl.write(type, object, outputStream, requestHeaders, responseHeaders);
514515
}

0 commit comments

Comments
 (0)