Browse Source

Allows resolving uri by request attribute

mvc-server
spencergibb 2 years ago committed by sgibb
parent
commit
5e6dc23224
No known key found for this signature in database
GPG Key ID: 7788A47380690861
  1. 7
      spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/HandlerFunctions.java
  2. 22
      spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java
  3. 13
      spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/LocalServerPortUriResolver.java

7
spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/HandlerFunctions.java

@ -34,6 +34,13 @@ public abstract class HandlerFunctions { @@ -34,6 +34,13 @@ public abstract class HandlerFunctions {
}
public static HandlerFunction<ServerResponse> http() {
return new ProxyExchangeHandlerFunction(request -> {
// TODO: rename request attr
return (URI) request.attribute("routeUri").orElseThrow();
});
}
public static HandlerFunction<ServerResponse> http(String uri) {
return http(URI.create(uri));
}

22
spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java

@ -39,7 +39,6 @@ import org.springframework.core.env.Environment; @@ -39,7 +39,6 @@ import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.function.RouterFunction;
import org.springframework.web.servlet.function.ServerRequest;
import org.springframework.web.servlet.function.ServerResponse;
@ -146,20 +145,31 @@ public class ServerMvcIntegrationTests { @@ -146,20 +145,31 @@ public class ServerMvcIntegrationTests {
@Bean
public RouterFunction<ServerResponse> gatewayRouterFunctions() {
return route(GET("/get"), http(new LocalServerPortUriResolver())).filter(addRequestHeader("X-Foo", "Bar"))
.filter(prefixPath("/httpbin"));
return route(GET("/get"), http()).filter(new LocalServerPortUriResolver())
.filter(addRequestHeader("X-Foo", "Bar")).filter(prefixPath("/httpbin"));
}
// TODO: should be about to combine with above
@Bean
public RouterFunction<ServerResponse> gatewayRouterFunctions2() {
return route(GET("/status/{status}"), http(new LocalServerPortUriResolver())).filter(prefixPath("/httpbin"))
.filter(setStatus(HttpStatus.TOO_MANY_REQUESTS));
// @formatter:off
return route()
.GET("/status/{status}", http())
.filter(new LocalServerPortUriResolver())
.filter(prefixPath("/httpbin"))
.filter(setStatus(HttpStatus.TOO_MANY_REQUESTS))
// TODO: Filters apply to all routes in a builder
//.GET("/anything/addresheader", http())
// .filter(new LocalServerPortUriResolver())
// .filter(prefixPath("/httpbin"))
// .filter(addResponseHeader("X-Bar", "val1"))
.build();
// @formatter:on
}
@Bean
public RouterFunction<ServerResponse> gatewayRouterFunctions3() {
return route(GET("/anything/addresheader"), http(new LocalServerPortUriResolver()))
return route(GET("/anything/addresheader"), http()).filter(new LocalServerPortUriResolver())
.filter(prefixPath("/httpbin")).filter(addResponseHeader("X-Bar", "val1"));
}

13
spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/test/LocalServerPortUriResolver.java

@ -20,9 +20,13 @@ import java.net.URI; @@ -20,9 +20,13 @@ import java.net.URI;
import org.springframework.cloud.gateway.server.mvc.HandlerFunctions;
import org.springframework.context.ApplicationContext;
import org.springframework.web.servlet.function.HandlerFilterFunction;
import org.springframework.web.servlet.function.HandlerFunction;
import org.springframework.web.servlet.function.ServerRequest;
import org.springframework.web.servlet.function.ServerResponse;
public class LocalServerPortUriResolver implements HandlerFunctions.URIResolver {
public class LocalServerPortUriResolver
implements HandlerFunctions.URIResolver, HandlerFilterFunction<ServerResponse, ServerResponse> {
@Override
public URI apply(ServerRequest request) {
@ -31,4 +35,11 @@ public class LocalServerPortUriResolver implements HandlerFunctions.URIResolver @@ -31,4 +35,11 @@ public class LocalServerPortUriResolver implements HandlerFunctions.URIResolver
return URI.create("http://localhost:" + port);
}
@Override
public ServerResponse filter(ServerRequest request, HandlerFunction<ServerResponse> next) throws Exception {
URI uri = apply(request);
request.attributes().put("routeUri", uri);
return next.handle(request);
}
}

Loading…
Cancel
Save