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 org.apache.commons.io.IOUtils; import com.temenos.useragent.generic.PayloadHandler; import com.temenos.useragent.generic.context.ContextFactory; import com.temenos.useragent.generic.internal.DefaultPayloadWrapper; import com.temenos.useragent.generic.internal.PayloadHandlerFactory; import com.temenos.useragent.generic.internal.PayloadResponse; import com.temenos.useragent.generic.internal.PayloadWrapper; import com.temenos.useragent.generic.internal.RequestData; import com.temenos.useragent.generic.internal.ResponseData; /** * Implements a {@link HttpMethodExecutor http method executor} using Apache * HttpComponents {@linkplain https://hc.apache.org/} * * @author ssethupathi * */ public class DefaultHttpExecutor implements HttpMethodExecutor { private HttpClient httpClient; private String url; private RequestData input; public DefaultHttpExecutor(HttpClient httpClient, String url, RequestData input) { this.httpClient = httpClient; this.url = url; this.input = input; } @Override public ResponseData execute(HttpMethod method) { switch (method) { case GET: return get(); case POST: return post(); case PUT: return put(); case DELETE: return delete(); } throw new RuntimeException("Http method '" + method + "' not supported"); } private ResponseData get() { HttpRequest request = new HttpRequestImpl(input.header()); HttpResponse response = httpClient.get(url, request); return buildResponse(response); } private ResponseData post() { HttpRequest request = new HttpRequestImpl(input.header(), getPayload(input)); HttpResponse response = httpClient.post(url, request); return buildResponse(response); } private ResponseData put() { HttpRequest request = new HttpRequestImpl(input.header(), getPayload(input)); HttpResponse response = httpClient.put(url, request); return buildResponse(response); } private ResponseData delete(){ HttpRequest request = new HttpRequestImpl(input.header()); HttpResponse response = httpClient.delete(url, request); return buildResponse(response); } private ResponseData buildResponse(HttpResponse response) { String contentType = response.headers().get("Content-Type"); if(contentType == null) contentType = ""; PayloadHandlerFactory<?> factory = ContextFactory .get() .getContext() .entityHandlersRegistry() .getPayloadHandlerFactory( DefaultHttpClientHelper.removeParameter(contentType) ); if (factory == null) { throw new IllegalStateException( "Content type handler factory not registered for content type '" + contentType + "'"); } PayloadHandler handler = factory.createHandler(response.payload()); handler.setParameter(DefaultHttpClientHelper .extractParameter(contentType)); PayloadWrapper payload = new DefaultPayloadWrapper(); payload.setHandler(handler); PayloadResponse.Builder responseBuilder = new PayloadResponse.Builder( response.result()); responseBuilder.header(response.headers()); responseBuilder.body(payload); return responseBuilder.build(); } private String getPayload(RequestData requestData) { String payload = ""; if (requestData.entity() != null) { try { payload = IOUtils.toString(input.entity().getContent()); } catch (IOException e) { throw new RuntimeException(e); } } return payload; } }