php - 如何阻止 cURL 使用 100 Continue?

标签 php jquery curl proxy

所以,长话短说,我有一个使用 MVC Web API 作为后端的 AJAX 应用程序。然而,客户端从不同的域调用并使用 PHP 代理文件来解决跨域请求问题。

但是,使用 PHP 代理时,Web API 会使用 100 Continue HTTP header 来响应某些请求,并且任何返回此 header 的请求都需要花费过多的时间才能完成(我们说的是最多 2分钟左右),也可能返回无效响应。

appears to be a known issue with cURL解决方法通常被引用为插入以下行以删除 cURL 请求中的 expect: 100 header

不幸的是,解决方案对我来说似乎难以捉摸:

$headers = getallheaders();
$headers_new = "";
foreach($headers as $title => $body) {
    $headers_new[] = $title.": ".$body;
}
//$headers_new[] = 'Expect:';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers_new);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:') );

此代码有效但删除了所有其他 header (这对我来说不可行,因为我正在使用 HTTP 基本身份验证 header 通过 API 进行身份验证)。 您可能还注意到我尝试将 Expect: 添加到现有 header 中,但这对我也没有帮助。

如何维护现有 header ,同时防止 cURL 期望 100 继续?

最佳答案

使用$headers_new[] = 'Expect:'; 确实有效除非$headers_new 数组包含一个字符串 '期望:100-继续'。在这种情况下,您需要将其从数组中删除,否则它将期望 100 继续(逻辑上)。

因为在您的代码中您使用了 getallheaders()并且您没有检查它是否已经包含 Expect: 100-continue header ,所以您的情况可能就是这种情况。

这里是一般情况的总结(以及创建它的脚本):

PHP Curl HTTP/1.1 100 Continue and CURLOPT_HTTPHEADER

GET request ..........................................: Continue: No
GET request with empty header ........................: Continue: No
POST request with empty header .......................: Continue: Yes
POST request with expect continue explicitly set .....: Continue: Yes
POST request with expect (set to nothing) as well ....: Continue: Yes
POST request with expect continue from earlier removed: Continue: No

代码:

<?php

$ch = curl_init('http://www.iana.org/domains/example/');

function curl_exec_continue($ch) {
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result   = curl_exec($ch);
    $continue = 0 === strpos($result, "HTTP/1.1 100 Continue\x0d\x0a\x0d\x0a");
    echo "Continue: ", $continue ? 'Yes' : 'No', "\n";

    return $result;
}

echo "GET request ..........................................: ", !curl_exec_continue($ch);

$header = array();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "GET request with empty header ........................: ", !curl_exec_continue($ch);

curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('hello'));
echo "POST request with empty header .......................: ", !curl_exec_continue($ch);

$header[] = 'Expect: 100-continue';
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "POST request with expect continue explicitly set .....: ", !curl_exec_continue($ch);

$header[] = 'Expect:';
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "POST request with expect (set to nothing) as well ....: ", !curl_exec_continue($ch);

unset($header[0]);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "POST request with expect continue from earlier removed: ", !curl_exec_continue($ch);

关于php - 如何阻止 cURL 使用 100 Continue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158675/

相关文章:

vb.net - VB.NET中的 curl 请求等效

php - CURL:发布表单并从 bash 获取数据

php - HTAccess-Mod_rewrite

php - 数据库表中的正则表达式搜索和替换

PHP isset($this) 并在静态和对象上下文中使用相同的对象方法

javascript - 获取时间并用它定义不同的变量

php - 如何测试 "If-Modified-Since"HTTP header 支持

php - SplFixedArray 的性能真的比数组好吗?

javascript - 光滑的 slider : Scroll to last slide if slider is in viewport

javascript - 使用 JQM (jQuery Mobile),为什么 Collapsible 会间歇性地嵌套另一个 collapsible-heading-toggle?