in sra/src/main/java/org/apache/syncope/sra/RouteProvider.java [131:405]
protected GatewayFilter toFilter(final SRARouteTO route, final SRARouteFilter gwfilter)
throws ClassNotFoundException, NumberFormatException {
GatewayFilter filter;
switch (gwfilter.getFactory()) {
case ADD_REQUEST_HEADER:
String[] addRequestHeaderArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(AddRequestHeaderGatewayFilterFactory.class).
apply(c -> c.setName(addRequestHeaderArgs[0].trim()).
setValue(addRequestHeaderArgs[1].trim()));
break;
case ADD_REQUEST_PARAMETER:
String[] addRequestParameterArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(AddRequestParameterGatewayFilterFactory.class).
apply(c -> c.setName(addRequestParameterArgs[0].trim()).
setValue(addRequestParameterArgs[1].trim()));
break;
case ADD_RESPONSE_HEADER:
String[] addResponseHeaderArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(AddResponseHeaderGatewayFilterFactory.class).
apply(c -> c.setName(addResponseHeaderArgs[0].trim()).
setValue(addResponseHeaderArgs[1].trim()));
break;
case DEDUPE_RESPONSE_HEADER:
String[] dedupeResponseHeaderArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(DedupeResponseHeaderGatewayFilterFactory.class).
apply(c -> {
c.setName(dedupeResponseHeaderArgs[0].trim());
if (dedupeResponseHeaderArgs.length > 1) {
c.setStrategy(DedupeResponseHeaderGatewayFilterFactory.Strategy.
valueOf(dedupeResponseHeaderArgs[1].trim()));
}
});
break;
case FALLBACK_HEADERS:
String[] fallbackHeadersArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(FallbackHeadersGatewayFilterFactory.class).
apply(c -> {
if (StringUtils.isNotBlank(fallbackHeadersArgs[0])) {
c.setExecutionExceptionTypeHeaderName(fallbackHeadersArgs[0].trim());
}
if (StringUtils.isNotBlank(fallbackHeadersArgs[1])) {
c.setExecutionExceptionMessageHeaderName(fallbackHeadersArgs[1].trim());
}
if (StringUtils.isNotBlank(fallbackHeadersArgs[2])) {
c.setRootCauseExceptionTypeHeaderName(fallbackHeadersArgs[2].trim());
}
if (StringUtils.isNotBlank(fallbackHeadersArgs[3])) {
c.setRootCauseExceptionMessageHeaderName(fallbackHeadersArgs[3].trim());
}
});
break;
case MAP_REQUEST_HEADER:
String[] mapRequestHeaderArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(MapRequestHeaderGatewayFilterFactory.class).
apply(c -> c.setFromHeader(mapRequestHeaderArgs[0].trim()).
setToHeader(mapRequestHeaderArgs[1].trim()));
break;
case PREFIX_PATH:
filter = ctx.getBean(PrefixPathGatewayFilterFactory.class).
apply(c -> c.setPrefix(gwfilter.getArgs().trim()));
break;
case PRESERVE_HOST_HEADER:
filter = ctx.getBean(PreserveHostHeaderGatewayFilterFactory.class).apply();
break;
case REDIRECT_TO:
String[] redirectArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(RedirectToGatewayFilterFactory.class).
apply(redirectArgs[0].trim(), redirectArgs[1].trim());
break;
case REMOVE_REQUEST_HEADER:
filter = ctx.getBean(RemoveRequestHeaderGatewayFilterFactory.class).
apply(c -> c.setName(gwfilter.getArgs().trim()));
break;
case REMOVE_RESPONSE_HEADER:
filter = ctx.getBean(RemoveResponseHeaderGatewayFilterFactory.class).
apply(c -> c.setName(gwfilter.getArgs().trim()));
break;
case REQUEST_RATE_LIMITER:
String[] requestRateLimiterArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(RequestRateLimiterGatewayFilterFactory.class).
apply(c -> {
if (StringUtils.isNotBlank(requestRateLimiterArgs[0])) {
c.setDenyEmptyKey(BooleanUtils.toBoolean(requestRateLimiterArgs[0].trim()));
}
if (StringUtils.isNotBlank(requestRateLimiterArgs[1])) {
c.setEmptyKeyStatus(requestRateLimiterArgs[1].trim());
}
if (StringUtils.isNotBlank(requestRateLimiterArgs[2])) {
c.setKeyResolver(ctx.getBean(requestRateLimiterArgs[2].trim(), KeyResolver.class));
}
if (StringUtils.isNotBlank(requestRateLimiterArgs[3])) {
c.setRateLimiter(ctx.getBean(requestRateLimiterArgs[3].trim(), RateLimiter.class));
}
if (StringUtils.isNotBlank(requestRateLimiterArgs[4])) {
c.setStatusCode(HttpStatus.valueOf(requestRateLimiterArgs[4].trim()));
}
});
break;
case REWRITE_PATH:
String[] rewritePathArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(RewritePathGatewayFilterFactory.class).
apply(c -> c.setRegexp(rewritePathArgs[0].trim()).
setReplacement(rewritePathArgs[1].trim()));
break;
case REWRITE_LOCATION:
String[] rewriteLocationArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(RewriteLocationResponseHeaderGatewayFilterFactory.class).
apply(c -> {
c.setStripVersion(RewriteLocationResponseHeaderGatewayFilterFactory.StripVersion.
valueOf(rewriteLocationArgs[0].trim()));
if (rewriteLocationArgs.length > 1) {
c.setLocationHeaderName(rewriteLocationArgs[1].trim());
}
if (rewriteLocationArgs.length > 2) {
c.setHostValue(rewriteLocationArgs[2].trim());
}
if (rewriteLocationArgs.length > 3) {
c.setProtocols(rewriteLocationArgs[3].trim());
}
});
break;
case REWRITE_RESPONSE_HEADER:
String[] rewriteResponseHeaderArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(RewriteResponseHeaderGatewayFilterFactory.class).
apply(c -> c.setReplacement(rewriteResponseHeaderArgs[2].trim()).
setRegexp(rewriteResponseHeaderArgs[1].trim()).
setName(rewriteResponseHeaderArgs[0].trim()));
break;
case RETRY:
Mutable<Integer> retries = new MutableObject<>();
try {
retries.setValue(Integer.valueOf(gwfilter.getArgs().trim()));
} catch (NumberFormatException e) {
LOG.error("Unexpected argument value: {}", gwfilter.getArgs().trim(), e);
retries.setValue(0);
}
filter = ctx.getBean(RetryGatewayFilterFactory.class).
apply(c -> c.setRetries(retries.getValue()));
break;
case SAVE_SESSION:
filter = ctx.getBean(SaveSessionGatewayFilterFactory.class).apply(c -> {
});
break;
case SECURE_HEADERS:
filter = ctx.getBean(SecureHeadersGatewayFilterFactory.class).apply(c -> {
});
break;
case SET_PATH:
filter = ctx.getBean(SetPathGatewayFilterFactory.class).
apply(c -> c.setTemplate(gwfilter.getArgs().trim()));
break;
case SET_REQUEST_HEADER:
String[] setRequestHeaderArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(SetRequestHeaderGatewayFilterFactory.class).
apply(c -> c.setName(setRequestHeaderArgs[0].trim()).
setValue(setRequestHeaderArgs[1].trim()));
break;
case SET_RESPONSE_HEADER:
String[] setResponseHeaderArgs = gwfilter.getArgs().split(",");
filter = ctx.getBean(SetResponseHeaderGatewayFilterFactory.class).
apply(c -> c.setName(setResponseHeaderArgs[0].trim()).
setValue(setResponseHeaderArgs[1].trim()));
break;
case SET_STATUS:
filter = ctx.getBean(SetStatusGatewayFilterFactory.class).
apply(c -> c.setStatus(gwfilter.getArgs().trim()));
break;
case STRIP_PREFIX:
Mutable<Integer> parts = new MutableObject<>();
try {
parts.setValue(Integer.valueOf(gwfilter.getArgs().trim()));
} catch (NumberFormatException e) {
LOG.error("Unexpected argument value: {}", gwfilter.getArgs().trim(), e);
parts.setValue(0);
}
filter = ctx.getBean(StripPrefixGatewayFilterFactory.class).
apply(c -> c.setParts(parts.getValue()));
break;
case REQUEST_HEADER_TO_REQUEST_URI:
filter = ctx.getBean(RequestHeaderToRequestUriGatewayFilterFactory.class).
apply(c -> c.setName(gwfilter.getArgs().trim()));
break;
case SET_REQUEST_SIZE:
filter = ctx.getBean(RequestSizeGatewayFilterFactory.class).
apply(c -> c.setMaxSize(DataSize.ofBytes(Long.parseLong(gwfilter.getArgs().trim()))));
break;
case SET_REQUEST_HOST:
filter = ctx.getBean(SetRequestHostHeaderGatewayFilterFactory.class).
apply(c -> c.setHost(gwfilter.getArgs().trim()));
break;
case LINK_REWRITE:
filter = ApplicationContextUtils.getOrCreateBean(
ctx,
LinkRewriteGatewayFilterFactory.class.getName(),
LinkRewriteGatewayFilterFactory.class).
apply(c -> c.setData(route.getTarget().toASCIIString() + "," + gwfilter.getArgs().trim()));
break;
case CLIENT_CERTS_TO_REQUEST_HEADER:
String header = StringUtils.isBlank(gwfilter.getArgs()) ? "X-Client-Certificate" : gwfilter.getArgs();
filter = ApplicationContextUtils.getOrCreateBean(
ctx,
ClientCertsToRequestHeaderFilterFactory.class.getName(),
ClientCertsToRequestHeaderFilterFactory.class).
apply(c -> c.setName(header.trim()));
break;
case QUERY_PARAM_TO_REQUEST_HEADER:
filter = ApplicationContextUtils.getOrCreateBean(
ctx,
QueryParamToRequestHeaderFilterFactory.class.getName(),
QueryParamToRequestHeaderFilterFactory.class).
apply(c -> c.setName(gwfilter.getArgs().trim()));
break;
case PRINCIPAL_TO_REQUEST_HEADER:
filter = ApplicationContextUtils.getOrCreateBean(
ctx,
PrincipalToRequestHeaderFilterFactory.class.getName(),
PrincipalToRequestHeaderFilterFactory.class).
apply(c -> c.setName(gwfilter.getArgs().trim()));
break;
case CUSTOM:
String[] customArgs = gwfilter.getArgs().split(";");
Consumer<CustomGatewayFilterFactory.Config> customConsumer = customArgs.length > 1
? c -> c.setData(customArgs[1])
: c -> c.setData(null);
CustomGatewayFilterFactory factory = ApplicationContextUtils.getOrCreateBean(
ctx,
customArgs[0],
CustomGatewayFilterFactory.class);
filter = factory.getOrder().
map(order -> (GatewayFilter) new OrderedGatewayFilter(factory.apply(customConsumer), order)).
orElseGet(() -> factory.apply(customConsumer));
break;
default:
filter = null;
}
if (filter == null) {
throw new IllegalArgumentException("Could not translate " + gwfilter);
}
return filter instanceof Ordered ? filter : new OrderedGatewayFilter(filter, 0);
}