今天在测试上测试上传图片POST请求 出现了响应两次
发现第一次请求的header头中有:
Expect: 100-continue
content-Length:41386
服务端响应了:
HTTP/1.1 100 Continue后
客户端进行上传
随后服务端响应回来数据
查资料发现:
在使用curl做POST的时候, 当要POST的数据大于1024字节的时候, curl并不会直接就发起POST请求, 而是会分为俩步,
1. 发送一个请求, 包含一个Expect:100-continue, 询问Server使用愿意接受数据
2. 接收到Server返回的100-continue应答以后, 才把数据POST给Server
这是libcurl的行为.
具体的RFC相关描述: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.3
于是,这样就有了一个问题, 并不是所有的Server都会正确应答100-continue, 比如lighttpd, 就会返回417 “Expectation Failed”, 则会造成逻辑出错,
要解决的办法也挺容易:
// Disable Expect: header (lighttpd does not support it)
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
参考资料:
https://www.laruence.com/2011/01/20/1840.html
https://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.3
https://tools.ietf.org/html/rfc7231#section-5.1.1