Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds Nima WebClient Shortcuts for media support #6951

Merged
merged 3 commits into from
Jun 13, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,8 @@ private ClientRequestImpl(ClientRequestImpl request,
UriHelper helper,
UriQueryWriteable query) {
this(request.clientConfig, method, helper, query);

this.clientConfig = request.clientConfig;
this.mediaContext = request.mediaContext;
this.followRedirects = request.followRedirects;
this.maxRedirects = request.maxRedirects;
this.tls = request.tls;
Expand Down Expand Up @@ -358,6 +362,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