PHP curl_exec 返回 HTTP/1.1 100 Continue 和 HTTP/1.1 200 OK,以空格分隔

2022-08-30 16:11:26

我使用cURL从PHP调用服务,如下所示:

$response = curl_exec($ch);

并且请求/响应标头如下所示:

请求:

POST /item/save HTTP/1.1
Host: services.mydomain.com
Accept: */*
Content-Length: 429
Expect: 100-continue
Content-Type: multipart/form-data

响应:

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Fri, 06 Jul 2012 08:37:01 GMT
Server: Apache
Vary: Accept-Encoding,User-Agent
Content-Length: 256
Content-Type: application/json; charset=utf-8

后跟正文(json 编码数据)。

问题是,常见的事情是通过遇到的第一个空行在响应中拆分标头和正文,除了在这种情况下,空行在后面,因此其他所有内容都被推入正文 - 这不再是有效的json:-)100 Continue

所以我的问题是:处理这个问题的常用方法是什么?我有3个选项:

  1. 指定卷曲不应该期望 ?(如何?100-continue
  2. 指定 curl 只应发回上次响应的标头?(如何?
  3. 手动检查标头并忽略它们及其后面的空行?(在这种情况下,是否还有其他类似的事情可能发生,我应该手动检查?100 Continue

除非我错过了一些明显的东西,否则我相信人们已经偶然发现了这一点,并解决了很多次!


答案 1

我会选择#1。您可以通过添加以下内容来强制 curl 发送空的“Expect”标头:

curl_setopt($ch, CURLOPT_HTTPHEADER,array("Expect:"));

到您的代码

如果你想手动检查它,你应该定义你自己的标头回调,也许写回调(在curl_setopt文档中查找CURLOPT_HEADERFUNCTION和CURLOPT_WRITEFUNCTION),这只需要忽略所有“HTTP / 1.1 100 Continue”标头。


答案 2

这是另一种方法,它使用我在注释中描述的方法,方法是使用以下命令将响应解析为标头与正文:CURLINFO_HEADER_SIZE

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://test/curl_test.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
// sets multipart/form-data content-type
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
  'field1' => 'foo',
  'field2' => 'bar'
));

$data = curl_exec($ch);

// if you want the headers sent by CURL
$sentHeaders = curl_getinfo($ch, CURLINFO_HEADER_OUT);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
curl_close($ch);

$header = substr($data, 0, $headerSize);
$body = substr($data, $headerSize);
echo "==Sent Headers==\n$sentHeaders\n==End Sent Headers==\n";
echo "==Response Headers==\n$headers\n==End Response Headers==\n";
echo "==Response Body==\n$body\n==End Body==";

我已经对此进行了测试,它产生了以下输出:

==Sent Headers==
POST /curl_test.php HTTP/1.1
Host: test
Accept: */*
Content-Length: 242
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------
d86ac263ce1b

==End Sent Headers==

==Response Headers==
HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Fri, 06 Jul 2012 14:21:53 GMT
Server: Apache/2.4.2 (Win32) PHP/5.4.4
X-Powered-By: PHP/5.4.4
Content-Length: 112
Content-Type: text/plain

==End Response Headers==

==Response Body==
**FORM DATA**
array(2) {
  ["field1"]=>
  string(3) "foo"
  ["field2"]=>
  string(3) "bar"
}
**END FORM DATA**
==End Body==

推荐