From 3d7c04f14c7dd0a2bcfe8593598624e43324ed5a Mon Sep 17 00:00:00 2001 From: Violeta Georgieva Date: Mon, 12 Feb 2018 14:30:46 +0200 Subject: [PATCH] fix #278: Resolve the relative location when redirecting --- .../http/client/MonoHttpClientResponse.java | 2 +- .../netty/http/client/HttpRedirectTest.java | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/main/java/reactor/ipc/netty/http/client/MonoHttpClientResponse.java b/src/main/java/reactor/ipc/netty/http/client/MonoHttpClientResponse.java index 9235a33551..210d3c17ed 100644 --- a/src/main/java/reactor/ipc/netty/http/client/MonoHttpClientResponse.java +++ b/src/main/java/reactor/ipc/netty/http/client/MonoHttpClientResponse.java @@ -148,7 +148,7 @@ void redirect(String to) { String[] redirectedFrom = this.redirectedFrom; URI from = activeURI; try { - activeURI = new URI(to); + activeURI = from.resolve(new URI(to)); } catch (URISyntaxException e) { throw Exceptions.propagate(e); diff --git a/src/test/java/reactor/ipc/netty/http/client/HttpRedirectTest.java b/src/test/java/reactor/ipc/netty/http/client/HttpRedirectTest.java index 623641f176..354b743810 100644 --- a/src/test/java/reactor/ipc/netty/http/client/HttpRedirectTest.java +++ b/src/test/java/reactor/ipc/netty/http/client/HttpRedirectTest.java @@ -25,6 +25,7 @@ import reactor.ipc.netty.NettyContext; import reactor.ipc.netty.http.server.HttpServer; import reactor.ipc.netty.resources.PoolResources; +import reactor.test.StepVerifier; import java.time.Duration; import java.util.concurrent.atomic.AtomicInteger; @@ -120,4 +121,56 @@ public void testIssue253() { server.dispose(); } + + @Test + public void testIssue278() { + NettyContext server1 = + HttpServer.create(8888) + .newRouter(r -> r.get("/1", (req, res) -> res.sendRedirect("/3")) + .get("/2", (req, res) -> res.sendRedirect("http://localhost:8888/3")) + .get("/3", (req, res) -> res.sendString(Mono.just("OK"))) + .get("/4", (req, res) -> res.sendRedirect("http://localhost:8889/1"))) + .block(Duration.ofSeconds(30)); + + NettyContext server2 = + HttpServer.create(8889) + .newRouter(r -> r.get("/1", (req, res) -> res.sendString(Mono.just("Other")))) + .block(Duration.ofSeconds(30)); + + HttpClient client = HttpClient.create(8888); + + Mono response = + client.get("/1", req -> req.followRedirect()) + .flatMap(res -> res.receive() + .aggregate() + .asString()); + + StepVerifier.create(response) + .expectNextMatches(s -> "OK".equals(s)) + .expectComplete() + .verify(Duration.ofSeconds(30)); + + response = client.get("/2", req -> req.followRedirect()) + .flatMap(res -> res.receive() + .aggregate() + .asString()); + + StepVerifier.create(response) + .expectNextMatches(s -> "OK".equals(s)) + .expectComplete() + .verify(Duration.ofSeconds(30)); + + response = client.get("/4", req -> req.followRedirect()) + .flatMap(res -> res.receive() + .aggregate() + .asString()); + + StepVerifier.create(response) + .expectNextMatches(s -> "Other".equals(s)) + .expectComplete() + .verify(Duration.ofSeconds(30)); + + server1.dispose(); + server2.dispose(); + } }