在一个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
,它将接受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");
像“这样”的东西可能对您有用。