/**
*
*/
package org.jboss.test.faces.htmlunit;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map.Entry;
import org.jboss.test.faces.staging.HttpMethod;
import org.jboss.test.faces.staging.StagingConnection;
import org.jboss.test.faces.staging.StagingServer;
import com.gargoylesoftware.htmlunit.FormEncodingType;
import com.gargoylesoftware.htmlunit.WebConnection;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.WebResponse;
import com.gargoylesoftware.htmlunit.WebResponseData;
import com.gargoylesoftware.htmlunit.util.NameValuePair;
/**
* This implementation of the HtmlUnit {@link WebConnection} execute http requests on the local
* staging server instead of the real network connection.
* @author asmirnov
*
*/
public final class LocalWebConnection implements WebConnection {
/**
* test server instance
*/
private final StagingServer localServer;
/**
* @param localServer
*/
public LocalWebConnection(StagingServer localServer) {
this.localServer = localServer;
}
/* (non-Javadoc)
* @see com.gargoylesoftware.htmlunit.WebConnection#getResponse(com.gargoylesoftware.htmlunit.WebRequestSettings)
*/
public WebResponse getResponse(WebRequest request)
throws IOException {
StagingConnection connection = localServer.getConnection(request.getUrl());
// Propagate web request request to the local connection.
for (NameValuePair param : request.getRequestParameters()) {
connection.addRequestParameter(param.getName(), param.getValue());
}
HttpMethod httpMethod = HttpMethod.valueOf(request.getHttpMethod().toString());
connection.setRequestMethod(httpMethod);
connection.setRequestCharacterEncoding(request.getCharset());
String body = request.getRequestBody();
String contentType = request.getEncodingType().getName();
connection.setRequestBody(body);
connection.setRequestContentType(contentType);
connection.addRequestHeaders(request.getAdditionalHeaders());
// HtmlUnit uses request parameters map for the form submit, but does not parse
// XMLHttpRequest content.
if(null != body && FormEncodingType.URL_ENCODED.getName().equals(contentType)){
connection.parseFormParameters(body);
}
long startTime = System.currentTimeMillis();
connection.execute();
ArrayList<NameValuePair> headers = new ArrayList<NameValuePair>(10);
for (Entry<String, String[]> entry : connection
.getResponseHeaders().entrySet()) {
for (String value : entry.getValue()) {
headers.add(new NameValuePair(entry.getKey(), value));
}
}
long contentLength = connection.getResponseContentLength();
if(contentLength>=0){
headers.add(new NameValuePair("Content-Length", String.valueOf(contentLength)));
}
WebResponseData responseData = new WebResponseData(connection.getResponseBody(),connection.getResponseStatus(),connection.getErrorMessage(),headers);
return new WebResponse(responseData,request,System.currentTimeMillis()-startTime);
}
}