2014-09-28 3 views
0

Я использую Retrofit (1.7.1), который использует клиент OkHttp (2.1.0) по умолчанию для проверки подлинности на сервере и получения некоторых файлов cookie сеансов для ответа друг на друга.Как установить формат файла cookie в OkHttp?

У меня есть CookieManager и перехватчик, который устанавливает заголовок «Cookie».

Перехватчик строит печенье как

cookieName + "=" + cookieValue + "; " 

(я на самом деле использовать StringWriter но результаты его же)

Правильные заголовки результат должен быть:

Cookie: PHPSESSID=<my_php_sess_id>; session=<my_session_id>; 

НО

Реализация по умолчанию (OkHttp, я думаю) добавляет еще один файл cookie h eader в результате:

Cookie: PHPSESSID=<my_php_sess_id>; session=<my_session_id>; 
Cookie: $Version="1"; PHPSESSID="<my_php_sess_id>";$Path="/";$Domain="<my_domain>"; session="<my_session_id>";$Path="/";$Domain="<my_domain>" 

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

Я думаю, что этот второй заголовок вызывает некоторые проблемы: обратите внимание на цитаты вокруг значения cookie.

Есть ли способ сказать OkHttp или «Дооснащение», чтобы использовать «обычную» версию cookie?
Может быть, я неправильно понял все все Cookie/Client/механизм перехватчик, но установка клиента Дооснащаемый на:

.setClient(new ApacheClient(new DefaultHttpClient())) 

решить эту проблему.

Спасибо заранее

+0

Вы нашли решение с помощью OkHttp вместо DefaultHttpClient? –

+0

Я обновил вопрос, включая модификации и версии OkHttp, которые я использовал в декабре 2014 года. С того времени я еще не пробовал. У вас такая же проблема с более новыми версиями? – Gnafu

+0

Я нашел обходное решение, заставив версию cookie до 0. Я напишу ответ. –

ответ

1

У меня была аналогичная проблема, вызванная веб-сервер, который не обрабатывать версии 1 куки (цитируемые значения). Единственный способ добиться этого, что я нашел перебрать ваше печенье магазина:

for (HttpCookie cookie: cookieStore.getCookies()) { 
    cookie.setVersion(0); 
}

Но ... вам нужно вызвать это каждый раз печенья меняется. Я написал перехватчик OkHttp, который делает именно это:

public class CookieBaker implements Interceptor { 
    private CookieStore cookieStore; 

    public CookieBaker(CookieStore cookieStore) { 
     this.cookieStore = cookieStore; 
    } 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     for (HttpCookie cookie: cookieStore.getCookies()) { 
      cookie.setVersion(0); 
     } 

     Response response = chain.proceed(chain.request()); 

     for (HttpCookie cookie: cookieStore.getCookies()) { 
      cookie.setVersion(0); 
     } 

     return response; 
    } 
}

И это, как вы включите его:

OkHttpClient httpClient = new OkHttpClient(); 
CookieManager cookieManager = new CookieManager(); 
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
httpClient.setCookieHandler(cookieManager); 
httpClient.interceptors().add(new CookieBaker(cookieManager.getCookieStore()));

Я не использую Дооснащение, но вы должны заменить вызов .setClient(new ApacheClient(new DefaultHttpClient())) что-то вроде .setClient(httpClient).

Смежные вопросы