This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch WW-5640-webjars-support in repository https://gitbox.apache.org/repos/asf/struts.git
commit fa93079dde306cafc6ed69d7ce853f9ff4eaa02d Author: Lukasz Lenart <[email protected]> AuthorDate: Wed Jul 1 11:30:00 2026 +0200 WW-5640 feat: extend static content-type map for webjar assets Co-Authored-By: Claude Opus 4.8 <[email protected]> --- .../dispatcher/DefaultStaticContentLoader.java | 18 ++++++- .../DefaultStaticContentLoaderWebJarTest.java | 57 ++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/DefaultStaticContentLoader.java b/core/src/main/java/org/apache/struts2/dispatcher/DefaultStaticContentLoader.java index 18f4c54dd..641872145 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/DefaultStaticContentLoader.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/DefaultStaticContentLoader.java @@ -330,7 +330,7 @@ public class DefaultStaticContentLoader implements StaticContentLoader { protected String getContentType(String name) { // NOT using the code provided activation.jar to avoid adding yet another dependency // this is generally OK, since these are the main files we server up - if (name.endsWith(".js")) { + if (name.endsWith(".js") || name.endsWith(".mjs")) { return "text/javascript"; } else if (name.endsWith(".css")) { return "text/css"; @@ -344,6 +344,22 @@ public class DefaultStaticContentLoader implements StaticContentLoader { return "image/jpeg"; } else if (name.endsWith(".png")) { return "image/png"; + } else if (name.endsWith(".svg")) { + return "image/svg+xml"; + } else if (name.endsWith(".ico")) { + return "image/x-icon"; + } else if (name.endsWith(".woff2")) { + return "font/woff2"; + } else if (name.endsWith(".woff")) { + return "font/woff"; + } else if (name.endsWith(".ttf")) { + return "font/ttf"; + } else if (name.endsWith(".otf")) { + return "font/otf"; + } else if (name.endsWith(".eot")) { + return "application/vnd.ms-fontobject"; + } else if (name.endsWith(".json") || name.endsWith(".map")) { + return "application/json"; } else { return null; } diff --git a/core/src/test/java/org/apache/struts2/dispatcher/DefaultStaticContentLoaderWebJarTest.java b/core/src/test/java/org/apache/struts2/dispatcher/DefaultStaticContentLoaderWebJarTest.java new file mode 100644 index 000000000..49488464c --- /dev/null +++ b/core/src/test/java/org/apache/struts2/dispatcher/DefaultStaticContentLoaderWebJarTest.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.struts2.dispatcher; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DefaultStaticContentLoaderWebJarTest { + + private final ContentTypeProbe loader = new ContentTypeProbe(); + + /** Exposes the protected getContentType for assertion. */ + static class ContentTypeProbe extends DefaultStaticContentLoader { + String type(String name) { + return getContentType(name); + } + } + + @Test + public void mapsWebJarAssetTypes() { + assertThat(loader.type("x.woff2")).isEqualTo("font/woff2"); + assertThat(loader.type("x.woff")).isEqualTo("font/woff"); + assertThat(loader.type("x.ttf")).isEqualTo("font/ttf"); + assertThat(loader.type("x.otf")).isEqualTo("font/otf"); + assertThat(loader.type("x.eot")).isEqualTo("application/vnd.ms-fontobject"); + assertThat(loader.type("x.svg")).isEqualTo("image/svg+xml"); + assertThat(loader.type("x.map")).isEqualTo("application/json"); + assertThat(loader.type("x.json")).isEqualTo("application/json"); + assertThat(loader.type("x.ico")).isEqualTo("image/x-icon"); + assertThat(loader.type("x.mjs")).isEqualTo("text/javascript"); + } + + @Test + public void preservesExistingTypes() { + assertThat(loader.type("x.js")).isEqualTo("text/javascript"); + assertThat(loader.type("x.css")).isEqualTo("text/css"); + assertThat(loader.type("x.png")).isEqualTo("image/png"); + assertThat(loader.type("x.unknown")).isNull(); + } +}
