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

bonampak pushed a commit to branch feature/jakarta-jetty-upgrade
in repository https://gitbox.apache.org/repos/asf/knox.git

commit addadaff8233db143f8161aecabedca7fedace99
Author: bonampak <[email protected]>
AuthorDate: Sun Apr 26 23:44:31 2026 +0200

    KNOX-3238: fix GatewayWebsocketHandlerTest and JWTValidatorTest.
---
 .../gateway/websockets/KnoxWebSocketCreator.java     | 18 +++++-------------
 .../websockets/GatewayWebsocketHandlerTest.java      |  9 ++++++++-
 .../knox/gateway/websockets/JWTValidatorTest.java    | 20 ++++++++++++++------
 3 files changed, 27 insertions(+), 20 deletions(-)

diff --git 
a/gateway-server/src/main/java/org/apache/knox/gateway/websockets/KnoxWebSocketCreator.java
 
b/gateway-server/src/main/java/org/apache/knox/gateway/websockets/KnoxWebSocketCreator.java
index f190a0bd6..51af8778c 100644
--- 
a/gateway-server/src/main/java/org/apache/knox/gateway/websockets/KnoxWebSocketCreator.java
+++ 
b/gateway-server/src/main/java/org/apache/knox/gateway/websockets/KnoxWebSocketCreator.java
@@ -30,8 +30,8 @@ import 
org.apache.knox.gateway.services.security.KeystoreService;
 import org.apache.knox.gateway.services.security.KeystoreServiceException;
 import org.apache.knox.gateway.webshell.WebshellWebSocketAdapter;
 import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.http.HttpURI;
 import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.websocket.api.util.WSURI;
 import org.eclipse.jetty.websocket.server.ServerUpgradeRequest;
 import org.eclipse.jetty.websocket.server.ServerUpgradeResponse;
 import org.eclipse.jetty.websocket.server.WebSocketCreator;
@@ -85,16 +85,10 @@ public class KnoxWebSocketCreator implements 
WebSocketCreator {
     }
 
     @Override
-    public Object createWebSocket(ServerUpgradeRequest req, 
ServerUpgradeResponse resp, Callback callback) {
+    public Object createWebSocket(ServerUpgradeRequest req, 
ServerUpgradeResponse resp, Callback callback) throws Exception {
         try {
-            // 1. Get the raw HTTP URI from the Jetty 12 Request
-            HttpURI httpURI = req.getHttpURI();
-
-            // 2. Translate the scheme to match Jetty 9's behavior (http -> 
ws, https -> wss)
-            String wsScheme = "https".equalsIgnoreCase(httpURI.getScheme()) ? 
"wss" : "ws";
-
-            // 3. Reconstruct the java.net.URI for Knox's internal routing 
methods
-            final URI requestURI = 
HttpURI.build(httpURI).scheme(wsScheme).toURI();
+            // 1. Get the raw HTTP URI from the Jetty 12 Request and convert 
it to ws URI
+            final URI requestURI = WSURI.toWebsocket(req.getHttpURI().toURI());
 
             // Now Knox's regex will work
             if (isWebshellRequest(requestURI)) {
@@ -111,9 +105,7 @@ public class KnoxWebSocketCreator implements 
WebSocketCreator {
 
         } catch (final Exception e) {
             LOG.failedCreatingWebSocket(e);
-            // In Jetty 12, completing the callback with failure tells the 
server to reject the upgrade
-            callback.failed(e);
-            return null;
+            throw e;
         }
     }
 
diff --git 
a/gateway-server/src/test/java/org/apache/knox/gateway/websockets/GatewayWebsocketHandlerTest.java
 
b/gateway-server/src/test/java/org/apache/knox/gateway/websockets/GatewayWebsocketHandlerTest.java
index b25909521..68c08360c 100644
--- 
a/gateway-server/src/test/java/org/apache/knox/gateway/websockets/GatewayWebsocketHandlerTest.java
+++ 
b/gateway-server/src/test/java/org/apache/knox/gateway/websockets/GatewayWebsocketHandlerTest.java
@@ -32,6 +32,7 @@ import org.easymock.EasyMock;
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpURI;
 import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.websocket.api.util.WSURI;
 import org.eclipse.jetty.websocket.server.ServerUpgradeRequest;
 import org.eclipse.jetty.websocket.server.ServerUpgradeResponse;
 import org.junit.Assert;
@@ -45,6 +46,7 @@ import 
org.powermock.core.classloader.annotations.PowerMockIgnore;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
+import java.net.URI;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -85,6 +87,7 @@ public class GatewayWebsocketHandlerTest {
 
         JWTValidator jwtValidator = 
EasyMock.createNiceMock(JWTValidator.class);
         EasyMock.expect(jwtValidator.validate()).andReturn(true).anyTimes();
+        
EasyMock.expect(jwtValidator.getUsername()).andReturn("testUser").anyTimes();
         PowerMock.mockStatic(JWTValidatorFactory.class);
         EasyMock.expect(JWTValidatorFactory.create(req, gatewayServices, 
gatewayConfig)).andReturn(jwtValidator).anyTimes();
 
@@ -112,6 +115,7 @@ public class GatewayWebsocketHandlerTest {
       EasyMock.replay(callback);
       JWTValidator jwtValidator = EasyMock.createNiceMock(JWTValidator.class);
       EasyMock.expect(jwtValidator.validate()).andReturn(true).anyTimes();
+      
EasyMock.expect(jwtValidator.getUsername()).andReturn("testUser").anyTimes();
       PowerMock.mockStatic(JWTValidatorFactory.class);
       EasyMock.expect(JWTValidatorFactory.create(req, gatewayServices, 
gatewayConfig)).andReturn(jwtValidator).anyTimes();
 
@@ -171,11 +175,14 @@ public class GatewayWebsocketHandlerTest {
         EasyMock.replay(gatewayServices,gatewayConfig);
         KnoxWebSocketCreator knoxWebSocketCreator = new 
KnoxWebSocketCreator(gatewayConfig,gatewayServices);
         knoxWebSocketCreator.createWebSocket(req,resp,callback);
+
     }
 
     private ServerUpgradeRequest createServerUpgradeRequest(String url) throws 
Exception {
         ServerUpgradeRequest mockRequest = 
EasyMock.createNiceMock(ServerUpgradeRequest.class);
-        HttpURI httpURI = HttpURI.build(url);
+        URI httpUri = WSURI.toHttp(new URI(url));
+
+        HttpURI httpURI = HttpURI.build(httpUri);
 
         // Set the expectations needed by KnoxWebSocketCreator and JWTValidator
         
EasyMock.expect(mockRequest.getHttpURI()).andReturn(httpURI).anyTimes();
diff --git 
a/gateway-server/src/test/java/org/apache/knox/gateway/websockets/JWTValidatorTest.java
 
b/gateway-server/src/test/java/org/apache/knox/gateway/websockets/JWTValidatorTest.java
index 9353b4290..a0551164c 100644
--- 
a/gateway-server/src/test/java/org/apache/knox/gateway/websockets/JWTValidatorTest.java
+++ 
b/gateway-server/src/test/java/org/apache/knox/gateway/websockets/JWTValidatorTest.java
@@ -35,8 +35,11 @@ import org.apache.knox.gateway.topology.Service;
 import org.apache.knox.gateway.topology.Topology;
 import org.apache.knox.gateway.util.X509CertificateUtil;
 import org.easymock.EasyMock;
+import org.eclipse.jetty.http.HttpCookie;
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Response;
 import org.eclipse.jetty.websocket.server.ServerUpgradeRequest;
 import org.junit.After;
 import org.junit.Assert;
@@ -55,8 +58,10 @@ import java.security.interfaces.RSAPrivateKey;
 import java.security.interfaces.RSAPublicKey;
 import java.text.MessageFormat;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.UUID;
@@ -114,12 +119,12 @@ public class JWTValidatorTest {
     }
 
     private void setTokenOnRequest(ServerUpgradeRequest request, SignedJWT 
jwt){
-        HttpFields mockedHeaders = HttpFields.build()
-        .add(HttpHeader.COOKIE, "hadoop-jwt=garbage")
-        .add(HttpHeader.COOKIE, "hadoop-jwt=ljm" + jwt.serialize())
-        .add(HttpHeader.COOKIE, "hadoop-jwt=" + jwt.serialize())
-        .asImmutable();
-        
EasyMock.expect(request.getHeaders()).andReturn(mockedHeaders).anyTimes();
+        List<HttpCookie> mockedCookies = Arrays.asList(
+        HttpCookie.from("hadoop-jwt", "garbage"),
+        HttpCookie.from("hadoop-jwt", "ljm" + jwt.serialize()),
+        HttpCookie.from("hadoop-jwt", jwt.serialize())
+        );
+        
EasyMock.expect(request.getAttribute(Request.COOKIE_ATTRIBUTE)).andReturn(mockedCookies).anyTimes();
     }
 
     private static SignedJWT getJWT(final String issuer,
@@ -216,6 +221,9 @@ public class JWTValidatorTest {
         setUpParams(new HashMap<>());
         ServerUpgradeRequest request = 
EasyMock.createNiceMock(ServerUpgradeRequest.class);
         
EasyMock.expect(request.getHeaders()).andReturn(HttpFields.EMPTY).anyTimes();
+        EasyMock.expect(request.getAttribute(Request.COOKIE_ATTRIBUTE))
+        .andReturn(Collections.emptyList())
+        .anyTimes();
         EasyMock.replay(request);
         JWTValidator jwtValidator = JWTValidatorFactory.create(request, 
gatewayServices, gatewayConfig);
         EasyMock.expect(authorityService.verifyToken(jwtValidator.getToken(), 
publicKey)).andReturn(true).anyTimes();

Reply via email to