13 changed files with 225 additions and 128 deletions
@ -0,0 +1,90 @@
@@ -0,0 +1,90 @@
|
||||
package org.springframework.cloud.gateway.config; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.Objects; |
||||
|
||||
import javax.validation.ValidationException; |
||||
import javax.validation.constraints.NotNull; |
||||
|
||||
import static org.springframework.util.StringUtils.tokenizeToStringArray; |
||||
|
||||
/** |
||||
* @author Spencer Gibb |
||||
*/ |
||||
public class PredicateDefinition { |
||||
@NotNull |
||||
private String name; |
||||
@NotNull |
||||
private String value; |
||||
|
||||
private String[] args; |
||||
|
||||
public PredicateDefinition() { |
||||
} |
||||
|
||||
public PredicateDefinition(String text) { |
||||
String[] parts = text.split("="); |
||||
if (parts.length != 2) { |
||||
throw new ValidationException("Unable to parse Predicate text '" + text + "'" + |
||||
", must be of the form name=value"); |
||||
} |
||||
setName(parts[0]); |
||||
|
||||
String[] args = tokenizeToStringArray(parts[1], ","); |
||||
|
||||
setValue(args[0]); |
||||
|
||||
if (args.length > 1) { |
||||
setArgs(Arrays.copyOfRange(args, 1, args.length)); |
||||
} |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
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) { |
||||
this.args = args; |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object o) { |
||||
if (this == o) return true; |
||||
if (o == null || getClass() != o.getClass()) return false; |
||||
PredicateDefinition that = (PredicateDefinition) 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); |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
final StringBuilder sb = new StringBuilder("PredicateDefinition{"); |
||||
sb.append("name='").append(name).append('\''); |
||||
sb.append(", value='").append(value).append('\''); |
||||
sb.append(", args=").append(Arrays.toString(args)); |
||||
sb.append('}'); |
||||
return sb.toString(); |
||||
} |
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
package org.springframework.cloud.gateway.config; |
||||
|
||||
import org.hibernate.validator.constraints.NotEmpty; |
||||
|
||||
import javax.validation.Valid; |
||||
import javax.validation.constraints.NotNull; |
||||
import java.net.URI; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Objects; |
||||
|
||||
/** |
||||
* @author Spencer Gibb |
||||
*/ |
||||
public class Route { |
||||
@NotEmpty |
||||
private String id; |
||||
|
||||
@NotEmpty |
||||
@Valid |
||||
private List<PredicateDefinition> predicates = new ArrayList<>(); |
||||
|
||||
@NotNull |
||||
private URI downstreamUrl; |
||||
|
||||
public String getId() { |
||||
return id; |
||||
} |
||||
|
||||
public void setId(String id) { |
||||
this.id = id; |
||||
} |
||||
|
||||
public List<PredicateDefinition> getPredicates() { |
||||
return predicates; |
||||
} |
||||
|
||||
public void setPredicates(List<PredicateDefinition> predicates) { |
||||
this.predicates = predicates; |
||||
} |
||||
|
||||
public URI getDownstreamUrl() { |
||||
return downstreamUrl; |
||||
} |
||||
|
||||
public void setDownstreamUrl(URI downstreamUrl) { |
||||
this.downstreamUrl = downstreamUrl; |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object o) { |
||||
if (this == o) return true; |
||||
if (o == null || getClass() != o.getClass()) return false; |
||||
Route route = (Route) o; |
||||
return Objects.equals(id, route.id) && |
||||
Objects.equals(predicates, route.predicates) && |
||||
Objects.equals(downstreamUrl, route.downstreamUrl); |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
return Objects.hash(id, predicates, downstreamUrl); |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return "Route{" + |
||||
"id='" + id + '\'' + |
||||
", predicates=" + predicates + |
||||
", downstreamUrl=" + downstreamUrl + |
||||
'}'; |
||||
} |
||||
} |
@ -0,0 +1,36 @@
@@ -0,0 +1,36 @@
|
||||
package org.springframework.cloud.gateway.handler.predicate; |
||||
|
||||
import java.util.List; |
||||
import java.util.function.Predicate; |
||||
|
||||
import org.springframework.util.Assert; |
||||
import org.springframework.web.server.ServerWebExchange; |
||||
|
||||
/** |
||||
* @author Spencer Gibb |
||||
*/ |
||||
public class HeaderPredicateFactory implements GatewayPredicateFactory { |
||||
|
||||
@Override |
||||
public String getName() { |
||||
return "Header"; |
||||
} |
||||
|
||||
@Override |
||||
public Predicate<ServerWebExchange> create(String header, String[] args) { |
||||
//TODO: caching can happen here
|
||||
return exchange -> { |
||||
Assert.isTrue(args != null && args.length == 1, |
||||
"args must have one entry"); |
||||
|
||||
String regexp = args[0]; |
||||
List<String> values = exchange.getRequest().getHeaders().get(header); |
||||
for (String value : values) { |
||||
if (value.matches(regexp)) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
}; |
||||
} |
||||
} |
Loading…
Reference in new issue