From b3a5dab1c8f1486a7362a771aa0ea65b8d87f833 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Wed, 16 Nov 2016 16:53:15 -0700 Subject: [PATCH] copy headers and add filters. --- .../cloud/gateway/GatewayController.java | 27 +++++++++-------- .../SpringCloudGatewayApplication.java | 29 +++++++++++++++++++ 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/springframework/cloud/gateway/GatewayController.java b/src/main/java/org/springframework/cloud/gateway/GatewayController.java index ed6fe95e..896ca641 100644 --- a/src/main/java/org/springframework/cloud/gateway/GatewayController.java +++ b/src/main/java/org/springframework/cloud/gateway/GatewayController.java @@ -1,9 +1,8 @@ package org.springframework.cloud.gateway; -import org.springframework.core.io.buffer.DataBufferFactory; -import org.springframework.core.io.buffer.DefaultDataBufferFactory; -import org.springframework.http.MediaType; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import java.util.Optional; + +import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,26 +19,26 @@ import reactor.core.publisher.Flux; public class GatewayController { private final WebClient webClient; - private final DataBufferFactory bufferFactory; - public GatewayController() { - webClient = WebClient.builder(new ReactorClientHttpConnector()).build(); - bufferFactory = new DefaultDataBufferFactory(); + public GatewayController(WebClient webClient) { + this.webClient = webClient; } + //TODO: plugin to request mappings @GetMapping(path = "/") public Flux home(ServerWebExchange exchange) { - ClientRequest request = ClientRequest - .GET("http://httpbin.org/get") - .accept(MediaType.APPLICATION_JSON) + Optional requestUrl = exchange.getAttribute("requestUrl"); + ServerHttpRequest request = exchange.getRequest(); + ClientRequest clientRequest = ClientRequest + .method(request.getMethod(), requestUrl.get()) + .headers(request.getHeaders()) .build(); - return this.webClient.exchange(request).flatMap(clientResponse -> { + return this.webClient.exchange(clientRequest).flatMap(clientResponse -> { ServerHttpResponse response = exchange.getResponse(); - response.getHeaders().setContentType(clientResponse.headers().contentType().get()); + response.getHeaders().putAll(clientResponse.headers().asHttpHeaders()); response.setStatusCode(clientResponse.statusCode()); return response.writeWith(clientResponse.body((inputMessage, context) -> inputMessage.getBody())); - // return response; }); } } diff --git a/src/main/java/org/springframework/cloud/gateway/SpringCloudGatewayApplication.java b/src/main/java/org/springframework/cloud/gateway/SpringCloudGatewayApplication.java index 589fbc52..b2f9e499 100644 --- a/src/main/java/org/springframework/cloud/gateway/SpringCloudGatewayApplication.java +++ b/src/main/java/org/springframework/cloud/gateway/SpringCloudGatewayApplication.java @@ -2,10 +2,39 @@ package org.springframework.cloud.gateway; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.core.annotation.Order; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.client.reactive.WebClient; +import org.springframework.web.server.WebFilter; @SpringBootApplication public class SpringCloudGatewayApplication { + @Bean + public WebClient webClient() { + return WebClient.builder(new ReactorClientHttpConnector()).build(); + } + + // TODO: request only, how to filter response? + @Bean + @Order(500) + public WebFilter findRouteFilter() { + return (exchange, chain) -> { + exchange.getAttributes().put("requestUrl", "http://httpbin.org/get"); + return chain.filter(exchange); + }; + } + + @Bean + @Order(501) + public WebFilter modifyResponseFilter() { + return (exchange, chain) -> { + exchange.getResponse().getHeaders().add("X-My-Custom", "MyCustomValue"); + return chain.filter(exchange); + }; + } + public static void main(String[] args) { SpringApplication.run(SpringCloudGatewayApplication.class, args); }