在一个Android应用程序中,当使用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字段不包含有效的日期格式。我了解它的原因可能是因为它是“ session Cookie”(不是专家)。 Thread about similar situation in Curl context

搜索网络时,我发现主要是
.setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BEST_MATCH (or other) )

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

但是,我想避免该日志。 (不是通过禁用日志)
我相信从内部来说一切都很好,因为“I GUESS”,cookie.setExpiryDate()根本没有被调用。

您是否认为我需要HTTP客户端的特定配置(我尚未设置特定配置)以避免该警告或支持空过期?

谢谢。

最佳答案

如果您不介意更改CookieSpec,则可以提供自己的,更宽松的子类。

首先,创建一个宽松的CookieSpec,它将接受nullexpires属性的空值,如下所示:

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

像“这样”的东西可能对您有用。

10-04 12:48