【问题标题】:Cookie Expired IndyCookie 过期 Indy
【发布时间】:2012-12-28 00:41:26
【问题描述】:

最近我发现我在调用 IDHTTP.GET 后收到 EConvertError。 我分析了流量,发现 cookie 上的过期日期是 2000。现在我的问题是如何绕过它。我正在使用 XE3 中的 Indy10。我知道 Indy 遵循关于 cookie 处理的严格标准,但不应该有一个功能可以关闭它吗?

网址: 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

【问题讨论】:

  • 有问题的日期/时间字符串不是来自 cookie,因为您显示的调用堆栈中不包含 TIdCustomHTTP.ProcessCookies()TIdCookieManager.AddServerCookies()TIdCookie.ParseServerCookie() 方法。它必须来自Last-ModifiedExpires 标头(或缺少),因为这些是TIdEntityHeaderInfo.ProcessHeaders() 直接调用GMTToLocalDateTime() 而不先检查空白值的唯一标头。
  • 你不能使用最新版本的 Indy,因为RawStrInternetToDateTime(),因此GMTToLocalDateTime(),在传递一个空白字符串时不会引发异常,所以必须有服务器发送的非空白格式错误的标头值。请显示实际的标题。
  • @RemyLebeau 如您所愿。这是 1970 年代的问题。
  • 正如我之前所说,该错误与 cookie 完全没有关系。实际上是 Last-Modified 标头有问题。它没有使用符合RFC 2616 Section 3.3 中的HTTP-date 定义并由RFC 2616 Section 14.29 使用的受支持的字符串格式。这是 Facebook 的 HTTP 服务器中的一个错误。他们应该知道最好不要将这种非标准格式用于 HTTP 日期标头。该错误需要向 Facebook 报告。这样他们就可以修复它。
  • Facebook 正在发送 ISO 8601 格式的日期,HTTP 规范不支持该日期。但是,我刚刚签入了 Indy 的更新,因此 TIdHTTP 现在可以解析 ISO 8601 日期。

标签: delphi delphi-xe2 indy10 delphi-xe3


【解决方案1】:

有问题的日期/时间字符串不是来自 cookie,因为您显示的调用堆栈中不包含 TIdCustomHTTP.ProcessCookies()TIdCookieManager.AddServerCookies()TIdCookie.ParseServerCookie() 方法。实际上是 Last-Modified 标头有问题。 Facebook 正在发送一个 ISO 8601 格式的日期,HTTP 规范不支持该日期。这是 Facebook 的 HTTP 服务器中的一个错误。他们应该知道最好不要对 HTTP 日期标头使用不符合标准的格式。该错误需要向 Facebook 报告,以便他们修复。同时,我已签入对the latest Indy SVN snapshot 的更新,因此TIdHTTP 现在可以解析ISO 8601 日期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多