PHP Curl - 在不允许时收到 HTTP/0.9
PHP Curl - Received HTTP/0.9 when not allowed
当我尝试向苹果推送服务发送 post HTTP/2.0 请求时,我偶然发现了一个奇怪的行为:
$http2ch = curl_init();
curl_setopt($http2ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($http2ch, CURLOPT_URL, 'https://api.push.apple.com/3/device/megauniquedevicetokendummy');
curl_setopt($http2ch, CURLOPT_PORT, 443);
curl_setopt($http2ch, CURLOPT_HTTPHEADER, $httpHeader);
curl_setopt($http2ch, CURLOPT_POST, true);
curl_setopt($http2ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($http2ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($http2ch, CURLOPT_TIMEOUT, 30);
curl_setopt($http2ch, CURLOPT_HEADER, 1);
$result = curl_exec($http2ch);
if ($result === false) {
throw new \Exception("Curl failed: " . curl_error($http2ch) . " | " . curl_getinfo($http2ch, CURLINFO_HTTP_CODE));
}
异常随消息一起抛出:
卷曲失败:收到HTTP/0.9 不允许 | 0
我明确告诉 curl 在上面截断的代码的第二行使用 HTTP/2.0。
有谁知道该错误消息的含义以及为什么 curl 使用这么旧的 HTTP 版本?
我正在使用 PHP 7.2 和 curl 版本 7.66.0。
我明白了。
确保 curl 是使用 nghttp2 编译的。
如果您不确定,可以在您的终端上使用 curl --version
进行检查
如果你没有找到 nghttp2/{version} 你需要用 nghttp2 重新编译 curl。
curl --version
缺少 nghttp2 的示例:
curl 7.66.0 (amd64-portbld-freebsd12.0) libcurl/7.66.0 OpenSSL/1.1.1d zlib/1.2.11
curl --version
nghttp2 可用的示例:
curl 7.64.1 (x86_64-apple-darwin19.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.39.2
我不认为它要求您以不同的方式编译 curl 版本,而是设置选项以允许 http 0.9 作为来自旧服务器的响应。 PHP 对“CURLOPT_HTTP09_ALLOWED”有一些注释,当您通过 https://www.php.net/manual/en/function.curl-setopt.php
发布问题时,这些注释可能有所不同
为我克服错误的选项是:
curl_setopt($http2ch, CURLOPT_HTTP09_ALLOWED, true);
当服务器是 grpc 服务器时也会发生这种情况。当 curl 运行 针对 grpc 服务器或其他非 HTTP 服务器没有响应 curl 期望的有效 HTTP 状态行时,curl 将打印“Received HTTP/0.9 when not allowed” .
如果 curl 打印诸如“未知协议”之类的内容而不是假设它是 0.9 可能会更好,因为如今访问诸如 grpc 服务器之类的内容比实际的 HTTP 0.9 服务器要普遍得多。
当我尝试向苹果推送服务发送 post HTTP/2.0 请求时,我偶然发现了一个奇怪的行为:
$http2ch = curl_init();
curl_setopt($http2ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($http2ch, CURLOPT_URL, 'https://api.push.apple.com/3/device/megauniquedevicetokendummy');
curl_setopt($http2ch, CURLOPT_PORT, 443);
curl_setopt($http2ch, CURLOPT_HTTPHEADER, $httpHeader);
curl_setopt($http2ch, CURLOPT_POST, true);
curl_setopt($http2ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($http2ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($http2ch, CURLOPT_TIMEOUT, 30);
curl_setopt($http2ch, CURLOPT_HEADER, 1);
$result = curl_exec($http2ch);
if ($result === false) {
throw new \Exception("Curl failed: " . curl_error($http2ch) . " | " . curl_getinfo($http2ch, CURLINFO_HTTP_CODE));
}
异常随消息一起抛出: 卷曲失败:收到HTTP/0.9 不允许 | 0
我明确告诉 curl 在上面截断的代码的第二行使用 HTTP/2.0。 有谁知道该错误消息的含义以及为什么 curl 使用这么旧的 HTTP 版本?
我正在使用 PHP 7.2 和 curl 版本 7.66.0。
我明白了。 确保 curl 是使用 nghttp2 编译的。
如果您不确定,可以在您的终端上使用 curl --version
如果你没有找到 nghttp2/{version} 你需要用 nghttp2 重新编译 curl。
curl --version
缺少 nghttp2 的示例:
curl 7.66.0 (amd64-portbld-freebsd12.0) libcurl/7.66.0 OpenSSL/1.1.1d zlib/1.2.11
curl --version
nghttp2 可用的示例:
curl 7.64.1 (x86_64-apple-darwin19.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.39.2
我不认为它要求您以不同的方式编译 curl 版本,而是设置选项以允许 http 0.9 作为来自旧服务器的响应。 PHP 对“CURLOPT_HTTP09_ALLOWED”有一些注释,当您通过 https://www.php.net/manual/en/function.curl-setopt.php
发布问题时,这些注释可能有所不同为我克服错误的选项是:
curl_setopt($http2ch, CURLOPT_HTTP09_ALLOWED, true);
当服务器是 grpc 服务器时也会发生这种情况。当 curl 运行 针对 grpc 服务器或其他非 HTTP 服务器没有响应 curl 期望的有效 HTTP 状态行时,curl 将打印“Received HTTP/0.9 when not allowed” .
如果 curl 打印诸如“未知协议”之类的内容而不是假设它是 0.9 可能会更好,因为如今访问诸如 grpc 服务器之类的内容比实际的 HTTP 0.9 服务器要普遍得多。