From fbb3e1212a700b2f2c99299f1dcf08b36b32420a Mon Sep 17 00:00:00 2001 From: Robbie Date: Tue, 24 Sep 2024 02:12:43 -0400 Subject: [PATCH] Use sessionRequest for wrapping HTTP stream instead of original Request. Add SessionHandlerTest case to ensure that flushOnResponseCommit is not broken in the future. Signed-off-by: Robert B. Langer --- .../eclipse/jetty/session/SessionHandler.java | 2 +- .../jetty/session/SessionHandlerTest.java | 69 +++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/jetty-core/jetty-session/src/main/java/org/eclipse/jetty/session/SessionHandler.java b/jetty-core/jetty-session/src/main/java/org/eclipse/jetty/session/SessionHandler.java index c847d7c94742..27a978e172f2 100644 --- a/jetty-core/jetty-session/src/main/java/org/eclipse/jetty/session/SessionHandler.java +++ b/jetty-core/jetty-session/src/main/java/org/eclipse/jetty/session/SessionHandler.java @@ -66,7 +66,7 @@ public boolean handle(Request request, Response response, Callback callback) thr return false; SessionRequest sessionRequest = new SessionRequest(request); - addSessionStreamWrapper(request); + addSessionStreamWrapper(sessionRequest); return sessionRequest.process(next, response, callback); } diff --git a/jetty-core/jetty-session/src/test/java/org/eclipse/jetty/session/SessionHandlerTest.java b/jetty-core/jetty-session/src/test/java/org/eclipse/jetty/session/SessionHandlerTest.java index b4ebae94116e..dab0cfc7ae67 100644 --- a/jetty-core/jetty-session/src/test/java/org/eclipse/jetty/session/SessionHandlerTest.java +++ b/jetty-core/jetty-session/src/test/java/org/eclipse/jetty/session/SessionHandlerTest.java @@ -13,6 +13,7 @@ package org.eclipse.jetty.session; +import java.io.File; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -25,7 +26,9 @@ import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Session; +import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.IO; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -721,4 +724,70 @@ public void testUriParameterOnly() throws Exception } } + @Test + public void testFlushOnResponseCommit() throws Exception + { + // Setup temporary datastore with write-through null cache + + File datastoreDir = MavenTestingUtils.getTargetTestingDir("datastore"); + IO.delete(datastoreDir); + + FileSessionDataStore datastore = new FileSessionDataStore(); + datastore.setStoreDir(datastoreDir); + + NullSessionCache cache = new NullSessionCache(_sessionHandler); + cache.setSessionDataStore(datastore); + cache.setFlushOnResponseCommit(true); + + _sessionHandler.setSessionCache(cache); + + _server.start(); + + LocalConnector.LocalEndPoint endPoint = _connector.connect(); + endPoint.addInput(""" + GET /create HTTP/1.1 + Host: localhost + + """); + + HttpTester.Response response = HttpTester.parseResponse(endPoint.getResponse()); + assertThat(response.getStatus(), equalTo(200)); + String setCookie = response.get(HttpHeader.SET_COOKIE); + String id = setCookie.substring(setCookie.indexOf("SESSION_ID=") + 11, setCookie.indexOf("; Path=/")); + String content = response.getContent(); + assertThat(content, startsWith("Session=")); + + endPoint.addInput(""" + GET /set/attribute/value HTTP/1.1 + Host: localhost + Cookie: SESSION_ID=%s + + """.formatted(id)); + + response = HttpTester.parseResponse(endPoint.getResponse()); + assertThat(response.getStatus(), equalTo(200)); + assertThat(response.get(HttpHeader.SET_COOKIE), nullValue()); + content = response.getContent(); + assertThat(content, containsString("Session=" + id.substring(0, id.indexOf(".node0")))); + assertThat(content, containsString("attribute = value")); + + // Session should persist through restart + _server.stop(); + _server.start(); + + endPoint.addInput(""" + GET /set/attribute/value HTTP/1.1 + Host: localhost + Cookie: SESSION_ID=%s + + """.formatted(id)); + + response = HttpTester.parseResponse(endPoint.getResponse()); + assertThat(response.getStatus(), equalTo(200)); + assertThat(response.get(HttpHeader.SET_COOKIE), nullValue()); + content = response.getContent(); + assertThat(content, containsString("Session=" + id.substring(0, id.indexOf(".node0")))); + assertThat(content, containsString("attribute = value")); + } + }