blob: e65cc311ec065b1efb9cd18e7102bd451dbc6633 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.synapse.transport.nhttp;
import org.apache.http.protocol.HTTP;
import org.apache.synapse.transport.utils.config.HttpTransportConfiguration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Store and manage properties that tune the nhttp transport
*/
public final class NHttpConfiguration extends HttpTransportConfiguration {
// defaults
private static final int WORKERS_CORE_THREADS = 20;
private static final int WORKERS_MAX_THREADS = 100;
private static final int WORKER_KEEP_ALIVE = 5;
private static final int BLOCKING_QUEUE_LENGTH = -1;
private static final int IO_WORKER_COUNT = Runtime.getRuntime().availableProcessors();
private static final int BUFFER_SIZE = 8192;
// server listener
private static final String S_T_CORE = "snd_t_core";
private static final String S_T_MAX = "snd_t_max";
private static final String S_T_ALIVE = "snd_alive_sec";
private static final String S_T_QLEN = "snd_qlen";
// client sender
private static final String C_T_CORE = "lst_t_core";
private static final String C_T_MAX = "lst_t_max";
private static final String C_T_ALIVE = "lst_alive_sec";
private static final String C_T_QLEN = "lst_qlen";
private static final String IO_WORKERS = "io_threads_per_reactor";
// general
private static final String G_BUFFER_SIZE = "nhttp_buffer_size";
private static final String G_DISABLED_HTTP_METHODS = "nhttp_disabled_methods";
private static NHttpConfiguration _instance = new NHttpConfiguration();
private List<String> methods;
//Preserve HTTP headers
private List<String> preserveHeaders;
/** Comma separated list of blocked uris*/
public static final String BLOCK_SERVICE_LIST = "http.block_service_list";
/** Default value for BLOCK_SERVICE_LIST*/
public static final String BLOCK_SERVICE_LIST_DEFAULT = "false";
private NHttpConfiguration() {
super("nhttp");
populatePreserveHttpHeaders();
}
@Override
protected int getThreadsPerReactor() {
return getIntProperty(IO_WORKERS, IO_WORKER_COUNT);
}
public static NHttpConfiguration getInstance() {
return _instance;
}
public int getServerCoreThreads() {
return getIntProperty(S_T_CORE, WORKERS_CORE_THREADS);
}
public int getServerMaxThreads() {
return getIntProperty(S_T_MAX, WORKERS_MAX_THREADS);
}
public int getServerKeepalive() {
return getIntProperty(S_T_ALIVE, WORKER_KEEP_ALIVE);
}
public int getServerQueueLen() {
return getIntProperty(S_T_QLEN, BLOCKING_QUEUE_LENGTH);
}
public int getClientCoreThreads() {
return getIntProperty(C_T_CORE, WORKERS_CORE_THREADS);
}
public int getClientMaxThreads() {
return getIntProperty(C_T_MAX, WORKERS_MAX_THREADS);
}
public int getClientKeepalive() {
return getIntProperty(C_T_ALIVE, WORKER_KEEP_ALIVE);
}
public int getClientQueueLen() {
return getIntProperty(C_T_QLEN, BLOCKING_QUEUE_LENGTH);
}
public int getBufferSize() {
return getIntProperty(G_BUFFER_SIZE, BUFFER_SIZE);
}
public boolean isKeepAliveDisabled() {
return getIntProperty(NhttpConstants.DISABLE_KEEPALIVE, 0) == 1;
}
public boolean isCountConnections() {
return getBooleanProperty(NhttpConstants.COUNT_CONNECTIONS, false);
}
public String isServiceListBlocked() {
return getStringProperty(BLOCK_SERVICE_LIST, BLOCK_SERVICE_LIST_DEFAULT);
}
public boolean isHttpMethodDisabled(String method) {
if (methods == null) {
methods = new ArrayList<String>();
String methodsString = getStringProperty(G_DISABLED_HTTP_METHODS, "");
for (String methodStr : methodsString.split(",")) {
methods.add(methodStr.trim().toUpperCase());
}
}
return methods.contains(method);
}
/**
* Check preserving status of the http header field
*
* @param httpHeader http header name
* @return return true if preserve else false
*/
public boolean isPreserveHttpHeader(String httpHeader) {
if (preserveHeaders == null || preserveHeaders.isEmpty() || httpHeader == null) {
return false;
} else {
return preserveHeaders.contains(httpHeader.toUpperCase());
}
}
private void populatePreserveHttpHeaders() {
if (preserveHeaders == null) {
preserveHeaders = new ArrayList<String>();
String presHeaders = getStringProperty(NhttpConstants.HTTP_HEADERS_PRESERVE, "");
if (presHeaders != null && !presHeaders.isEmpty()) {
String[] splitHeaders = presHeaders.toUpperCase().trim().split(",");
if (splitHeaders != null && splitHeaders.length > 0) {
preserveHeaders.addAll(Arrays.asList(splitHeaders));
}
}
if (getBooleanProperty(NhttpConstants.SERVER_HEADER_PRESERVE, true)
&& !preserveHeaders.contains(HTTP.SERVER_HEADER.toUpperCase())) {
preserveHeaders.add(HTTP.SERVER_HEADER.toUpperCase());
}
if (getBooleanProperty(NhttpConstants.USER_AGENT_HEADER_PRESERVE, false)
&& !preserveHeaders.contains(HTTP.USER_AGENT.toUpperCase())) {
preserveHeaders.add(HTTP.USER_AGENT.toUpperCase());
}
}
}
}