/*
* Copyright (c) 2010, 2017 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package org.glassfish.grizzly.http.server;
import java.nio.charset.Charset;
import org.glassfish.grizzly.Grizzly;
import org.glassfish.grizzly.utils.JdkVersion;
HttpServerFilter
configuration. Author: Alexey Stashok
/**
* {@link HttpServerFilter} configuration.
*
* @author Alexey Stashok
*/
public class ServerFilterConfiguration {
public static final int MAX_REQUEST_PARAMETERS = 10000;
public static final String USE_SEND_FILE = "org.glassfish.grizzly.http.USE_SEND_FILE";
private String httpServerName;
private String httpServerVersion;
private boolean sendFileEnabled;
private boolean traceEnabled;
private boolean passTraceRequest;
private int maxRequestParameters = MAX_REQUEST_PARAMETERS;
private long maxPostSize = -1L;
private int maxFormPostSize = 2 * 1024 * 1024;
private int maxBufferedPostSize = 2 * 1024 * 1024;
private int sessionTimeoutSeconds = -1;
Default query string encoding (query part of request URI).
/**
* Default query string encoding (query part of request URI).
*/
private Charset defaultQueryEncoding;
The default error page generator
/**
* The default error page generator
*/
private ErrorPageGenerator defaultErrorPageGenerator;
The auxiliary configuration, which might be used, when Grizzly HttpServer
is running behind some HTTP gateway like reverse proxy or load balancer.
/**
* The auxiliary configuration, which might be used, when Grizzly HttpServer
* is running behind some HTTP gateway like reverse proxy or load balancer.
*/
private BackendConfiguration backendConfiguration;
The HTTP server SessionManager
. /**
* The HTTP server {@link SessionManager}.
*/
private SessionManager sessionManager;
true, if HttpServerFilter
has to support graceful shutdown, or false otherwise
/**
* <tt>true</tt>, if {@link HttpServerFilter} has to support
* graceful shutdown, or <tt>false</tt> otherwise
*/
private boolean isGracefulShutdownSupported = true;
public ServerFilterConfiguration() {
this("Grizzly", Grizzly.getDotedVersion());
}
public ServerFilterConfiguration(final String serverName, final String serverVersion) {
this.httpServerName = serverName;
this.httpServerVersion = serverVersion;
configureSendFileSupport();
defaultErrorPageGenerator = new DefaultErrorPageGenerator();
}
public ServerFilterConfiguration(final ServerFilterConfiguration configuration) {
this.httpServerName = configuration.httpServerName;
this.httpServerVersion = configuration.httpServerVersion;
this.sendFileEnabled = configuration.sendFileEnabled;
this.backendConfiguration = configuration.backendConfiguration;
this.traceEnabled = configuration.traceEnabled;
this.passTraceRequest = configuration.passTraceRequest;
this.maxRequestParameters = configuration.maxRequestParameters;
this.maxFormPostSize = configuration.maxFormPostSize;
this.maxBufferedPostSize = configuration.maxBufferedPostSize;
this.defaultQueryEncoding = configuration.defaultQueryEncoding;
this.defaultErrorPageGenerator = configuration.defaultErrorPageGenerator;
this.isGracefulShutdownSupported = configuration.isGracefulShutdownSupported;
this.maxPostSize = configuration.maxPostSize;
this.sessionTimeoutSeconds = configuration.sessionTimeoutSeconds;
this.sessionManager = configuration.sessionManager;
}
Returns: the server name used for headers and default error pages.
/**
* @return the server name used for headers and default error pages.
*/
public String getHttpServerName() {
return httpServerName;
}
Sets the server name used for HTTP response headers and default generated error pages. If not value is
explicitly set, this value defaults to Grizzly
.
Params: - httpServerName – server name
/**
* Sets the server name used for HTTP response headers and default generated error pages. If not value is
* explicitly set, this value defaults to <code>Grizzly</code>.
*
* @param httpServerName server name
*/
public void setHttpServerName(String httpServerName) {
this.httpServerName = httpServerName;
}
Returns: the version of this server used for headers and default error pages.
/**
* @return the version of this server used for headers and default error pages.
*/
public String getHttpServerVersion() {
return httpServerVersion;
}
Sets the version of the server info sent in HTTP response headers and the default generated error pages. If not
value is explicitly set, this value defaults to the current version of the Grizzly runtime.
Params: - httpServerVersion – server version
/**
* Sets the version of the server info sent in HTTP response headers and the default generated error pages. If not
* value is explicitly set, this value defaults to the current version of the Grizzly runtime.
*
* @param httpServerVersion server version
*/
public void setHttpServerVersion(String httpServerVersion) {
this.httpServerVersion = httpServerVersion;
}
Returns true
if File resources may be be sent using FileChannel.transferTo(long, long, WritableByteChannel)
.
By default, this property will be true, except in the following cases:
- JVM OS is HP-UX
- JVM OS is Linux, and the Oracle JVM in use is 1.6.0_17 or older
This logic can be overridden by explicitly setting the property via setSendFileEnabled(boolean)
or by specifying the system property "org.glassfish.grizzly.http.USE_SEND_FILE" with a value of true
Finally, if the connection between endpoints is secure, send file functionality
will be disabled regardless of configuration.
Returns: true
if resources will be sent using FileChannel.transferTo(long, long, WritableByteChannel)
.Since: 2.2
/**
* <p>
* Returns <code>true</code> if File resources may be be sent using
* {@link java.nio.channels.FileChannel#transferTo(long, long, java.nio.channels.WritableByteChannel)}.
* </p>
* <p/>
* <p>
* By default, this property will be true, except in the following cases:
* </p>
* <p/>
* <ul>
* <li>JVM OS is HP-UX</li>
* <li>JVM OS is Linux, and the Oracle JVM in use is 1.6.0_17 or older</li>
* </ul>
* <p/>
* <p>
* This logic can be overridden by explicitly setting the property via
* {@link #setSendFileEnabled(boolean)} or by specifying the system property
* {@value #USE_SEND_FILE} with a value of <code>true</code>
* </p>
* <p/>
* <p>
* Finally, if the connection between endpoints is secure, send file functionality
* will be disabled regardless of configuration.
* </p>
*
* @return <code>true</code> if resources will be sent using
* {@link java.nio.channels.FileChannel#transferTo(long, long, java.nio.channels.WritableByteChannel)}.
* @since 2.2
*/
public boolean isSendFileEnabled() {
return sendFileEnabled;
}
Configure whether or sendfile support will enabled which allows sending File
resources via FileChannel.transferTo(long, long, WritableByteChannel)
. If disabled, the more traditional byte[] copy will be used to send content. Params: - sendFileEnabled –
true
to enable FileChannel.transferTo(long, long, WritableByteChannel)
support.
Since: 2.2
/**
* Configure whether or sendfile support will enabled which allows sending
* {@link java.io.File} resources via {@link java.nio.channels.FileChannel#transferTo(long, long, java.nio.channels.WritableByteChannel)}.
* If disabled, the more traditional byte[] copy will be used to send content.
*
* @param sendFileEnabled <code>true</code> to enable {@link java.nio.channels.FileChannel#transferTo(long, long, java.nio.channels.WritableByteChannel)}
* support.
* @since 2.2
*/
public void setSendFileEnabled(boolean sendFileEnabled) {
this.sendFileEnabled = sendFileEnabled;
}
Get the HTTP request scheme, which if non-null overrides default one
picked up by framework during runtime.
Returns: the HTTP request scheme Since: 2.2.4
/**
* Get the HTTP request scheme, which if non-null overrides default one
* picked up by framework during runtime.
*
* @return the HTTP request scheme
*
* @since 2.2.4
*/
public String getScheme() {
final BackendConfiguration config = backendConfiguration;
return config != null ? config.getScheme() : null;
}
Set the HTTP request scheme, which if non-null overrides default one
picked up by framework during runtime.
Params: - scheme – the HTTP request scheme
Since: 2.2.4
/**
* Set the HTTP request scheme, which if non-null overrides default one
* picked up by framework during runtime.
*
* @param scheme the HTTP request scheme
*
* @since 2.2.4
*/
public void setScheme(final String scheme) {
BackendConfiguration config = backendConfiguration;
if (config == null) {
config = new BackendConfiguration();
}
config.setScheme(scheme);
this.backendConfiguration = config;
}
Returns: the auxiliary configuration, which might be used, when Grizzly
HttpServer is running behind HTTP gateway like reverse proxy or load
balancer. Since: 2.3.18
/**
* @return the auxiliary configuration, which might be used, when Grizzly
* HttpServer is running behind HTTP gateway like reverse proxy or load
* balancer.
*
* @since 2.3.18
*/
public BackendConfiguration getBackendConfiguration() {
return backendConfiguration;
}
Sets the auxiliary configuration, which might be used, when Grizzly
HttpServer is running behind HTTP gateway like reverse proxy or load
balancer.
Params: - backendConfiguration –
BackendConfiguration
Since: 2.3.18
/**
* Sets the auxiliary configuration, which might be used, when Grizzly
* HttpServer is running behind HTTP gateway like reverse proxy or load
* balancer.
*
* @param backendConfiguration {@link BackendConfiguration}
*
* @since 2.3.18
*/
public void setBackendConfiguration(
final BackendConfiguration backendConfiguration) {
this.backendConfiguration = backendConfiguration;
}
Returns: true if the TRACE request will be passed to the registered HttpHandler
s, otherwise false if the
TRACE request will be handled by Grizzly. Since: 2.2.7
/**
* @return <tt>true</tt> if the <tt>TRACE</tt> request will be passed
* to the registered {@link HttpHandler}s, otherwise <tt>false</tt> if the
* <tt>TRACE</tt> request will be handled by Grizzly.
*
* @since 2.2.7
*/
public boolean isPassTraceRequest() {
return passTraceRequest;
}
If passTraceRequest is true, the TRACE request will be passed to the registered HttpHandler
s. Otherwise, TRACE will be handled by Grizzly.
By default, TRACE requests will be handled by Grizzly.
Params: - passTraceRequest – boolean to configure if trace requests will be handled by Grizzly or by a configured
HttpHandler
.
Since: 2.2.7
/**
* If <tt>passTraceRequest</tt> is <tt>true</tt>, the <tt>TRACE</tt> request
* will be passed to the registered {@link HttpHandler}s. Otherwise,
* <tt>TRACE</tt> will be handled by Grizzly.
*
* By default, <tt>TRACE</tt> requests will be handled by Grizzly.
*
* @param passTraceRequest boolean to configure if trace requests will
* be handled by Grizzly or by a configured
* {@link HttpHandler}.
*
* @since 2.2.7
*/
public void setPassTraceRequest(boolean passTraceRequest) {
this.passTraceRequest = passTraceRequest;
}
Returns: true if a proper response to HTTP TRACE is to
be generated, or false if a 405 is to be returned instead. Since: 2.2.7
/**
*
* @return <tt>true</tt> if a proper response to HTTP <tt>TRACE</tt> is to
* be generated, or <tt>false</tt> if a 405 is to be returned instead.
*
* @since 2.2.7
*/
public boolean isTraceEnabled() {
return traceEnabled;
}
If enabled is true the TRACE method will be
respected and a proper response will be generated. Otherwise, the
method will be considered as not allowed and an HTTP 405 will be returned.
This method only comes into effect when setPassTraceRequest(false)
has been called.
Params: - enabled – boolean to configure how grizzly handles TRACE requests
Since: 2.2.7
/**
* If <tt>enabled</tt> is <tt>true</tt> the <tt>TRACE</tt> method will be
* respected and a proper response will be generated. Otherwise, the
* method will be considered as not allowed and an HTTP 405 will be returned.
*
* This method only comes into effect when <code>setPassTraceRequest(false)</code>
* has been called.
*
* @param enabled boolean to configure how grizzly handles TRACE requests
*
* @since 2.2.7
*/
public void setTraceEnabled(final boolean enabled) {
traceEnabled = enabled;
}
Returns the maximum number of parameters allowed per request. If the value is less than zero, then there will be no limit on parameters. By default, the limit imposed is 10000. Returns: the maximum number of parameters, or -1 if there is no
imposed limit. Since: 2.2.8
/**
* Returns the maximum number of parameters allowed per request. If the
* value is less than zero, then there will be no limit on parameters. By
* default, the limit imposed is {@value #MAX_REQUEST_PARAMETERS}.
*
* @return the maximum number of parameters, or <tt>-1</tt> if there is no
* imposed limit.
*
* @since 2.2.8
*/
public int getMaxRequestParameters() {
return maxRequestParameters;
}
Sets the maximum number of parameters allowed for a request.
Params: - maxRequestParameters – the maximum number of parameters.
Since: 2.2.8
/**
* Sets the maximum number of parameters allowed for a request.
*
* @param maxRequestParameters the maximum number of parameters.
*
* @since 2.2.8
*/
public void setMaxRequestParameters(int maxRequestParameters) {
if (maxRequestParameters < 0) {
this.maxRequestParameters = -1;
} else {
this.maxRequestParameters = maxRequestParameters;
}
}
Returns the "reuse session IDs when creating sessions"
Since: 2.2.19 Deprecated: since 2.3.17
/**
* Returns the "reuse session IDs when creating sessions"
*
* @since 2.2.19
* @deprecated since 2.3.17
*/
public boolean isReuseSessionID() {
return false;
}
Sets the "reuse session IDs when creating sessions"
Since: 2.2.19 Deprecated: since 2.3.17
/**
* Sets the "reuse session IDs when creating sessions"
*
* @since 2.2.19
* @deprecated since 2.3.17
*/
public void setReuseSessionID(boolean isReuseSessionID) {
}
Gets the maximum size of the POST body.
-1
value means no size limits applied.
Since: 2.3.13
/**
* Gets the maximum size of the POST body.
* <code>-1</code> value means no size limits applied.
*
* @since 2.3.13
*/
public long getMaxPostSize() {
return maxPostSize;
}
Sets the maximum size of the POST body.
-1
value means no size limits applied.
Since: 2.3.13
/**
* Sets the maximum size of the POST body.
* <code>-1</code> value means no size limits applied.
*
* @since 2.3.13
*/
public void setMaxPostSize(final long maxPostSize) {
this.maxPostSize = maxPostSize < 0 ? -1 : maxPostSize;
}
Gets the maximum size of the POST body generated by an HTML form.
-1
value means no size limits applied.
Since: 2.3
/**
* Gets the maximum size of the POST body generated by an HTML form.
* <code>-1</code> value means no size limits applied.
*
* @since 2.3
*/
public int getMaxFormPostSize() {
return maxFormPostSize;
}
Sets the maximum size of the POST body generated by an HTML form.
-1
value means no size limits applied.
Since: 2.3
/**
* Sets the maximum size of the POST body generated by an HTML form.
* <code>-1</code> value means no size limits applied.
*
* @since 2.3
*/
public void setMaxFormPostSize(final int maxFormPostSize) {
this.maxFormPostSize = maxFormPostSize < 0 ? -1 : maxFormPostSize;
}
Gets the maximum POST body size, which can buffered in memory.
-1
value means no size limits applied.
Since: 2.3
/**
* Gets the maximum POST body size, which can buffered in memory.
* <code>-1</code> value means no size limits applied.
*
* @since 2.3
*/
public int getMaxBufferedPostSize() {
return maxBufferedPostSize;
}
Sets the maximum POST body size, which can buffered in memory.
-1
value means no size limits applied.
Since: 2.3
/**
* Sets the maximum POST body size, which can buffered in memory.
* <code>-1</code> value means no size limits applied.
*
* @since 2.3
*/
public void setMaxBufferedPostSize(final int maxBufferedPostSize) {
this.maxBufferedPostSize = maxBufferedPostSize < 0 ? -1 : maxBufferedPostSize;
}
Returns: the default character encoding used to decode request URI's query part.
null
value means specific request's character encoding will be used
/**
* @return the default character encoding used to decode request URI's query part.
* <code>null</code> value means specific request's character encoding will be used
*/
public Charset getDefaultQueryEncoding() {
return defaultQueryEncoding;
}
Sets the default character encoding used to decode request URI's query part.
null
value means specific request's character encoding will be used.
/**
* Sets the default character encoding used to decode request URI's query part.
* <code>null</code> value means specific request's character encoding will be used.
*/
public void setDefaultQueryEncoding(final Charset defaultQueryEncoding) {
this.defaultQueryEncoding = defaultQueryEncoding;
}
Returns: the default ErrorPageGenerator
/**
* @return the default {@link ErrorPageGenerator}
*/
public ErrorPageGenerator getDefaultErrorPageGenerator() {
return defaultErrorPageGenerator;
}
Sets the default ErrorPageGenerator
. Params: - defaultErrorPageGenerator –
/**
* Sets the default {@link ErrorPageGenerator}.
*
* @param defaultErrorPageGenerator
*/
public void setDefaultErrorPageGenerator(
final ErrorPageGenerator defaultErrorPageGenerator) {
this.defaultErrorPageGenerator = defaultErrorPageGenerator;
}
Returns: true, if HttpServerFilter
has to support graceful shutdown, or false otherwise
/**
* @return <tt>true</tt>, if {@link HttpServerFilter} has to support
* graceful shutdown, or <tt>false</tt> otherwise
*/
public boolean isGracefulShutdownSupported() {
return isGracefulShutdownSupported;
}
Enables or disables graceful shutdown support.
Params: - isGracefulShutdownSupported –
/**
* Enables or disables graceful shutdown support.
*
* @param isGracefulShutdownSupported
*/
public void setGracefulShutdownSupported(final boolean isGracefulShutdownSupported) {
this.isGracefulShutdownSupported = isGracefulShutdownSupported;
}
Returns the maximum time interval, in seconds, that
the HTTP server will keep this session open between
client accesses. After this interval, the HTTP server
will invalidate the session.
A return value of zero or less indicates that the
session will never timeout.
See Also: Returns: an integer specifying the number of
seconds this session remains open
between client requests
/**
* Returns the maximum time interval, in seconds, that
* the HTTP server will keep this session open between
* client accesses. After this interval, the HTTP server
* will invalidate the session.
*
* <p>A return value of zero or less indicates that the
* session will never timeout.
*
* @return an integer specifying the number of
* seconds this session remains open
* between client requests
*
* @see #setSessionTimeoutSeconds
*/
public int getSessionTimeoutSeconds() {
return sessionTimeoutSeconds;
}
Specifies the time, in seconds, between client requests before the
HTTP server will invalidate this session.
An interval value of zero or less indicates that the
session should never timeout.
Params: - sessionTimeoutSeconds – An integer specifying the number
of seconds
/**
* Specifies the time, in seconds, between client requests before the
* HTTP server will invalidate this session.
*
* <p>An <tt>interval</tt> value of zero or less indicates that the
* session should never timeout.
*
* @param sessionTimeoutSeconds An integer specifying the number
* of seconds
*/
public void setSessionTimeoutSeconds(int sessionTimeoutSeconds) {
this.sessionTimeoutSeconds = sessionTimeoutSeconds;
}
See Also: Returns: the HTTP server SessionManager
/**
* @return the HTTP server {@link SessionManager}
*
* @see #setSessionManager
*/
public SessionManager getSessionManager() {
return sessionManager;
}
Sets the HTTP server SessionManager
. Params: - sessionManager –
SessionManager
/**
* Sets the HTTP server {@link SessionManager}.
*
* @param sessionManager {@link SessionManager}
*/
public void setSessionManager(SessionManager sessionManager) {
this.sessionManager = sessionManager;
}
// --------------------------------------------------------- Private Methods
private void configureSendFileSupport() {
if ((System.getProperty("os.name").equalsIgnoreCase("linux")
&& !linuxSendFileSupported())
|| System.getProperty("os.name").equalsIgnoreCase("HP-UX")) {
sendFileEnabled = false;
}
// overrides the config from the previous block
if (System.getProperty(USE_SEND_FILE) != null) {
sendFileEnabled = Boolean.valueOf(System.getProperty(USE_SEND_FILE));
}
}
private static boolean linuxSendFileSupported() {
JdkVersion jdkVersion = JdkVersion.getJdkVersion();
JdkVersion minimumVersion = JdkVersion.parseVersion("1.6.0_18");
return minimumVersion.compareTo(jdkVersion) <= 0;
}
}