Apply server.jetty.* config to reactive servers
This commit applies `server.jetty.*` configuration properties to Jetty when configured as a reactive web server. It also removes some infrastructure support for Jetty 8, which is not supported anymore in Spring Boot 2.0 (partial fix for gh-11504). See gh-11500
This commit is contained in:
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
*
|
||||
* Licensed 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.springframework.boot.autoconfigure.web.embedded.jetty;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
import org.eclipse.jetty.server.AbstractConnector;
|
||||
import org.eclipse.jetty.server.ConnectionFactory;
|
||||
import org.eclipse.jetty.server.Handler;
|
||||
import org.eclipse.jetty.server.HttpConfiguration;
|
||||
import org.eclipse.jetty.server.NCSARequestLog;
|
||||
import org.eclipse.jetty.server.Server;
|
||||
import org.eclipse.jetty.server.handler.ContextHandler;
|
||||
import org.eclipse.jetty.server.handler.HandlerCollection;
|
||||
import org.eclipse.jetty.server.handler.HandlerWrapper;
|
||||
|
||||
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
||||
import org.springframework.boot.cloud.CloudPlatform;
|
||||
import org.springframework.boot.web.embedded.jetty.ConfigurableJettyWebServerFactory;
|
||||
import org.springframework.boot.web.embedded.jetty.JettyServerCustomizer;
|
||||
import org.springframework.core.env.Environment;
|
||||
|
||||
/**
|
||||
* Customization for Jetty-specific features common
|
||||
* for both Servlet and Reactive servers.
|
||||
*
|
||||
* @author Brian Clozel
|
||||
* @since 2.0.0
|
||||
*/
|
||||
public final class JettyCustomizer {
|
||||
|
||||
private JettyCustomizer() {
|
||||
}
|
||||
|
||||
public static void customizeJetty(ServerProperties serverProperties,
|
||||
Environment environment, ConfigurableJettyWebServerFactory factory) {
|
||||
ServerProperties.Jetty jettyProperties = serverProperties.getJetty();
|
||||
factory.setUseForwardHeaders(
|
||||
getOrDeduceUseForwardHeaders(serverProperties, environment));
|
||||
if (jettyProperties.getAcceptors() != null) {
|
||||
factory.setAcceptors(jettyProperties.getAcceptors());
|
||||
}
|
||||
if (jettyProperties.getSelectors() != null) {
|
||||
factory.setSelectors(jettyProperties.getSelectors());
|
||||
}
|
||||
if (serverProperties.getMaxHttpHeaderSize() > 0) {
|
||||
customizeMaxHttpHeaderSize(factory,
|
||||
serverProperties.getMaxHttpHeaderSize());
|
||||
}
|
||||
if (jettyProperties.getMaxHttpPostSize() > 0) {
|
||||
customizeMaxHttpPostSize(factory, jettyProperties.getMaxHttpPostSize());
|
||||
}
|
||||
|
||||
if (serverProperties.getConnectionTimeout() != null) {
|
||||
customizeConnectionTimeout(factory,
|
||||
serverProperties.getConnectionTimeout());
|
||||
}
|
||||
if (jettyProperties.getAccesslog().isEnabled()) {
|
||||
customizeAccessLog(factory, jettyProperties.getAccesslog());
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean getOrDeduceUseForwardHeaders(ServerProperties serverProperties,
|
||||
Environment environment) {
|
||||
if (serverProperties.isUseForwardHeaders() != null) {
|
||||
return serverProperties.isUseForwardHeaders();
|
||||
}
|
||||
CloudPlatform platform = CloudPlatform.getActive(environment);
|
||||
return platform != null && platform.isUsingForwardHeaders();
|
||||
}
|
||||
|
||||
private static void customizeConnectionTimeout(
|
||||
ConfigurableJettyWebServerFactory factory, Duration connectionTimeout) {
|
||||
factory.addServerCustomizers((server) -> {
|
||||
for (org.eclipse.jetty.server.Connector connector : server
|
||||
.getConnectors()) {
|
||||
if (connector instanceof AbstractConnector) {
|
||||
((AbstractConnector) connector)
|
||||
.setIdleTimeout(connectionTimeout.toMillis());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void customizeMaxHttpHeaderSize(
|
||||
ConfigurableJettyWebServerFactory factory, int maxHttpHeaderSize) {
|
||||
factory.addServerCustomizers(new JettyServerCustomizer() {
|
||||
|
||||
@Override
|
||||
public void customize(Server server) {
|
||||
for (org.eclipse.jetty.server.Connector connector : server
|
||||
.getConnectors()) {
|
||||
for (ConnectionFactory connectionFactory : connector
|
||||
.getConnectionFactories()) {
|
||||
if (connectionFactory instanceof HttpConfiguration.ConnectionFactory) {
|
||||
customize(
|
||||
(HttpConfiguration.ConnectionFactory) connectionFactory);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void customize(HttpConfiguration.ConnectionFactory factory) {
|
||||
HttpConfiguration configuration = factory.getHttpConfiguration();
|
||||
configuration.setRequestHeaderSize(maxHttpHeaderSize);
|
||||
configuration.setResponseHeaderSize(maxHttpHeaderSize);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
private static void customizeMaxHttpPostSize(ConfigurableJettyWebServerFactory factory,
|
||||
int maxHttpPostSize) {
|
||||
factory.addServerCustomizers(new JettyServerCustomizer() {
|
||||
|
||||
@Override
|
||||
public void customize(Server server) {
|
||||
setHandlerMaxHttpPostSize(maxHttpPostSize, server.getHandlers());
|
||||
}
|
||||
|
||||
private void setHandlerMaxHttpPostSize(int maxHttpPostSize,
|
||||
Handler... handlers) {
|
||||
for (Handler handler : handlers) {
|
||||
if (handler instanceof ContextHandler) {
|
||||
((ContextHandler) handler)
|
||||
.setMaxFormContentSize(maxHttpPostSize);
|
||||
}
|
||||
else if (handler instanceof HandlerWrapper) {
|
||||
setHandlerMaxHttpPostSize(maxHttpPostSize,
|
||||
((HandlerWrapper) handler).getHandler());
|
||||
}
|
||||
else if (handler instanceof HandlerCollection) {
|
||||
setHandlerMaxHttpPostSize(maxHttpPostSize,
|
||||
((HandlerCollection) handler).getHandlers());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
private static void customizeAccessLog(ConfigurableJettyWebServerFactory factory,
|
||||
ServerProperties.Jetty.Accesslog properties) {
|
||||
factory.addServerCustomizers((server) -> {
|
||||
NCSARequestLog log = new NCSARequestLog();
|
||||
if (properties.getFilename() != null) {
|
||||
log.setFilename(properties.getFilename());
|
||||
}
|
||||
if (properties.getFileDateFormat() != null) {
|
||||
log.setFilenameDateFormat(properties.getFileDateFormat());
|
||||
}
|
||||
log.setRetainDays(properties.getRetentionPeriod());
|
||||
log.setAppend(properties.isAppend());
|
||||
log.setExtended(properties.isExtendedFormat());
|
||||
if (properties.getDateFormat() != null) {
|
||||
log.setLogDateFormat(properties.getDateFormat());
|
||||
}
|
||||
if (properties.getLocale() != null) {
|
||||
log.setLogLocale(properties.getLocale());
|
||||
}
|
||||
if (properties.getTimeZone() != null) {
|
||||
log.setLogTimeZone(properties.getTimeZone().getID());
|
||||
}
|
||||
log.setLogCookies(properties.isLogCookies());
|
||||
log.setLogServer(properties.isLogServer());
|
||||
log.setLogLatency(properties.isLogLatency());
|
||||
server.setRequestLog(log);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Configuration for embedded reactive and servlet Jetty web servers.
|
||||
*
|
||||
* @see org.springframework.boot.web.embedded.jetty.ConfigurableJettyWebServerFactory
|
||||
*/
|
||||
package org.springframework.boot.autoconfigure.web.embedded.jetty;
|
||||
@@ -17,7 +17,9 @@
|
||||
package org.springframework.boot.autoconfigure.web.reactive;
|
||||
|
||||
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
||||
import org.springframework.boot.autoconfigure.web.embedded.jetty.JettyCustomizer;
|
||||
import org.springframework.boot.autoconfigure.web.embedded.tomcat.TomcatCustomizer;
|
||||
import org.springframework.boot.web.embedded.jetty.JettyReactiveWebServerFactory;
|
||||
import org.springframework.boot.web.embedded.tomcat.TomcatReactiveWebServerFactory;
|
||||
import org.springframework.boot.web.reactive.server.ConfigurableReactiveWebServerFactory;
|
||||
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
|
||||
@@ -73,6 +75,10 @@ public class DefaultReactiveWebServerFactoryCustomizer implements
|
||||
TomcatCustomizer.customizeTomcat(this.serverProperties, this.environment,
|
||||
(TomcatReactiveWebServerFactory) factory);
|
||||
}
|
||||
if (factory instanceof JettyReactiveWebServerFactory) {
|
||||
JettyCustomizer.customizeJetty(this.serverProperties, this.environment,
|
||||
(JettyReactiveWebServerFactory) factory);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -25,21 +25,12 @@ import javax.servlet.ServletException;
|
||||
import javax.servlet.SessionCookieConfig;
|
||||
|
||||
import io.undertow.UndertowOptions;
|
||||
import org.eclipse.jetty.server.AbstractConnector;
|
||||
import org.eclipse.jetty.server.ConnectionFactory;
|
||||
import org.eclipse.jetty.server.Handler;
|
||||
import org.eclipse.jetty.server.HttpConfiguration;
|
||||
import org.eclipse.jetty.server.NCSARequestLog;
|
||||
import org.eclipse.jetty.server.Server;
|
||||
import org.eclipse.jetty.server.handler.ContextHandler;
|
||||
import org.eclipse.jetty.server.handler.HandlerCollection;
|
||||
import org.eclipse.jetty.server.handler.HandlerWrapper;
|
||||
|
||||
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
||||
import org.springframework.boot.autoconfigure.web.ServerProperties.Session;
|
||||
import org.springframework.boot.autoconfigure.web.embedded.jetty.JettyCustomizer;
|
||||
import org.springframework.boot.autoconfigure.web.embedded.tomcat.TomcatCustomizer;
|
||||
import org.springframework.boot.cloud.CloudPlatform;
|
||||
import org.springframework.boot.web.embedded.jetty.JettyServerCustomizer;
|
||||
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
|
||||
import org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory;
|
||||
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
|
||||
@@ -128,7 +119,6 @@ public class DefaultServletWebServerFactoryCustomizer
|
||||
JettyCustomizer.customizeJetty(this.serverProperties, this.environment,
|
||||
(JettyServletWebServerFactory) factory);
|
||||
}
|
||||
|
||||
if (factory instanceof UndertowServletWebServerFactory) {
|
||||
UndertowCustomizer.customizeUndertow(this.serverProperties, this.environment,
|
||||
(UndertowServletWebServerFactory) factory);
|
||||
@@ -308,154 +298,4 @@ public class DefaultServletWebServerFactoryCustomizer
|
||||
|
||||
}
|
||||
|
||||
private static class JettyCustomizer {
|
||||
|
||||
public static void customizeJetty(ServerProperties serverProperties,
|
||||
Environment environment, JettyServletWebServerFactory factory) {
|
||||
ServerProperties.Jetty jettyProperties = serverProperties.getJetty();
|
||||
factory.setUseForwardHeaders(
|
||||
getOrDeduceUseForwardHeaders(serverProperties, environment));
|
||||
if (jettyProperties.getAcceptors() != null) {
|
||||
factory.setAcceptors(jettyProperties.getAcceptors());
|
||||
}
|
||||
if (jettyProperties.getSelectors() != null) {
|
||||
factory.setSelectors(jettyProperties.getSelectors());
|
||||
}
|
||||
if (serverProperties.getMaxHttpHeaderSize() > 0) {
|
||||
customizeMaxHttpHeaderSize(factory,
|
||||
serverProperties.getMaxHttpHeaderSize());
|
||||
}
|
||||
if (jettyProperties.getMaxHttpPostSize() > 0) {
|
||||
customizeMaxHttpPostSize(factory, jettyProperties.getMaxHttpPostSize());
|
||||
}
|
||||
|
||||
if (serverProperties.getConnectionTimeout() != null) {
|
||||
customizeConnectionTimeout(factory,
|
||||
serverProperties.getConnectionTimeout());
|
||||
}
|
||||
if (jettyProperties.getAccesslog().isEnabled()) {
|
||||
customizeAccessLog(factory, jettyProperties.getAccesslog());
|
||||
}
|
||||
}
|
||||
|
||||
private static void customizeConnectionTimeout(
|
||||
JettyServletWebServerFactory factory, Duration connectionTimeout) {
|
||||
factory.addServerCustomizers((server) -> {
|
||||
for (org.eclipse.jetty.server.Connector connector : server
|
||||
.getConnectors()) {
|
||||
if (connector instanceof AbstractConnector) {
|
||||
((AbstractConnector) connector)
|
||||
.setIdleTimeout(connectionTimeout.toMillis());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void customizeMaxHttpHeaderSize(
|
||||
JettyServletWebServerFactory factory, int maxHttpHeaderSize) {
|
||||
factory.addServerCustomizers(new JettyServerCustomizer() {
|
||||
|
||||
@Override
|
||||
public void customize(Server server) {
|
||||
for (org.eclipse.jetty.server.Connector connector : server
|
||||
.getConnectors()) {
|
||||
try {
|
||||
for (ConnectionFactory connectionFactory : connector
|
||||
.getConnectionFactories()) {
|
||||
if (connectionFactory instanceof HttpConfiguration.ConnectionFactory) {
|
||||
customize(
|
||||
(HttpConfiguration.ConnectionFactory) connectionFactory);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (NoSuchMethodError ex) {
|
||||
customizeOnJetty8(connector, maxHttpHeaderSize);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void customize(HttpConfiguration.ConnectionFactory factory) {
|
||||
HttpConfiguration configuration = factory.getHttpConfiguration();
|
||||
configuration.setRequestHeaderSize(maxHttpHeaderSize);
|
||||
configuration.setResponseHeaderSize(maxHttpHeaderSize);
|
||||
}
|
||||
|
||||
private void customizeOnJetty8(
|
||||
org.eclipse.jetty.server.Connector connector,
|
||||
int maxHttpHeaderSize) {
|
||||
try {
|
||||
connector.getClass().getMethod("setRequestHeaderSize", int.class)
|
||||
.invoke(connector, maxHttpHeaderSize);
|
||||
connector.getClass().getMethod("setResponseHeaderSize", int.class)
|
||||
.invoke(connector, maxHttpHeaderSize);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
private static void customizeMaxHttpPostSize(JettyServletWebServerFactory factory,
|
||||
int maxHttpPostSize) {
|
||||
factory.addServerCustomizers(new JettyServerCustomizer() {
|
||||
|
||||
@Override
|
||||
public void customize(Server server) {
|
||||
setHandlerMaxHttpPostSize(maxHttpPostSize, server.getHandlers());
|
||||
}
|
||||
|
||||
private void setHandlerMaxHttpPostSize(int maxHttpPostSize,
|
||||
Handler... handlers) {
|
||||
for (Handler handler : handlers) {
|
||||
if (handler instanceof ContextHandler) {
|
||||
((ContextHandler) handler)
|
||||
.setMaxFormContentSize(maxHttpPostSize);
|
||||
}
|
||||
else if (handler instanceof HandlerWrapper) {
|
||||
setHandlerMaxHttpPostSize(maxHttpPostSize,
|
||||
((HandlerWrapper) handler).getHandler());
|
||||
}
|
||||
else if (handler instanceof HandlerCollection) {
|
||||
setHandlerMaxHttpPostSize(maxHttpPostSize,
|
||||
((HandlerCollection) handler).getHandlers());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
private static void customizeAccessLog(JettyServletWebServerFactory factory,
|
||||
ServerProperties.Jetty.Accesslog properties) {
|
||||
factory.addServerCustomizers((server) -> {
|
||||
NCSARequestLog log = new NCSARequestLog();
|
||||
if (properties.getFilename() != null) {
|
||||
log.setFilename(properties.getFilename());
|
||||
}
|
||||
if (properties.getFileDateFormat() != null) {
|
||||
log.setFilenameDateFormat(properties.getFileDateFormat());
|
||||
}
|
||||
log.setRetainDays(properties.getRetentionPeriod());
|
||||
log.setAppend(properties.isAppend());
|
||||
log.setExtended(properties.isExtendedFormat());
|
||||
if (properties.getDateFormat() != null) {
|
||||
log.setLogDateFormat(properties.getDateFormat());
|
||||
}
|
||||
if (properties.getLocale() != null) {
|
||||
log.setLogLocale(properties.getLocale());
|
||||
}
|
||||
if (properties.getTimeZone() != null) {
|
||||
log.setLogTimeZone(properties.getTimeZone().getID());
|
||||
}
|
||||
log.setLogCookies(properties.isLogCookies());
|
||||
log.setLogServer(properties.isLogServer());
|
||||
log.setLogLatency(properties.isLogLatency());
|
||||
server.setRequestLog(log);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,9 +16,13 @@
|
||||
|
||||
package org.springframework.boot.autoconfigure.web.reactive;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import org.apache.catalina.Context;
|
||||
import org.apache.catalina.Valve;
|
||||
@@ -26,6 +30,8 @@ import org.apache.catalina.startup.Tomcat;
|
||||
import org.apache.catalina.valves.AccessLogValve;
|
||||
import org.apache.catalina.valves.RemoteIpValve;
|
||||
import org.apache.coyote.AbstractProtocol;
|
||||
import org.eclipse.jetty.server.NCSARequestLog;
|
||||
import org.eclipse.jetty.server.RequestLog;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
@@ -34,6 +40,8 @@ import org.springframework.boot.context.properties.bind.Bindable;
|
||||
import org.springframework.boot.context.properties.bind.Binder;
|
||||
import org.springframework.boot.context.properties.source.ConfigurationPropertySource;
|
||||
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
|
||||
import org.springframework.boot.web.embedded.jetty.JettyReactiveWebServerFactory;
|
||||
import org.springframework.boot.web.embedded.jetty.JettyWebServer;
|
||||
import org.springframework.boot.web.embedded.tomcat.TomcatReactiveWebServerFactory;
|
||||
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
|
||||
import org.springframework.boot.web.reactive.server.ConfigurableReactiveWebServerFactory;
|
||||
@@ -42,6 +50,7 @@ import org.springframework.mock.env.MockEnvironment;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
@@ -340,6 +349,97 @@ public class DefaultReactiveWebServerFactoryCustomizerTests {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void defaultUseForwardHeadersJetty() {
|
||||
JettyReactiveWebServerFactory factory = spy(new JettyReactiveWebServerFactory());
|
||||
this.customizer.customize(factory);
|
||||
verify(factory).setUseForwardHeaders(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setUseForwardHeadersJetty() {
|
||||
this.properties.setUseForwardHeaders(true);
|
||||
JettyReactiveWebServerFactory factory = spy(new JettyReactiveWebServerFactory());
|
||||
this.customizer.customize(factory);
|
||||
verify(factory).setUseForwardHeaders(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void deduceUseForwardHeadersJetty() {
|
||||
this.customizer.setEnvironment(new MockEnvironment().withProperty("DYNO", "-"));
|
||||
JettyReactiveWebServerFactory factory = spy(new JettyReactiveWebServerFactory());
|
||||
this.customizer.customize(factory);
|
||||
verify(factory).setUseForwardHeaders(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void jettyAccessLogCanBeEnabled() {
|
||||
JettyReactiveWebServerFactory factory = new JettyReactiveWebServerFactory(0);
|
||||
Map<String, String> map = new HashMap<>();
|
||||
map.put("server.jetty.accesslog.enabled", "true");
|
||||
bindProperties(map);
|
||||
this.customizer.customize(factory);
|
||||
JettyWebServer webServer = (JettyWebServer) factory.getWebServer(mock(HttpHandler.class));
|
||||
try {
|
||||
NCSARequestLog requestLog = getNCSARequestLog(webServer);
|
||||
assertThat(requestLog.getFilename()).isNull();
|
||||
assertThat(requestLog.isAppend()).isFalse();
|
||||
assertThat(requestLog.isExtended()).isFalse();
|
||||
assertThat(requestLog.getLogCookies()).isFalse();
|
||||
assertThat(requestLog.getLogServer()).isFalse();
|
||||
assertThat(requestLog.getLogLatency()).isFalse();
|
||||
}
|
||||
finally {
|
||||
webServer.stop();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void jettyAccessLogCanBeCustomized() throws IOException {
|
||||
File logFile = File.createTempFile("jetty_log", ".log");
|
||||
JettyReactiveWebServerFactory factory = new JettyReactiveWebServerFactory(0);
|
||||
Map<String, String> map = new HashMap<>();
|
||||
String timezone = TimeZone.getDefault().getID();
|
||||
map.put("server.jetty.accesslog.enabled", "true");
|
||||
map.put("server.jetty.accesslog.filename", logFile.getAbsolutePath());
|
||||
map.put("server.jetty.accesslog.file-date-format", "yyyy-MM-dd");
|
||||
map.put("server.jetty.accesslog.retention-period", "42");
|
||||
map.put("server.jetty.accesslog.append", "true");
|
||||
map.put("server.jetty.accesslog.extended-format", "true");
|
||||
map.put("server.jetty.accesslog.date-format", "HH:mm:ss");
|
||||
map.put("server.jetty.accesslog.locale", "en_BE");
|
||||
map.put("server.jetty.accesslog.time-zone", timezone);
|
||||
map.put("server.jetty.accesslog.log-cookies", "true");
|
||||
map.put("server.jetty.accesslog.log-server", "true");
|
||||
map.put("server.jetty.accesslog.log-latency", "true");
|
||||
bindProperties(map);
|
||||
this.customizer.customize(factory);
|
||||
JettyWebServer webServer = (JettyWebServer) factory.getWebServer(mock(HttpHandler.class));
|
||||
NCSARequestLog requestLog = getNCSARequestLog(webServer);
|
||||
try {
|
||||
assertThat(requestLog.getFilename()).isEqualTo(logFile.getAbsolutePath());
|
||||
assertThat(requestLog.getFilenameDateFormat()).isEqualTo("yyyy-MM-dd");
|
||||
assertThat(requestLog.getRetainDays()).isEqualTo(42);
|
||||
assertThat(requestLog.isAppend()).isTrue();
|
||||
assertThat(requestLog.isExtended()).isTrue();
|
||||
assertThat(requestLog.getLogDateFormat()).isEqualTo("HH:mm:ss");
|
||||
assertThat(requestLog.getLogLocale()).isEqualTo(new Locale("en", "BE"));
|
||||
assertThat(requestLog.getLogTimeZone()).isEqualTo(timezone);
|
||||
assertThat(requestLog.getLogCookies()).isTrue();
|
||||
assertThat(requestLog.getLogServer()).isTrue();
|
||||
assertThat(requestLog.getLogLatency()).isTrue();
|
||||
}
|
||||
finally {
|
||||
webServer.stop();
|
||||
}
|
||||
}
|
||||
|
||||
private NCSARequestLog getNCSARequestLog(JettyWebServer webServer) {
|
||||
RequestLog requestLog = webServer.getServer().getRequestLog();
|
||||
assertThat(requestLog).isInstanceOf(NCSARequestLog.class);
|
||||
return (NCSARequestLog) requestLog;
|
||||
}
|
||||
|
||||
private void bindProperties(Map<String, String> map) {
|
||||
ConfigurationPropertySource source = new MapConfigurationPropertySource(map);
|
||||
new Binder(source).bind("server", Bindable.ofInstance(this.properties));
|
||||
|
||||
Reference in New Issue
Block a user