Неверный заголовок cookie: невозможно проанализировать атрибут expires, если атрибут expires пуст

В приложении андроид, при использовании 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-клиента (я не задавал конкретные конфигурации), чтобы избежать этого предупреждения или поддержать пустой срок действия?

Благодарю.

1 ответ

Решение

Если вы не против изменить 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);
                }
            }
        });
    }
}

Теперь вам нужно зарегистрироваться и выбрать этот новый CookieSpec в вашем HTTP-клиенте.

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

Нечто подобное может работать на вас.

Я получил похожие предупреждения, как показано ниже

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

Мой env - http client-4.5.12, причина в том, что нужно установить cookiesSpec.

Способ исправления (просто игнорируйте другие параметры)

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

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

Здесь вы можете изменить CookieSpecs.XXX в соответствии с вашим условием, в большинстве случаев СТАНДАРТ в порядке, подробности можно найти в последней документации apache https://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/statemgmt.html

ЗАМЕТКИ, что HttpClientParams (некоторые страницы, упомянутые ранее) является устаревшим классом, просто используйте RequestConfig в качестве замены.

Другие вопросы по тегам