See below.

On Fri, Nov 21, 2008 at 12:22 AM, Al Byers <[EMAIL PROTECTED]>wrote:

> I am working on a plugin for the SeleniumXml tool that Brett demoed at
> Apachecon. It sends a request to the server and parses the result, putting
> it into the SeleniumXml test context.
>
> I am using Apache's HttpClient 4.0b3 because it has some nice response
> handling features. I am making two requests to the server, one to login and
> one to run the request. My problem is that the login request seems to
> execute okay, but when I inspect the contents of the cookies I don't see
> anything that looks like a session management cookie (is it JSESSIONID ?) so
> the second request does not share the session and does not think the user is
> logged in, so the service fails due to authorization failure.
>
> This is not an OFBiz problem, but I am hoping there are some OFBiz
> friendlies out there that will help me move the testing environment along.
> Is there something that a browser does in interacting with the server that
> my HttpClient will not do unless I tell it to?
> How does tomcat know to track sessions?

If tomcat is using HttpSession to maintain the connection between client and
server, my question still is what might I have to do with HttpClient that
the browser would automatically do?

-Al

>
>
> I have pasted in my current code. It is mostly a hack of HttpClient 4.0
> examples.
>
> package org.seleniumxml;
>
> import java.io.IOException;
> import java.io.UnsupportedEncodingException;
> import java.net.URLEncoder;
> import java.util.List;
> import java.util.Map;
>
> import org.apache.http.Header;
> import org.apache.http.HttpEntity;
> import org.apache.http.HttpHost;
> import org.apache.http.HttpRequest;
> import org.apache.http.HttpResponse;
> import org.apache.http.HttpVersion;
> import org.apache.http.auth.AuthScope;
> import org.apache.http.auth.UsernamePasswordCredentials;
> import org.apache.http.client.CookieStore;
> import org.apache.http.client.HttpResponseException;
> import org.apache.http.client.ResponseHandler;
> import org.apache.http.client.methods.HttpGet;
> import org.apache.http.client.params.HttpClientParams;
> import org.apache.http.client.protocol.ClientContext;
> import org.apache.http.conn.ClientConnectionManager;
> import org.apache.http.conn.scheme.PlainSocketFactory;
> import org.apache.http.conn.scheme.Scheme;
> import org.apache.http.conn.scheme.SchemeRegistry;
> import org.apache.http.conn.scheme.SocketFactory;
> import org.apache.http.cookie.Cookie;
> import org.apache.http.impl.client.BasicCookieStore;
> import org.apache.http.impl.client.BasicResponseHandler;
> import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
> import org.apache.http.impl.client.DefaultHttpClient;
> import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
> import org.apache.http.message.BasicHttpRequest;
> import org.apache.http.params.BasicHttpParams;
> import org.apache.http.params.HttpParams;
> import org.apache.http.params.HttpProtocolParams;
> import org.apache.http.protocol.BasicHttpContext;
> import org.apache.http.protocol.HttpContext;
> import org.apache.http.util.EntityUtils;
> import org.jdom.Element;
>
>
> public class RemoteRequest {
>
>     public static final String module = RemoteRequest.class.getName();
>
>     /**
>      * The default parameters.
>      * Instantiated in [EMAIL PROTECTED] #setup setup}.
>      */
>     private static HttpParams defaultParameters = null;
>
>     /**
>      * The scheme registry.
>      * Instantiated in [EMAIL PROTECTED] #setup setup}.
>      */
>     private static SchemeRegistry supportedSchemes;
>     final private static String JsonHandleMode = "JSON_HANDLE";
>     final private static String HttpHandleMode = "HTTP_HANDLE";
>
>     private SeleniumXml parent;
>     private SeleniumXml currentTest;
>     private List <Element>children;
>     private Map <String, Object> inMap;
>     private Map <String, Object> outMap;
>     private String requestUrl;
>     private String host;
>     private String responseHandlerMode;
>
>     private int currentRowIndx;
>
>     static {
>
>         supportedSchemes = new SchemeRegistry();
>
>         // Register the "http" protocol scheme, it is required
>         // by the default operator to look up socket factories.
>         SocketFactory sf = PlainSocketFactory.getSocketFactory();
>         supportedSchemes.register(new Scheme("http", sf, 80));
>
>         // prepare parameters
>         HttpParams params = new BasicHttpParams();
>         HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
>         HttpProtocolParams.setContentCharset(params, "UTF-8");
>         HttpProtocolParams.setUseExpectContinue(params, true);
>         //HttpClientParams.setAuthenticating(params, true);
>         defaultParameters = params;
>
>     }
>     public RemoteRequest(SeleniumXml parent, List<Element> children, String
> requestUrl, String hostString, String responseHandlerMode) {
>         super();
>         this.parent = parent;
>         this.requestUrl = requestUrl;
>         this.host = hostString;
>         this.children = children;
>         this.responseHandlerMode =
> (HttpHandleMode.equals(responseHandlerMode)) ? HttpHandleMode :
> JsonHandleMode;
>         initData();
>     }
>
>     private void initData() {
>
>         String nm, name, value = null;
>         for(Element elem: this.children) {
>             nm = elem.getName();
>             if (nm.equals("param-in") || nm.equals("param-inout")) {
>                 name = elem.getAttributeValue("name");
>                 value =
> this.parent.replaceParam(elem.getAttributeValue("value"));
>                 this.inMap.put(name, value);
>             } else if (nm.equals("param-out") || nm.equals("param-inout"))
> {
>                 name = elem.getAttributeValue("name");
>                 value =
> this.parent.replaceParam(elem.getAttributeValue("value"));
>                 this.outMap.put(name, value);
>             }
>         }
>         return;
>     }
>
>     public void runTest() {
>
>         ClientConnectionManager ccm =
>             new ThreadSafeClientConnManager(defaultParameters,
> supportedSchemes);
>         //  new SingleClientConnManager(getParams(), supportedSchemes);
>
>         DefaultHttpClient client = new DefaultHttpClient(ccm,
> defaultParameters);
>         client.setKeepAliveStrategy(new
> DefaultConnectionKeepAliveStrategy());  // Don't know what this does - a
> shot in the dark
>
>         //HttpContext clientContext = client.
>         //HttpHost target = new HttpHost(this.host, 80, "http");
>         HttpEntity entity = null;
>         ResponseHandler <String> responseHandler = null;
>         try {
>             BasicHttpContext localContext = new BasicHttpContext(); // This
> is what I expect to tie the requests to the same session
>
> // because it stores the cookies
>             // Create a local instance of cookie store
>             CookieStore cookieStore = new BasicCookieStore();
>             localContext.setAttribute(ClientContext.COOKIE_STORE,
> cookieStore);
>             //this.login(client, localContext);
>             // I copied the 'login' code to here
>             String paramString2 = "USERNAME=" + this.parent.getUserName()
>                                + "&PASSWORD=" + this.parent.getPassword();
>             String thisUri2 = this.host + "/eng/control/login?" +
> paramString2;
>             HttpGet req2 = new HttpGet ( thisUri2 );
>             req2.setHeader("Connection","Keep-Alive");
>             client.execute(req2, localContext);
>
>
>             List<Cookie> cookies = cookieStore.getCookies();
>             for (int i = 0; i < cookies.size(); i++) {
>                 System.out.println("Local cookie(0): " + cookies.get(i));
>             }
>             // The above lines print out: Local cookie(0): [version:
> 0][name: OFBiz.Visitor][value: 10221][domain: localhost][path: /][expiry:
> Sat Nov 21 00:10:39 MST 2009]
>             // I am thinking I should see something related to session
> tracking here
>
>             if (HttpHandleMode.equals(this.responseHandlerMode)) {
>
>             } else {
>                 responseHandler = new JsonResponseHandler(this);
>             }
>             String paramString = urlEncodeArgs(this.inMap, true);
>             String thisUri = this.host + this.requestUrl + "?" +
> paramString;
>             HttpGet req = new HttpGet ( thisUri );
>
>             String responseBody = client.execute( req, responseHandler,
> localContext);
>             /*
>             entity = rsp.getEntity();
>
>             System.out.println("----------------------------------------");
>             System.out.println(rsp.getStatusLine());
>             Header[] headers = rsp.getAllHeaders();
>             for (int i=0; i<headers.length; i++) {
>                 System.out.println(headers[i]);
>             }
>             System.out.println("----------------------------------------");
>
>             if (entity != null) {
>                 System.out.println(EntityUtils.toString(rsp.getEntity()));
>             }
>             */
>         } catch(IOException e) {
>             System.out.println(e.getMessage());
>         } finally {
>             // If we could be sure that the stream of the entity has been
>             // closed, we wouldn't need this code to release the
> connection.
>             // However, EntityUtils.toString(...) can throw an exception.
>
>             // if there is no entity, the connection is already released
>             try {
>               if (entity != null)
>                 entity.consumeContent(); // release connection gracefully
>             } catch(IOException e) {
>                 System.out.println("in 'finally'  " + e.getMessage());
>             }
>
>         }
>         return;
>     }
>
>

Reply via email to