2012-02-29 19 views
8

En una aplicación androide, cuando se utiliza DefaultHttpClient para obtener un contenido de URL (la ejecución de HttpGet) recibo el siguiente mensaje de advertencia en los registros:cabecera de cookies no válido: No se puede analizar expira atributo cuando expira atributo está vacío

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 comprende la advertencia porque el campo expires no contiene un formato de fecha válido. Lo entiendo tal vez porque es una 'cookie de sesión' (sin ser un experto). Thread about similar situation in Curl context

Buscando en la web me encontré sobre todo la opción

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

para evitar la advertencia al analizar correctamente el fechas que contiene una coma.

Sin embargo, me gustaría evitar ese registro. (no deshabilitando los registros) Creo que internamente todo está bien ya que "I GUESS", cookie.setExpiryDate() simplemente no se llama.

¿Crees que necesito una configuración específica de mi cliente HTTP (no he configurado configuraciones específicas) para evitar esa advertencia o para apoyar caducas?

Gracias.

Respuesta

4

Si no le importa cambiar el CookieSpec puede suministrar su propia subclase, más indulgente.

En primer lugar, crear un leve CookieSpec que aceptará null y vacíos valores para el atributo expires, así:

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); 
       } 
      } 
     }); 
    } 
} 

Ahora tiene que registrarse & elegir este nuevo CookieSpec en su cliente HTTP.

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

Something "like this" funcionará para usted.

+0

Gracias por ese comentario. Debería funcionar de verdad y no sabía que podía hacerlo así. ¿Pero ahora me pregunto si se puede esperar el formato de cookie del servidor con este espacio vacío? No soy el propietario del servidor, así que ¿debo informar al propietario del servidor sobre la situación? Saludos, –

+2

Bueno, no es ideal que estén enviando cookies defectuosas - otoh, creo que todas las implementaciones de 'CookieSpec' en Apache son un poco * anal * sobre el análisis a veces. – Jens

+0

Acabo de revisar el rfc2109 al respecto y parece que no entendí el hecho de que expira =; no es válido cuando se revisan comentarios como en http://www.codeproject.com/Articles/3106/On-The-Care-and-Handling-of-Cookies donde la fecha "en blanco" se refiere a la fecha como (01-Jan-0001 00:00:00 –

Cuestiones relacionadas