Skip to content

Commit

Permalink
Adds Nima WebClient Shortcuts for media support (#6951)
Browse files Browse the repository at this point in the history
* Adds Nima WebClient Shortcuts for media support

Signed-off-by: Laird Nelson <laird.nelson@oracle.com>
  • Loading branch information
ljnelson authored Jun 13, 2023
1 parent 24048d6 commit 992699c
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import io.helidon.common.uri.UriQuery;
import io.helidon.common.uri.UriQueryWriteable;
import io.helidon.nima.common.tls.Tls;
import io.helidon.nima.http.media.MediaContext;
import io.helidon.nima.webclient.ClientConnection;
import io.helidon.nima.webclient.UriHelper;
import io.helidon.nima.webclient.WebClientServiceRequest;
Expand All @@ -52,6 +53,7 @@ class ClientRequestImpl implements Http1ClientRequest {
private final UriHelper uri;
private final String requestId;
private final Http1ClientConfig clientConfig;
private final MediaContext mediaContext;

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

this.clientConfig = clientConfig;
this.mediaContext = clientConfig.mediaContext();
this.followRedirects = clientConfig.followRedirects();
this.maxRedirects = clientConfig.maxRedirects();
this.tls = clientConfig.tls().orElse(null);
Expand All @@ -85,7 +88,6 @@ private ClientRequestImpl(ClientRequestImpl request,
UriHelper helper,
UriQueryWriteable query) {
this(request.clientConfig, method, helper, query);

this.followRedirects = request.followRedirects;
this.maxRedirects = request.maxRedirects;
this.tls = request.tls;
Expand Down Expand Up @@ -358,6 +360,7 @@ private ClientResponseImpl invokeServices(WebClientService.Chain callChain,
serviceResponse.headers(),
serviceResponse.connection(),
serviceResponse.reader(),
mediaContext,
complete);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class ClientResponseImpl implements Http1ClientResponse {
private final DataReader reader;
// todo configurable
private final ContentEncodingContext encodingSupport = ContentEncodingContext.create();
private final MediaContext mediaContext = MediaContext.create();
private final MediaContext mediaContext;
private final String channelId;
private final CompletableFuture<Void> whenComplete;
private final boolean hasTrailers;
Expand All @@ -78,12 +78,14 @@ class ClientResponseImpl implements Http1ClientResponse {
ClientResponseHeaders responseHeaders,
ClientConnection connection,
DataReader reader,
MediaContext mediaContext,
CompletableFuture<Void> whenComplete) {
this.responseStatus = responseStatus;
this.requestHeaders = requestHeaders;
this.responseHeaders = responseHeaders;
this.connection = connection;
this.reader = reader;
this.mediaContext = mediaContext;
this.channelId = connection.channelId();
this.whenComplete = whenComplete;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import io.helidon.common.socket.SocketOptions;
import io.helidon.nima.common.tls.Tls;
import io.helidon.nima.http.media.MediaContext;
import io.helidon.nima.http.media.MediaSupport;
import io.helidon.nima.webclient.DefaultDnsResolverProvider;
import io.helidon.nima.webclient.DnsAddressLookup;
import io.helidon.nima.webclient.HttpClient;
Expand Down Expand Up @@ -67,6 +68,8 @@ class Http1ClientBuilder extends WebClient.Builder<Http1ClientBuilder, Http1Clie

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

private MediaContext.Builder mediaContextBuilder;

private final Http1ClientConfigDefault.Builder configBuilder = Http1ClientConfigDefault.builder()
.mediaContext(MediaContext.create())
.dnsResolver(DEFAULT_DNS_RESOLVER.get())
Expand All @@ -79,6 +82,9 @@ private Http1ClientBuilder() {
@Override
public Http1Client build() {
configBuilder.defaultHeaders(defaultHeaders());
if (mediaContextBuilder != null) {
configBuilder.mediaContext(mediaContextBuilder.fallback(configBuilder.mediaContext()).build());
}
return new Http1ClientImpl(configBuilder.build());
}

Expand Down Expand Up @@ -188,8 +194,27 @@ public Http1ClientBuilder validateHeaders(boolean validateHeaders) {
* @return updated builder
*/
public Http1ClientBuilder mediaContext(MediaContext mediaContext) {
Objects.requireNonNull(mediaContext);
configBuilder.mediaContext(mediaContext);
configBuilder.mediaContext(Objects.requireNonNull(mediaContext, "mediaContext"));
return this;
}

/**
* Add an explicit media support to the list.
* By default, all discovered media supports will be available to the server. Use this method only when
* the media support is not discoverable by service loader, or when using explicit
* {@link #mediaContext(io.helidon.nima.http.media.MediaContext)}.
*
* @param mediaSupport media support to add
* @return updated builder
*/
public Http1ClientBuilder addMediaSupport(MediaSupport mediaSupport) {
Objects.requireNonNull(mediaSupport);
if (mediaContextBuilder == null) {
mediaContextBuilder = MediaContext.builder()
.discoverServices(false);
}

mediaContextBuilder.addMediaSupport(mediaSupport);
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -507,8 +507,9 @@ public void write(GenericType<T> type,
Headers requestHeaders,
WritableHeaders<?> responseHeaders) {
if (object instanceof String) {
String maxLen5 = ((String) object).substring(0, 5);
impl.write(type, (T) maxLen5, outputStream, requestHeaders, responseHeaders);
@SuppressWarnings("unchecked")
final T maxLen5 = (T)((String) object).substring(0, 5);
impl.write(type, maxLen5, outputStream, requestHeaders, responseHeaders);
} else {
impl.write(type, object, outputStream, requestHeaders, responseHeaders);
}
Expand Down

0 comments on commit 992699c

Please sign in to comment.