package org.apache.coyote.http11;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
import javax.servlet.http.HttpUpgradeHandler;
import org.apache.coyote.AbstractProtocol;
import org.apache.coyote.CompressionConfig;
import org.apache.coyote.Processor;
import org.apache.coyote.Request;
import org.apache.coyote.Response;
import org.apache.coyote.UpgradeProtocol;
import org.apache.coyote.UpgradeToken;
import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler;
import org.apache.coyote.http11.upgrade.UpgradeProcessorExternal;
import org.apache.coyote.http11.upgrade.UpgradeProcessorInternal;
import org.apache.tomcat.util.buf.StringUtils;
import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.SSLHostConfig;
import org.apache.tomcat.util.net.SocketWrapperBase;
import org.apache.tomcat.util.res.StringManager;
public abstract class AbstractHttp11Protocol<S> extends AbstractProtocol<S> {
protected static final StringManager sm =
StringManager.getManager(AbstractHttp11Protocol.class);
private final CompressionConfig compressionConfig = new CompressionConfig();
public AbstractHttp11Protocol(AbstractEndpoint<S,?> endpoint) {
super(endpoint);
setConnectionTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT);
ConnectionHandler<S> cHandler = new ConnectionHandler<>(this);
setHandler(cHandler);
getEndpoint().setHandler(cHandler);
}
@Override
public void init() throws Exception {
for (UpgradeProtocol upgradeProtocol : upgradeProtocols) {
configureUpgradeProtocol(upgradeProtocol);
}
super.init();
}
@Override
protected String getProtocolName() {
return "Http";
}
@Override
protected AbstractEndpoint<S,?> getEndpoint() {
return super.getEndpoint();
}
private String relaxedPathChars = null;
public String getRelaxedPathChars() {
return relaxedPathChars;
}
public void setRelaxedPathChars(String relaxedPathChars) {
this.relaxedPathChars = relaxedPathChars;
}
private String relaxedQueryChars = null;
public String getRelaxedQueryChars() {
return relaxedQueryChars;
}
public void setRelaxedQueryChars(String relaxedQueryChars) {
this.relaxedQueryChars = relaxedQueryChars;
}
private boolean = false;
public boolean () {
return allowHostHeaderMismatch;
}
public void (boolean allowHostHeaderMismatch) {
this.allowHostHeaderMismatch = allowHostHeaderMismatch;
}
private boolean = true;
public boolean () { return rejectIllegalHeaderName; }
public void (boolean rejectIllegalHeaderName) {
this.rejectIllegalHeaderName = rejectIllegalHeaderName;
}
private int maxSavePostSize = 4 * 1024;
public int getMaxSavePostSize() { return maxSavePostSize; }
public void setMaxSavePostSize(int maxSavePostSize) {
this.maxSavePostSize = maxSavePostSize;
}
private int = 8 * 1024;
public int () { return maxHttpHeaderSize; }
public void (int valueI) { maxHttpHeaderSize = valueI; }
private int connectionUploadTimeout = 300000;
public int getConnectionUploadTimeout() { return connectionUploadTimeout; }
public void setConnectionUploadTimeout(int timeout) {
connectionUploadTimeout = timeout;
}
private boolean disableUploadTimeout = true;
public boolean getDisableUploadTimeout() { return disableUploadTimeout; }
public void setDisableUploadTimeout(boolean isDisabled) {
disableUploadTimeout = isDisabled;
}
public void setCompression(String compression) {
compressionConfig.setCompression(compression);
}
public String getCompression() {
return compressionConfig.getCompression();
}
protected int getCompressionLevel() {
return compressionConfig.getCompressionLevel();
}
public String getNoCompressionUserAgents() {
return compressionConfig.getNoCompressionUserAgents();
}
protected Pattern getNoCompressionUserAgentsPattern() {
return compressionConfig.getNoCompressionUserAgentsPattern();
}
public void setNoCompressionUserAgents(String noCompressionUserAgents) {
compressionConfig.setNoCompressionUserAgents(noCompressionUserAgents);
}
public String getCompressibleMimeType() {
return compressionConfig.getCompressibleMimeType();
}
public void setCompressibleMimeType(String valueS) {
compressionConfig.setCompressibleMimeType(valueS);
}
public String[] getCompressibleMimeTypes() {
return compressionConfig.getCompressibleMimeTypes();
}
public int getCompressionMinSize() {
return compressionConfig.getCompressionMinSize();
}
public void setCompressionMinSize(int compressionMinSize) {
compressionConfig.setCompressionMinSize(compressionMinSize);
}
public boolean useCompression(Request request, Response response) {
return compressionConfig.useCompression(request, response);
}
private Pattern restrictedUserAgents = null;
public String getRestrictedUserAgents() {
if (restrictedUserAgents == null) {
return null;
} else {
return restrictedUserAgents.toString();
}
}
protected Pattern getRestrictedUserAgentsPattern() {
return restrictedUserAgents;
}
public void setRestrictedUserAgents(String restrictedUserAgents) {
if (restrictedUserAgents == null || restrictedUserAgents.length() == 0) {
this.restrictedUserAgents = null;
} else {
this.restrictedUserAgents = Pattern.compile(restrictedUserAgents);
}
}
private String server;
public String getServer() { return server; }
public void setServer(String server) {
this.server = server;
}
private boolean serverRemoveAppProvidedValues = false;
public boolean getServerRemoveAppProvidedValues() { return serverRemoveAppProvidedValues; }
public void setServerRemoveAppProvidedValues(boolean serverRemoveAppProvidedValues) {
this.serverRemoveAppProvidedValues = serverRemoveAppProvidedValues;
}
private int maxTrailerSize = 8192;
public int getMaxTrailerSize() { return maxTrailerSize; }
public void setMaxTrailerSize(int maxTrailerSize) {
this.maxTrailerSize = maxTrailerSize;
}
private int maxExtensionSize = 8192;
public int getMaxExtensionSize() { return maxExtensionSize; }
public void setMaxExtensionSize(int maxExtensionSize) {
this.maxExtensionSize = maxExtensionSize;
}
private int maxSwallowSize = 2 * 1024 * 1024;
public int getMaxSwallowSize() { return maxSwallowSize; }
public void setMaxSwallowSize(int maxSwallowSize) {
this.maxSwallowSize = maxSwallowSize;
}
private boolean secure;
public boolean getSecure() { return secure; }
public void setSecure(boolean b) {
secure = b;
}
private Set<String> =
Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
public void (String commaSeparatedHeaders) {
Set<String> toRemove = new HashSet<>();
toRemove.addAll(allowedTrailerHeaders);
if (commaSeparatedHeaders != null) {
String[] headers = commaSeparatedHeaders.split(",");
for (String header : headers) {
String trimmedHeader = header.trim().toLowerCase(Locale.ENGLISH);
if (toRemove.contains(trimmedHeader)) {
toRemove.remove(trimmedHeader);
} else {
allowedTrailerHeaders.add(trimmedHeader);
}
}
allowedTrailerHeaders.removeAll(toRemove);
}
}
protected Set<String> () {
return allowedTrailerHeaders;
}
public String () {
List<String> copy = new ArrayList<>(allowedTrailerHeaders.size());
copy.addAll(allowedTrailerHeaders);
return StringUtils.join(copy);
}
public void (String header) {
if (header != null) {
allowedTrailerHeaders.add(header.trim().toLowerCase(Locale.ENGLISH));
}
}
public void (String header) {
if (header != null) {
allowedTrailerHeaders.remove(header.trim().toLowerCase(Locale.ENGLISH));
}
}
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
@Override
public void addUpgradeProtocol(UpgradeProtocol upgradeProtocol) {
upgradeProtocols.add(upgradeProtocol);
}
@Override
public UpgradeProtocol[] findUpgradeProtocols() {
return upgradeProtocols.toArray(new UpgradeProtocol[0]);
}
private final Map<String,UpgradeProtocol> httpUpgradeProtocols = new HashMap<>();
private final Map<String,UpgradeProtocol> negotiatedProtocols = new HashMap<>();
private void configureUpgradeProtocol(UpgradeProtocol upgradeProtocol) {
String httpUpgradeName = upgradeProtocol.getHttpUpgradeName(getEndpoint().isSSLEnabled());
boolean httpUpgradeConfigured = false;
if (httpUpgradeName != null && httpUpgradeName.length() > 0) {
httpUpgradeProtocols.put(httpUpgradeName, upgradeProtocol);
httpUpgradeConfigured = true;
getLog().info(sm.getString("abstractHttp11Protocol.httpUpgradeConfigured",
getName(), httpUpgradeName));
}
String alpnName = upgradeProtocol.getAlpnName();
if (alpnName != null && alpnName.length() > 0) {
if (getEndpoint().isAlpnSupported()) {
negotiatedProtocols.put(alpnName, upgradeProtocol);
getEndpoint().addNegotiatedProtocol(alpnName);
getLog().info(sm.getString("abstractHttp11Protocol.alpnConfigured",
getName(), alpnName));
} else {
if (!httpUpgradeConfigured) {
getLog().error(sm.getString("abstractHttp11Protocol.alpnWithNoAlpn",
upgradeProtocol.getClass().getName(), alpnName, getName()));
}
}
}
}
@Override
public UpgradeProtocol getNegotiatedProtocol(String negotiatedName) {
return negotiatedProtocols.get(negotiatedName);
}
@Override
public UpgradeProtocol getUpgradeProtocol(String upgradedName) {
return httpUpgradeProtocols.get(upgradedName);
}
public boolean isSSLEnabled() { return getEndpoint().isSSLEnabled();}
public void setSSLEnabled(boolean SSLEnabled) {
getEndpoint().setSSLEnabled(SSLEnabled);
}
public boolean getUseSendfile() { return getEndpoint().getUseSendfile(); }
public void setUseSendfile(boolean useSendfile) { getEndpoint().setUseSendfile(useSendfile); }
public int getMaxKeepAliveRequests() {
return getEndpoint().getMaxKeepAliveRequests();
}
public void setMaxKeepAliveRequests(int mkar) {
getEndpoint().setMaxKeepAliveRequests(mkar);
}
public String getDefaultSSLHostConfigName() {
return getEndpoint().getDefaultSSLHostConfigName();
}
public void setDefaultSSLHostConfigName(String defaultSSLHostConfigName) {
getEndpoint().setDefaultSSLHostConfigName(defaultSSLHostConfigName);
if (defaultSSLHostConfig != null) {
defaultSSLHostConfig.setHostName(defaultSSLHostConfigName);
}
}
@Override
public void addSslHostConfig(SSLHostConfig sslHostConfig) {
getEndpoint().addSslHostConfig(sslHostConfig);
}
@Override
public SSLHostConfig[] findSslHostConfigs() {
return getEndpoint().findSslHostConfigs();
}
public void reloadSslHostConfigs() {
getEndpoint().reloadSslHostConfigs();
}
public void reloadSslHostConfig(String hostName) {
getEndpoint().reloadSslHostConfig(hostName);
}
private SSLHostConfig defaultSSLHostConfig = null;
private void registerDefaultSSLHostConfig() {
if (defaultSSLHostConfig == null) {
for (SSLHostConfig sslHostConfig : findSslHostConfigs()) {
if (getDefaultSSLHostConfigName().equals(sslHostConfig.getHostName())) {
defaultSSLHostConfig = sslHostConfig;
break;
}
}
if (defaultSSLHostConfig == null) {
defaultSSLHostConfig = new SSLHostConfig();
defaultSSLHostConfig.setHostName(getDefaultSSLHostConfigName());
getEndpoint().addSslHostConfig(defaultSSLHostConfig);
}
}
}
public String getSslEnabledProtocols() {
registerDefaultSSLHostConfig();
return StringUtils.join(defaultSSLHostConfig.getEnabledProtocols());
}
public void setSslEnabledProtocols(String enabledProtocols) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setProtocols(enabledProtocols);
}
public String getSSLProtocol() {
registerDefaultSSLHostConfig();
return StringUtils.join(defaultSSLHostConfig.getEnabledProtocols());
}
public void setSSLProtocol(String sslProtocol) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setProtocols(sslProtocol);
}
public String getKeystoreFile() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateKeystoreFile();
}
public void setKeystoreFile(String keystoreFile) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateKeystoreFile(keystoreFile);
}
public String getSSLCertificateChainFile() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateChainFile();
}
public void setSSLCertificateChainFile(String certificateChainFile) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateChainFile(certificateChainFile);
}
public String getSSLCertificateFile() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateFile();
}
public void setSSLCertificateFile(String certificateFile) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateFile(certificateFile);
}
public String getSSLCertificateKeyFile() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateKeyFile();
}
public void setSSLCertificateKeyFile(String certificateKeyFile) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateKeyFile(certificateKeyFile);
}
public String getAlgorithm() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getKeyManagerAlgorithm();
}
public void setAlgorithm(String keyManagerAlgorithm) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setKeyManagerAlgorithm(keyManagerAlgorithm);
}
public String getClientAuth() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateVerificationAsString();
}
public void setClientAuth(String certificateVerification) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateVerification(certificateVerification);
}
public String getSSLVerifyClient() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateVerificationAsString();
}
public void setSSLVerifyClient(String certificateVerification) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateVerification(certificateVerification);
}
public int getTrustMaxCertLength(){
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateVerificationDepth();
}
public void setTrustMaxCertLength(int certificateVerificationDepth){
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateVerificationDepth(certificateVerificationDepth);
}
public int getSSLVerifyDepth() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateVerificationDepth();
}
public void setSSLVerifyDepth(int certificateVerificationDepth) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateVerificationDepth(certificateVerificationDepth);
}
public boolean getUseServerCipherSuitesOrder() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getHonorCipherOrder();
}
public void setUseServerCipherSuitesOrder(boolean honorCipherOrder) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setHonorCipherOrder(honorCipherOrder);
}
public boolean getSSLHonorCipherOrder() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getHonorCipherOrder();
}
public void setSSLHonorCipherOrder(boolean honorCipherOrder) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setHonorCipherOrder(honorCipherOrder);
}
public String getCiphers() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCiphers();
}
public void setCiphers(String ciphers) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCiphers(ciphers);
}
public String getSSLCipherSuite() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCiphers();
}
public void setSSLCipherSuite(String ciphers) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCiphers(ciphers);
}
public String getKeystorePass() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateKeystorePassword();
}
public void setKeystorePass(String certificateKeystorePassword) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateKeystorePassword(certificateKeystorePassword);
}
public String getKeyPass() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateKeyPassword();
}
public void setKeyPass(String certificateKeyPassword) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateKeyPassword(certificateKeyPassword);
}
public String getSSLPassword() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateKeyPassword();
}
public void setSSLPassword(String certificateKeyPassword) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateKeyPassword(certificateKeyPassword);
}
public String getCrlFile(){
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateRevocationListFile();
}
public void setCrlFile(String certificateRevocationListFile){
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateRevocationListFile(certificateRevocationListFile);
}
public String getSSLCARevocationFile() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateRevocationListFile();
}
public void setSSLCARevocationFile(String certificateRevocationListFile) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateRevocationListFile(certificateRevocationListFile);
}
public String getSSLCARevocationPath() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateRevocationListPath();
}
public void setSSLCARevocationPath(String certificateRevocationListPath) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateRevocationListPath(certificateRevocationListPath);
}
public String getKeystoreType() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateKeystoreType();
}
public void setKeystoreType(String certificateKeystoreType) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateKeystoreType(certificateKeystoreType);
}
public String getKeystoreProvider() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateKeystoreProvider();
}
public void setKeystoreProvider(String certificateKeystoreProvider) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateKeystoreProvider(certificateKeystoreProvider);
}
public String getKeyAlias() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCertificateKeyAlias();
}
public void setKeyAlias(String certificateKeyAlias) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCertificateKeyAlias(certificateKeyAlias);
}
public String getTruststoreAlgorithm(){
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getTruststoreAlgorithm();
}
public void setTruststoreAlgorithm(String truststoreAlgorithm){
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setTruststoreAlgorithm(truststoreAlgorithm);
}
public String getTruststoreFile(){
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getTruststoreFile();
}
public void setTruststoreFile(String truststoreFile){
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setTruststoreFile(truststoreFile);
}
public String getTruststorePass(){
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getTruststorePassword();
}
public void setTruststorePass(String truststorePassword){
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setTruststorePassword(truststorePassword);
}
public String getTruststoreType(){
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getTruststoreType();
}
public void setTruststoreType(String truststoreType){
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setTruststoreType(truststoreType);
}
public String getTruststoreProvider(){
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getTruststoreProvider();
}
public void setTruststoreProvider(String truststoreProvider){
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setTruststoreProvider(truststoreProvider);
}
public String getSslProtocol() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getSslProtocol();
}
public void setSslProtocol(String sslProtocol) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setSslProtocol(sslProtocol);
}
public int getSessionCacheSize(){
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getSessionCacheSize();
}
public void setSessionCacheSize(int sessionCacheSize){
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setSessionCacheSize(sessionCacheSize);
}
public int getSessionTimeout(){
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getSessionTimeout();
}
public void setSessionTimeout(int sessionTimeout){
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setSessionTimeout(sessionTimeout);
}
public String getSSLCACertificatePath() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCaCertificatePath();
}
public void setSSLCACertificatePath(String caCertificatePath) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCaCertificatePath(caCertificatePath);
}
public String getSSLCACertificateFile() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getCaCertificateFile();
}
public void setSSLCACertificateFile(String caCertificateFile) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setCaCertificateFile(caCertificateFile);
}
public boolean getSSLDisableCompression() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getDisableCompression();
}
public void setSSLDisableCompression(boolean disableCompression) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setDisableCompression(disableCompression);
}
public boolean getSSLDisableSessionTickets() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getDisableSessionTickets();
}
public void setSSLDisableSessionTickets(boolean disableSessionTickets) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setDisableSessionTickets(disableSessionTickets);
}
public String getTrustManagerClassName() {
registerDefaultSSLHostConfig();
return defaultSSLHostConfig.getTrustManagerClassName();
}
public void setTrustManagerClassName(String trustManagerClassName) {
registerDefaultSSLHostConfig();
defaultSSLHostConfig.setTrustManagerClassName(trustManagerClassName);
}
@Override
protected Processor createProcessor() {
Http11Processor processor = new Http11Processor(this, adapter);
return processor;
}
@Override
protected Processor createUpgradeProcessor(
SocketWrapperBase<?> socket,
UpgradeToken upgradeToken) {
HttpUpgradeHandler httpUpgradeHandler = upgradeToken.getHttpUpgradeHandler();
if (httpUpgradeHandler instanceof InternalHttpUpgradeHandler) {
return new UpgradeProcessorInternal(socket, upgradeToken);
} else {
return new UpgradeProcessorExternal(socket, upgradeToken);
}
}
}