php-curl 使用代理时 header 大小不正确

php-curl incorrect header size when use proxy

此代码:

$headersSize     = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$responseHeaders = substr($response, 0, $headersSize);
$responseBody    = substr($response, $headersSize);

return headers 的不正确大小 (strlen),例如这里:

...
Pragma: no-cache
Set-Cookie: foo=bar; pat

 ---- curl want split here ---- 

h=/
Access-Control-Allow-Origin: *

<!DOCTYPE html ...

响应可以有多个headers(重定向、继续等)。当然,这样行不通:

list($header, $body) = explode("\r\n\r\n", $response, 2);

如何正确确定 headers 的大小?

可能与此有关:https://bugs.php.net/bug.php?id=63894&edit=1 or http://sourceforge.net/p/curl/bugs/1204

That fix was commit bc6037e which went into curl 7.30.0

无论如何,这是一个错误。此错误之后的任何修复都是不可靠的。

知道它是如何工作的,您可以手动 add/subtract 将 header 的长度增加一个特定的量,看看它缺少多少。

或者如果代理仅用于 HTML,那么您可以手动解析字符串,直到得到以 HTML 标记开头的行,这就是您的 header 结束。

抱歉,除了从源头修复此错误外,我没有看到可靠的解决方案。如果可以,您可以只更新 curl、libcurl 或其他任何东西。或者你可以从 git 中提取那个版本,修复这个错误,重新编译,如果你是 version-sensible.