转载:Apache1.1 post请求无body的bug

起因

开发者在论坛发贴说php sdk有个问题,并初步定位,找到了解决方案,但不明白原因,详见:http://open.taobao.com/bbs/read.php?tid=18801

解决过程

因为我看到帖子后在正式环境和沙箱都不能重现,留言让开发者旺旺远程协助

下午5点,技术支持旺旺联系上了开发者,经过1个半小时远程桌面调试,最终找到问题原因,解决方法已经告诉开发者,SDK也已更新。

技术分析

这是一个HTTP通信的细节,php curl向top发起请求的时候,默认设置了HTTP POST方式,但又没设置POST的内容,结果导致libcurl发出了一个HTTP请求,包含这样的HEADER:

Expect: 100-continue

Content-Length: -1

Apache看到这样的请求,就给扔了一个302回来了。

Expect: 100-continue是干嘛的?

正常情况下,只有当post body超过1024字节的时候,才需要http client发出带Expect: 100-continue的请求,web server给出一个100-Continue的响应,client再发送请求的内容。

为什么会有Content-Length: -1?

因为php sdk设了POST方式(curl_setopt($ch, CURLOPT_POST, true);)却没给它POST内容,所以长度就成-1了

为什么我无法重现?

因为我用的是php 5.2.12/libcurl 7.19.3,这个curl版本是不会出这个错的,把这个错误兼容掉了。

而开发者用的是php5.2.13/libcurl 7.20.0,这个curl版本支持http协议比较严格,不再兼容了,就出错了。

环境导致的问题不好查,所以远程协助搞了90分钟。

结论

结合上次multipart的问题来看,HTTP通信对多数开发者(不管是java还是php)都是比较难的技术点,还是用官方的SDK省事

ps: java sdk不存在这个问题