package scotty.plugin;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.logging.Logger;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.owasp.webscarab.httpclient.HTTPClient;
import org.owasp.webscarab.model.HttpUrl;
import org.owasp.webscarab.model.Request;
import org.owasp.webscarab.model.Response;
import org.owasp.webscarab.plugin.proxy.ProxyPlugin;
import scotty.transformer.RequestTransformer;
import scotty.transformer.ResponseTransformer;
import scotty.util.UserAgentProvider;
/**
* This plugin intercepts the request/response and does the transformation,
* specified by {@link RequestTransformer} and {@link ResponseTransformer}.
*
* @author flo
*
*/
public class TransformingProxyPlugin extends ProxyPlugin {
private Logger log = Logger.getLogger(getPluginName());
private RequestTransformer requestTransformer;
private ResponseTransformer responseTransformer;
private UserAgentProvider uaProvider = new UserAgentProvider();
private String gatewayUrl;
public TransformingProxyPlugin(RequestTransformer requestTransformer,
ResponseTransformer responseTransformer, String gatewayUrl) {
this.requestTransformer = requestTransformer;
this.responseTransformer = responseTransformer;
this.gatewayUrl = gatewayUrl;
}
protected TransformingProxyPlugin() {
}
@Override
public String getPluginName() {
return "TransformingProxyPlugin";
}
@Override
public HTTPClient getProxyPlugin(HTTPClient in) {
return new Plugin(in);
}
private class Plugin implements HTTPClient {
private HTTPClient in;
public Plugin(HTTPClient in) {
this.in = in;
}
@Override
public Response fetchResponse(Request request) throws IOException {
Response response = null;
byte[] cryptedRequest = requestTransformer
.transformRequest(request);
// Build request, which will be sent to the gateway:
HttpUrl url = request.getURL();
request = new Request();
request.setContent(cryptedRequest);
HttpUrl gateway = new HttpUrl(gatewayUrl);
request.setHeader("Host", gateway.getHost());
request.setHeader("Accept-Charset",
"ISO-8859-1,utf-8;q=0.7,*;q=0.3");
request.setHeader("Accept-Encoding", "deflate");
request.setHeader("Accept-Language",
"de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4");
request.setHeader("Content-Length",
Integer.toString(cryptedRequest.length));
request.setHeader("User-Agent", uaProvider.getUserAgent());
request.setMethod("POST");
if ("https".equalsIgnoreCase(url.getScheme())) {
request.setURL(createHttpsGatewayUrl(gatewayUrl));
} else {
request.setURL(gateway);
}
Response cryptedResponse = in.fetchResponse(request);
response = responseTransformer.transformResponse(cryptedResponse
.getContent());
response.setRequest(request);
return response;
}
}
public HttpUrl createHttpsGatewayUrl(String gatewayUrl)
throws MalformedURLException, URIException {
HttpMethod method = new GetMethod(gatewayUrl);
method.setQueryString("ssl=true");
String url = method.getURI().getEscapedURI();
return new HttpUrl(url);
}
}