{
/**
- * Attribute name used to retrieve the application instance from a {@link javax.servlet.ServletContext}.
+ * Attribute name used to retrieve the application instance from a {@link jakarta.servlet.ServletContext}.
* See also {@link WebServerInitializer}.
*
*
@@ -100,15 +100,15 @@ public interface WebServer {
* Servlet API provides following Listener interfaces:
*
*
- * - {@code javax.servlet.ServletContextListener}
- * - {@code javax.servlet.ServletContextAttributeListener}
- * - {@code javax.servlet.ServletRequestListener}
- * - {@code javax.servlet.ServletRequestAttributeListener}
- * - {@code javax.servlet.http.HttpSessionListener}
- * - {@code javax.servlet.http.HttpSessionBindingListener}
- * - {@code javax.servlet.http.HttpSessionAttributeListener}
- * - {@code javax.servlet.http.HttpSessionActivationListener}
- * - {@code javax.servlet.AsyncListener}
+ * - {@link jakarta.servlet.ServletContextListener}
+ * - {@link jakarta.servlet.ServletContextAttributeListener}
+ * - {@link jakarta.servlet.ServletRequestListener}
+ * - {@link jakarta.servlet.ServletRequestAttributeListener}
+ * - {@link jakarta.servlet.http.HttpSessionListener}
+ * - {@link jakarta.servlet.http.HttpSessionBindingListener}
+ * - {@link jakarta.servlet.http.HttpSessionAttributeListener}
+ * - {@link jakarta.servlet.http.HttpSessionActivationListener}
+ * - {@link jakarta.servlet.AsyncListener}
*
*
* @param listener
diff --git a/pippo-core/src/main/java/ro/pippo/core/WebServerInitializer.java b/pippo-core/src/main/java/ro/pippo/core/WebServerInitializer.java
index 8074c3f4..99b3a8e4 100644
--- a/pippo-core/src/main/java/ro/pippo/core/WebServerInitializer.java
+++ b/pippo-core/src/main/java/ro/pippo/core/WebServerInitializer.java
@@ -15,7 +15,7 @@
*/
package ro.pippo.core;
-import javax.servlet.ServletContext;
+import jakarta.servlet.ServletContext;
/**
* Interface to be implemented in Servlet 3.0+ environments in order to configure the
diff --git a/pippo-core/src/main/java/ro/pippo/core/gzip/GZipFilter.java b/pippo-core/src/main/java/ro/pippo/core/gzip/GZipFilter.java
index ce9a5514..4ce30fa5 100644
--- a/pippo-core/src/main/java/ro/pippo/core/gzip/GZipFilter.java
+++ b/pippo-core/src/main/java/ro/pippo/core/gzip/GZipFilter.java
@@ -17,14 +17,14 @@
import ro.pippo.core.util.StringUtils;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/pippo-core/src/main/java/ro/pippo/core/gzip/GZipRequestResponseFactory.java b/pippo-core/src/main/java/ro/pippo/core/gzip/GZipRequestResponseFactory.java
index 93dc960a..66689d31 100644
--- a/pippo-core/src/main/java/ro/pippo/core/gzip/GZipRequestResponseFactory.java
+++ b/pippo-core/src/main/java/ro/pippo/core/gzip/GZipRequestResponseFactory.java
@@ -22,8 +22,8 @@
import ro.pippo.core.Response;
import ro.pippo.core.util.StringUtils;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* @author Decebal Suiu
diff --git a/pippo-core/src/main/java/ro/pippo/core/gzip/GZipResponseStream.java b/pippo-core/src/main/java/ro/pippo/core/gzip/GZipResponseStream.java
index 1216f511..bbfa5209 100644
--- a/pippo-core/src/main/java/ro/pippo/core/gzip/GZipResponseStream.java
+++ b/pippo-core/src/main/java/ro/pippo/core/gzip/GZipResponseStream.java
@@ -15,8 +15,9 @@
*/
package ro.pippo.core.gzip;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.WriteListener;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
@@ -94,4 +95,15 @@ public void write(byte[] b, int off, int len) throws IOException {
gzipOutputStream.write(b, off, len);
}
+ @Override
+ public boolean isReady() {
+ // we are writing to internal buffer, so we are always ready
+ return true;
+ }
+
+ @Override
+ public void setWriteListener(WriteListener writeListener) {
+ // we are always ready, ignore
+ }
+
}
diff --git a/pippo-core/src/main/java/ro/pippo/core/gzip/GZipResponseWrapper.java b/pippo-core/src/main/java/ro/pippo/core/gzip/GZipResponseWrapper.java
index 93c84b24..550c702d 100644
--- a/pippo-core/src/main/java/ro/pippo/core/gzip/GZipResponseWrapper.java
+++ b/pippo-core/src/main/java/ro/pippo/core/gzip/GZipResponseWrapper.java
@@ -17,9 +17,9 @@
import ro.pippo.core.util.IoUtils;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponseWrapper;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
diff --git a/pippo-core/src/main/java/ro/pippo/core/route/CSRFHandler.java b/pippo-core/src/main/java/ro/pippo/core/route/CSRFHandler.java
index c737afe5..5f979959 100644
--- a/pippo-core/src/main/java/ro/pippo/core/route/CSRFHandler.java
+++ b/pippo-core/src/main/java/ro/pippo/core/route/CSRFHandler.java
@@ -23,7 +23,7 @@
import ro.pippo.core.util.CryptoUtils;
import ro.pippo.core.util.StringUtils;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
diff --git a/pippo-core/src/main/java/ro/pippo/core/route/RouteDispatcher.java b/pippo-core/src/main/java/ro/pippo/core/route/RouteDispatcher.java
index 285048d3..83377286 100644
--- a/pippo-core/src/main/java/ro/pippo/core/route/RouteDispatcher.java
+++ b/pippo-core/src/main/java/ro/pippo/core/route/RouteDispatcher.java
@@ -25,8 +25,8 @@
import ro.pippo.core.Response;
import ro.pippo.core.util.ServiceLocator;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
diff --git a/pippo-core/src/main/java/ro/pippo/core/util/CookieUtils.java b/pippo-core/src/main/java/ro/pippo/core/util/CookieUtils.java
index a967b2b6..8baab34c 100644
--- a/pippo-core/src/main/java/ro/pippo/core/util/CookieUtils.java
+++ b/pippo-core/src/main/java/ro/pippo/core/util/CookieUtils.java
@@ -15,8 +15,8 @@
*/
package ro.pippo.core.util;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
diff --git a/pippo-core/src/main/java/ro/pippo/core/websocket/AbstractWebSocketFilter.java b/pippo-core/src/main/java/ro/pippo/core/websocket/AbstractWebSocketFilter.java
index e3411d3b..fe6d3abc 100644
--- a/pippo-core/src/main/java/ro/pippo/core/websocket/AbstractWebSocketFilter.java
+++ b/pippo-core/src/main/java/ro/pippo/core/websocket/AbstractWebSocketFilter.java
@@ -20,7 +20,7 @@
import ro.pippo.core.Response;
import ro.pippo.core.util.StringUtils;
-import javax.servlet.ServletException;
+import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
@@ -50,7 +50,7 @@ protected boolean acceptWebSocket(Request request, Response response)
return false;
}
- if (!headerContainsToken(request, "Sec-websocket-version", "13")) {
+ if (!headerContainsToken(request, "Sec-WebSocket-Version", "13")) {
response.badRequest().header("Sec-WebSocket-Version", "13"); // http://tools.ietf.org/html/rfc6455#section-4.4
return false;
}
diff --git a/pippo-core/src/main/java/ro/pippo/core/websocket/WebSocketConnection.java b/pippo-core/src/main/java/ro/pippo/core/websocket/WebSocketConnection.java
index 1aea811c..fafbbc4d 100644
--- a/pippo-core/src/main/java/ro/pippo/core/websocket/WebSocketConnection.java
+++ b/pippo-core/src/main/java/ro/pippo/core/websocket/WebSocketConnection.java
@@ -16,7 +16,7 @@
package ro.pippo.core.websocket;
import java.io.IOException;
-import java.net.InetSocketAddress;
+import java.net.SocketAddress;
/**
* @author Decebal Suiu
@@ -49,6 +49,6 @@ public interface WebSocketConnection {
*/
WebSocketConnection sendMessage(byte[] message) throws IOException;
- InetSocketAddress getRemoteAddress();
+ SocketAddress getRemoteAddress();
}
diff --git a/pippo-core/src/test/java/ro/pippo/core/RequestTest.java b/pippo-core/src/test/java/ro/pippo/core/RequestTest.java
index d4ece8b4..15698412 100644
--- a/pippo-core/src/test/java/ro/pippo/core/RequestTest.java
+++ b/pippo-core/src/test/java/ro/pippo/core/RequestTest.java
@@ -17,7 +17,7 @@
import org.junit.jupiter.api.Test;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.Collections;
import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git a/pippo-core/src/test/java/ro/pippo/core/ResponseTest.java b/pippo-core/src/test/java/ro/pippo/core/ResponseTest.java
index 5823064a..3a6d1498 100644
--- a/pippo-core/src/test/java/ro/pippo/core/ResponseTest.java
+++ b/pippo-core/src/test/java/ro/pippo/core/ResponseTest.java
@@ -17,7 +17,7 @@
import org.junit.jupiter.api.Test;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;
import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git a/pippo-core/src/test/java/ro/pippo/core/gzip/GZipRequestResponseFactoryTest.java b/pippo-core/src/test/java/ro/pippo/core/gzip/GZipRequestResponseFactoryTest.java
index 58d5d694..06abc8f6 100644
--- a/pippo-core/src/test/java/ro/pippo/core/gzip/GZipRequestResponseFactoryTest.java
+++ b/pippo-core/src/test/java/ro/pippo/core/gzip/GZipRequestResponseFactoryTest.java
@@ -19,7 +19,7 @@
import org.mockito.Mockito;
import ro.pippo.core.Application;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/pippo-core/src/test/java/ro/pippo/core/route/CorsHandlerTest.java b/pippo-core/src/test/java/ro/pippo/core/route/CorsHandlerTest.java
index 91e754c8..3abd95b1 100644
--- a/pippo-core/src/test/java/ro/pippo/core/route/CorsHandlerTest.java
+++ b/pippo-core/src/test/java/ro/pippo/core/route/CorsHandlerTest.java
@@ -22,7 +22,7 @@
import ro.pippo.core.PippoRuntimeException;
import ro.pippo.core.Response;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
diff --git a/pippo-metrics-parent/pippo-metrics/pom.xml b/pippo-metrics-parent/pippo-metrics/pom.xml
index 918f5661..656b6cbb 100644
--- a/pippo-metrics-parent/pippo-metrics/pom.xml
+++ b/pippo-metrics-parent/pippo-metrics/pom.xml
@@ -53,8 +53,8 @@
- javax.servlet
- javax.servlet-api
+ jakarta.servlet
+ jakarta.servlet-api
${servlet.version}
provided
diff --git a/pippo-security-parent/pippo-pac4j/pom.xml b/pippo-security-parent/pippo-pac4j/pom.xml
index f86856de..702c85b3 100644
--- a/pippo-security-parent/pippo-pac4j/pom.xml
+++ b/pippo-security-parent/pippo-pac4j/pom.xml
@@ -19,8 +19,8 @@
- javax.servlet
- javax.servlet-api
+ jakarta.servlet
+ jakarta.servlet-api
${servlet.version}
provided
diff --git a/pippo-security-parent/pippo-pac4j/src/main/java/ro/pippo/pac4j/PippoWebContext.java b/pippo-security-parent/pippo-pac4j/src/main/java/ro/pippo/pac4j/PippoWebContext.java
index 132a3e42..c480f9f4 100644
--- a/pippo-security-parent/pippo-pac4j/src/main/java/ro/pippo/pac4j/PippoWebContext.java
+++ b/pippo-security-parent/pippo-pac4j/src/main/java/ro/pippo/pac4j/PippoWebContext.java
@@ -171,7 +171,7 @@ public void addResponseCookie(Cookie cookie) {
cookie.isSecure()
);
- javax.servlet.http.Cookie addedCookie = getResponse().getCookie(cookie.getName());
+ jakarta.servlet.http.Cookie addedCookie = getResponse().getCookie(cookie.getName());
addedCookie.setHttpOnly(cookie.isHttpOnly());
addedCookie.setComment(cookie.getComment());
}
diff --git a/pippo-security-parent/pippo-pac4j/src/test/java/ro/pippo/pac4j/PippoWebContextTest.java b/pippo-security-parent/pippo-pac4j/src/test/java/ro/pippo/pac4j/PippoWebContextTest.java
index e781891d..aafd8325 100644
--- a/pippo-security-parent/pippo-pac4j/src/test/java/ro/pippo/pac4j/PippoWebContextTest.java
+++ b/pippo-security-parent/pippo-pac4j/src/test/java/ro/pippo/pac4j/PippoWebContextTest.java
@@ -34,8 +34,8 @@
import ro.pippo.core.route.RouteContext;
import ro.pippo.core.route.Router;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -314,8 +314,8 @@ public void shouldReturnRouteContext() {
public void shouldReturnAllCookiesFromUnderlyingRequest() {
int authCookieExpiry = 604800000;
- javax.servlet.http.Cookie testCookie = new javax.servlet.http.Cookie("test", "talk");
- javax.servlet.http.Cookie authCookie = new javax.servlet.http.Cookie("sid", "DEADBEEF");
+ jakarta.servlet.http.Cookie testCookie = new jakarta.servlet.http.Cookie("test", "talk");
+ jakarta.servlet.http.Cookie authCookie = new jakarta.servlet.http.Cookie("sid", "DEADBEEF");
authCookie.setDomain("foo.example.com");
authCookie.setPath(DEFAULT_APPLICATION_PATH);
authCookie.setComment("auth cookie");
@@ -324,7 +324,7 @@ public void shouldReturnAllCookiesFromUnderlyingRequest() {
authCookie.setMaxAge(authCookieExpiry);
when(mockHttpRequest.getCookies())
- .thenReturn(new javax.servlet.http.Cookie[] { testCookie, authCookie });
+ .thenReturn(new jakarta.servlet.http.Cookie[] { testCookie, authCookie });
PippoWebContext context = makePippoWebContext();
@@ -351,7 +351,7 @@ public void shouldReturnAllCookiesFromUnderlyingRequest() {
@Test
public void shouldReturnEmptyCollectionIfNoCookiesInUnderlyingRequest() {
when(mockHttpRequest.getCookies())
- .thenReturn(new javax.servlet.http.Cookie[0]);
+ .thenReturn(new jakarta.servlet.http.Cookie[0]);
PippoWebContext context = makePippoWebContext();
@@ -374,14 +374,14 @@ public void shouldAddSpecifiedCookieToUnderlyingResponse() {
makePippoWebContext().addResponseCookie(cookieToAdd);
- ArgumentCaptor cookieArgumentCaptor
- = ArgumentCaptor.forClass(javax.servlet.http.Cookie.class);
+ ArgumentCaptor cookieArgumentCaptor
+ = ArgumentCaptor.forClass(jakarta.servlet.http.Cookie.class);
response.commit();
verify(mockHttpResponse, times(1)).addCookie(cookieArgumentCaptor.capture());
- javax.servlet.http.Cookie cookieAdded = cookieArgumentCaptor.getValue();
+ jakarta.servlet.http.Cookie cookieAdded = cookieArgumentCaptor.getValue();
assertThat(cookieAdded.getName(), is(cookieToAdd.getName()));
assertThat(cookieAdded.getValue(), is(cookieToAdd.getValue()));
diff --git a/pippo-server-parent/pippo-jetty/pom.xml b/pippo-server-parent/pippo-jetty/pom.xml
index 54561428..36d44702 100644
--- a/pippo-server-parent/pippo-jetty/pom.xml
+++ b/pippo-server-parent/pippo-jetty/pom.xml
@@ -15,7 +15,7 @@
Jetty embedded server
- 9.4.44.v20210927
+ 11.0.13
@@ -45,7 +45,7 @@
org.eclipse.jetty.websocket
- websocket-server
+ websocket-jetty-server
${jetty.version}
@@ -54,6 +54,20 @@
metainf-services
provided
+
+
+ ro.pippo
+ pippo-test
+ ${project.version}
+ test
+
+
+
+ org.eclipse.jetty.websocket
+ websocket-jetty-client
+ ${jetty.version}
+ test
+
diff --git a/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/JettyServer.java b/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/JettyServer.java
index 4b57dcc2..4973dec9 100644
--- a/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/JettyServer.java
+++ b/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/JettyServer.java
@@ -33,11 +33,11 @@
import ro.pippo.core.PippoServletContextListener;
import ro.pippo.core.WebServer;
-import javax.servlet.DispatcherType;
-import javax.servlet.MultipartConfigElement;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.DispatcherType;
+import jakarta.servlet.MultipartConfigElement;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
@@ -160,7 +160,7 @@ protected ServerConnector createServerConnector(Server server) {
return new ServerConnector(server);
}
- SslContextFactory sslContextFactory = new SslContextFactory.Server();
+ SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath(asJettyFriendlyPath(keyStoreFile, "Keystore file"));
if (getSettings().getKeystorePassword() != null) {
@@ -213,7 +213,7 @@ protected ServletContextHandler createPippoHandler() {
protected PippoFilter createPippoFilter() {
try {
// try to load a class from jetty.websocket
- Class.forName("org.eclipse.jetty.websocket.server.WebSocketServerFactory");
+ Class.forName("org.eclipse.jetty.websocket.server.JettyWebSocketServerContainer");
} catch (ClassNotFoundException e) {
return super.createPippoFilter();
}
@@ -221,7 +221,7 @@ protected PippoFilter createPippoFilter() {
try {
// create an instance of JettyWebSocketFilter
Class> pippoFilterClass = Class.forName("ro.pippo.jetty.websocket.JettyWebSocketFilter");
- return (PippoFilter) pippoFilterClass.getDeclaredConstructor().newInstance();
+ return (PippoFilter) pippoFilterClass.getDeclaredConstructor(Server.class).newInstance(server);
} catch (Exception e) {
throw new PippoRuntimeException(e);
}
@@ -257,7 +257,7 @@ public void doHandle(String target, Request baseRequest, HttpServletRequest requ
throws IOException, ServletException {
if (isMultipartRequest(request)) {
- baseRequest.setAttribute(Request.MULTIPART_CONFIG_ELEMENT, multipartConfig);
+ baseRequest.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, multipartConfig);
}
super.doHandle(target, baseRequest, request, response);
diff --git a/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/websocket/JettyWebSocketConnection.java b/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/websocket/JettyWebSocketConnection.java
index c83dce38..f58229bd 100644
--- a/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/websocket/JettyWebSocketConnection.java
+++ b/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/websocket/JettyWebSocketConnection.java
@@ -19,7 +19,7 @@
import ro.pippo.core.websocket.WebSocketConnection;
import java.io.IOException;
-import java.net.InetSocketAddress;
+import java.net.SocketAddress;
import java.nio.ByteBuffer;
/**
@@ -63,7 +63,7 @@ public WebSocketConnection sendMessage(byte[] message) throws IOException {
}
@Override
- public InetSocketAddress getRemoteAddress() {
+ public SocketAddress getRemoteAddress() {
return session.getRemoteAddress();
}
diff --git a/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/websocket/JettyWebSocketFilter.java b/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/websocket/JettyWebSocketFilter.java
index ba4a7be4..1cb4a2ec 100644
--- a/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/websocket/JettyWebSocketFilter.java
+++ b/pippo-server-parent/pippo-jetty/src/main/java/ro/pippo/jetty/websocket/JettyWebSocketFilter.java
@@ -15,9 +15,11 @@
*/
package ro.pippo.jetty.websocket;
-import org.eclipse.jetty.websocket.api.WebSocketPolicy;
-import org.eclipse.jetty.websocket.server.WebSocketServerFactory;
-import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.websocket.core.server.WebSocketServerComponents;
+import org.eclipse.jetty.websocket.server.JettyServerUpgradeRequest;
+import org.eclipse.jetty.websocket.server.JettyWebSocketCreator;
+import org.eclipse.jetty.websocket.server.JettyWebSocketServerContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.pippo.core.Request;
@@ -25,9 +27,11 @@
import ro.pippo.core.websocket.AbstractWebSocketFilter;
import ro.pippo.core.websocket.WebSocketRouter;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+
import java.io.IOException;
+import java.time.Duration;
/**
* @author Decebal Suiu
@@ -36,33 +40,40 @@ public class JettyWebSocketFilter extends AbstractWebSocketFilter {
private static final Logger log = LoggerFactory.getLogger(JettyWebSocketFilter.class);
- private WebSocketServerFactory webSocketFactory;
+ private final Server server;
+ private JettyWebSocketServerContainer serverContainer;
+ private JettyWebSocketCreator creator;
+
+ public JettyWebSocketFilter(Server server) {
+ this.server = server;
+ }
@Override
public void init(FilterConfig filterConfig) throws ServletException {
super.init(filterConfig);
try {
- WebSocketPolicy serverPolicy = WebSocketPolicy.newServerPolicy();
+ WebSocketServerComponents.ensureWebSocketComponents(server, filterConfig.getServletContext());
+ serverContainer = JettyWebSocketServerContainer.ensureContainer(filterConfig.getServletContext());
String inputBufferSize = filterConfig.getInitParameter("inputBufferSize");
if (inputBufferSize != null) {
- serverPolicy.setInputBufferSize(Integer.parseInt(inputBufferSize));
+ serverContainer.setInputBufferSize(Integer.parseInt(inputBufferSize));
}
String idleTimeout = filterConfig.getInitParameter("idleTimeout");
if (idleTimeout != null) {
- serverPolicy.setIdleTimeout(Integer.parseInt(idleTimeout));
+ serverContainer.setIdleTimeout(Duration.ofMillis(Long.parseLong(idleTimeout)));
}
String maxTextMessageSize = filterConfig.getInitParameter("maxTextMessageSize");
if (maxTextMessageSize != null) {
- serverPolicy.setMaxTextMessageSize(Integer.parseInt(maxTextMessageSize));
+ serverContainer.setMaxTextMessageSize(Integer.parseInt(maxTextMessageSize));
}
- webSocketFactory = new WebSocketServerFactory(filterConfig.getServletContext(), serverPolicy);
- webSocketFactory.setCreator((request, response) -> createWebSocketAdapter(request));
- webSocketFactory.start();
+ creator = (request, response) -> createWebSocketAdapter(request);
+
+ serverContainer.start();
} catch (ServletException e) {
throw e;
} catch (Exception e) {
@@ -72,9 +83,9 @@ public void init(FilterConfig filterConfig) throws ServletException {
@Override
public void destroy() {
- if (webSocketFactory != null) {
+ if (serverContainer != null) {
try {
- webSocketFactory.stop();
+ serverContainer.stop();
} catch (Exception e) {
log.warn("A problem occurred while stopping the web socket factory", e);
}
@@ -85,13 +96,11 @@ public void destroy() {
@Override
protected boolean acceptWebSocket(Request request, Response response) throws IOException, ServletException {
- return super.acceptWebSocket(request, response) && webSocketFactory
- .acceptWebSocket(request.getHttpServletRequest(), response.getHttpServletResponse());
+ return super.acceptWebSocket(request, response) && serverContainer.upgrade(creator, request.getHttpServletRequest(), response.getHttpServletResponse());
}
- protected JettyWebSocketAdapter createWebSocketAdapter(ServletUpgradeRequest request) {
+ protected JettyWebSocketAdapter createWebSocketAdapter(JettyServerUpgradeRequest request) {
WebSocketRouter.WebSocketMatch match = findWebSocketRoute(request.getRequestPath());
-
return new JettyWebSocketAdapter(match.getHandler(), match.getPathParameters());
}
diff --git a/pippo-server-parent/pippo-jetty/src/test/java/ro/pippo/jetty/JettyServerTest.java b/pippo-server-parent/pippo-jetty/src/test/java/ro/pippo/jetty/JettyServerTest.java
new file mode 100644
index 00000000..f4a596c8
--- /dev/null
+++ b/pippo-server-parent/pippo-jetty/src/test/java/ro/pippo/jetty/JettyServerTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2015-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package ro.pippo.jetty;
+
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
+import org.eclipse.jetty.websocket.api.annotations.WebSocket;
+import org.hamcrest.Matchers;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+import ro.pippo.core.Application;
+import ro.pippo.core.websocket.WebSocketContext;
+import ro.pippo.core.websocket.WebSocketHandler;
+import ro.pippo.test.PippoTest;
+import ro.pippo.test.PippoWebSocketExtension;
+
+import java.io.IOException;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class JettyServerTest extends PippoTest {
+
+ @RegisterExtension
+ public static PippoWebSocketExtension pippoExtension = new PippoWebSocketExtension(new Application() {{
+
+ GET("/foo", context -> context.send("foo"));
+
+ addWebSocket("/ws/echo", new WebSocketHandler() {
+ @Override
+ public void onMessage(WebSocketContext context, String message) {
+ try {
+ context.getConnection().sendMessage(message);
+ } catch (IOException e) {
+ throw new RuntimeException("Unable to echo message", e);
+ }
+ }
+ @Override
+ public void onMessage(WebSocketContext context, byte[] message) {
+ try {
+ context.getConnection().sendMessage(message);
+ } catch (IOException e) {
+ throw new RuntimeException("Unable to echo message", e);
+ }
+ }
+ });
+
+ }});
+
+ @Test
+ public void testPlainTextGet() {
+ when()
+ .get("/foo")
+ .then()
+ .statusCode(200)
+ .body(Matchers.containsString("foo"))
+ ;
+ }
+
+ @Test
+ public void testWsText() throws IOException, ExecutionException, InterruptedException {
+ BlockingQueue incoming = new LinkedBlockingQueue<>();
+
+ WsEchoEndpoint clientEndPoint = new WsEchoEndpoint(incoming);
+
+ CompletableFuture clientSessionPromise = pippoExtension.wsConnect(clientEndPoint, "/ws/echo");
+
+ try (Session session = clientSessionPromise.get()) {
+ String message = "ping";
+
+ session.getRemote().sendString(message);
+
+ String response = incoming.take();
+ Assertions.assertEquals(response, message);
+ }
+ }
+
+ @WebSocket
+ @SuppressWarnings("InnerClassMayBeStatic")
+ public class WsEchoEndpoint {
+
+ private final BlockingQueue queue;
+
+ public WsEchoEndpoint(BlockingQueue queue) {
+ this.queue = queue;
+ }
+
+ @OnWebSocketMessage
+ public void onText(@SuppressWarnings("unused") Session session, String message) throws InterruptedException {
+ queue.put(message);
+ }
+
+ }
+
+}
diff --git a/pippo-server-parent/pippo-tomcat/pom.xml b/pippo-server-parent/pippo-tomcat/pom.xml
index df5debb0..67a38a2a 100644
--- a/pippo-server-parent/pippo-tomcat/pom.xml
+++ b/pippo-server-parent/pippo-tomcat/pom.xml
@@ -14,7 +14,7 @@
Tomcat Embedded Web Server
- 8.5.61
+ 10.0.27
diff --git a/pippo-server-parent/pippo-tomcat/src/main/java/ro/pippo/tomcat/TomcatServer.java b/pippo-server-parent/pippo-tomcat/src/main/java/ro/pippo/tomcat/TomcatServer.java
index ab582a95..28de6df1 100644
--- a/pippo-server-parent/pippo-tomcat/src/main/java/ro/pippo/tomcat/TomcatServer.java
+++ b/pippo-server-parent/pippo-tomcat/src/main/java/ro/pippo/tomcat/TomcatServer.java
@@ -70,8 +70,8 @@ public void start() {
wrapper.setLoadOnStartup(1);
wrapper.setServlet(pippoServlet);
wrapper.setMultipartConfigElement(createMultipartConfigElement());
+ wrapper.addMapping(pippoFilterPath);
context.addChild(wrapper);
- context.addServletMapping(pippoFilterPath, name);
// inject application as context attribute
context.getServletContext().setAttribute(PIPPO_APPLICATION, getApplication());
@@ -128,20 +128,19 @@ private void enableSSLConnector(Tomcat tomcat) {
connector.setPort(getSettings().getPort());
connector.setSecure(true);
connector.setScheme("https");
- connector.setAttribute("keyAlias", getSettings().getKeyAlias());
- connector.setAttribute("keystorePass", getSettings().getKeystorePassword());
- connector.setAttribute("keystoreType", getSettings().getKeyType());
- connector.setAttribute("keystoreFile", getSettings().getKeystoreFile());
- connector.setAttribute("clientAuth", getSettings().getClientAuth());
+ connector.setProperty("keyAlias", getSettings().getKeyAlias());
+ connector.setProperty("keystorePass", getSettings().getKeystorePassword());
+ connector.setProperty("keystoreType", getSettings().getKeyType());
+ connector.setProperty("keystoreFile", getSettings().getKeystoreFile());
+ connector.setProperty("clientAuth", getSettings().getClientAuth() ? "required" : "none");
if (getSettings().getClientAuth()) {
- connector.setAttribute("truststoreFile", getSettings().getTruststoreFile());
- connector.setAttribute("truststorePass", getSettings().getTruststorePassword());
+ connector.setProperty("truststoreFile", getSettings().getTruststoreFile());
+ connector.setProperty("truststorePassword", getSettings().getTruststorePassword());
}
- connector.setAttribute("protocol", "HTTP/1.1");
- connector.setAttribute("sslProtocol", "TLS");
- connector.setAttribute("maxThreads", getSettings().getMaxConnections());
- connector.setAttribute("protocol", "org.apache.coyote.http11.Http11AprProtocol");
- connector.setAttribute("SSLEnabled", true);
+ connector.setProperty("protocol", "HTTP/1.1");
+ connector.setProperty("sslProtocol", "TLS");
+ connector.setProperty("maxThreads", String.valueOf(getSettings().getMaxConnections()));
+ connector.setProperty("SSLEnabled", "true");
}
}
diff --git a/pippo-server-parent/pippo-undertow/pom.xml b/pippo-server-parent/pippo-undertow/pom.xml
index 2fda4f39..cc164b84 100644
--- a/pippo-server-parent/pippo-undertow/pom.xml
+++ b/pippo-server-parent/pippo-undertow/pom.xml
@@ -15,7 +15,7 @@
Undertow embedded server
- 1.4.27.Final
+ 2.2.20.Final
@@ -27,7 +27,7 @@
io.undertow
- undertow-servlet
+ undertow-servlet-jakarta
${undertow.version}
diff --git a/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/UndertowServer.java b/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/UndertowServer.java
index 55e64732..51a2901e 100644
--- a/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/UndertowServer.java
+++ b/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/UndertowServer.java
@@ -45,8 +45,8 @@
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
-import javax.servlet.DispatcherType;
-import javax.servlet.MultipartConfigElement;
+import jakarta.servlet.DispatcherType;
+import jakarta.servlet.MultipartConfigElement;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
diff --git a/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/websocket/UndertowWebSocketConnection.java b/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/websocket/UndertowWebSocketConnection.java
index b3422573..9af58a38 100644
--- a/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/websocket/UndertowWebSocketConnection.java
+++ b/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/websocket/UndertowWebSocketConnection.java
@@ -18,11 +18,10 @@
import io.undertow.websockets.core.WebSocketChannel;
import io.undertow.websockets.core.WebSockets;
import io.undertow.websockets.spi.WebSocketHttpExchange;
-import ro.pippo.core.PippoRuntimeException;
import ro.pippo.core.websocket.WebSocketConnection;
import java.io.IOException;
-import java.net.InetSocketAddress;
+import java.net.SocketAddress;
import java.nio.ByteBuffer;
/**
@@ -66,7 +65,7 @@ public WebSocketConnection sendMessage(byte[] message) throws IOException {
}
@Override
- public InetSocketAddress getRemoteAddress() {
+ public SocketAddress getRemoteAddress() {
return channel.getSourceAddress();
}
diff --git a/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/websocket/UndertowWebSocketFilter.java b/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/websocket/UndertowWebSocketFilter.java
index 45621309..ec9f5de1 100644
--- a/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/websocket/UndertowWebSocketFilter.java
+++ b/pippo-server-parent/pippo-undertow/src/main/java/ro/pippo/undertow/websocket/UndertowWebSocketFilter.java
@@ -28,10 +28,10 @@
import ro.pippo.core.websocket.AbstractWebSocketFilter;
import ro.pippo.core.websocket.WebSocketRouter;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
diff --git a/pippo-session-parent/pippo-session-cookie/pom.xml b/pippo-session-parent/pippo-session-cookie/pom.xml
index 95eb43d9..08476a30 100644
--- a/pippo-session-parent/pippo-session-cookie/pom.xml
+++ b/pippo-session-parent/pippo-session-cookie/pom.xml
@@ -17,8 +17,8 @@
- javax.servlet
- javax.servlet-api
+ jakarta.servlet
+ jakarta.servlet-api
${servlet.version}
provided
diff --git a/pippo-session-parent/pippo-session-cookie/src/main/java/ro/pippo/session/cookie/CookieSessionDataStorage.java b/pippo-session-parent/pippo-session-cookie/src/main/java/ro/pippo/session/cookie/CookieSessionDataStorage.java
index f25fdb70..9488962e 100644
--- a/pippo-session-parent/pippo-session-cookie/src/main/java/ro/pippo/session/cookie/CookieSessionDataStorage.java
+++ b/pippo-session-parent/pippo-session-cookie/src/main/java/ro/pippo/session/cookie/CookieSessionDataStorage.java
@@ -26,9 +26,9 @@
import ro.pippo.session.SessionDataStorage;
import ro.pippo.session.SessionDataTranscoder;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* @author Decebal Suiu
diff --git a/pippo-session-parent/pippo-session/pom.xml b/pippo-session-parent/pippo-session/pom.xml
index 85baf105..002539da 100644
--- a/pippo-session-parent/pippo-session/pom.xml
+++ b/pippo-session-parent/pippo-session/pom.xml
@@ -17,8 +17,8 @@
- javax.servlet
- javax.servlet-api
+ jakarta.servlet
+ jakarta.servlet-api
${servlet.version}
provided
diff --git a/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/CookieSessionStrategy.java b/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/CookieSessionStrategy.java
index 3d770ddf..492c3e7c 100644
--- a/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/CookieSessionStrategy.java
+++ b/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/CookieSessionStrategy.java
@@ -17,9 +17,9 @@
import ro.pippo.core.util.CookieUtils;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* @author Decebal Suiu
diff --git a/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/PippoHttpSession.java b/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/PippoHttpSession.java
index cc6f40fa..81c972b6 100644
--- a/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/PippoHttpSession.java
+++ b/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/PippoHttpSession.java
@@ -15,9 +15,9 @@
*/
package ro.pippo.session;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpSession;
-import javax.servlet.http.HttpSessionContext;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.http.HttpSession;
+import jakarta.servlet.http.HttpSessionContext;
import java.util.Collections;
import java.util.Enumeration;
diff --git a/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionHttpServletRequest.java b/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionHttpServletRequest.java
index 98aa7894..0e579be0 100644
--- a/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionHttpServletRequest.java
+++ b/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionHttpServletRequest.java
@@ -15,10 +15,10 @@
*/
package ro.pippo.session;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpSession;
/**
* @author Decebal Suiu
diff --git a/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionRequestResponseFactory.java b/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionRequestResponseFactory.java
index 7e5bdaf3..f449b60a 100644
--- a/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionRequestResponseFactory.java
+++ b/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionRequestResponseFactory.java
@@ -21,8 +21,8 @@
import ro.pippo.core.RequestResponseFactory;
import ro.pippo.core.Response;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* @author Decebal Suiu
diff --git a/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionStrategy.java b/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionStrategy.java
index 2b67f853..c17330f2 100644
--- a/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionStrategy.java
+++ b/pippo-session-parent/pippo-session/src/main/java/ro/pippo/session/SessionStrategy.java
@@ -15,8 +15,8 @@
*/
package ro.pippo.session;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* @author Decebal Suiu
diff --git a/pippo-test/pom.xml b/pippo-test/pom.xml
index 1d3da41c..3d540cc3 100644
--- a/pippo-test/pom.xml
+++ b/pippo-test/pom.xml
@@ -16,6 +16,7 @@
5.3.0
+ 11.0.13
@@ -33,6 +34,13 @@
compile
+
+ org.eclipse.jetty.websocket
+ websocket-jetty-client
+ ${jetty-websocket.version}
+ true
+
+
org.junit.jupiter
junit-jupiter-engine
diff --git a/pippo-test/src/main/java/ro/pippo/test/PippoExtension.java b/pippo-test/src/main/java/ro/pippo/test/PippoExtension.java
index 6441221f..1f556c04 100644
--- a/pippo-test/src/main/java/ro/pippo/test/PippoExtension.java
+++ b/pippo-test/src/main/java/ro/pippo/test/PippoExtension.java
@@ -15,14 +15,16 @@
*/
package ro.pippo.test;
+import org.junit.jupiter.api.extension.AfterAllCallback;
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import io.restassured.RestAssured;
import io.restassured.config.ObjectMapperConfig;
import io.restassured.config.RestAssuredConfig;
import io.restassured.mapper.ObjectMapper;
import io.restassured.mapper.ObjectMapperDeserializationContext;
import io.restassured.mapper.ObjectMapperSerializationContext;
-import org.junit.jupiter.api.extension.AfterEachCallback;
-import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import ro.pippo.core.Application;
import ro.pippo.core.ContentTypeEngine;
@@ -34,9 +36,11 @@
*
* @author Decebal Suiu
*/
-public class PippoExtension implements BeforeEachCallback, AfterEachCallback {
+public class PippoExtension implements BeforeAllCallback, AfterAllCallback {
- private final Pippo pippo;
+ private static final Logger log = LoggerFactory.getLogger(PippoExtension.class);
+
+ protected final Pippo pippo;
public PippoExtension() {
this(new Application());
@@ -70,21 +74,29 @@ public Application getApplication() {
}
public void startPippo() {
- pippo.start();
+ try {
+ pippo.start();
+ } catch (Exception e) {
+ throw new RuntimeException("Error starting Pippo", e);
+ }
initRestAssured();
}
public void stopPippo() {
- pippo.stop();
+ try {
+ pippo.stop();
+ } catch (Exception e) {
+ log.error("Error stopping Pippo", e);
+ }
}
@Override
- public void beforeEach(ExtensionContext extensionContext) {
+ public void beforeAll(ExtensionContext extensionContext) {
startPippo();
}
@Override
- public void afterEach(ExtensionContext extensionContext) {
+ public void afterAll(ExtensionContext extensionContext) {
stopPippo();
}
diff --git a/pippo-test/src/main/java/ro/pippo/test/PippoWebSocketExtension.java b/pippo-test/src/main/java/ro/pippo/test/PippoWebSocketExtension.java
new file mode 100644
index 00000000..d413fc7d
--- /dev/null
+++ b/pippo-test/src/main/java/ro/pippo/test/PippoWebSocketExtension.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2015-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package ro.pippo.test;
+
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.client.WebSocketClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import ro.pippo.core.Application;
+import ro.pippo.core.Pippo;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.concurrent.CompletableFuture;
+
+public class PippoWebSocketExtension extends PippoExtension {
+
+ private static final Logger log = LoggerFactory.getLogger(PippoWebSocketExtension.class);
+
+ private final WebSocketClient webSocketClient;
+
+ public PippoWebSocketExtension() {
+ this(new Application());
+ }
+
+ public PippoWebSocketExtension(Application application) {
+ this(application, AvailablePortFinder.findAvailablePort());
+ }
+
+ public PippoWebSocketExtension(Application application, Integer port) {
+ this(new Pippo(application), port);
+ }
+
+ public PippoWebSocketExtension(Pippo pippo) {
+ this(pippo, AvailablePortFinder.findAvailablePort());
+ }
+
+ public PippoWebSocketExtension(Pippo pippo, Integer port) {
+ super(pippo, port);
+
+ webSocketClient = new WebSocketClient();
+ webSocketClient.setMaxTextMessageSize(8 * 1024);
+ }
+
+ @Override
+ public void startPippo() {
+ super.startPippo();
+
+ try {
+ webSocketClient.start();
+ } catch (Exception e) {
+ throw new RuntimeException("Error starting WebSocket client", e);
+ }
+ }
+
+ @Override
+ public void stopPippo() {
+ try {
+ webSocketClient.stop();
+ } catch (Exception e) {
+ log.error("Error stopping WebSocket client", e);
+ }
+
+ super.stopPippo();
+ }
+
+ public CompletableFuture wsConnect(Object clientEndPoint, String path) throws IOException {
+ return webSocketClient.connect(clientEndPoint, URI.create(String.format("ws://%s:%d%s", "localhost", pippo.getServer().getPort(), path)));
+ }
+}
diff --git a/pom.xml b/pom.xml
index cd6b4446..d7c67c3b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -48,7 +48,7 @@
2.3.1
2.3.0.1
- 3.0.1
+ 5.0.0
1.7.25
4.0.2