package org.jboss.test.faces.staging; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.jboss.test.faces.TestException; public abstract class HttpConnection { private final Map<String, String[]> requestParameters = new HashMap<String, String[]>(); private HttpMethod method = HttpMethod.GET; /** * Parse 'application/x-www-form-urlencoded' string with parameters name/value pairs, * as it expected after a form submit. * @param queryString URL query string or POST content. */ /* (non-Javadoc) * @see org.jboss.test.faces.staging.HttpConnection#parseFormParameters(java.lang.String) */ public void parseFormParameters(String queryString) { String[] queryParams = queryString.split("&"); for (int i = 0; i < queryParams.length; i++) { String par = queryParams[i]; int eqIndex = par.indexOf('='); if (eqIndex >= 0) { // decode url-decoded values. String name = decode(par.substring(0, eqIndex)); String value = decode( par.substring(eqIndex + 1)); addRequestParameter(name, value); } else { addRequestParameter(decode(par), null); } } } protected String decode(String value){ if(null != getRequestCharacterEncoding()){ try { return URLDecoder.decode(value, getRequestCharacterEncoding()); } catch (UnsupportedEncodingException e) { return URLDecoder.decode(value); } } else { return URLDecoder.decode(value); } } protected abstract String getRequestCharacterEncoding(); /** * @return the finished */ public abstract boolean isFinished(); /** * @return the started */ public abstract boolean isStarted(); /** * Execute this connection request on the associated servlet or filter chain. * @throws TestException if any errors were during execution. */ public abstract void execute(); /** * Finish request to the this connection, inform server listeners about request status. */ public abstract void finish(); /** * Start request to the this connection, inform server listeners about request status. * No request parameters changes allowed after connection start. */ public abstract void start(); /** * Get content of the response as String. * @return content of the response writer or String created from the ServletOutputStream with current response encoding. * @throws TestException * if has an unsupported encoding. */ public abstract String getContentAsString(); /** * Get content of the response as byte array. * @return content of the ServletOutputStream or convert String, collected by response writer, with current response encoding. * @throws TestException * if response has unsupported encoding. */ public abstract byte[] getResponseBody(); /** * @return encoding used to write response. */ public abstract String getResponseCharacterEncoding(); /** * @return content type ( eg 'text/html' ) of the response. */ public abstract String getResponseContentType(); /** * @return HTTP status code of the response. */ public abstract int getResponseStatus(); /** * @return HTTP error message. */ public abstract String getErrorMessage(); /** * Get HTTP response headers. * @return headers name-values map. */ public abstract Map<String, String[]> getResponseHeaders(); /** * Set charset for the request body. * @param charset * @throws UnsupportedEncodingException */ public abstract void setRequestCharacterEncoding(String charset) throws UnsupportedEncodingException; /** * Set HTTP POST/PUT methods uploading content. * @param body */ public abstract void setRequestBody(String body); /** * Set HTTP request content type ( eg 'application/x-www-form-urlencoded' or 'text/xml' ). * @param contentType */ public abstract void setRequestContentType(String contentType); public abstract long getResponseContentLength(); public abstract HttpServletResponse getResponse(); public abstract HttpServletRequest getRequest(); public abstract void addRequestHeaders(Map<String, String> headers); public void addRequestParameter(String name, String value) { // checkNotStarted(); String[] values = getRequestParameters().get(name); if (null == values) { values = new String[1]; } else { String[] newValues = new String[values.length + 1]; System.arraycopy(values, 0, newValues, 0, values.length); values = newValues; } values[values.length - 1] = value; getRequestParameters().put(name, values); } protected String getRequestQueryString() { StringBuilder queryString = new StringBuilder(); for (Map.Entry<String, String[]> entry : getRequestParameters().entrySet()) { if(null !=entry.getValue()){ for (String value : entry.getValue()) { if(queryString.length()>0){ queryString.append("&"); } queryString.append(encode(entry.getKey())); if(null != value){ queryString.append("=").append(encode(value)); } } } }; return queryString.length()>0?queryString.toString():null; } private String encode(String entry) { try { return URLEncoder.encode(entry, getRequestCharacterEncoding()); } catch (UnsupportedEncodingException e) { return URLEncoder.encode(entry); } } /** * <p class="changed_added_4_0"></p> * @return the requestParameters */ protected Map<String, String[]> getRequestParameters() { return requestParameters; } /** * Get request HTTP methos ( GET, POST etc ). * @return the method */ public HttpMethod getRequestMethod() { return method; } public void setRequestMethod(HttpMethod method) { // checkNotStarted(); this.method = method; } }