diff --git a/server/src/main/java/org/eclipse/openvsx/RegistryApplication.java b/server/src/main/java/org/eclipse/openvsx/RegistryApplication.java index 523660e9d..59ba5ac4f 100644 --- a/server/src/main/java/org/eclipse/openvsx/RegistryApplication.java +++ b/server/src/main/java/org/eclipse/openvsx/RegistryApplication.java @@ -30,6 +30,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.security.web.firewall.HttpStatusRequestRejectedHandler; import org.springframework.security.web.firewall.RequestRejectedHandler; +import org.springframework.web.filter.CharacterEncodingFilter; @SpringBootApplication @EnableScheduling @@ -62,6 +63,23 @@ public FilterRegistrationBean shallowEtagHeaderFilter() return registrationBean; } + @Bean + public FilterRegistrationBean forceUTF8EncodingFilter() { + var registrationBean = new FilterRegistrationBean(); + + // Enforce the use of utf-8 as character encoding for requests / responses as spring boot defaults to ISO-8859-1. + // This avoids the need to explicitly specify the charset in the returned Content-Type header for each mapping. + CharacterEncodingFilter filter = new CharacterEncodingFilter(); + filter.setEncoding("UTF-8"); + filter.setForceEncoding(true); + + registrationBean.setFilter(filter); + registrationBean.addUrlPatterns("/api/*"); + registrationBean.setOrder(Ordered.LOWEST_PRECEDENCE); + + return registrationBean; + } + @Bean public RequestRejectedHandler requestRejectedHandler() { return new HttpStatusRequestRejectedHandler();