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();
