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

jgi*_*oni 24 php curl web-services http-headers

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

$response = curl_exec($ch);
Run Code Online (Sandbox Code Playgroud)

并且请求/响应标头看起来像这样:

请求:

POST /item/save HTTP/1.1
Host: services.mydomain.com
Accept: */*
Content-Length: 429
Expect: 100-continue
Content-Type: multipart/form-data
Run Code Online (Sandbox Code Playgroud)

响应:

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
Run Code Online (Sandbox Code Playgroud)

其次是身体(json编码数据).

问题是常见的事情是在遇到第一个空行的情况下将响应中的标题和正文分开,除非在这种情况下,空行在之后100 Continue,因此其他所有内容都被推入正文 - 这是无效的json再也:-)

所以我的问题是:解决这个问题的常用方法是什么?我有3个选项排成一行:

  1. 指定curl不应该期望100-continue?(怎么样?)
  2. 指定curl应该只发回最后一个响应的标题?(怎么样?)
  3. 手动检查100 Continue标题并忽略它们及其后面的空行?(在这种情况下,还有其他可能发生的类似事情,我应该手动检查吗?)

除非我遗漏了一些明显的东西,否则我肯定人们偶然发现了这个问题并多次解决了!

ts.*_*ts. 19

我会选择#1.您可以通过添加以下命令强制curl发送空的"Expect"标题:

curl_setopt($ch, CURLOPT_HTTPHEADER,array("Expect:"));
Run Code Online (Sandbox Code Playgroud)

你的代码

如果你想手动检查它,你应该定义自己的头回调,也可以写回调(在curl_setopt doc中查找CURLOPT_HEADERFUNCTION和CURLOPT_WRITEFUNCTION ),它只是忽略所有"HTTP/1.1 100 Continue"标题.


Lès*_*sté 5

这是另一种方法,它使用我在评论中描述的方法,通过使用以下方法将响应解析为标题与正文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==";
Run Code Online (Sandbox Code Playgroud)

我已对此进行了测试,结果如下:

==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==