HttpRequestConfig.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2025 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.utils.transport.http;
import java.util.Arrays;
import java.util.function.Function;
import java.util.function.UnaryOperator;
import org.openspcoop2.utils.UtilsException;
import org.openspcoop2.utils.properties.PropertiesReader;
/**
* HttpRequestConfig
*
* @author Tommaso Burlon (tommaso.burlon@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class HttpRequestConfig {
private final PropertiesReader props;
private final Function<String, String> propSupplier;
private String prefix;
private static final String PROP_URL = "baseUrl";
private static final String PROP_READ_TIMEOUT = "readTimeout";
private static final String PROP_CONNECTION_TIMEOUT = "connectTimeout";
private static final String PROP_HTTP_USERNAME = "http.username";
private static final String PROP_HTTP_PASSWORD = "http.password";
private static final String PROP_HTTP_QUERY = "http.queryParameters";
private static final String PROP_HTTP_HEADER = "http.headers";
private static final String PROP_HTTPS_HOSTNAME_VERIFIER = "https.hostnameVerifier";
private static final String PROP_HTTPS_TRUST_ALL_CERTS = "https.trustAllCerts";
private static final String PROP_HTTPS_TRUSTSTORE = "https.trustStore";
private static final String PROP_HTTPS_TRUSTSTORE_PASSWORD = "https.trustStore.password";
private static final String PROP_HTTPS_TRUSTSTORE_TYPE = "https.trustStore.type";
private static final String PROP_HTTPS_CRL = "https.trustStore.crl";
private static final String PROP_HTTPS_KEYSTORE = "https.keyStore";
private static final String PROP_HTTPS_KEYSTORE_PASSWORD = "https.keyStore.password";
private static final String PROP_HTTPS_KEYSTORE_TYPE = "https.keyStore.type";
private static final String PROP_HTTPS_KEY_ALIAS = "https.key.alias";
private static final String PROP_HTTPS_KEY_PASSWORD = "https.key.password";
public HttpRequestConfig(String prefix, PropertiesReader props) {
this.prefix = prefix;
this.props = props;
this.propSupplier = null;
}
public HttpRequestConfig(String prefix, UnaryOperator<String> props) {
this.prefix = prefix;
this.props = null;
this.propSupplier = props;
}
private String getProperty(String code, String key) {
return getProperty(code, key, true);
}
private String getProperty(String code, String baseKey, boolean searchDefault) {
String value = null;
String key;
if (code == null)
key = this.prefix + "." + baseKey;
else
key = this.prefix + "." + code + "." + baseKey;
if (this.props != null){
try {
value = this.props.getValue(key);
} catch (UtilsException e) {
value = null;
}
}
if (this.propSupplier != null) {
value = this.propSupplier.apply(key);
}
if (!searchDefault || value != null)
return value;
return this.getProperty(null, baseKey, false);
}
private void fillHttpProperties(HttpRequest req, String code) {
req.setUsername(getProperty(code, PROP_HTTP_USERNAME));
req.setPassword(getProperty(code, PROP_HTTP_PASSWORD));
}
private void fillHttpsProperties(HttpRequest req, String code) {
String hostnameVerifier = getProperty(code, PROP_HTTPS_HOSTNAME_VERIFIER);
if (hostnameVerifier != null)
req.setHostnameVerifier(Boolean.valueOf(hostnameVerifier));
String trustAllCerts = getProperty(code, PROP_HTTPS_TRUST_ALL_CERTS);
if (trustAllCerts != null)
req.setTrustAllCerts(Boolean.valueOf(trustAllCerts));
req.setTrustStorePath(getProperty(code, PROP_HTTPS_TRUSTSTORE));
req.setTrustStorePassword(getProperty(code, PROP_HTTPS_TRUSTSTORE_PASSWORD));
req.setTrustStoreType(getProperty(code, PROP_HTTPS_TRUSTSTORE_TYPE));
req.setCrlPath(getProperty(code, PROP_HTTPS_CRL));
req.setKeyStorePath(getProperty(code, PROP_HTTPS_KEYSTORE));
req.setKeyStorePassword(getProperty(code, PROP_HTTPS_KEYSTORE_PASSWORD));
req.setKeyStoreType(getProperty(code, PROP_HTTPS_KEYSTORE_TYPE));
req.setKeyAlias(getProperty(code, PROP_HTTPS_KEY_ALIAS));
req.setKeyPassword(getProperty(code, PROP_HTTPS_KEY_PASSWORD));
}
public HttpRequest getBaseRequest() {
return this.getBaseRequest(null);
}
public HttpRequest getBaseRequest(String code) {
HttpRequest req = new HttpRequest();
req.setUrl(getProperty(code, PROP_URL));
String connectTimeout = getProperty(code, PROP_CONNECTION_TIMEOUT);
if (!"false".equals(connectTimeout))
req.setConnectTimeout(Integer.valueOf(connectTimeout));
String readTimeout = getProperty(code, PROP_READ_TIMEOUT);
if (!"false".equals(readTimeout))
req.setReadTimeout(Integer.valueOf(readTimeout));
fillHttpProperties(req, code);
fillHttpsProperties(req, code);
String queryParameters = getProperty(code, PROP_HTTP_QUERY);
if (queryParameters != null) {
Arrays.stream(queryParameters.split(";"))
.map(str -> str.split(":"))
.forEach(arr -> req.addParam(arr[0], arr[1]));
}
String headers = getProperty(code, PROP_HTTP_HEADER);
if (headers != null) {
Arrays.stream(headers.split(";"))
.map(str -> str.split(":"))
.forEach(arr -> req.addHeader(arr[0], arr[1]));
}
return req;
}
}