如何阻止 cURL 使用 100 Continue? [英] How can I stop cURL from using 100 Continue?

查看:25
本文介绍了如何阻止 cURL 使用 100 Continue?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

So, long story short, I have an AJAX application that uses MVC Web API as the back end. The client however calls from a different domain and uses a PHP proxy file to get around cross-domain request issues.

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

However, using the PHP proxy, the Web API responds to certain requests with a 100 Continue HTTP header and any requests that get this back take excessive time to complete (we're talking up to 2 mins or so) and can also return a non-valid response.

似乎是 cURL 的一个已知问题 解决方法通常被引用为插入以下行以删除 cURL 请求中的 expect: 100 标头

This appears to be a known issue with cURL and the workaround is commonly cited as inserting the below line to remove the expect: 100 header in the cURL request

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

Unfortunately, the solution seems to be elusive for me:

$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:') );

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

This code works but removes all the other headers (which isn't workable for me as I'm using HTTP basic auth headers to authenticate with the API). You may also notice I tried adding the Expect: to the existing headers, but this didn't help me either.

如何维护现有标头,同时防止 cURL 期望 100 continue?

How can I maintain the existing headers, but also prevent cURL from expecting a 100 continue?

推荐答案

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

Using $headers_new[] = 'Expect:'; does work unless the $headers_new array contains a string that is 'Expect: 100-continue'. In this case you need to remove it from the array otherwise it will be expecting the 100 continue (logically).

因为在你的代码中你使用了 getallheaders() 而你没有检查如果它已经包含 Expect: 100-continue 标头,那么您的情况可能就是这种情况.

Because in your code you use getallheaders() and you're not checking if it contains an Expect: 100-continue header already so this probably is the case in your case.

以下是一般情况(以及创建它的脚本)的摘要:

Here is a summary for the general situation (and the script that created it):

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 Continuex0dx0ax0dx0a");
    echo "Continue: ", $continue ? 'Yes' : 'No', "
";

    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);

这篇关于如何阻止 cURL 使用 100 Continue?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆