2012-02-29 17 views
8

W android aplikacji, przy użyciu DefaultHttpClient aby uzyskać zawartość URL (wykonującemu HttpGet) otrzymuję następujące ostrzeżenie kłody:Nieprawidłowy nagłówek Cookie: Nie można przeanalizować wygasa atrybut po wygaśnięciu atrybut jest pusty

W/ResponseProcessCookies(20386): Invalid cookie header: "Set-Cookie: NSC_vbue_iuuq=ffff660; expires=; domain=private.false.name; path=/; isSecure=false". Unable to parse expires attribute: 

I zrozumienie ostrzeżenia, ponieważ pole expires nie zawiera prawidłowego formatu daty. Rozumiem to może dlatego, że jest to plik cookie sesji (bez bycia ekspertem). Thread about similar situation in Curl context

wyszukać w internecie znalazłem głównie opcję

.setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BEST_MATCH (or other)) 

aby uniknąć ostrzeżenia przez parsowania prawidłowej daty, które zawierają przecinek.

Chciałbym jednak uniknąć tego dziennika. (nie wyłączając logów) Uważam, że wewnętrznie wszystko jest w porządku, ponieważ "I GUESS", cookie.setExpiryDate() po prostu nie jest wywoływane.

Czy uważasz, że potrzebuję określonej konfiguracji mojego klienta HTTP (nie ustawiłem konkretnych konfiguracji), aby uniknąć tego ostrzeżenia lub obsługi pustych wygasających?

Dzięki.

Odpowiedz

4

Jeśli nie masz nic przeciwko zmianie CookieSpec, możesz podać własną, łagodniejszą podklasę.

Najpierw utwórz pobłażliwe CookieSpec że będzie akceptować null i pustych wartości atrybutu expires coś takiego:

class LenientCookieSpec extends BrowserCompatSpec { 
    public LenientCookieSpec() { 
     super(); 
     registerAttribHandler(ClientCookie.EXPIRES_ATTR, new BasicExpiresHandler(DATE_PATTERNS) { 
      @Override public void parse(SetCookie cookie, String value) throws MalformedCookieException { 
       if (TextUtils.isEmpty(value)) { 
        // You should set whatever you want in cookie 
        cookie.setExpiryDate(null); 
       } else { 
        super.parse(cookie, value); 
       } 
      } 
     }); 
    } 
} 

Teraz trzeba zarejestrować & wybrać tę nową CookieSpec w kliencie HTTP.

DefaultHttpClient client = new DefaultHttpClient(); 
client.getCookieSpecs().register("lenient", new CookieSpecFactory() { 
     public CookieSpec newInstance(HttpParams params) { 
      return new LenientCookieSpec(); 
     } 
    }); 
HttpClientParams.setCookiePolicy(client.getParams(), "lenient"); 

Coś takiego może ci pomóc.

+0

Dzięki za ten komentarz. Powinienem rzeczywiście pracować i nie wiedziałem, że mogę to zrobić w ten sposób. Ale teraz zastanawiam się, czy można się spodziewać formatu cookie serwera z tym pustym terminem ważności? Nie jestem właścicielem serwera, więc czy powinienem zgłosić właścicielowi serwera sytuację? Pozdrawiam, –

+2

No cóż, to nie jest idealne, że wysyłają złe ciasteczka - otoh, uważam, że wszystkie implementacje 'CookieSpec' w Apache są trochę troszkę * anal * o parsowaniu. – Jens

+0

Właśnie przejrzałem rfc2109 o tym i wydaje się, że źle zrozumiałem fakt, że wygasa =; nie jest ważny podczas przeglądania komentarzy, takich jak na stronie http://www.codeproject.com/Articles/3106/On-The-Care-and-Handling-of-Cookies gdzie "puste" data odnosi się do daty takiej jak (01-Jan-0001 00:00:00 –

Powiązane problemy