• 转载: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不存在这个问题

  • 相关阅读:
    B.Little Sub and Triples
    A.Little Sub and Applese
    1003 超级无敌简单题[暴力打表]
    1002 人类史上最大最好的希望事件[前缀和]
    1001 hzy 和zsl 的生存挑战
    Computer Arrangement [经典贪心]
    Linux指令
    LInux
    Servlet
    El表达式与JSTL表达式
  • 原文地址:https://www.cnblogs.com/lovelili/p/2177750.html
Copyright © 2020-2023  润新知