This is an automated email from the ASF dual-hosted git repository.

remm pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/10.1.x by this push:
     new d5755ed94c Add SSL session tracking test
d5755ed94c is described below

commit d5755ed94caeb16863af57348fb137fdb077ecea
Author: remm <r...@apache.org>
AuthorDate: Wed Oct 2 17:20:23 2024 +0200

    Add SSL session tracking test
---
 test/org/apache/tomcat/util/net/TestSsl.java | 59 ++++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)

diff --git a/test/org/apache/tomcat/util/net/TestSsl.java 
b/test/org/apache/tomcat/util/net/TestSsl.java
index 736f1e1072..004765b3d5 100644
--- a/test/org/apache/tomcat/util/net/TestSsl.java
+++ b/test/org/apache/tomcat/util/net/TestSsl.java
@@ -26,6 +26,7 @@ import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.EnumSet;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -38,6 +39,7 @@ import javax.net.ssl.SSLSocket;
 import javax.net.ssl.SSLSocketFactory;
 
 import jakarta.servlet.ServletException;
+import jakarta.servlet.SessionTrackingMode;
 import jakarta.servlet.http.HttpServlet;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
@@ -49,11 +51,17 @@ import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
 
 import org.apache.catalina.Context;
+import org.apache.catalina.Lifecycle;
+import org.apache.catalina.LifecycleEvent;
+import org.apache.catalina.LifecycleListener;
 import org.apache.catalina.Wrapper;
 import org.apache.catalina.connector.Connector;
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.connector.Response;
 import org.apache.catalina.startup.TesterServlet;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
+import org.apache.catalina.valves.ValveBase;
 import org.apache.tomcat.util.buf.ByteChunk;
 import org.apache.tomcat.websocket.server.WsContextListener;
 
@@ -117,6 +125,37 @@ public class TestSsl extends TomcatBaseTest {
 
     }
 
+    private String sessionId = null;
+
+    @Test
+    public void testSSLSessionTracking() throws Exception {
+        TesterSupport.configureClientSsl();
+
+        Tomcat tomcat = getTomcatInstance();
+        tomcat.getEngine().getPipeline().addValve(new VerificationValve());
+
+        File appDir = new File(getBuildDirectory(), "webapps/examples");
+        Context ctxt  = tomcat.addWebapp(null, "/examples", 
appDir.getAbsolutePath());
+        ctxt.addLifecycleListener(new SSLSessionTrackingLifecycleListener());
+        ctxt.addApplicationListener(WsContextListener.class.getName());
+
+        ctxt = getProgrammaticRootContext();
+        Tomcat.addServlet(ctxt, "post", new SimplePostServlet());
+        ctxt.addServletMappingDecoded("/post", "post");
+
+        TesterSupport.initSsl(tomcat);
+        TesterSupport.configureSSLImplementation(tomcat, 
sslImplementationName, useOpenSSL);
+
+        tomcat.start();
+        getUrl("https://localhost:"; + getPort() + 
"/examples/servlets/servlet/HelloWorldExample");
+        // SSL is the only source for the requested session ID, and 
SessionTrackingMode.SSL is set on examples
+        Assert.assertNotNull(sessionId);
+        Assert.assertTrue(sessionId.length() > 1);
+        // No SessionTrackingMode.SSL on the root webapp
+        getUrl("https://localhost:"; + getPort() + "/post");
+        Assert.assertNull(sessionId);
+    }
+
     @Test
     public void testPost() throws Exception {
         SocketFactory socketFactory = TesterSupport.configureClientSsl();
@@ -379,4 +418,24 @@ public class TestSsl extends TomcatBaseTest {
         }
 
     }
+
+    public static class SSLSessionTrackingLifecycleListener implements 
LifecycleListener {
+        @Override
+        public void lifecycleEvent(LifecycleEvent event) {
+            if (Lifecycle.BEFORE_START_EVENT.equals(event.getType())) {
+                if (!(event.getLifecycle() instanceof Context)) {
+                    throw new IllegalArgumentException("Not Context");
+                }
+                Context context = (Context) event.getLifecycle();
+                
context.getServletContext().setSessionTrackingModes(EnumSet.of(SessionTrackingMode.SSL));
+            }
+        }
+    }
+
+    public class VerificationValve extends ValveBase {
+        @Override
+        public void invoke(Request request, Response response) throws 
IOException, ServletException {
+            sessionId = request.getRequestedSessionId();
+        }
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to