package org.browsermob.proxy.http;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.browsermob.proxy.jetty.http.HttpRequest;
import org.browsermob.proxy.util.Base64;
import org.browsermob.proxy.util.ClonedInputStream;
import org.browsermob.proxy.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
public class BrowserMobHttpRequest {
private static final Log LOG = new Log();
private HttpRequestBase method;
private BrowserMobHttpClient client;
private int expectedStatusCode;
private String verificationText;
private List<NameValuePair> nvps = new ArrayList<NameValuePair>();
private StringEntity stringEntity;
private ByteArrayEntity byteArrayEntity;
private InputStreamEntity inputStreamEntity;
private MultipartEntity multipartEntity;
private OutputStream outputStream;
private RequestCallback requestCallback;
private boolean collectAdditionalInfo;
private HttpRequest proxyRequest;
private ByteArrayOutputStream copy;
private String expectedLocation;
private boolean multiPart;
protected BrowserMobHttpRequest(HttpRequestBase method, BrowserMobHttpClient client, int expectedStatusCode,
boolean collectAdditionalInfo, HttpRequest proxyRequest) {
this.method = method;
this.client = client;
this.expectedStatusCode = expectedStatusCode;
this.collectAdditionalInfo = collectAdditionalInfo;
this.proxyRequest = proxyRequest;
}
public String getExpectedLocation() {
return expectedLocation;
}
public void setExpectedLocation(String location) {
this.expectedLocation = location;
}
public void addRequestHeader(String key, String value) {
method.addHeader(key, value);
}
public void addRequestParameter(String key, String value) {
nvps.add(new BasicNameValuePair(key, value));
}
public void setRequestBody(String body, String contentType, String charSet) {
try {
stringEntity = new StringEntity(body, charSet);
} catch (UnsupportedEncodingException e) {
try {
stringEntity = new StringEntity(body, (String) null);
} catch (UnsupportedEncodingException e1) {
// this won't happen
}
}
stringEntity.setContentType(contentType);
}
public void setRequestBody(String body) {
setRequestBody(body, null, "UTF-8");
}
public void setRequestBodyAsBase64EncodedBytes(String bodyBase64Encoded) {
byteArrayEntity = new ByteArrayEntity(Base64.base64ToByteArray(bodyBase64Encoded));
}
public void setRequestInputStream(InputStream is, long length) {
if (collectAdditionalInfo) {
ClonedInputStream cis = new ClonedInputStream(is);
is = cis;
copy = cis.getOutput();
}
inputStreamEntity = new InputStreamEntity(is, length);
}
public String getVerificationText() {
return verificationText;
}
public void setVerificationText(String verificationText) {
this.verificationText = verificationText;
}
public HttpRequestBase getMethod() {
return method;
}
public HttpRequest getProxyRequest() {
return proxyRequest;
}
public void makeMultiPart() {
if (!multiPart) {
multiPart = true;
multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
}
}
public BrowserMobHttpResponse execute() {
// deal with PUT/POST requests
if (method instanceof HttpEntityEnclosingRequestBase) {
HttpEntityEnclosingRequestBase enclodingRequest = (HttpEntityEnclosingRequestBase) method;
if (!nvps.isEmpty()) {
try {
if (!multiPart) {
enclodingRequest.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
} else {
for (NameValuePair nvp : nvps) {
multipartEntity.addPart(nvp.getName(), new StringBody(nvp.getValue()));
}
enclodingRequest.setEntity(multipartEntity);
}
} catch (UnsupportedEncodingException e) {
LOG.severe("Could not find UTF-8 encoding, something is really wrong", e);
}
} else if (multipartEntity != null) {
enclodingRequest.setEntity(multipartEntity);
} else if (byteArrayEntity != null) {
enclodingRequest.setEntity(byteArrayEntity);
} else if (stringEntity != null) {
enclodingRequest.setEntity(stringEntity);
} else if (inputStreamEntity != null) {
enclodingRequest.setEntity(inputStreamEntity);
}
}
return client.execute(this);
}
public int getExpectedStatusCode() {
return expectedStatusCode;
}
public void setExpectedStatusCode(int expectedStatusCode) {
this.expectedStatusCode = expectedStatusCode;
}
public OutputStream getOutputStream() {
return outputStream;
}
public void setOutputStream(OutputStream outputStream) {
this.outputStream = outputStream;
}
public RequestCallback getRequestCallback() {
return requestCallback;
}
public void setRequestCallback(RequestCallback requestCallback) {
this.requestCallback = requestCallback;
}
public ByteArrayOutputStream getCopy() {
return copy;
}
}