package com.nvarghese.beowulf.common.http.wrapper;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpRequest;
import org.apache.http.NameValuePair;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.message.BasicHeader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.nvarghese.beowulf.common.http.payload.RequestPayload;
import com.nvarghese.beowulf.common.http.payload.UrlEncodedRequestPayload;
import com.nvarghese.beowulf.common.http.txn.HttpMethodType;
import com.nvarghese.beowulf.common.http.txn.HttpTransactionFactory;
public class HttpRequestWrapper extends HttpMessageWrapper {
private HttpMethodType method;
private HttpRequest httpRequest;
private List<Header> headers;
private RequestPayload requestPayload;
static Logger logger = LoggerFactory.getLogger(HttpRequestWrapper.class);
public HttpRequestWrapper(HttpMethodType method, HttpRequest httpRequest, RequestPayload requestPayload) {
super();
this.method = method;
this.httpRequest = httpRequest;
this.requestPayload = requestPayload;
this.headers = Arrays.asList(httpRequest.getAllHeaders());
}
public URI getURI() {
HttpUriRequest uriRequest = (HttpUriRequest) httpRequest;
return uriRequest.getURI();
}
public HttpMethodType getMethod() {
return method;
}
public HttpRequest getHttpRequest() {
return httpRequest;
}
public RequestPayload getRequestPayload() {
return requestPayload;
}
public void processUpdates() {
headers = Arrays.asList(httpRequest.getAllHeaders());
URI uri = getUpdatedURI();
if (requestPayload.getContentType() != null) {
BasicHeader contentTypeHeader = new BasicHeader(HttpHeaders.CONTENT_TYPE, requestPayload.getContentType().getMimeType());
headers.add(contentTypeHeader);
}
HttpRequest newHttpRequest = HttpTransactionFactory.createHttpRequest(method, uri, headers.toArray(new Header[0]),
requestPayload.toHttpEntity());
this.httpRequest = newHttpRequest;
}
private URI getUpdatedURI() {
HttpUriRequest uriRequest = (HttpUriRequest) httpRequest;
URI uri = uriRequest.getURI();
try {
URIBuilder uriBuilder = new URIBuilder(uri);
if ((httpRequest instanceof HttpEntityEnclosingRequestBase) == false) {
/* an idempotent request */
if (requestPayload instanceof UrlEncodedRequestPayload) {
List<NameValuePair> params = ((UrlEncodedRequestPayload) requestPayload).getParameters();
for (NameValuePair param : params) {
uriBuilder.setParameter(param.getName(), param.getValue());
}
}
uri = uriBuilder.build();
}
} catch (URISyntaxException e) {
logger.error("Failed to retrieve the new URI from payload. Reason: {}", e.getMessage(), e);
logger.warn("Reverted the http request due to problem in URI building");
uri = uriRequest.getURI();
}
return uri;
}
public List<? extends Header> getHeaders() {
return headers;
}
public void setHeaders(List<Header> headers) {
this.headers = headers;
}
}