package com.temenos.useragent.generic.http; /* * #%L * useragent-generic-java * %% * Copyright (C) 2012 - 2016 Temenos Holdings N.V. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * 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 Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import java.io.IOException; import java.io.InputStream; import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; 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.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class implements {@link HttpClient http client} using Apache * HttpComponents {@linkplain https://hc.apache.org/} * * @author ssethupathi * */ public class DefaultHttpClient implements HttpClient { private Logger logger = LoggerFactory.getLogger(DefaultHttpClient.class); @Override public HttpResponse get(String url, HttpRequest request) { logHttpRequest(url, request); CloseableHttpClient client = HttpClientBuilder .create() .setDefaultCredentialsProvider( DefaultHttpClientHelper.getBasicCredentialProvider()) .build(); HttpGet getRequest = new HttpGet(url); DefaultHttpClientHelper.buildRequestHeaders(request, getRequest); try { CloseableHttpResponse httpResponse = client.execute(getRequest); HttpEntity responseEntity = httpResponse.getEntity(); return handleResponse(httpResponse, responseEntity); } catch (IOException e) { throw new RuntimeException(e); } } @Override public HttpResponse post(String url, HttpRequest request) { logHttpRequest(url, request); CloseableHttpClient client = HttpClientBuilder .create() .setDefaultCredentialsProvider( DefaultHttpClientHelper.getBasicCredentialProvider()) .build(); HttpPost postRequest = new HttpPost(url); DefaultHttpClientHelper.buildRequestHeaders(request, postRequest); postRequest.setEntity(new StringEntity(request.payload(), "UTF-8")); try { CloseableHttpResponse httpResponse = client.execute(postRequest); HttpEntity responseEntity = httpResponse.getEntity(); return handleResponse(httpResponse, responseEntity); } catch (IOException e) { throw new RuntimeException(e); } } @Override public HttpResponse put(String url, HttpRequest request) { logHttpRequest(url, request); CloseableHttpClient client = HttpClientBuilder .create() .setDefaultCredentialsProvider( DefaultHttpClientHelper.getBasicCredentialProvider()) .build(); HttpPut putRequest = new HttpPut(url); DefaultHttpClientHelper.buildRequestHeaders(request, putRequest); putRequest.setEntity(new StringEntity(request.payload(), "UTF-8")); try { CloseableHttpResponse httpResponse = client.execute(putRequest); HttpEntity responseEntity = httpResponse.getEntity(); return handleResponse(httpResponse, responseEntity); } catch (IOException e) { throw new RuntimeException(e); } } @Override public HttpResponse delete(String url, HttpRequest request) { logHttpRequest(url, request); CloseableHttpClient client = HttpClientBuilder .create() .setDefaultCredentialsProvider( DefaultHttpClientHelper.getBasicCredentialProvider()) .build(); HttpDelete deleteRequest = new HttpDelete(url); DefaultHttpClientHelper.buildRequestHeaders(request, deleteRequest); try { CloseableHttpResponse httpResponse = client.execute(deleteRequest); HttpEntity responseEntity = httpResponse.getEntity(); return handleResponse(httpResponse, responseEntity); } catch (IOException e) { throw new RuntimeException(e); } } private HttpResponse handleResponse(CloseableHttpResponse httpResponse, HttpEntity responseEntity) throws IOException { HttpResponse response; if(responseEntity != null){ InputStream contentStream = httpResponse.getEntity().getContent(); response = new HttpResponseImpl( DefaultHttpClientHelper.buildResponseHeaders(httpResponse), IOUtils.toString(contentStream, "UTF-8"), DefaultHttpClientHelper.buildResult(httpResponse)); }else{ //e.g. HTTP 204 response = new HttpResponseImpl( DefaultHttpClientHelper.buildResponseHeaders(httpResponse), "", DefaultHttpClientHelper.buildResult(httpResponse)); } logHttpResponse(response); return response; } private void logHttpRequest(String url, HttpRequest request) { if (logger.isInfoEnabled()) { String payload = request.payload(); if (payload != null && !payload.isEmpty()) { logger.info( "\nURL: {}\nHEADERS: {}\nREQUEST: {}", url, request.headers(), ContentPrettyFormatter.newFormatter( request.headers().get("Content-Type")).format( payload)); } else { logger.info("\nURL: {}\nHEADERS:{}\nNO REQUEST BODY", url, request.headers()); } } } private void logHttpResponse(HttpResponse response) { if (logger.isInfoEnabled()) { String payload = response.payload(); if (payload != null && !payload.isEmpty()) { logger.info( "\nHEADERS: {}\nRESPONSE: {}", response.headers(), ContentPrettyFormatter.newFormatter( response.headers().get("Content-Type")).format( payload)); } else { logger.info("\nHEADERS: {}\nNO RESPONSE BODY", response.headers() ); } } } }