diff --git a/src/main/java/io/vertx/httpproxy/impl/ProxiedRequest.java b/src/main/java/io/vertx/httpproxy/impl/ProxiedRequest.java index 29926f5..83882f6 100644 --- a/src/main/java/io/vertx/httpproxy/impl/ProxiedRequest.java +++ b/src/main/java/io/vertx/httpproxy/impl/ProxiedRequest.java @@ -13,30 +13,19 @@ import io.vertx.core.Future; import io.vertx.core.MultiMap; import io.vertx.core.buffer.Buffer; -import io.vertx.core.http.HttpClientRequest; -import io.vertx.core.http.HttpHeaders; -import io.vertx.core.http.HttpMethod; -import io.vertx.core.http.HttpServerRequest; -import io.vertx.core.http.HttpVersion; +import io.vertx.core.http.*; import io.vertx.core.internal.ContextInternal; import io.vertx.core.internal.http.HttpServerRequestInternal; import io.vertx.core.net.HostAndPort; import io.vertx.core.streams.Pipe; import io.vertx.httpproxy.Body; -import io.vertx.httpproxy.MediaType; import io.vertx.httpproxy.ProxyRequest; import io.vertx.httpproxy.ProxyResponse; import java.util.Map; import java.util.Objects; -import static io.vertx.core.http.HttpHeaders.CONNECTION; -import static io.vertx.core.http.HttpHeaders.CONTENT_LENGTH; -import static io.vertx.core.http.HttpHeaders.KEEP_ALIVE; -import static io.vertx.core.http.HttpHeaders.PROXY_AUTHENTICATE; -import static io.vertx.core.http.HttpHeaders.PROXY_AUTHORIZATION; -import static io.vertx.core.http.HttpHeaders.TRANSFER_ENCODING; -import static io.vertx.core.http.HttpHeaders.UPGRADE; +import static io.vertx.core.http.HttpHeaders.*; public class ProxiedRequest implements ProxyRequest { @@ -152,9 +141,11 @@ public HttpServerRequest proxiedRequest() { @Override public ProxyRequest release() { - body.stream().resume(); - headers.clear(); - body = null; + if (body != null) { + body.stream().resume(); + headers.clear(); + body = null; + } return this; } diff --git a/src/test/java/io/vertx/tests/ProxyRequestTest.java b/src/test/java/io/vertx/tests/ProxyRequestTest.java index d341f35..7482411 100644 --- a/src/test/java/io/vertx/tests/ProxyRequestTest.java +++ b/src/test/java/io/vertx/tests/ProxyRequestTest.java @@ -10,21 +10,9 @@ */ package io.vertx.tests; -import io.vertx.core.AsyncResult; -import io.vertx.core.Future; -import io.vertx.core.Handler; -import io.vertx.core.MultiMap; -import io.vertx.core.Promise; +import io.vertx.core.*; import io.vertx.core.buffer.Buffer; -import io.vertx.core.http.HttpClient; -import io.vertx.core.http.HttpClientOptions; -import io.vertx.core.http.HttpClientResponse; -import io.vertx.core.http.HttpHeaders; -import io.vertx.core.http.HttpMethod; -import io.vertx.core.http.HttpServerRequest; -import io.vertx.core.http.HttpServerResponse; -import io.vertx.core.http.HttpVersion; -import io.vertx.core.http.RequestOptions; +import io.vertx.core.http.*; import io.vertx.core.net.NetClient; import io.vertx.core.net.NetSocket; import io.vertx.core.net.SocketAddress; @@ -40,7 +28,6 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; /** * @author Julien Viet @@ -585,6 +572,30 @@ public void testReleaseProxyRequest(TestContext ctx) { })); } + @Test + public void testReleaseProxyRequestAndFail(TestContext ctx) { + SocketAddress backend = startHttpBackend(ctx, 8081, req -> { + ctx.fail("Shouldn't be called"); + }); + backendClient = vertx.createHttpClient(new HttpClientOptions(clientOptions)); + HttpProxy proxy = HttpProxy.reverseProxy(backendClient); + proxy.origin(backend); + proxy.addInterceptor(new ProxyInterceptor() { + @Override + public Future handleProxyRequest(ProxyContext context) { + context.request().release(); + return Future.failedFuture("boom"); + } + }); + startHttpServer(ctx, serverOptions, proxy); + httpClient = vertx.createHttpClient(); + httpClient.request(HttpMethod.GET, 8080, "localhost", "/somepath").onComplete(ctx.asyncAssertSuccess(req -> { + req.send().onComplete(ctx.asyncAssertSuccess(resp -> { + ctx.assertEquals(502, resp.statusCode()); + })); + })); + } + @Test public void testSendDefaultProxyResponse(TestContext ctx) { startHttpServer(ctx, serverOptions, req -> {