You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by bo...@apache.org on 2026/08/05 17:31:00 UTC
(knox) 31/49: KNOX-3238: fix GatewayWebsocketHandlerTest and JWTValidatorTest.
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 <bo...@apache.org>
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();