Updates rewrite filters to use framework web function classes. (#329)
This avoids any blocking operations. fixes gh-316
This commit is contained in:
@@ -20,6 +20,8 @@ package org.springframework.cloud.gateway.sample;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.SpringBootConfiguration;
|
||||
@@ -28,6 +30,7 @@ import org.springframework.cloud.gateway.route.RouteLocator;
|
||||
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.reactive.function.BodyInserters;
|
||||
import org.springframework.web.reactive.function.server.RequestPredicates;
|
||||
import org.springframework.web.reactive.function.server.RouterFunction;
|
||||
@@ -59,47 +62,49 @@ public class GatewaySampleApplication {
|
||||
)
|
||||
.route("read_body_pred", r -> r.host("*.readbody.org")
|
||||
.and().readBody(String.class,
|
||||
s -> s.trim().equalsIgnoreCase("hello"))
|
||||
.filters(f ->
|
||||
f.prefixPath("/httpbin")
|
||||
.addRequestHeader("X-TestHeader", "read_body_pred")
|
||||
s -> s.trim().equalsIgnoreCase("hi"))
|
||||
.filters(f -> f.prefixPath("/httpbin")
|
||||
.addResponseHeader("X-TestHeader", "read_body_pred")
|
||||
).uri(uri)
|
||||
)
|
||||
.route("rewrite_request_obj", r -> r.host("*.rewriterequestobj.org")
|
||||
.filters(f -> f.prefixPath("/httpbin")
|
||||
.addRequestHeader("X-TestHeader", "rewrite_request")
|
||||
//TODO: add as configuration to modifyRequestBody
|
||||
.setRequestHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE)
|
||||
.addResponseHeader("X-TestHeader", "rewrite_request")
|
||||
.modifyRequestBody(String.class, Hello.class,
|
||||
(exchange, s) -> {
|
||||
return new Hello(s.toUpperCase());
|
||||
})
|
||||
return Mono.just(new Hello(s.toUpperCase()));
|
||||
})
|
||||
).uri(uri)
|
||||
)
|
||||
.route("rewrite_request_upper", r -> r.host("*.rewriterequestupper.org")
|
||||
.route("rewrite_request_upper", r -> r.host("*.rewriterequestupper.org")
|
||||
.filters(f -> f.prefixPath("/httpbin")
|
||||
.addRequestHeader("X-TestHeader", "rewrite_request_upper")
|
||||
.addResponseHeader("X-TestHeader", "rewrite_request_upper")
|
||||
.modifyRequestBody(String.class, String.class,
|
||||
(exchange, s) -> {
|
||||
return s.toUpperCase();
|
||||
})
|
||||
return Mono.just(s.toUpperCase());
|
||||
})
|
||||
).uri(uri)
|
||||
)
|
||||
.route("rewrite_response_upper", r -> r.host("*.rewriteresponseupper.org")
|
||||
.filters(f -> f.prefixPath("/httpbin")
|
||||
.addRequestHeader("X-TestHeader", "rewrite_response_upper")
|
||||
.addResponseHeader("X-TestHeader", "rewrite_response_upper")
|
||||
.modifyResponseBody(String.class, String.class,
|
||||
(exchange, s) -> {
|
||||
return s.toUpperCase();
|
||||
})
|
||||
return Mono.just(s.toUpperCase());
|
||||
})
|
||||
).uri(uri)
|
||||
)
|
||||
.route("rewrite_response_obj", r -> r.host("*.rewriteresponseobj.org")
|
||||
.route("rewrite_response_obj", r -> r.host("*.rewriteresponseobj.org")
|
||||
.filters(f -> f.prefixPath("/httpbin")
|
||||
.addRequestHeader("X-TestHeader", "rewrite_response_obj")
|
||||
.modifyResponseBody(Map.class, String.class,
|
||||
.addResponseHeader("X-TestHeader", "rewrite_response_obj")
|
||||
.modifyResponseBody(Map.class, String.class, MediaType.TEXT_PLAIN_VALUE,
|
||||
(exchange, map) -> {
|
||||
Object data = map.get("data");
|
||||
return data.toString();
|
||||
})
|
||||
return Mono.just(data.toString());
|
||||
})
|
||||
.setResponseHeader("Content-Type", MediaType.TEXT_PLAIN_VALUE)
|
||||
).uri(uri)
|
||||
)
|
||||
.route(r -> r.path("/image/webp")
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
package org.springframework.cloud.gateway.sample;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.Map;
|
||||
|
||||
import com.netflix.loadbalancer.Server;
|
||||
import com.netflix.loadbalancer.ServerList;
|
||||
@@ -41,6 +42,7 @@ import org.springframework.test.context.junit4.SpringRunner;
|
||||
import org.springframework.test.web.reactive.server.WebTestClient;
|
||||
import org.springframework.util.SocketUtils;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
|
||||
|
||||
/**
|
||||
@@ -85,6 +87,81 @@ public class GatewaySampleApplicationTests {
|
||||
.expectStatus().isOk();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void readBodyPredicateStringWorks() {
|
||||
webClient.post()
|
||||
.uri("/post")
|
||||
.header("Host", "www.readbody.org")
|
||||
.syncBody("hi")
|
||||
.exchange()
|
||||
.expectStatus().isOk()
|
||||
.expectHeader().valueEquals("X-TestHeader", "read_body_pred")
|
||||
.expectBody(Map.class)
|
||||
.consumeWith(result ->
|
||||
assertThat(result.getResponseBody()).containsEntry("data", "hi"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void rewriteRequestBodyStringWorks() {
|
||||
webClient.post()
|
||||
.uri("/post")
|
||||
.header("Host", "www.rewriterequestupper.org")
|
||||
.syncBody("hello")
|
||||
.exchange()
|
||||
.expectStatus().isOk()
|
||||
.expectHeader().valueEquals("X-TestHeader", "rewrite_request_upper")
|
||||
.expectBody(Map.class)
|
||||
.consumeWith(result ->
|
||||
assertThat(result.getResponseBody()).containsEntry("data", "HELLO"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void rewriteRequestBodyObjectWorks() {
|
||||
webClient.post()
|
||||
.uri("/post")
|
||||
.header("Host", "www.rewriterequestobj.org")
|
||||
.syncBody("hello")
|
||||
.exchange()
|
||||
.expectStatus().isOk()
|
||||
.expectHeader().valueEquals("X-TestHeader", "rewrite_request")
|
||||
.expectBody(Map.class)
|
||||
.consumeWith(result ->
|
||||
assertThat(result.getResponseBody()).containsEntry("data", "{\"message\":\"HELLO\"}"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void rewriteResponseBodyStringWorks() {
|
||||
webClient.post()
|
||||
.uri("/post")
|
||||
.header("Host", "www.rewriteresponseupper.org")
|
||||
.syncBody("hello")
|
||||
.exchange()
|
||||
.expectStatus().isOk()
|
||||
.expectHeader().valueEquals("X-TestHeader", "rewrite_response_upper")
|
||||
.expectBody(Map.class)
|
||||
.consumeWith(result ->
|
||||
assertThat(result.getResponseBody()).containsEntry("DATA", "HELLO"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void rewriteResponeBodyObjectWorks() {
|
||||
webClient.post()
|
||||
.uri("/post")
|
||||
.header("Host", "www.rewriteresponseobj.org")
|
||||
.syncBody("hello")
|
||||
.exchange()
|
||||
.expectStatus().isOk()
|
||||
.expectHeader().valueEquals("X-TestHeader", "rewrite_response_obj")
|
||||
.expectBody(String.class)
|
||||
.consumeWith(result ->
|
||||
assertThat(result.getResponseBody()).isEqualTo("hello"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void complexPredicate() {
|
||||
webClient.get()
|
||||
|
||||
Reference in New Issue
Block a user