From f4da9760fdb6e301e4ceea79b054a883d51c4708 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Wed, 25 Mar 2020 13:47:34 +0100 Subject: [PATCH] Reset trailers on recycled response Whilst investigating #4711 for jetty-10, it was noticed that trailers are not nulled on recycled Response instances, nor on reset. Signed-off-by: Greg Wilkins --- .../org/eclipse/jetty/server/Response.java | 2 ++ .../jetty/http/client/HttpTrailersTest.java | 33 ++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java index d2f265f77a6a..86dcc473e679 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java @@ -132,6 +132,7 @@ protected void recycle() _out.recycle(); _fields.clear(); _encodingFrom = EncodingFrom.NOT_SET; + _trailers = null; } public HttpOutput getHttpOutput() @@ -1080,6 +1081,7 @@ public void reset() _mimeType = null; _characterEncoding = null; _encodingFrom = EncodingFrom.NOT_SET; + _trailers = null; // Clear all response headers _fields.clear(); diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpTrailersTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpTrailersTest.java index 21923297095a..48aafe6997bb 100644 --- a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpTrailersTest.java +++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpTrailersTest.java @@ -24,6 +24,7 @@ import java.nio.charset.StandardCharsets; import java.util.Random; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; @@ -165,6 +166,7 @@ public void testResponseTrailersWithContent(Transport transport) throws Exceptio private void testResponseTrailers(byte[] content) throws Exception { + final AtomicBoolean once = new AtomicBoolean(false); String trailerName = "Trailer"; String trailerValue = "value"; scenario.start(new AbstractHandler() @@ -173,12 +175,15 @@ private void testResponseTrailers(byte[] content) throws Exception public void handle(String target, Request jettyRequest, HttpServletRequest request, HttpServletResponse response) throws IOException { jettyRequest.setHandled(true); + Response jettyResponse = (Response)response; - HttpFields trailers = new HttpFields(); - trailers.put(trailerName, trailerValue); + if (once.compareAndSet(false, true)) + { + HttpFields trailers = new HttpFields(); + trailers.put(trailerName, trailerValue); + jettyResponse.setTrailers(() -> trailers); + } - Response jettyResponse = (Response)response; - jettyResponse.setTrailers(() -> trailers); if (content != null) response.getOutputStream().write(content); } @@ -205,6 +210,26 @@ public void handle(String target, Request jettyRequest, HttpServletRequest reque .send(); assertEquals(HttpStatus.OK_200, response.getStatus()); assertNull(failure.get()); + + // subsequent requests should not have trailers + response = scenario.client.newRequest(scenario.newURI()) + .onResponseSuccess(r -> + { + try + { + HttpResponse httpResponse = (HttpResponse)r; + assertNull(httpResponse.getTrailers()); + failure.set(null); + } + catch (Throwable x) + { + failure.set(x); + } + }) + .timeout(5, TimeUnit.SECONDS) + .send(); + assertEquals(HttpStatus.OK_200, response.getStatus()); + assertNull(failure.get()); } @ParameterizedTest