summaryrefslogtreecommitdiffstats
path: root/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpClient.java
diff options
context:
space:
mode:
Diffstat (limited to 'common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpClient.java')
-rw-r--r--common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpClient.java147
1 files changed, 147 insertions, 0 deletions
diff --git a/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpClient.java b/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpClient.java
new file mode 100644
index 0000000000..26518a6456
--- /dev/null
+++ b/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpClient.java
@@ -0,0 +1,147 @@
+package org.openecomp.sdc.common.http.client.api;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Properties;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHeaders;
+import org.apache.http.HttpHost;
+import org.apache.http.auth.AuthScheme;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.AuthCache;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPatch;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.impl.auth.BasicScheme;
+import org.apache.http.impl.client.BasicAuthCache;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.openecomp.sdc.be.config.BeEcompErrorManager;
+import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces.FunctionThrows;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HttpClient {
+ private static final Logger logger = LoggerFactory.getLogger(HttpClient.class);
+
+ private final CloseableHttpClient client;
+ private final HttpClientConfigImmutable configImmutable;
+
+ HttpClient(CloseableHttpClient client, HttpClientConfigImmutable configImmutable) {
+ this.client = client;
+ this.configImmutable = configImmutable;
+ }
+
+ <T> HttpResponse<T> get(String url, Properties headers, FunctionThrows<CloseableHttpResponse, HttpResponse<T>, Exception> responseBuilder) throws HttpExecuteException {
+ HttpGet httpGet = new HttpGet(url);
+ return execute(httpGet, headers, responseBuilder);
+ }
+
+ <T> HttpResponse<T> put(String url, Properties headers, HttpEntity entity, FunctionThrows<CloseableHttpResponse, HttpResponse<T>, Exception> responseBuilder) throws HttpExecuteException {
+ HttpPut httpPut = new HttpPut(url);
+ httpPut.setEntity(entity);
+ return execute(httpPut, headers, responseBuilder);
+ }
+
+ <T> HttpResponse<T> post(String url, Properties headers, HttpEntity entity, FunctionThrows<CloseableHttpResponse, HttpResponse<T>, Exception> responseBuilder) throws HttpExecuteException {
+ HttpPost httpPost = new HttpPost(url);
+ httpPost.setEntity(entity);
+ return execute(httpPost, headers, responseBuilder);
+ }
+
+ <T> HttpResponse<T> patch(String url, Properties headers, HttpEntity entity, FunctionThrows<CloseableHttpResponse, HttpResponse<T>, Exception> responseBuilder) throws HttpExecuteException {
+ HttpPatch httpPatch = new HttpPatch(url);
+ httpPatch.setEntity(entity);
+ return execute(httpPatch, headers, responseBuilder);
+ }
+
+ <T> HttpResponse<T> delete(String url, Properties headers, FunctionThrows<CloseableHttpResponse, HttpResponse<T>, Exception> responseBuilder) throws HttpExecuteException {
+ HttpDelete httpDelete = new HttpDelete(url);
+ return execute(httpDelete, headers, responseBuilder);
+ }
+
+ void close() {
+ try {
+ client.close();
+ }
+ catch (IOException e) {
+ logger.debug("Close http client failed with exception ", e);
+ }
+ }
+
+ private <T> HttpResponse<T> execute(HttpRequestBase request, Properties headers, FunctionThrows<CloseableHttpResponse, HttpResponse<T>, Exception> responseBuilder) throws HttpExecuteException {
+ if(configImmutable.getHeaders() != null) {
+ configImmutable.getHeaders().forEach((k, v) -> request.addHeader(k, v));
+ }
+
+ if (headers != null) {
+ headers.forEach((k, v) -> request.addHeader(k.toString(), v.toString()));
+ }
+
+ HttpClientContext httpClientContext = null;
+ if(request.getHeaders(HttpHeaders.AUTHORIZATION).length == 0) {
+ httpClientContext = createHttpContext(request.getURI());
+ }
+
+ logger.debug("Execute request {}", request.getRequestLine());
+ try (CloseableHttpResponse response = client.execute(request, httpClientContext)) {
+ return responseBuilder.apply(response);
+ }
+ catch (Exception e) {
+ String description = String.format("Execute request %s failed with exception: %s", request.getRequestLine(), e.getMessage());
+ BeEcompErrorManager.getInstance().logInternalFlowError("ExecuteRestRequest", description, ErrorSeverity.ERROR);
+ logger.debug("{}: ",description, e);
+
+ throw new HttpExecuteException(description, e);
+ }
+ }
+
+ private HttpClientContext createHttpContext(URI uri) {
+ if(StringUtils.isEmpty(configImmutable.getBasicAuthUserName()) || StringUtils.isEmpty(configImmutable.getBasicAuthPassword())) {
+ return null;
+ }
+
+ CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+ int port = getPort(uri);
+ credentialsProvider.setCredentials(new AuthScope(uri.getHost(), port),
+ new UsernamePasswordCredentials(configImmutable.getBasicAuthUserName(), configImmutable.getBasicAuthPassword()));
+
+ HttpClientContext localContext = HttpClientContext.create();
+ localContext.setCredentialsProvider(credentialsProvider);
+
+ AuthCache authCache = new BasicAuthCache();
+ authCache.put(new HttpHost(uri.getHost(), port), (AuthScheme) new BasicScheme());
+ localContext.setAuthCache(authCache);
+
+ return localContext;
+ }
+
+ private int getPort(URI uri) {
+ int port = uri.getPort();
+ if(port < 0) {
+ if(Constants.HTTPS.equals(uri.getScheme())) {
+ port = 443;
+ }
+ else
+ if (Constants.HTTP.equals(uri.getScheme())) {
+ port = 80;
+ }
+ else {
+ port = AuthScope.ANY_PORT;
+ logger.debug("Protocol \"{}\" is not supported, set port to {}", uri.getScheme(), port);
+ }
+ }
+ return port;
+ }
+}