Skip to content

Commit 366d079

Browse files
authored
Rest client inbound headers provider added (#4593)
* Rest client inbound headers provider added Signed-off-by: David Kral <[email protected]>
1 parent 01c6a32 commit 366d079

File tree

6 files changed

+249
-9
lines changed

6 files changed

+249
-9
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License v. 2.0, which is available at
6+
* http://www.eclipse.org/legal/epl-2.0.
7+
*
8+
* This Source Code may also be made available under the following Secondary
9+
* Licenses when the conditions for such availability set forth in the
10+
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
11+
* version 2 with the GNU Classpath Exception, which is available at
12+
* https://www.gnu.org/software/classpath/license.html.
13+
*
14+
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15+
*/
16+
package org.glassfish.jersey.microprofile.restclient;
17+
18+
import java.util.List;
19+
import java.util.Map;
20+
21+
/**
22+
* This provider is executed if no headers found for propagation from inbound request via normal propagation mechanism.
23+
* If headers of the inbound request are found, this provider is ignored.
24+
*
25+
* @author David Kral
26+
*/
27+
public interface InboundHeadersProvider {
28+
29+
/**
30+
* Return inbound request headers.
31+
*
32+
* @return inbound request headers
33+
*/
34+
Map<String, List<String>> inboundHeaders();
35+
36+
}

ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/InterfaceModel.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class InterfaceModel {
7373
private final List<AsyncInvocationInterceptorFactory> asyncInterceptorFactories;
7474
private final Set<ResponseExceptionMapper> responseExceptionMappers;
7575
private final Set<ParamConverterProvider> paramConverterProviders;
76+
private final Set<InboundHeadersProvider> inboundHeadersProviders;
7677
private final Set<Annotation> interceptorAnnotations;
7778
private final BeanManager beanManager;
7879

@@ -82,20 +83,23 @@ class InterfaceModel {
8283
* @param restClientClass interface class
8384
* @param responseExceptionMappers registered exception mappers
8485
* @param paramConverterProviders registered parameter providers
86+
* @param inboundHeadersProviders registered inbound header providers
8587
* @param asyncInterceptorFactories async interceptor factories
8688
* @param injectionManager
8789
* @return new model instance
8890
*/
8991
static InterfaceModel from(Class<?> restClientClass,
9092
Set<ResponseExceptionMapper> responseExceptionMappers,
9193
Set<ParamConverterProvider> paramConverterProviders,
94+
Set<InboundHeadersProvider> inboundHeadersProviders,
9295
List<AsyncInvocationInterceptorFactory> asyncInterceptorFactories,
9396
InjectionManager injectionManager,
9497
BeanManager beanManager) {
9598
return new Builder(restClientClass,
9699
responseExceptionMappers,
97100
paramConverterProviders,
98101
asyncInterceptorFactories,
102+
inboundHeadersProviders,
99103
injectionManager,
100104
beanManager).build();
101105
}
@@ -113,6 +117,7 @@ private InterfaceModel(Builder builder) {
113117
this.interceptorAnnotations = builder.interceptorAnnotations;
114118
this.creationalContext = builder.creationalContext;
115119
this.asyncInterceptorFactories = builder.asyncInterceptorFactories;
120+
this.inboundHeadersProviders = builder.inboundHeadersProviders;
116121
this.beanManager = builder.beanManager;
117122
}
118123

@@ -188,6 +193,15 @@ Set<ResponseExceptionMapper> getResponseExceptionMappers() {
188193
return responseExceptionMappers;
189194
}
190195

196+
/**
197+
* Returns {@link Set} of registered {@link InboundHeadersProvider}
198+
*
199+
* @return registered inbound header providers
200+
*/
201+
Set<InboundHeadersProvider> getInboundHeadersProviders() {
202+
return inboundHeadersProviders;
203+
}
204+
191205
/**
192206
* Returns {@link Set} of registered {@link ParamConverterProvider}
193207
*
@@ -249,6 +263,7 @@ private static class Builder {
249263

250264
private final Class<?> restClientClass;
251265

266+
private final Set<InboundHeadersProvider> inboundHeadersProviders;
252267
private final InjectionManager injectionManager;
253268
private final BeanManager beanManager;
254269
private String pathValue;
@@ -266,13 +281,15 @@ private Builder(Class<?> restClientClass,
266281
Set<ResponseExceptionMapper> responseExceptionMappers,
267282
Set<ParamConverterProvider> paramConverterProviders,
268283
List<AsyncInvocationInterceptorFactory> asyncInterceptorFactories,
284+
Set<InboundHeadersProvider> inboundHeadersProviders,
269285
InjectionManager injectionManager,
270286
BeanManager beanManager) {
271287
this.injectionManager = injectionManager;
272288
this.restClientClass = restClientClass;
273289
this.responseExceptionMappers = responseExceptionMappers;
274290
this.paramConverterProviders = paramConverterProviders;
275291
this.asyncInterceptorFactories = asyncInterceptorFactories;
292+
this.inboundHeadersProviders = inboundHeadersProviders;
276293
this.beanManager = beanManager;
277294
filterAllInterceptorAnnotations();
278295
}

ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/MethodModel.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.HashSet;
3232
import java.util.List;
3333
import java.util.Map;
34+
import java.util.Optional;
3435
import java.util.Set;
3536
import java.util.concurrent.CompletableFuture;
3637
import java.util.concurrent.CompletionStage;
@@ -122,6 +123,7 @@ private MethodModel(Builder builder) {
122123
subResourceModel = RestClientModel.from(returnType.getRawType(),
123124
interfaceModel.getResponseExceptionMappers(),
124125
interfaceModel.getParamConverterProviders(),
126+
interfaceModel.getInboundHeadersProviders(),
125127
interfaceModel.getAsyncInterceptorFactories(),
126128
interfaceModel.getInjectionManager(),
127129
interfaceModel.getBeanManager());
@@ -374,11 +376,17 @@ private MultivaluedMap<String, String> resolveCustomHeaders(Object[] args) {
374376
args[parameterModel.getParamPosition()]));
375377

376378
MultivaluedMap<String, String> inbound = new MultivaluedHashMap<>();
377-
HeadersContext.get().ifPresent(headersContext -> inbound.putAll(headersContext.inboundHeaders()));
379+
Optional<HeadersContext> headersContext = HeadersContext.get();
380+
headersContext.ifPresent(hc -> inbound.putAll(hc.inboundHeaders()));
381+
if (!headersContext.isPresent()) {
382+
for (InboundHeadersProvider provider : interfaceModel.getInboundHeadersProviders()) {
383+
inbound.putAll(provider.inboundHeaders());
384+
}
385+
}
378386

379387
AtomicReference<MultivaluedMap<String, String>> toReturn = new AtomicReference<>(customHeaders);
380-
interfaceModel.getClientHeadersFactory().ifPresent(clientHeadersFactory -> toReturn
381-
.set(clientHeadersFactory.update(inbound, customHeaders)));
388+
interfaceModel.getClientHeadersFactory()
389+
.ifPresent(clientHeadersFactory -> toReturn.set(clientHeadersFactory.update(inbound, customHeaders)));
382390
return toReturn.get();
383391
}
384392

ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RestClientBuilderImpl.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class RestClientBuilderImpl implements RestClientBuilder {
8383

8484
private final Set<ResponseExceptionMapper> responseExceptionMappers;
8585
private final Set<ParamConverterProvider> paramConverterProviders;
86+
private final Set<InboundHeadersProvider> inboundHeaderProviders;
8687
private final List<AsyncInvocationInterceptorFactoryPriorityWrapper> asyncInterceptorFactories;
8788
private final Config config;
8889
private final ConfigWrapper configWrapper;
@@ -100,6 +101,7 @@ class RestClientBuilderImpl implements RestClientBuilder {
100101
clientBuilder = ClientBuilder.newBuilder();
101102
responseExceptionMappers = new HashSet<>();
102103
paramConverterProviders = new HashSet<>();
104+
inboundHeaderProviders = new HashSet<>();
103105
asyncInterceptorFactories = new ArrayList<>();
104106
config = ConfigProvider.getConfig();
105107
configWrapper = new ConfigWrapper(clientBuilder.getConfiguration());
@@ -194,6 +196,7 @@ public <T> T build(Class<T> interfaceClass) throws IllegalStateException, RestCl
194196
RestClientModel restClientModel = RestClientModel.from(interfaceClass,
195197
responseExceptionMappers,
196198
paramConverterProviders,
199+
inboundHeaderProviders,
197200
new ArrayList<>(asyncInterceptorFactories),
198201
injectionManagerExposer.injectionManager,
199202
CdiUtil.getBeanManager());
@@ -389,7 +392,8 @@ private boolean isSupportedCustomProvider(Class<?> providerClass) {
389392
return ResponseExceptionMapper.class.isAssignableFrom(providerClass)
390393
|| ParamConverterProvider.class.isAssignableFrom(providerClass)
391394
|| AsyncInvocationInterceptorFactory.class.isAssignableFrom(providerClass)
392-
|| ConnectorProvider.class.isAssignableFrom(providerClass);
395+
|| ConnectorProvider.class.isAssignableFrom(providerClass)
396+
|| InboundHeadersProvider.class.isAssignableFrom(providerClass);
393397
}
394398

395399
private void registerCustomProvider(Object instance, Integer priority) {
@@ -414,6 +418,9 @@ private void registerCustomProvider(Object instance, Integer priority) {
414418
if (instance instanceof ConnectorProvider) {
415419
connector = (ConnectorProvider) instance;
416420
}
421+
if (instance instanceof InboundHeadersProvider) {
422+
inboundHeaderProviders.add((InboundHeadersProvider) instance);
423+
}
417424
}
418425

419426
private static class InjectionManagerExposer implements Feature {

ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RestClientModel.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved.
33
* Copyright (c) 2019 Payara Foundation and/or its affiliates. All rights reserved.
44
*
55
* This program and the accompanying materials are made available under the
@@ -46,22 +46,25 @@ class RestClientModel {
4646
/**
4747
* Creates new instance of the {@link RestClientModel} base on interface class.
4848
*
49-
* @param restClientClass rest client interface
50-
* @param responseExceptionMappers registered exception mappers
51-
* @param paramConverterProviders registered param converters
52-
* @param asyncInterceptors registered async interceptor factories
49+
* @param restClientClass rest client interface
50+
* @param responseExceptionMappers registered exception mappers
51+
* @param paramConverterProviders registered param converters
52+
* @param inboundHeadersProviders registered inbound header providers
53+
* @param asyncInterceptorFactories registered async interceptor factories
5354
* @param injectionManager
5455
* @return new instance
5556
*/
5657
static RestClientModel from(Class<?> restClientClass,
5758
Set<ResponseExceptionMapper> responseExceptionMappers,
5859
Set<ParamConverterProvider> paramConverterProviders,
60+
Set<InboundHeadersProvider> inboundHeadersProviders,
5961
List<AsyncInvocationInterceptorFactory> asyncInterceptorFactories,
6062
InjectionManager injectionManager,
6163
BeanManager beanManager) {
6264
InterfaceModel interfaceModel = InterfaceModel.from(restClientClass,
6365
responseExceptionMappers,
6466
paramConverterProviders,
67+
inboundHeadersProviders,
6568
asyncInterceptorFactories,
6669
injectionManager,
6770
beanManager);

0 commit comments

Comments
 (0)