无效的 Cookie 头:当 expires 属性为空时,无法解析过期属性。

11
在一个安卓应用中,当使用DefaultHttpClient来获取URL的内容(执行HttpGet),我在日志中收到以下警告:
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:

我理解这个警告是因为expires字段不包含有效的日期格式。我理解这可能是因为它是一个'会话cookie'(没有专家的情况下)。有关Curl上类似情况的讨论线程

在网上搜索,主要发现了

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

有选项可以通过正确解析包含逗号的日期来避免警告。

然而,我想要避免那个日志(而不是禁用日志记录)。 我相信内部一切都很好,因为“我猜”,cookie.setExpiryDate()根本没有被调用。

你认为我需要特定的HTTP客户端配置(我没有设置特定的配置)来避免该警告或支持空过期吗?

谢谢。

2个回答

4
如果您不介意修改CookieSpec,则可以提供您自己更宽松的子类。首先,创建一个宽松的CookieSpec,允许接受null和空值作为expires属性,如下所示:
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);
                }
            }
        });
    }
}

现在,您需要注册并在HTTP客户端中选择此新的CookieSpec
DefaultHttpClient client = new DefaultHttpClient();
client.getCookieSpecs().register("lenient", new CookieSpecFactory() {
        public CookieSpec newInstance(HttpParams params) {
            return new LenientCookieSpec();
        }
    });
HttpClientParams.setCookiePolicy(client.getParams(), "lenient");

类似这样的东西可能对你有用。


谢谢您的评论。这应该是有效的,我之前不知道可以这样做。 但现在我在想,如果服务器cookie格式是这个空过期,是否可以预期呢?我不是服务器的所有者,所以应该向服务器所有者报告这种情况吗? 问候, - Michael Stilmant
2
嗯,他们发送错误的 cookie 并不理想 - 另一方面,我相信 Apache 中的所有 CookieSpec 实现有时都会有点过于严格解析。 - Jens
刚刚查看了关于rfc2109的内容,似乎我误解了expires=;这个事实,当像http://www.codeproject.com/Articles/3106/On-The-Care-and-Handling-of-Cookies中的评论一样进行审查时,它是无效的,其中“空白”日期指的是像(01-Jan-0001 00:00:00)这样的日期。 - Michael Stilmant

2
我刚刚收到了类似以下的警告:
Invalid cookie header: "Set-Cookie: A3=d=AQABBPA3c18CEOtNC3d8X1pEkCvrf2cxZRIFEgEBAQGJdF99XwAAAAAA_SMAAA&S=AQAAAiTHBvO_oaoz8tCr1A7ArCs; Expires=Wed, 29 Sep 2021 19:34:41 GMT; Max-Age=31557600; Domain=.yahoo.com; Path=/; SameSite=None; Secure; HttpOnly". Invalid 'expires' attribute: Wed, 29 Sep 2021 19:34:41 GMT

我的环境是http client-4.5.12,原因是需要设置cookiesSpec。

修复方法(忽略其他参数):

requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();

        httpclient = HttpClients.custom()
               .setDefaultRequestConfig(requestConfig).build();

在这里,您可以根据自己的需求更改CookieSpecs.XXX,对于大多数情况,标准(STANDARD)就可以了。详情请参考最新的Apache文档:https://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/statemgmt.html

请注意,HttpClientParams(之前提到的某些页面)是一个已弃用的类,只需使用RequestConfig作为替代即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接