From cf3735d21dca0403fe1593e36704e840e03c1205 Mon Sep 17 00:00:00 2001 From: Eduardo Pinho Date: Sat, 30 Sep 2023 11:30:29 +0100 Subject: [PATCH 1/2] Update Jetty to 9.4 - from 9.0.3.v20130506 to 9.4.52.v20230823 - rearrange and reorganize servlets and handlers so that the server provides everything - remove server session attribute - we already handle user sessions separately at the moment - mark services known to be unused as deprecated - add plugin controller check to skip JettyPluginInterface resource if it is null --- .../ua/dicoogle/plugins/PluginController.java | 3 + .../ua/dicoogle/server/web/DicoogleWeb.java | 271 ++++++++++-------- .../ua/dicoogle/server/web/auth/Session.java | 3 - .../web/servlets/SearchHolderServlet.java | 2 + .../web/servlets/search/ExportServlet.java | 4 + .../web/servlets/search/WadoServlet.java | 2 + pom.xml | 2 +- 7 files changed, 159 insertions(+), 128 deletions(-) diff --git a/dicoogle/src/main/java/pt/ua/dicoogle/plugins/PluginController.java b/dicoogle/src/main/java/pt/ua/dicoogle/plugins/PluginController.java index 9e8a1341b..9933f563c 100755 --- a/dicoogle/src/main/java/pt/ua/dicoogle/plugins/PluginController.java +++ b/dicoogle/src/main/java/pt/ua/dicoogle/plugins/PluginController.java @@ -266,6 +266,9 @@ private void initJettyInterface(Collection plugins) { DicoogleWeb jettyServer = ControlServices.getInstance().getWebServicePlatform(); for (JettyPluginInterface resource : jettyInterfaces) { + if (resource == null) { + continue; + } jettyServer.addContextHandlers(resource.getJettyHandlers()); } } diff --git a/dicoogle/src/main/java/pt/ua/dicoogle/server/web/DicoogleWeb.java b/dicoogle/src/main/java/pt/ua/dicoogle/server/web/DicoogleWeb.java index 87dff12a7..121a4bdd2 100755 --- a/dicoogle/src/main/java/pt/ua/dicoogle/server/web/DicoogleWeb.java +++ b/dicoogle/src/main/java/pt/ua/dicoogle/server/web/DicoogleWeb.java @@ -28,7 +28,6 @@ import pt.ua.dicoogle.server.web.servlets.SettingsServlet; import pt.ua.dicoogle.server.web.servlets.TagsServlet; import pt.ua.dicoogle.server.web.servlets.ExportCSVToFILEServlet; -import pt.ua.dicoogle.server.web.servlets.SearchHolderServlet; import pt.ua.dicoogle.server.web.servlets.IndexerServlet; import pt.ua.dicoogle.server.web.servlets.ImageServlet; import pt.ua.dicoogle.server.web.servlets.plugins.PluginsServlet; @@ -39,20 +38,6 @@ import pt.ua.dicoogle.server.web.servlets.accounts.LoginServlet; import pt.ua.dicoogle.server.web.servlets.accounts.UserServlet; -//import pt.ua.dicoogle.core.ServerSettings; - -import pt.ua.dicoogle.server.web.servlets.management.AETitleServlet; -import pt.ua.dicoogle.server.web.servlets.management.DicomQuerySettingsServlet; -import pt.ua.dicoogle.server.web.servlets.management.ForceIndexing; -import pt.ua.dicoogle.server.web.servlets.management.IndexerSettingsServlet; -import pt.ua.dicoogle.server.web.servlets.management.LoggerServlet; -import pt.ua.dicoogle.server.web.servlets.management.RemoveServlet; -import pt.ua.dicoogle.server.web.servlets.management.RunningTasksServlet; -import pt.ua.dicoogle.server.web.servlets.management.ServerStorageServlet; -import pt.ua.dicoogle.server.web.servlets.management.ServicesServlet; -import pt.ua.dicoogle.server.web.servlets.management.TransferOptionsServlet; - - import java.io.File; import java.net.URL; import java.nio.charset.StandardCharsets; @@ -64,18 +49,16 @@ import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.webapp.WebAppContext; +import org.restlet.Restlet; import javax.servlet.DispatcherType; -import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.HandlerWrapper; - +import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.FilterHolder; -import org.eclipse.jetty.servlets.GzipFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -83,8 +66,6 @@ import pt.ua.dicoogle.server.LegacyRestletApplication; import pt.ua.dicoogle.server.web.servlets.accounts.LogoutServlet; -import pt.ua.dicoogle.server.web.servlets.search.DumpServlet; -import pt.ua.dicoogle.server.web.servlets.management.UnindexServlet; import pt.ua.dicoogle.server.web.servlets.webui.WebUIModuleServlet; import pt.ua.dicoogle.server.web.servlets.webui.WebUIServlet; import pt.ua.dicoogle.server.web.utils.LocalImageCache; @@ -115,9 +96,9 @@ public class DicoogleWeb { private final int port; private final ContextHandlerCollection contextHandlers; - private ServletContextHandler pluginHandler = null; + private Handler pluginHandler; private PluginRestletApplication pluginApp = null; - private ServletContextHandler legacyHandler = null; + private Handler legacyHandler = null; private LegacyRestletApplication legacyApp = null; /** @@ -128,123 +109,162 @@ public class DicoogleWeb { public DicoogleWeb(int port) throws Exception { logger.info("Starting Web Services in DicoogleWeb. Port: {}", port); System.setProperty("org.apache.jasper.compiler.disablejsr199", "true"); - // System.setProperty("org.mortbay.jetty.webapp.parentLoaderPriority", "true"); - // System.setProperty("production.mode", "true"); this.port = port; + this.contextHandlers = this.createHandlerCollection(); - // "build" the input location, based on the www directory/.war chosen - final URL warUrl = Thread.currentThread().getContextClassLoader().getResource(WEBAPPDIR); - final String warUrlString = warUrl.toExternalForm(); + // setup the server + server = new Server(port); + server.setHandler(this.contextHandlers); + // Increase maxFormContentSize to avoid issues with big forms + server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", 3325000); + + // and then start the server + server.start(); + } + + /** Root context handler, contains the full tree of services. */ + private ContextHandlerCollection createHandlerCollection() { // setup the DICOM to PNG image servlet, with a local cache cache = new LocalImageCache("dic2png", 300, 900, new SimpleImageRetriever()); // pooling rate of 12/hr and max un-used cache age of 15 minutes - final ServletContextHandler dic2png = createServletHandler(new ImageServlet(cache), "/dic2png"); cache.start(); // start the caching system - // setup the DICOM to PNG image servlet - final ServletContextHandler dictags = createServletHandler(new TagsServlet(), "/dictags"); - - // setup the Export to CSV Servlet - final ServletContextHandler csvServletHolder = createServletHandler(new ExportToCSVServlet(), "/export"); + // temporary folder for export CSV files File tempDir = Paths.get(System.getProperty("java.io.tmpdir")).toFile(); - csvServletHolder.addServlet(new ServletHolder(new ExportCSVToFILEServlet(tempDir)), "/exportFile"); - - // setup the search (DIMSE-service-user C-FIND ?!?) servlet - // final ServletContextHandler search = new ServletContextHandler(ServletContextHandler.SESSIONS); // servlet with session support enabled - // search.setContextPath(CONTEXTPATH); - // search.addServlet(new ServletHolder(new SearchServlet()), "/search"); - - /*hooks = getRegisteredHookActions(); - plugin.addServlet(new ServletHolder(new PluginsServlet(hooks)), "/plugin/*"); - */ - - // setup the web pages/scripts app - final WebAppContext webpages = new WebAppContext(warUrlString, CONTEXTPATH); - webpages.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false"); // disables directory listing - webpages.setInitParameter("useFileMappedBuffer", "false"); - webpages.setInitParameter("cacheControl", "public, max-age=2592000"); // cache for 30 days - webpages.setInitParameter("etags", "true"); // generate and handle weak entity validation tags - webpages.setDisplayName("webapp"); - webpages.setWelcomeFiles(new String[] {"index.html"}); - webpages.addServlet(new ServletHolder(new SearchHolderServlet()), "/search/holders"); - webpages.addFilter(GzipFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); + // set up plugin Restlet application for plugin services this.pluginApp = new PluginRestletApplication(); - this.pluginHandler = createServletHandler(new RestletHttpServlet(this.pluginApp), "/ext/*"); + this.pluginHandler = createRestletHandler("ext", this.pluginApp); + // set up plugin Restlet application for legacy services this.legacyApp = new LegacyRestletApplication(); - this.legacyHandler = createServletHandler(new RestletHttpServlet(this.legacyApp), "/legacy/*"); + this.legacyHandler = createRestletHandler("legacy", this.legacyApp); // Add Static RESTlet Plugins PluginRestletApplication.attachRestPlugin(new VersionResource()); - // list the all the handlers mounted above - Handler[] handlers = new Handler[] {pluginHandler, legacyHandler, dic2png, dictags, - createServletHandler(new IndexerServlet(), "/indexer"), // DEPRECATED - createServletHandler(new SettingsServlet(), "/settings"), csvServletHolder, - createServletHandler(new LoginServlet(), "/login"), - createServletHandler(new LogoutServlet(), "/logout"), - createServletHandler(new UserServlet(), "/user/*"), - createServletHandler(new SearchServlet(), "/search"), - createServletHandler(new SearchServlet(SearchType.PATIENT), "/searchDIM"), - createServletHandler(new DumpServlet(), "/dump"), - createServletHandler(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.path), - "/management/settings/index/path"), - createServletHandler(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.zip), - "/management/settings/index/zip"), - createServletHandler(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.effort), - "/management/settings/index/effort"), - createServletHandler(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.thumbnail), - "/management/settings/index/thumbnail"), - createServletHandler(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.watcher), - "/management/settings/index/watcher"), - createServletHandler(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.thumbnailSize), - "/management/settings/index/thumbnail/size"), - createServletHandler(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.all), - "/management/settings/index"), - createServletHandler(new TransferOptionsServlet(), "/management/settings/transfer"), - createServletHandler(new WadoServlet(), "/wado"), - createServletHandler(new ProvidersServlet(), "/providers"), - createServletHandler(new DicomQuerySettingsServlet(), "/management/settings/dicom/query"), - createServletHandler(new DimTagsServlet(TagsStruct.getInstance()), "/management/settings/dicom/tags"), - createServletHandler(new ForceIndexing(), "/management/tasks/index"), - createServletHandler(new UnindexServlet(), "/management/tasks/unindex"), - createServletHandler(new RemoveServlet(), "/management/tasks/remove"), - createServletHandler(new ServicesServlet(ServicesServlet.STORAGE), "/management/dicom/storage"), - createServletHandler(new ServicesServlet(ServicesServlet.QUERY), "/management/dicom/query"), - createServletHandler(new ServicesServlet(ServicesServlet.PLUGIN), "/management/plugins/"), - createServletHandler(new AETitleServlet(), "/management/settings/dicom"), - createServletHandler(new PluginsServlet(), "/plugins/*"), - createServletHandler(new PresetsServlet(), "/presets/*"), - createServletHandler(new WebUIServlet(), "/webui"), createWebUIModuleServletHandler(), - createServletHandler(new LoggerServlet(), "/logger"), - createServletHandler(new RunningTasksServlet(), "/index/task"), - createServletHandler(new ExportServlet(ExportType.EXPORT_CVS), "/export/cvs"), - createServletHandler(new ExportServlet(ExportType.LIST), "/export/list"), - createServletHandler(new ServerStorageServlet(), "/management/settings/storage/dicom"), webpages}; + ServletContextHandler rootContextHandler = new ServletContextHandler(0); + rootContextHandler.setContextPath(CONTEXTPATH); + + // list handlers for services mounted in the root context directly + + // search + rootContextHandler.addServlet(new ServletHolder("search", new SearchServlet()), "/search"); + // DICOM to PNG image servlet + rootContextHandler.addServlet(new ServletHolder("dic2png", new ImageServlet(cache)), "/dic2png"); + // export to CSV servlets + rootContextHandler.addServlet(new ServletHolder("export", new ExportToCSVServlet()), "/export"); + rootContextHandler.addServlet(new ServletHolder(new ExportCSVToFILEServlet(tempDir)), "/exportFile"); + // dictags + rootContextHandler.addServlet(new ServletHolder(new TagsServlet()), "/dictags"); + // User servlets: logging in and out, and fetching user information. + rootContextHandler.addServlet(new ServletHolder(new LoginServlet()), "/login"); + rootContextHandler.addServlet(new ServletHolder(new LogoutServlet()), "/logout"); + rootContextHandler.addServlet(new ServletHolder(new UserServlet()), "/user/*"); + // DIM search servlet + rootContextHandler.addServlet(new ServletHolder(new SearchServlet(SearchType.PATIENT)), "/searchDIM"); + // metadata dump servlet + rootContextHandler.addServlet(new ServletHolder(new DumpServlet()), "/dump"); + // list query/index/storage providers + rootContextHandler.addServlet(new ServletHolder(new ProvidersServlet()), "/providers"); + // service to retrieve plugin information + rootContextHandler.addServlet(new ServletHolder(new PluginsServlet()), "/plugins/*"); + // service to retrieve export presets + rootContextHandler.addServlet(new ServletHolder(new PresetsServlet()), "/presets/*"); + // retrieve logs + rootContextHandler.addServlet(new ServletHolder(new LoggerServlet()), "/logger"); + // get running index tasks and do operations on them + rootContextHandler.addServlet(new ServletHolder(new RunningTasksServlet()), "/index/task"); + // deprecated stuff + rootContextHandler.addServlet(new ServletHolder(new IndexerServlet()), "/indexer"); + rootContextHandler.addServlet(new ServletHolder(new SettingsServlet()), "/settings"); + rootContextHandler.addServlet(new ServletHolder(new WadoServlet()), "/wado"); + rootContextHandler.addServlet(new ServletHolder(new ExportServlet(ExportType.EXPORT_CVS)), "/export/cvs"); + rootContextHandler.addServlet(new ServletHolder(new ExportServlet(ExportType.LIST)), "/export/list"); + // webapp + rootContextHandler.addServlet(createWebappServlet(), "/"); + + this.addCORSFilter(rootContextHandler); + + // list ALL of the handlers mounted above + Handler[] handlers = new Handler[] { + // /management + createManagementHandler(), + + // /webui + createWebUIServletHandler(), + + // /ext (handler for Restlet resources from Dicoogle plugins) + pluginHandler, + // /legacy (legacy Restlet service handling) + legacyHandler, + + // / + rootContextHandler}; + + ContextHandlerCollection col = new ContextHandlerCollection(); + col.setHandlers(handlers); + return col; + } - // setup the server - server = new Server(port); - // register the handlers on the server - this.contextHandlers = new ContextHandlerCollection(); - this.contextHandlers.setHandlers(handlers); - server.setHandler(this.contextHandlers); + private ServletHolder createWebappServlet() { + final URL warUrl = Thread.currentThread().getContextClassLoader().getResource(WEBAPPDIR); - // Increase maxFormContentSize to avoid issues with big forms - server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", 3325000); + // set up static serving of the webapp + ServletHolder webpages = new ServletHolder("webapp", DefaultServlet.class); + webpages.setInitParameter("resourceBase", warUrl.toExternalForm()); + webpages.setInitParameter("welcomeFile", "index.html"); + webpages.setInitParameter(AbstractCacheFilter.CACHE_CONTROL_PARAM, "public, max-age=2592000"); // cache for 30 days - // and then start the server - server.start(); + return webpages; + } + + /** Management services: create all servlets and respective handlers */ + private ServletContextHandler createManagementHandler() { + ServletContextHandler handler = new ServletContextHandler(0); + + handler.setContextPath(CONTEXTPATH + "management"); + + handler.addServlet(new ServletHolder(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.path)), + "/settings/index/path"); + handler.addServlet(new ServletHolder(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.zip)), + "/settings/index/zip"); + handler.addServlet(new ServletHolder(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.effort)), + "/settings/index/effort"); + handler.addServlet(new ServletHolder(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.thumbnail)), + "/settings/index/thumbnail"); + handler.addServlet(new ServletHolder(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.watcher)), + "/settings/index/watcher"); + handler.addServlet( + new ServletHolder(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.thumbnailSize)), + "/settings/index/thumbnail/size"); + handler.addServlet(new ServletHolder(new IndexerSettingsServlet(IndexerSettingsServlet.SettingsType.all)), + "/settings/index"); + handler.addServlet(new ServletHolder(new TransferOptionsServlet()), "/settings/transfer"); + handler.addServlet(new ServletHolder(new DicomQuerySettingsServlet()), "/settings/dicom/query"); + handler.addServlet(new ServletHolder(new DimTagsServlet(TagsStruct.getInstance())), "/settings/dicom/tags"); + handler.addServlet(new ServletHolder(new ForceIndexing()), "/tasks/index"); + handler.addServlet(new ServletHolder(new UnindexServlet()), "/tasks/unindex"); + handler.addServlet(new ServletHolder(new RemoveServlet()), "/tasks/remove"); + handler.addServlet(new ServletHolder(new ServicesServlet(ServicesServlet.STORAGE)), "/dicom/storage"); + handler.addServlet(new ServletHolder(new ServicesServlet(ServicesServlet.QUERY)), "/dicom/query"); + handler.addServlet(new ServletHolder(new AETitleServlet()), "/settings/dicom"); + handler.addServlet(new ServletHolder(new ServerStorageServlet()), "/settings/storage/dicom"); + + this.addCORSFilter(handler); + + return handler; } - private ServletContextHandler createWebUIModuleServletHandler() { - ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS); // servlet with session support enabled - handler.setContextPath(CONTEXTPATH); + /** Web UI functionality: create all servlets and respective handlers */ + private ServletContextHandler createWebUIServletHandler() { + ServletContextHandler handler = new ServletContextHandler(0); + handler.setContextPath(CONTEXTPATH + "webui"); - HttpServlet servletModule = new WebUIModuleServlet(); // CORS support this.addCORSFilter(handler); + // Caching! FilterHolder cacheHolder = new FilterHolder(new AbstractCacheFilter() { @Override @@ -269,20 +289,24 @@ protected String etag(HttpServletRequest req) { } } }); + cacheHolder.setInitParameter(AbstractCacheFilter.CACHE_CONTROL_PARAM, "private, max-age=2592000"); // cache for 30 days - handler.addFilter(cacheHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); - handler.addServlet(new ServletHolder(servletModule), "/webui/module/*"); + + // servlet for web UI extension info retrieval + handler.addServlet(new ServletHolder("webui", new WebUIServlet()), ""); + // servlet for web UI JavaScript retrieval (with Etag support) + handler.addFilter(cacheHolder, "/module/*", EnumSet.of(DispatcherType.REQUEST)); + handler.addServlet(new ServletHolder("webui/module", new WebUIModuleServlet()), "/module/*"); return handler; } - private ServletContextHandler createServletHandler(HttpServlet servlet, String path) { - ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS); // servlet with session support enabled - handler.setContextPath(CONTEXTPATH); + private Handler createRestletHandler(String path, Restlet app) { - // CORS support - this.addCORSFilter(handler); + ServletContextHandler handler = new ServletContextHandler(0); + handler.setContextPath(CONTEXTPATH + path); + + handler.addServlet(new ServletHolder(path, new RestletHttpServlet(app)), "/*"); - handler.addServlet(new ServletHolder(servlet), path); return handler; } @@ -353,7 +377,6 @@ public void addContextHandlers(HandlerList handler) { this.contextHandlers.addHandler(handler); this.addCORSFilter(handler); - // this.server.setHandler(this.contextHandlers); } public void stopPluginWebServices() { diff --git a/dicoogle/src/main/java/pt/ua/dicoogle/server/web/auth/Session.java b/dicoogle/src/main/java/pt/ua/dicoogle/server/web/auth/Session.java index 07ba682b7..f8345b281 100644 --- a/dicoogle/src/main/java/pt/ua/dicoogle/server/web/auth/Session.java +++ b/dicoogle/src/main/java/pt/ua/dicoogle/server/web/auth/Session.java @@ -235,9 +235,6 @@ public static LoggedInStatus webappLogin(HttpServletRequest request, HttpServlet return new LoggedInStatus(null, LoggedInStatus.S_UNAUTHORIZEDACCESS); } - // add the login information to the session - HttpSession session = request.getSession(true); // force the creation of a new session if there is none - session.setAttribute("login", login); return new LoggedInStatus(login, LoggedInStatus.S_VALIDLOGIN); } diff --git a/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/SearchHolderServlet.java b/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/SearchHolderServlet.java index bd5eee724..2c862f060 100644 --- a/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/SearchHolderServlet.java +++ b/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/SearchHolderServlet.java @@ -43,7 +43,9 @@ * * @author Tiago Godinho. * + * @deprecated See {@link pt.ua.dicoogle.server.web.servlets.search.SearchServlet} instead */ +@Deprecated public class SearchHolderServlet extends HttpServlet { private static final long serialVersionUID = 1L; diff --git a/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/search/ExportServlet.java b/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/search/ExportServlet.java index eedd97de7..638cd37d4 100644 --- a/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/search/ExportServlet.java +++ b/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/search/ExportServlet.java @@ -35,6 +35,10 @@ import pt.ua.dicoogle.plugins.PluginController; import pt.ua.dicoogle.sdk.utils.DictionaryAccess; +/** + * @deprecated Use {@link pt.ua.dicoogle.server.web.servlets.ExportCSVToFILEServlet} instead. + */ +@Deprecated public class ExportServlet extends HttpServlet { private static final Logger logger = LoggerFactory.getLogger(ExportServlet.class); diff --git a/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/search/WadoServlet.java b/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/search/WadoServlet.java index 4af81c48c..985f9f3e8 100644 --- a/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/search/WadoServlet.java +++ b/dicoogle/src/main/java/pt/ua/dicoogle/server/web/servlets/search/WadoServlet.java @@ -38,7 +38,9 @@ /** * @author Frederico Silva * @todo + * @deprecated Incomplete implementation, to be removed in Dicoogle 4 */ +@Deprecated public class WadoServlet extends HttpServlet { @Override diff --git a/pom.xml b/pom.xml index 12eeed323..00dd46069 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ dicoogle-all - 9.0.3.v20130506 + 9.4.52.v20230823 2.1.2 2.0.29 1.7.36 From 2cc87a9b13fcb57f4aa2ff80308c38a5131a6b96 Mon Sep 17 00:00:00 2001 From: Eduardo Pinho Date: Wed, 20 Nov 2024 11:08:49 +0000 Subject: [PATCH 2/2] Update jetty to 9.4.56.v20240826 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 00dd46069..3348d9a73 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ dicoogle-all - 9.4.52.v20230823 + 9.4.56.v20240826 2.1.2 2.0.29 1.7.36