diff --git a/src/main/java/org/springframework/cloud/gateway/config/FilterDefinition.java b/src/main/java/org/springframework/cloud/gateway/config/FilterDefinition.java index 6b804b3d..6d525810 100644 --- a/src/main/java/org/springframework/cloud/gateway/config/FilterDefinition.java +++ b/src/main/java/org/springframework/cloud/gateway/config/FilterDefinition.java @@ -14,9 +14,6 @@ import static org.springframework.util.StringUtils.tokenizeToStringArray; public class FilterDefinition { @NotNull private String name; - @NotNull - private String value; - private String[] args; public FilterDefinition() { @@ -32,11 +29,7 @@ public class FilterDefinition { String[] args = tokenizeToStringArray(text.substring(eqIdx+1), ","); - setValue(args[0]); - - if (args.length > 1) { - setArgs(Arrays.copyOfRange(args, 1, args.length)); - } + setArgs(args); } public String getName() { @@ -47,19 +40,11 @@ public class FilterDefinition { this.name = name; } - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - public String[] getArgs() { return args; } - public void setArgs(String[] args) { + public void setArgs(String... args) { this.args = args; } @@ -69,20 +54,18 @@ public class FilterDefinition { if (o == null || getClass() != o.getClass()) return false; FilterDefinition that = (FilterDefinition) o; return Objects.equals(name, that.name) && - Objects.equals(value, that.value) && Arrays.equals(args, that.args); } @Override public int hashCode() { - return Objects.hash(name, value, args); + return Objects.hash(name, args); } @Override public String toString() { final StringBuilder sb = new StringBuilder("FilterDefinition{"); sb.append("name='").append(name).append('\''); - sb.append(", value='").append(value).append('\''); sb.append(", args=").append(Arrays.toString(args)); sb.append('}'); return sb.toString(); diff --git a/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteReader.java b/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteReader.java index 8fdf9f69..5ffe8be9 100644 --- a/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteReader.java +++ b/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteReader.java @@ -43,8 +43,9 @@ public class DiscoveryClientRouteReader implements RouteReader { // add a filter that removes /serviceId by default FilterDefinition filter = new FilterDefinition(); filter.setName("RewritePath"); - filter.setValue("/" + serviceId + "/(?.*)"); - filter.setArgs(new String[]{ "/${remaining}" }); + String regex = "/" + serviceId + "/(?.*)"; + String replacement = "/${remaining}"; + filter.setArgs(regex, replacement); route.getFilters().add(filter); //TODO: support for default filters diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/AddRequestHeaderRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/AddRequestHeaderRouteFilter.java index e10ea350..fa2696a5 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/AddRequestHeaderRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/AddRequestHeaderRouteFilter.java @@ -9,13 +9,12 @@ import org.springframework.http.server.reactive.ServerHttpRequest; public class AddRequestHeaderRouteFilter implements RouteFilter { @Override - public WebFilter apply(String header, String[] args) { - validate(args, 1); + public WebFilter apply(String... args) { + validate(2, args); - //TODO: caching can happen here return (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest().mutate() - .header(header, args[0]) + .header(args[0], args[1]) .build(); return chain.filter(exchange.mutate().request(request).build()); diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/AddRequestParameterRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/AddRequestParameterRouteFilter.java index 2d7c807d..6dae70b5 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/AddRequestParameterRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/AddRequestParameterRouteFilter.java @@ -17,10 +17,11 @@ import org.springframework.web.server.WebFilter; public class AddRequestParameterRouteFilter implements RouteFilter { @Override - public WebFilter apply(String parameter, String[] args) { - validate(args, 1); + public WebFilter apply(String... args) { + validate(2, args); + String parameter = args[0]; + String value = args[1]; - //TODO: caching can happen here return (exchange, chain) -> { URI uri = exchange.getRequest().getURI(); @@ -37,7 +38,7 @@ public class AddRequestParameterRouteFilter implements RouteFilter { //TODO urlencode? query.append(parameter); query.append('='); - query.append(args[0]); + query.append(value); ServerHttpRequest request = new QueryParamServerHttpRequestBuilder(exchange.getRequest()) .query(query.toString()) diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/AddResponseHeaderRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/AddResponseHeaderRouteFilter.java index 82865768..df56bfc3 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/AddResponseHeaderRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/AddResponseHeaderRouteFilter.java @@ -8,12 +8,13 @@ import org.springframework.web.server.WebFilter; public class AddResponseHeaderRouteFilter implements RouteFilter { @Override - public WebFilter apply(String header, String[] args) { - validate(args, 1); + public WebFilter apply(String... args) { + validate(2, args); + final String header = args[0]; + final String value = args[1]; - //TODO: caching can happen here return (exchange, chain) -> { - exchange.getResponse().getHeaders().add(header, args[0]); + exchange.getResponse().getHeaders().add(header, value); return chain.filter(exchange); }; diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/HystrixRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/HystrixRouteFilter.java index 6eb8a452..dc9a525e 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/HystrixRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/HystrixRouteFilter.java @@ -19,7 +19,9 @@ import rx.Subscription; public class HystrixRouteFilter implements RouteFilter { @Override - public WebFilter apply(String commandName, String[] args) { + public WebFilter apply(String... args) { + validate(1, args); + final String commandName = args[0]; final HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey(getClass().getSimpleName()); final HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey(commandName); diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/RedirectToRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/RedirectToRouteFilter.java index ea26cce5..8fd7201d 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/RedirectToRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/RedirectToRouteFilter.java @@ -20,18 +20,19 @@ import reactor.core.publisher.Mono; */ public class RedirectToRouteFilter implements RouteFilter { @Override - public WebFilter apply(String statusString, String[] args) { - validate(args, 1); + public WebFilter apply(String... args) { + validate(2, args); + final String statusString = args[0]; + final String uri = args[1]; final HttpStatus httpStatus = parse(statusString); final URL url; try { - url = URI.create(args[0]).toURL(); + url = URI.create(uri).toURL(); } catch (MalformedURLException e) { - throw new IllegalArgumentException("Invalid url " + args[0], e); + throw new IllegalArgumentException("Invalid url " + uri, e); } - //TODO: caching can happen here return (exchange, chain) -> chain.filter(exchange).then(() -> { if (!isResponseCommitted(exchange)) { diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveRequestHeaderRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveRequestHeaderRouteFilter.java index 344a03a3..69e84585 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveRequestHeaderRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveRequestHeaderRouteFilter.java @@ -11,9 +11,10 @@ public class RemoveRequestHeaderRouteFilter implements RouteFilter { public static final String FAKE_HEADER = "_______force_______"; @Override - public WebFilter apply(String header, String[] args) { + public WebFilter apply(String... args) { + validate(1, args); + final String header = args[0]; - //TODO: caching can happen here return (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest().mutate() .header(FAKE_HEADER, "mutable") //TODO: is there a better way? diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveResponseHeaderRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveResponseHeaderRouteFilter.java index 3d7bd8fc..168f0c73 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveResponseHeaderRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveResponseHeaderRouteFilter.java @@ -8,9 +8,10 @@ import org.springframework.web.server.WebFilter; public class RemoveResponseHeaderRouteFilter implements RouteFilter { @Override - public WebFilter apply(String header, String[] args) { + public WebFilter apply(String... args) { + validate(1, args); + final String header = args[0]; - //TODO: caching can happen here return (exchange, chain) -> { exchange.getResponse().getHeaders().remove(header); diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilter.java index 42cffabd..1cc578b5 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilter.java @@ -9,11 +9,11 @@ import org.springframework.http.server.reactive.ServerHttpRequest; public class RewritePathRouteFilter implements RouteFilter { @Override - public WebFilter apply(String regex, String[] args) { - validate(args, 1); - String replacement = args[0].replace("$\\", "$"); + public WebFilter apply(String... args) { + validate(2, args); + final String regex = args[0]; + String replacement = args[1].replace("$\\", "$"); - //TODO: caching can happen here return (exchange, chain) -> { ServerHttpRequest req = exchange.getRequest(); String path = req.getURI().getPath(); diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/RouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/RouteFilter.java index 0b620b37..8d82074f 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/RouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/RouteFilter.java @@ -8,9 +8,9 @@ import org.springframework.web.server.WebFilter; */ public interface RouteFilter { - WebFilter apply(String value, String[] args); + WebFilter apply(String... args); - default void validate(String[] args, int requiredSize) { + default void validate(int requiredSize, String... args) { Assert.isTrue(args != null && args.length == requiredSize, "args must have "+ requiredSize +" entry(s)"); } diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilter.java index 8cf1040e..e079f68f 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilter.java @@ -17,10 +17,10 @@ public class SetPathRouteFilter implements RouteFilter { @Override @SuppressWarnings("unchecked") - public WebFilter apply(String template, String[] args) { - UriTemplate uriTemplate = new UriTemplate(template); + public WebFilter apply(String... args) { + validate(1, args); + UriTemplate uriTemplate = new UriTemplate(args[0]); - //TODO: caching can happen here return (exchange, chain) -> { Map variables = getAttribute(exchange, URL_PREDICATE_VARS_ATTR, Map.class); ServerHttpRequest req = exchange.getRequest(); diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/SetResponseHeaderRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/SetResponseHeaderRouteFilter.java index 477c84ff..80c62404 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/SetResponseHeaderRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/SetResponseHeaderRouteFilter.java @@ -8,12 +8,13 @@ import org.springframework.web.server.WebFilter; public class SetResponseHeaderRouteFilter implements RouteFilter { @Override - public WebFilter apply(String header, String[] args) { - validate(args, 1); + public WebFilter apply(String... args) { + validate(2, args); + final String header = args[0]; + final String value = args[1]; - //TODO: caching can happen here return (exchange, chain) -> { - exchange.getResponse().getHeaders().set(header, args[0]); + exchange.getResponse().getHeaders().set(header, value); return chain.filter(exchange); }; diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/SetStatusRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/SetStatusRouteFilter.java index d6698ce4..ba8bee7d 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/route/SetStatusRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/SetStatusRouteFilter.java @@ -15,10 +15,10 @@ import reactor.core.publisher.Mono; public class SetStatusRouteFilter implements RouteFilter { @Override - public WebFilter apply(String statusString, String[] args) { - final HttpStatus httpStatus = ServerWebExchangeUtils.parse(statusString); + public WebFilter apply(String... args) { + validate(1, args); + final HttpStatus httpStatus = ServerWebExchangeUtils.parse(args[0]); - //TODO: caching can happen here return (exchange, chain) -> { // option 1 (runs in filter order) diff --git a/src/main/java/org/springframework/cloud/gateway/handler/FilteringWebHandler.java b/src/main/java/org/springframework/cloud/gateway/handler/FilteringWebHandler.java index cd517468..11e9c0c3 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/FilteringWebHandler.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/FilteringWebHandler.java @@ -143,10 +143,9 @@ public class FilteringWebHandler extends WebHandlerDecorator { } else { args = Collections.emptyList(); } - logger.debug("Route " + route.getId() + " applying filter " + definition.getValue() - + ", " + args + " to " + definition.getName()); + logger.debug("Route " + route.getId() + " applying filter " + args + " to " + definition.getName()); } - return filter.apply(definition.getValue(), definition.getArgs()); + return filter.apply(definition.getArgs()); }) .collect(Collectors.toList()); diff --git a/src/test/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilterTests.java b/src/test/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilterTests.java index 0207d7f1..f40b0006 100644 --- a/src/test/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilterTests.java +++ b/src/test/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilterTests.java @@ -30,7 +30,7 @@ public class RewritePathRouteFilterTests { } private void testRewriteFilter(String regex, String replacement, String actualPath, String expectedPath) { - WebFilter filter = new RewritePathRouteFilter().apply(regex, new String[]{replacement}); + WebFilter filter = new RewritePathRouteFilter().apply(regex, replacement); MockServerHttpRequest request = MockServerHttpRequest .get("http://localhost"+ actualPath) diff --git a/src/test/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilterTests.java b/src/test/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilterTests.java index 61e01cee..1e14619f 100644 --- a/src/test/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilterTests.java +++ b/src/test/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilterTests.java @@ -37,7 +37,7 @@ public class SetPathRouteFilterTests { } private void testRewriteFilter(String template, String actualPath, String expectedPath, HashMap variables) { - WebFilter filter = new SetPathRouteFilter().apply(template, new String[]{}); + WebFilter filter = new SetPathRouteFilter().apply(new String[]{template}); MockServerHttpRequest request = MockServerHttpRequest .get("http://localhost"+ actualPath) diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 22db75bc..af235679 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -124,7 +124,8 @@ spring: - Host=**.setstatusint.org - Url=/headers filters: - - SetStatus=401 + - name: SetStatus + args: 401 # ===================================== - id: set_status_string_test