Срок действия файла cookie истек

Недавно я обнаружил, что получаю EConvertError после вызова IDHTTP.GET. Я проанализировал трафик и увидел, что срок действия куки - 2000. Теперь мой вопрос, как это обойти. Я использую Indy10, который присутствует в XE3. Я знаю, что Indy придерживается строгих стандартов в отношении обработки файлов cookie, но разве не должна быть функция, позволяющая отключить это?

URL: https://graph.facebook.com/me?access_token=ACCESS_TOKEN

Отслеживание стека:

:75a5c41f KERNELBASE.RaiseException + 0x58
System.SysUtils.ConvertErrorFmt($412994,(...))
System.SysUtils.StrToInt('')
IdGlobal.IndyStrToInt('')
IdGlobalProtocols.RawStrInternetToDateTime('',0)
IdGlobalProtocols.GMTToLocalDateTime('')
IdHTTPHeaderInfo.TIdEntityHeaderInfo.ProcessHeaders
IdHTTPHeaderInfo.TIdResponseHeaderInfo.ProcessHeaders
IdHTTP.TIdHTTPProtocol.RetrieveHeaders(???)

Заголовки ответа:

(Status-Line)   HTTP/1.1 200 OK
Access-Control-Allow-Origin *
Cache-Control   private, no-cache, no-store, must-revalidate
Content-Type    text/javascript; charset=UTF-8
ETag    "676c539ac3cd7161f5492ce95d72d8b620c6fa6c"
Expires Sat, 01 Jan 2000 00:00:00 GMT
Last-Modified   2012-12-20T20:08:20+0000
P3P CP="Facebook does not have a P3P policy. Learn why here: http://fb.me/p3p"
Pragma  no-cache
X-FB-Rev    702819
X-UA-Compatible IE=edge,chrome=1
Set-Cookie  m_ts=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.facebook.com; httponly
Set-Cookie  reg_ext_ref=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.facebook.com
Set-Cookie  reg_fb_gate=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.facebook.com
Set-Cookie  reg_fb_ref=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.facebook.com
X-FB-Debug  kZmwuLCRhfhJBKfLoQEbTOBJNyKQGUKLEeJ2R2rcxXg=
Date    Fri, 28 Dec 2012 10:02:19 GMT
Connection  keep-alive
Content-Length  1932

person Nuno Jemaio    schedule 28.12.2012    source источник
comment
Неверная строка даты/времени исходит не из файла cookie, поскольку методы TIdCustomHTTP.ProcessCookies(), TIdCookieManager.AddServerCookies() и TIdCookie.ParseServerCookie() не включены в показанный стек вызовов. Он должен исходить из заголовка Last-Modified или Expires (или из отсутствия), так как это единственные заголовки, для которых TIdEntityHeaderInfo.ProcessHeaders() напрямую вызывает GMTToLocalDateTime() без предварительной проверки пустых значений.   -  person Remy Lebeau    schedule 28.12.2012
comment
Вы не должны использовать актуальную версию Indy, потому что RawStrInternetToDateTime() и, следовательно, GMTToLocalDateTime() не вызывают исключения при передаче пустой строки, поэтому сервер должен отправлять непустое искаженное значение заголовка. . Пожалуйста, покажите настоящие заголовки.   -  person Remy Lebeau    schedule 28.12.2012
comment
@RemyLebeau Как вы и просили. Это проблема 1970-х годов.   -  person Nuno Jemaio    schedule 28.12.2012
comment
Как я уже говорил ранее, ошибка НИЧЕГО не связана с файлами cookie. На самом деле виноват заголовок Last-Modified. Он не использует поддерживаемый строковый формат, соответствующий определению HTTP-date в RFC 2616, раздел 3.3 и используется RFC 2616, раздел 14.29. Это ошибка в HTTP-сервере Facebook. Они должны были знать лучше, чем использовать этот нестандартный формат для заголовка даты HTTP. Об этой ошибке необходимо сообщить в Facebook. так что они могут это исправить.   -  person Remy Lebeau    schedule 28.12.2012
comment
Facebook отправляет дату в формате ISO 8601, что не поддерживается спецификациями HTTP. Однако я только что проверил обновление Indy, поэтому TIdHTTP теперь может анализировать даты ISO 8601.   -  person Remy Lebeau    schedule 29.12.2012
comment
@RemyLebeau Где люди в униформе, такие как я, могут получить эти обновления Indy :)   -  person Nuno Jemaio    schedule 29.12.2012
comment
Подробности на веб-сайте Indy.   -  person Remy Lebeau    schedule 29.12.2012
comment
Я разместил эти комментарии в качестве ответа сейчас.   -  person Remy Lebeau    schedule 29.12.2012


Ответы (1)


Неверная строка даты/времени исходит не из файла cookie, поскольку методы TIdCustomHTTP.ProcessCookies(), TIdCookieManager.AddServerCookies() и TIdCookie.ParseServerCookie() не включены в показанный стек вызовов. На самом деле виноват заголовок Last-Modified. Facebook отправляет дату в формате ISO 8601, что не поддерживается спецификациями HTTP. Это ошибка в HTTP-сервере Facebook. Они должны были знать лучше, чем использовать несоответствующий формат для заголовка даты HTTP. Об этой ошибке необходимо сообщить в Facebook, чтобы они могли ее исправить. Тем временем я проверил обновление до последнего снимка Indy SVN поэтому TIdHTTP теперь может анализировать даты ISO 8601.

person Remy Lebeau    schedule 29.12.2012