Skip to content

Commit

Permalink
add RemoveNonProxyHeaders filter
Browse files Browse the repository at this point in the history
  • Loading branch information
spencergibb committed Feb 15, 2017
1 parent e967d23 commit 2995005
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.springframework.cloud.gateway.filter.route.AddResponseHeaderRouteFilter;
import org.springframework.cloud.gateway.filter.route.HystrixRouteFilter;
import org.springframework.cloud.gateway.filter.route.RedirectToRouteFilter;
import org.springframework.cloud.gateway.filter.route.RemoveNonProxyHeadersRouteFilter;
import org.springframework.cloud.gateway.filter.route.RemoveRequestHeaderRouteFilter;
import org.springframework.cloud.gateway.filter.route.RemoveResponseHeaderRouteFilter;
import org.springframework.cloud.gateway.filter.route.RewritePathRouteFilter;
Expand Down Expand Up @@ -213,6 +214,11 @@ public RedirectToRouteFilter redirectToRouteFilter() {
return new RedirectToRouteFilter();
}

@Bean(name = "RemoveNonProxyHeadersRouteFilter")
public RemoveNonProxyHeadersRouteFilter removeNonProxyHeadersRouteFilter() {
return new RemoveNonProxyHeadersRouteFilter();
}

@Bean(name = "RemoveRequestHeaderRouteFilter")
public RemoveRequestHeaderRouteFilter removeRequestHeaderRouteFilter() {
return new RemoveRequestHeaderRouteFilter();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package org.springframework.cloud.gateway.filter.route;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.web.server.WebFilter;

import java.util.Arrays;
import java.util.List;

/**
* Hop-by-hop header fields, which are meaningful only for a single transport-level connection,
* and are not stored by caches or forwarded by proxies. The following HTTP/1.1 header fields
* are hop-by-hop header fields:
* <ul>
* <li>Connection
* <li>Keep-Alive
* <li>Proxy-Authenticate
* <li>Proxy-Authorization
* <li>TE
* <li>Trailer
* <li>Transfer-Encoding
* <li>Upgrade
* </ul>
*
* See https://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-14#section-7.1.3
*
* @author Spencer Gibb
*/
@ConfigurationProperties("spring.cloud.gateway.filter.removeNonProxyHeaders")
public class RemoveNonProxyHeadersRouteFilter implements RouteFilter {

private static final String FAKE_HEADER = "_______force_______";
public static final String[] DEFAULT_HEADERS_TO_REMOVE = new String[] {"Connection", "Keep-Alive",
"Proxy-Authenticate", "Proxy-Authorization", "TE", "Trailer", "Transfer-Encoding", "Upgrade"};

private List<String> headers = Arrays.asList(DEFAULT_HEADERS_TO_REMOVE);

public List<String> getHeaders() {
return headers;
}

public void setHeaders(List<String> headers) {
this.headers = headers;
}

@Override
public WebFilter apply(String... args) {
//TODO: support filter args

return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest().mutate()
.header(FAKE_HEADER, "mutable") //TODO: is there a better way?
.build();

request.getHeaders().remove(FAKE_HEADER);

for (String header : this.headers) {
request.getHeaders().remove(header);
}

return chain.filter(exchange.mutate().request(request).build());
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.springframework.cloud.gateway.support;

import org.springframework.cloud.gateway.filter.route.RouteFilter;
import org.springframework.cloud.gateway.handler.predicate.RoutePredicate;

/**
* @author Spencer Gibb
*/
public class NameUtils {

public static String normalizePredicateName(Class<? extends RoutePredicate> clazz) {
return clazz.getSimpleName().replace(RoutePredicate.class.getSimpleName(), "");
}

public static String normalizeFilterName(Class<? extends RouteFilter> clazz) {
return clazz.getSimpleName().replace(RouteFilter.class.getSimpleName(), "");
}
}

0 comments on commit 2995005

Please sign in to comment.