diff --git a/core/src/main/java/org/alfresco/httpclient/HttpClient4Factory.java b/core/src/main/java/org/alfresco/httpclient/HttpClient4Factory.java index 9557e13ca2..74b2cd5327 100644 --- a/core/src/main/java/org/alfresco/httpclient/HttpClient4Factory.java +++ b/core/src/main/java/org/alfresco/httpclient/HttpClient4Factory.java @@ -92,15 +92,16 @@ public class HttpClient4Factory else { //Setting a connectionManager overrides these properties - clientBuilder.setMaxConnTotal(config.getMaxTotalConnections()); - clientBuilder.setMaxConnPerRoute(config.getMaxHostConnections()); + config.getMaxTotalConnections().ifPresent(v -> clientBuilder.setMaxConnTotal(v)); + config.getMaxHostConnections().ifPresent(v -> clientBuilder.setMaxConnPerRoute(v)); } - RequestConfig requestConfig = RequestConfig.custom() - .setConnectTimeout(config.getConnectionTimeout()) - .setSocketTimeout(config.getSocketTimeout()) - .setConnectionRequestTimeout(config.getConnectionRequestTimeout()) - .build(); + RequestConfig.Builder requestConfigBuilder = RequestConfig.custom(); + config.getConnectionTimeout().ifPresent(v -> requestConfigBuilder.setConnectTimeout(v)); + config.getConnectionRequestTimeout().ifPresent(v -> requestConfigBuilder.setConnectionRequestTimeout(v)); + config.getSocketTimeout().ifPresent(v -> requestConfigBuilder.setSocketTimeout(v)); + + RequestConfig requestConfig = requestConfigBuilder.build(); clientBuilder.setDefaultRequestConfig(requestConfig); @@ -135,8 +136,8 @@ public class HttpClient4Factory .register("http", PlainConnectionSocketFactory.getSocketFactory()) .build()); } - poolingHttpClientConnectionManager.setMaxTotal(config.getMaxTotalConnections()); - poolingHttpClientConnectionManager.setDefaultMaxPerRoute(config.getMaxHostConnections()); + config.getMaxTotalConnections().ifPresent(v -> poolingHttpClientConnectionManager.setMaxTotal(v)); + config.getMaxHostConnections().ifPresent(v -> poolingHttpClientConnectionManager.setDefaultMaxPerRoute(v)); return poolingHttpClientConnectionManager; } diff --git a/core/src/main/java/org/alfresco/httpclient/HttpClientConfig.java b/core/src/main/java/org/alfresco/httpclient/HttpClientConfig.java index 7700c3382c..e4decb957d 100644 --- a/core/src/main/java/org/alfresco/httpclient/HttpClientConfig.java +++ b/core/src/main/java/org/alfresco/httpclient/HttpClientConfig.java @@ -85,17 +85,27 @@ public class HttpClientConfig this.keyStore = new AlfrescoKeyStoreImpl(sslEncryptionParameters.getKeyStoreParameters(), keyResourceLoader); this.trustStore = new AlfrescoKeyStoreImpl(sslEncryptionParameters.getTrustStoreParameters(), keyResourceLoader); - config = retrieveConfig(serviceName); + config = retrieveConfig(); checkUnsupportedProperties(config); } /** * Method used for retrieving HttpClient config from Global Properties - * @param serviceName name of used service + * that can also have values provided/overridden through System Properties + * * @return map of properties */ - private Map retrieveConfig(String serviceName) + private Map retrieveConfig() { + Map resultProperties = getHttpClientPropertiesForService(properties); + Map systemProperties = getHttpClientPropertiesForService(System.getProperties()); + + systemProperties.forEach((k, v) -> resultProperties.put(k, v)); //Override/Add to Global Properties results with values from System Properties + + return resultProperties; + } + + private Map getHttpClientPropertiesForService(Properties properties) { return properties.keySet().stream() .filter(key -> key instanceof String) .map(Object::toString) @@ -112,79 +122,75 @@ public class HttpClientConfig .forEach(propertyName -> LOGGER.warn(String.format("For service [%s], an unsupported property [%s] is set", serviceName, propertyName))); } - private Integer getIntegerProperty(HttpClientPropertiesEnum property) + private Optional getIntegerProperty(HttpClientPropertiesEnum property) { - return Integer.parseInt(extractValueFromConfig(property).orElse("0")); + Optional optionalProperty = extractValueFromConfig(property); + + return optionalProperty.isPresent() ? Optional.of(Integer.parseInt(optionalProperty.get())) : Optional.empty(); } - private Boolean getBooleanProperty(HttpClientPropertiesEnum property) + private Optional getBooleanProperty(HttpClientPropertiesEnum property) { - return Boolean.parseBoolean(extractValueFromConfig(property).orElse("false")); + Optional optionalProperty = extractValueFromConfig(property); + + return optionalProperty.isPresent() ? Optional.of(Boolean.parseBoolean(optionalProperty.get())) : Optional.empty(); } private Optional extractValueFromConfig(HttpClientPropertiesEnum property) { - Optional optionalProperty = Optional.ofNullable(config.get(property.name)); - if(property.isRequired && optionalProperty.isEmpty()) - { - String msg = String.format("Required property: '%s' is empty.", property.name); - throw new HttpClientException(msg); - } - return optionalProperty; + return Optional.ofNullable(config.get(property.name)); } - public Integer getConnectionTimeout() + public Optional getConnectionTimeout() { return getIntegerProperty(HttpClientPropertiesEnum.CONNECTION_REQUEST_TIMEOUT); } - public Integer getSocketTimeout() + public Optional getSocketTimeout() { return getIntegerProperty(HttpClientPropertiesEnum.SOCKET_TIMEOUT); } - public Integer getConnectionRequestTimeout() + public Optional getConnectionRequestTimeout() { return getIntegerProperty(HttpClientPropertiesEnum.CONNECTION_REQUEST_TIMEOUT); } - public Integer getMaxTotalConnections() + public Optional getMaxTotalConnections() { return getIntegerProperty(HttpClientPropertiesEnum.MAX_TOTAL_CONNECTIONS); } - public Integer getMaxHostConnections() + public Optional getMaxHostConnections() { return getIntegerProperty(HttpClientPropertiesEnum.MAX_HOST_CONNECTIONS); } - public Boolean isMTLSEnabled() + public boolean isMTLSEnabled() { - return getBooleanProperty(HttpClientPropertiesEnum.MTLS_ENABLED); + return getBooleanProperty(HttpClientPropertiesEnum.MTLS_ENABLED).orElse(Boolean.FALSE); } public boolean isHostnameVerificationDisabled() { - return getBooleanProperty(HttpClientPropertiesEnum.HOSTNAME_VERIFICATION_DISABLED); + return getBooleanProperty(HttpClientPropertiesEnum.HOSTNAME_VERIFICATION_DISABLED).orElse(Boolean.FALSE); } private enum HttpClientPropertiesEnum { - CONNECTION_TIMEOUT("connectionTimeout", true), - SOCKET_TIMEOUT("socketTimeout", true), - CONNECTION_REQUEST_TIMEOUT("connectionRequestTimeout", true), - MAX_TOTAL_CONNECTIONS("maxTotalConnections", true), - MAX_HOST_CONNECTIONS("maxHostConnections", true), - HOSTNAME_VERIFICATION_DISABLED("hostnameVerificationDisabled", false), - MTLS_ENABLED("mTLSEnabled", true); + CONNECTION_TIMEOUT("connectionTimeout"), + SOCKET_TIMEOUT("socketTimeout"), + CONNECTION_REQUEST_TIMEOUT("connectionRequestTimeout"), + MAX_TOTAL_CONNECTIONS("maxTotalConnections"), + MAX_HOST_CONNECTIONS("maxHostConnections"), + HOSTNAME_VERIFICATION_DISABLED("hostnameVerificationDisabled"), + MTLS_ENABLED("mTLSEnabled"); private final String name; - private final Boolean isRequired; - HttpClientPropertiesEnum(String propertyName, Boolean isRequired) + HttpClientPropertiesEnum(String propertyName) { this.name = propertyName; - this.isRequired = isRequired; } private static final List supportedProperties = new ArrayList<>(); diff --git a/repository/src/main/resources/alfresco/repository.properties b/repository/src/main/resources/alfresco/repository.properties index 908bf8bbef..ef4dfa3927 100644 --- a/repository/src/main/resources/alfresco/repository.properties +++ b/repository/src/main/resources/alfresco/repository.properties @@ -754,13 +754,6 @@ encryption.ssl.truststore.keyMetaData.location= httpclient.config.transform.mTLSEnabled=false httpclient.config.transform.maxTotalConnections=20 httpclient.config.transform.maxHostConnections=20 -httpclient.config.transform.socketTimeout=5000 -httpclient.config.transform.connectionRequestTimeout=5000 -httpclient.config.transform.connectionTimeout=5000 - -# Property is disabled by default for security reasons, never enable it on for production environments. -# It will stop verification of hostnames placed in certificates returned with server responses to Repository requests towards transform services -httpclient.config.transform.hostnameVerificationDisabled=false # Re-encryptor properties encryption.reencryptor.chunkSize=100