3131import jakarta .servlet .Filter ;
3232import jakarta .servlet .http .HttpServletRequest ;
3333import java .util .ArrayList ;
34- import java .util .Arrays ;
35- import java .util .Objects ;
36- import org .eclipse .jetty .http .UriCompliance ;
37- import org .eclipse .jetty .server .Connector ;
38- import org .eclipse .jetty .server .HttpConnectionFactory ;
39- import org .eclipse .jetty .server .SecureRequestCustomizer ;
40- import org .eclipse .jetty .server .Server ;
41- import org .eclipse .jetty .server .ServerConnector ;
34+ import org .apache .catalina .connector .Connector ;
35+ import org .apache .tomcat .util .buf .EncodedSolidusHandling ;
4236import org .slf4j .Logger ;
4337import org .slf4j .LoggerFactory ;
4438import org .springframework .boot .context .properties .EnableConfigurationProperties ;
45- import org .springframework .boot .web .embedded .jetty . JettyServletWebServerFactory ;
39+ import org .springframework .boot .web .embedded .tomcat . TomcatServletWebServerFactory ;
4640import org .springframework .boot .web .servlet .filter .OrderedFormContentFilter ;
4741import org .springframework .boot .web .servlet .server .ServletWebServerFactory ;
4842import org .springframework .context .annotation .Bean ;
6357@ Configuration
6458@ EnableConfigurationProperties (S3MockProperties .class )
6559public class S3MockConfiguration implements WebMvcConfigurer {
66- private ServerConnector httpServerConnector ;
60+ private Connector httpConnector ;
6761
6862 /**
6963 * Create a ServletWebServerFactory bean reconfigured for an additional HTTP port.
@@ -72,37 +66,24 @@ public class S3MockConfiguration implements WebMvcConfigurer {
7266 */
7367 @ Bean
7468 ServletWebServerFactory webServerFactory (S3MockProperties properties ) {
75- var factory = new JettyServletWebServerFactory ();
76- factory .addServerCustomizers (
77- server -> server .addConnector (createHttpConnector (server , properties .httpPort ())),
78- server -> Arrays .stream (server .getConnectors ())
79- .filter (ServerConnector .class ::isInstance )
80- .forEach (
81- connector -> connector .getConnectionFactories ()
82- .stream ()
83- .filter (HttpConnectionFactory .class ::isInstance )
84- .map (cf -> (HttpConnectionFactory ) cf )
85- .map (HttpConnectionFactory ::getHttpConfiguration )
86- .map (hc -> {
87- //disable UriCompliance checks. S3 allows object keys that do not conform to
88- //URI specs as defined here: https://datatracker.ietf.org/doc/html/rfc3986
89- hc .setUriCompliance (UriCompliance .UNSAFE );
90- return hc .getCustomizer (SecureRequestCustomizer .class );
91- })
92- .filter (Objects ::nonNull )
93- .forEach (customizer -> customizer .setSniHostCheck (false ))
94- ));
69+ var factory = new TomcatServletWebServerFactory ();
70+ factory .addAdditionalTomcatConnectors (createHttpConnector (properties .httpPort ()));
71+ factory .addConnectorCustomizers (connector -> {
72+ // Allow encoded slashes in URL
73+ connector .setEncodedSolidusHandling (EncodedSolidusHandling .DECODE .getValue ());
74+ connector .setAllowBackslash (true );
75+ });
9576 return factory ;
9677 }
9778
98- private Connector createHttpConnector (final Server server , int httpPort ) {
99- httpServerConnector = new ServerConnector ( server );
100- httpServerConnector .setPort (httpPort );
101- return httpServerConnector ;
79+ private Connector createHttpConnector (int httpPort ) {
80+ httpConnector = new Connector ( );
81+ httpConnector .setPort (httpPort );
82+ return httpConnector ;
10283 }
10384
104- ServerConnector getHttpServerConnector () {
105- return httpServerConnector ;
85+ Connector getHttpConnector () {
86+ return httpConnector ;
10687 }
10788
10889 @ Bean
0 commit comments