From c8ede50f06f9f0080adec2aa3564da1298566465 Mon Sep 17 00:00:00 2001 From: Jaco de Groot Date: Tue, 9 Jul 2024 17:47:05 +0200 Subject: [PATCH 1/7] Prevent recursion when index.html is not found --- src/main/java/nl/nn/testtool/web/AngularServlet.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/nl/nn/testtool/web/AngularServlet.java b/src/main/java/nl/nn/testtool/web/AngularServlet.java index e9e5008f..0b4ea822 100644 --- a/src/main/java/nl/nn/testtool/web/AngularServlet.java +++ b/src/main/java/nl/nn/testtool/web/AngularServlet.java @@ -146,10 +146,16 @@ public String getRequestURI() { RequestDispatcher requestDispatcher = request.getRequestDispatcher(webJarsRequestURI); requestDispatcher.include(requestWrapper, response); } catch(FileNotFoundException e) { - // Serve index.html when a resource is not found - includeWebJarAsset(request, response, true); + if (forceIndexHtml) { + // Prevent recursion when index.html is not found + throw e; + } else { + // Serve index.html when a resource is not found + includeWebJarAsset(request, response, true); + } } } + } class BaseRewritingServletOutputStream extends ServletOutputStream { From f559450ed8915a565321e47de3617c9a453dd21a Mon Sep 17 00:00:00 2001 From: Jaco de Groot Date: Tue, 9 Jul 2024 20:55:26 +0200 Subject: [PATCH 2/7] Don't use request dispatcher (by default) --- .../nl/nn/testtool/web/AngularServlet.java | 79 +++++++++++++------ 1 file changed, 56 insertions(+), 23 deletions(-) diff --git a/src/main/java/nl/nn/testtool/web/AngularServlet.java b/src/main/java/nl/nn/testtool/web/AngularServlet.java index 0b4ea822..ba192026 100644 --- a/src/main/java/nl/nn/testtool/web/AngularServlet.java +++ b/src/main/java/nl/nn/testtool/web/AngularServlet.java @@ -17,6 +17,7 @@ import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; @@ -62,6 +63,7 @@ public class AngularServlet extends HttpServlet { private static final long serialVersionUID = 1L; private String artifactId; private String version = ""; + private boolean useRequestDispatcher = false; /** * Set artifactId of WebJars jar that contains the Angular app to be served. In case of a Maven project the pom.xml @@ -83,6 +85,18 @@ public void setVersion(String version) { this.version = "/" + version; } + /** + * The servlet 3 specification allows static resources from /META-INF/resources to be served by the application + * server. For Tomcat this means that the JarScanner should not be configured to skip the WebJar (see also + * https://www.webjars.org/documentation#servlet3). Hence useRequestDispatcher is false by default (works in all + * situations). + * + * @param useRequestDispatcher set to true to dispatch requests and make the application server serve the resources + */ + public void setUseRequestDispatcher(boolean useRequestDispatcher) { + this.useRequestDispatcher = useRequestDispatcher; + } + @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { @@ -124,34 +138,53 @@ public ServletOutputStream getOutputStream() throws IOException { } else { webJarsRequestURI = webJarsBase + artifactId + version + pathInfo; } - // When Servlet 3 method (see https://www.webjars.org/documentation#servlet3) is used the Content-Type header - // isn't set (tested with Tomcat 9.0.60) which will cause problems when X-Content-Type-Options: nosniff is being - // used. Hence set the header like it is done by WebJars Servlet 2 - // (https://www.webjars.org/documentation#servlet2) + // Set Content-Type header to prevent problems when X-Content-Type-Options: nosniff is being used. + // Copied from WebJars Servlet 2. Would maybe be nice to set caching related headers also. + // https://www.webjars.org/documentation#servlet2 + // https://github.com/webjars/webjars-servlet-2.x/blob/master/src/main/java/org/webjars/servlet/WebjarsServlet.java String[] tokens = webJarsRequestURI.split("/"); String filename = tokens[tokens.length - 1]; String mimeType = getServletContext().getMimeType(filename); response.setContentType(mimeType != null ? mimeType : "application/octet-stream"); - HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) { - @Override - public String getServletPath() { - return webJarsBase; - } - @Override - public String getRequestURI() { - return webJarsRequestURI; + if (!useRequestDispatcher) { + String resourceName = "/META-INF/resources" + webJarsRequestURI; + try (InputStream inputStream = this.getClass().getResourceAsStream(resourceName)) { + if (inputStream != null) { + inputStream.transferTo(response.getOutputStream()); + } else { + if (forceIndexHtml) { + // Prevent infinite recursion when index.html is not found + throw new FileNotFoundException("The requested resource [" + webJarsRequestURI + "] is not available"); + } else { + // Serve index.html when a resource is not found + includeWebJarAsset(request, response, true); + } + } } - }; - try { - RequestDispatcher requestDispatcher = request.getRequestDispatcher(webJarsRequestURI); - requestDispatcher.include(requestWrapper, response); - } catch(FileNotFoundException e) { - if (forceIndexHtml) { - // Prevent recursion when index.html is not found - throw e; - } else { - // Serve index.html when a resource is not found - includeWebJarAsset(request, response, true); + } else { + HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) { + @Override + public String getServletPath() { + return webJarsBase; + } + @Override + public String getRequestURI() { + return webJarsRequestURI; + } + }; + try { + RequestDispatcher requestDispatcher = request.getRequestDispatcher(webJarsRequestURI); + // Using forward instead of include would set Content-Type and caching related headers but doesn't + // throw an exception when resource is not found (allowing for index.html to be served) + requestDispatcher.include(requestWrapper, response); + } catch(RuntimeException e) { + if (forceIndexHtml) { + // Prevent infinite recursion when index.html is not found + throw e; + } else { + // Serve index.html when a resource is not found + includeWebJarAsset(request, response, true); + } } } } From 66cc138c8ef44eccf50ba780ed60d0b2d82d5055 Mon Sep 17 00:00:00 2001 From: Jaco de Groot Date: Wed, 10 Jul 2024 11:17:54 +0200 Subject: [PATCH 3/7] Add maven.compiler.release --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index dc3c7774..55df9011 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ 3.0-SNAPSHOT UTF-8 + 11 0.1.0-20240704.152642 6.1.7 4.0.4 From 64ceb9c7a02a941c8d8ecb9facb42d71f6af6ca9 Mon Sep 17 00:00:00 2001 From: Jaco de Groot Date: Wed, 10 Jul 2024 11:19:26 +0200 Subject: [PATCH 4/7] Bump frontend from 0.1.0-20240704.152642 to 0.1.0-20240708.215154 --- pom.xml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 55df9011..9883563d 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 3.0-SNAPSHOT UTF-8 11 - 0.1.0-20240704.152642 + 0.1.0-20240708.215154 6.1.7 4.0.4 2.17.1 @@ -63,6 +63,23 @@ ladybug-frontend ${frontend.version} + org.apache.cxf cxf-rt-rs-client From 40fe2cc9d4eb18e4d35bc161905401377a42b63c Mon Sep 17 00:00:00 2001 From: Martijn Dirkse Date: Wed, 10 Jul 2024 18:00:47 +0200 Subject: [PATCH 5/7] Update inputs because frontend timestamp releases not tagged (#262) --- .github/workflows/start-frontend-test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/start-frontend-test.yml b/.github/workflows/start-frontend-test.yml index c69f0f05..2044b091 100644 --- a/.github/workflows/start-frontend-test.yml +++ b/.github/workflows/start-frontend-test.yml @@ -25,8 +25,7 @@ jobs: workflow_id: 'testing.js.yml', ref: 'master', inputs: { - useRealFrontend: 'true', - frontendCommitToCheckout: 'tags/v${{ steps.get_frontendVersion.outputs.frontendVersion }}', + frontendCommitToCheckout: 'master', backendCommitToCheckout: '${{ github.ref_name }}', mergeMasterToBranch: 'true' } From 15e279d2c6832118981b54e08d720a2a2d6c6e41 Mon Sep 17 00:00:00 2001 From: Martijn Dirkse Date: Wed, 10 Jul 2024 18:15:40 +0200 Subject: [PATCH 6/7] Bump frontend to 0.1.0-20240710.153412 (#264) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9883563d..91755f55 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 3.0-SNAPSHOT UTF-8 11 - 0.1.0-20240708.215154 + 0.1.0-20240710.153412 6.1.7 4.0.4 2.17.1 From 01654ba507758b9a9fd3348598dfb9e9d4f40b2f Mon Sep 17 00:00:00 2001 From: Sergi Philipsen Date: Thu, 11 Jul 2024 11:49:37 +0200 Subject: [PATCH 7/7] Bump frontend version to 0.1.0-20240711.113931 (#265) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 91755f55..7ae846cd 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 3.0-SNAPSHOT UTF-8 11 - 0.1.0-20240710.153412 + 0.1.0-20240711.113931 6.1.7 4.0.4 2.17.1