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.
此代码:
$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.