package org.infoglue.common.webappintegrator; import java.net.URLDecoder; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HostConfiguration; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.HttpState; import org.apache.commons.httpclient.URI; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.log4j.Logger; import org.infoglue.cms.controllers.kernel.impl.simple.InterceptionPointController; import org.infoglue.deliver.util.HttpHelper; /** * * This is a simple text mode application that demonstrates * how to use the Jakarta HttpClient API. * * @author <a href="mailto:jsdever@apache.org">Jeff Dever</a> * @author Ortwin Glück */ public class PageFetcher { private final static Logger logger = Logger.getLogger(PageFetcher.class.getName()); public static void main(String[] args) throws Exception { /* Map<String,String> parameters = new HashMap<String,String>(); parameters.put("ct_orig_uri","https://forum.tewss.telia.se"); parameters.put("ct_error_uri","http://www.telia.se/privat/security/loginpage.do"); parameters.put("SCAUTHMETHOD","basic"); parameters.put("user","mattiasbogeblad"); parameters.put("password","blader22"); String url = "https://access.tewss.telia.se/ssotcwss/login"; new PageFetcher().fetchPage(url, "post", new HashMap<String,String>(), new HashMap<String,String>(), parameters, new HashMap<String,String>(), new HashMap<String,String>(), new HashMap<String,String>(), new ArrayList<String>()); */ } public String fetchPage(String url, String httpMethod, String proxyHost, Integer proxyPort, Map<String,String> cookies, Map<String,String> inputRequestHeaders, Map<String,String> requestParameters, Map<String,String> returnCookies, Map<String,String> returnHeaders, Map<String,String> statusData, List<String> blockedParameters) throws Exception { logger.info("Fetching page on:" + url); HttpState initialState = new HttpState(); for(Entry<String,String> cookie : cookies.entrySet()) { logger.info("Cookie: " + cookie.getKey() + "=" + cookie.getValue()); Cookie mycookie = new Cookie(".telia.se", cookie.getKey(), cookie.getValue(), "/", null, false); initialState.addCookie(mycookie); } Credentials creds = null; //if (args.length >= 3) { // creds = new UsernamePasswordCredentials(args[1], args[2]); //} HttpClient client = new HttpClient(); client.setState(initialState); client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); client.getHttpConnectionManager().getParams().setSoTimeout(10000); if(proxyHost != null && !proxyHost.equals("")) { HostConfiguration config = client.getHostConfiguration(); config.setProxy(proxyHost, (proxyPort == null ? 80 : proxyPort)); } if (creds != null) { client.getState().setCredentials(AuthScope.ANY, creds); } logger.info("URL TO CALL with " + httpMethod + ":" + url); HttpMethod method = null; url = URLDecoder.decode(url, "utf-8"); logger.info("URL TO CALL with " + httpMethod + ":" + url); url = new URI(url).getEscapedURI(); logger.info("URL TO CALL with " + httpMethod + ":" + url); if(httpMethod.equalsIgnoreCase("post")) method = new PostMethod(url); else method = new GetMethod(url); for(Entry<String,String> requestParameter : requestParameters.entrySet()) { logger.info("BlockedParameters:" + blockedParameters); if(!blockedParameters.contains(requestParameter.getKey())) { if(method instanceof PostMethod) { logger.info("Parameter in post: " + requestParameter.getKey() + "=" + requestParameter.getValue()); ((PostMethod)method).addParameter(requestParameter.getKey(), requestParameter.getValue()); } } else logger.info("Skipping:" + requestParameter.getKey()); } /* TODO - we must have somewhere to do this controllable for(Entry<String,String> inputRequestHeader : inputRequestHeaders.entrySet()) { logger.info("Header: " + inputRequestHeader.getKey() + "=" + inputRequestHeader.getValue()); method.addRequestHeader(inputRequestHeader.getKey(), inputRequestHeader.getValue()); } */ //execute the method String responseBody = null; client.executeMethod(method); responseBody = method.getResponseBodyAsString(); //write out the request headers logger.info("*** Request ***"); logger.info("Request Path: " + method.getPath()); logger.info("Request Query: " + method.getQueryString()); Header[] requestHeaders = method.getRequestHeaders(); for (int i=0; i<requestHeaders.length; i++){ logger.info(requestHeaders[i]); } //write out the response headers logger.info("*** Response ***"); logger.info("Status Line: " + method.getStatusLine()); Header[] responseHeaders = method.getResponseHeaders(); for (int i=0; i<responseHeaders.length; i++) { returnHeaders.put(responseHeaders[i].getName(), responseHeaders[i].getValue()); logger.info(responseHeaders[i]); } Cookie[] returnCookiesArray = client.getState().getCookies(); // Display the cookies logger.info("Present cookies: "); for (int i = 0; i < returnCookiesArray.length; i++) { logger.info(" - " + returnCookiesArray[i].toExternalForm()); returnCookies.put(returnCookiesArray[i].getName(), returnCookiesArray[i].getValue()); } //write out the response body //logger.info("*** Response Body ***"); //logger.info(responseBody); logger.info("****************************"); logger.info("* Looking for redirect.... *"); logger.info("****************************"); String redirectLocation; Header locationHeader = method.getResponseHeader("location"); if (locationHeader != null) { redirectLocation = locationHeader.getValue(); logger.info("redirectLocation:" + redirectLocation); String fullUrl = addParameters(redirectLocation, requestParameters); logger.info("fullUrl:" + fullUrl); //if(httpMethod.equalsIgnoreCase("post")) // method = new PostMethod(fullUrl); //else method = new GetMethod(fullUrl); for(Entry<String,String> requestParameter : requestParameters.entrySet()) { if(requestParameter.getKey().equals("ct_error_uri") || requestParameter.getKey().equals("ct_orig_uri") || requestParameter.getKey().equals("SCAUTHMETHOD") || requestParameter.getKey().equals("user") || requestParameter.getKey().equals("password")) { if(method instanceof PostMethod) { logger.info("Parameter: " + requestParameter.getKey() + "=" + requestParameter.getValue()); ((PostMethod)method).addParameter(requestParameter.getKey(), requestParameter.getValue()); } } else logger.info("Skipping:" + requestParameter.getKey()); } client.executeMethod(method); responseBody = method.getResponseBodyAsString(); //write out the request headers logger.info("*** Request ***"); logger.info("Request Path: " + method.getPath()); logger.info("Request Query: " + method.getQueryString()); requestHeaders = method.getRequestHeaders(); for (int i=0; i<requestHeaders.length; i++){ logger.info(requestHeaders[i]); } //write out the response headers logger.info("*** Response ***"); logger.info("Status Line: " + method.getStatusLine()); responseHeaders = method.getResponseHeaders(); for (int i=0; i<responseHeaders.length; i++) { returnHeaders.put(responseHeaders[i].getName(), responseHeaders[i].getValue()); logger.info(responseHeaders[i]); } returnCookiesArray = client.getState().getCookies(); // Display the cookies logger.info("Present cookies: "); for (int i = 0; i < returnCookiesArray.length; i++) { logger.info(" - " + returnCookiesArray[i].toExternalForm()); returnCookies.put(returnCookiesArray[i].getName(), returnCookiesArray[i].getValue()); } //write out the response body logger.info("*** Response Body ***"); logger.info(responseBody); } //clean up the connection resources method.releaseConnection(); return responseBody; } private String addParameters(String redirectLocation, Map<String, String> requestParameters) throws Exception { String params = new HttpHelper().toEncodedString(requestParameters, "utf-8"); String url = redirectLocation + (redirectLocation.indexOf("?") > -1 ? "&" : "?") + params; return url; } }