Неверный заголовок cookie: невозможно проанализировать атрибут expires, если атрибут expires пуст - PullRequest
8 голосов
/ 29 февраля 2012

В приложении для 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 не содержит допустимый формат даты. Я понимаю это, может быть, потому что это «сессионный cookie» (не будучи экспертом). Тема о похожей ситуации в контексте Curl

При поиске в Интернете я нашел в основном

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

опция, позволяющая избежать предупреждения путем правильного разбора дат, которые содержат запятую.

Однако я бы хотел избежать этого журнала. (не отключая журналы) Я верю, что внутренне все хорошо, так как "Я Угадаю", cookie.setExpiryDate() просто не вызывается

Как вы думаете, мне нужна конкретная конфигурация моего HTTP-клиента (я не задавал конкретные конфигурации), чтобы избежать этого предупреждения или поддержать пустой срок действия?

Спасибо.

1 Ответ

4 голосов
/ 29 февраля 2012

Если вы не возражаете против изменения CookieSpec, вы можете указать свой собственный, более снисходительный, подкласс.

Сначала создайте снисходительный CookieSpec, который будет принимать null и пустые значения для *Атрибут 1006 *, например:

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

Что-то вроде этого может работать длявы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...