views:

34

answers:

1

I'm developing an app using android 2.1.

I have a problem with using session cookies to login to a RESTful web service. The code works fine on the emulator, but when I run it on my HTC Magic, the cookie logic doesn't work. I've confirmed that the magic is receiving cookies in the headers by listing them (see attached). Can anyone say why the cookie store would be empty even tho they are in the headers?

  public HttpProvider() {
    Scheme http = new Scheme("http", new PlainSocketFactory(), 80);
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(http);

    client = new DefaultHttpClient(new ThreadSafeClientConnManager((new BasicHttpParams()), registry), new BasicHttpParams());
  }

  public void get(Request request) {
    try {
      HttpGet get = new HttpGet(request.url);
      HttpResponse response = client.execute(get);
      debugListHeaders(response, request.ticket);
      debugListCookies();
    } 
  }

  void debugListHeaders(HttpResponse response, int ticket) {
    Header[] headers = response.getAllHeaders();
    Log.d(LOG, "Printing all headers" + " (" + ticket + ")");
    for (Header header : headers) {
      Log.d(LOG, "Header name: " + header.getName() + ", value: " + header.getValue() + " (" + ticket + ")");
    }
    Log.d(LOG, "All headers have been printed" + " (" + ticket + ")");
  }

  void debugListCookies() {
    Log.d(LOG, "List cookies for connection");
    for (Cookie cookie : client.getCookieStore().getCookies()) {
      Log.d(LOG, 
        "Domain: " + cookie.getDomain() + 
        " Name: " + cookie.getName() + 
        " Path: " + cookie.getPath() + 
        " Value: " + cookie.getValue() + 
        " Expires: " + cookie.getExpiryDate().toString() + 
        " IsExpired: " + (cookie.isExpired(new Date()) ? "true" : "false"));
    }
    Log.d(LOG, "All cookies have been listed");
  }

Thru the emulator:
<snipped header list as it's obviously working>
D/SessionProvider(  257): List cookies for connection
D/SessionProvider(  257): Domain:<snip> Name: S Path: / Value: 75XGSMR3BLLGYM0J Expires: Tue Oct 12 20:24:09 America/Barbados 2010
IsExpired: false
D/SessionProvider(  257): Domain: <snip> Name: lang Path: / Value: en Expires: Tue Oct 12 20:24:09 America/Barbados 2010 IsExpired: false
D/SessionProvider(  257): All cookies have been listed


Thru HTC Magic:
D/HttpProvider(  983): Printing all headers (-192275970)
D/HttpProvider(  983): Header name: Date, value: Thu, 14 Oct 2010 22:44:38 GMT (-192275970)
D/HttpProvider(  983): Header name: Server, value: Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.5 with Suhosin-Patch mod_perl/2.0.4 Perl/v5.10.0 (-192275970)
D/HttpProvider(  983): Header name: Set-Cookie, value: S=S41GM85A675Z8YQU; path=/; expires=Thu, 14-Oct-2010 23:14:38 GMT (-192275970)
D/HttpProvider(  983): Header name: Set-Cookie, value: U=nibor.yarrum%40gmail.com; path=/; expires=Thu, 14-Oct-2010 23:14:38 GMT (-192275970)
D/HttpProvider(  983): Header name: Set-Cookie, value: lang=en; path=/; expires=Thu, 14-Oct-2010 23:14:38 GMT (-192275970)
D/HttpProvider(  983): Header name: Vary, value: Accept-Encoding (-192275970)
D/HttpProvider(  983): Header name: Keep-Alive, value: timeout=15, max=100 (-192275970)
D/HttpProvider(  983): Header name: Connection, value: Keep-Alive (-192275970)
D/HttpProvider(  983): Header name: Transfer-Encoding, value: chunked (-192275970)
D/HttpProvider(  983): Header name: Content-Type, value: text/html (-192275970)
D/HttpProvider(  983): All headers have been printed (-192275970)
I/HttpProvider(  983): Request completed (-192275970)
D/SessionProvider(  983): List cookies for connection
D/SessionProvider(  983): All cookies have been listed
A: 

Well, this turned out to be a hunting expedition in the apache code. What it boiled down to was the cookies were already expired, so cookiestore just threw them away with no explanation. Turns out the phone did not have 'use network date/time' checked on the settings. As soon as I did that the app worked fine. It's still puzzling though - the local time was set properly (within 2 minutes).

From org.apache.http.impl.client.BasicCookieStore/addCookie:

94   if (!cookie.isExpired(new Date())) {
95     cookies.add(cookie);

related questions