如何在libcurl中禁用Expect 100-continue?解决POST请求阻塞问题
解决libcurl中Expect: 100-continue导致的POST请求阻塞问题
我太懂这个糟心的问题了——当你用libcurl的CURLOPT_POST发HTTPS请求时,默认的Expect: 100-continue机制经常会在服务器不配合的时候搞出阻塞,就是你看到的那串提示。本质上是libcurl在发送大体积POST数据前,先给服务器发个Expect头,等服务器返回100 Continue信号才会发实际数据;要是服务器不支持这个机制、或者响应慢,就会卡在那等,直到超时。
下面给你两种靠谱的解决办法,按需选择:
方法一:直接禁用Expect头(兼容所有libcurl版本)
通过自定义HTTP请求头,把Expect设为空值,直接跳过100-continue的等待流程。代码示例(C语言):
// 初始化自定义头列表 struct curl_slist *custom_headers = NULL; // 添加空的Expect头,覆盖默认值 custom_headers = curl_slist_append(custom_headers, "Expect:"); // 告诉libcurl使用这个自定义头列表 curl_easy_setopt(your_curl_handle, CURLOPT_HTTPHEADER, custom_headers); // ... 执行你的请求逻辑 ... // 请求结束后记得清理头列表,避免内存泄漏 curl_slist_free_all(custom_headers);
这个方法不管你用的是新还是旧版本的libcurl都管用,是最通用的方案。
方法二:设置100-continue超时(libcurl 7.36.0+可用)
如果你不想完全禁用这个机制,只是不想等太久,可以用CURLOPT_EXPECT_100_TIMEOUT_MS选项设置等待超时时间。比如设为0毫秒,libcurl就会直接发送POST数据,完全不等待服务器的100响应:
// 设置等待100-continue的超时为0,立即发送数据 curl_easy_setopt(your_curl_handle, CURLOPT_EXPECT_100_TIMEOUT_MS, 0L);
要是你想留一点等待时间,比如设为500毫秒,超过这个时间没收到响应就直接发数据也行,灵活度更高。
额外提醒
- 如果你用的是非常老旧的libcurl版本(低于7.36.0),只能用方法一,因为方法二的选项是后来才加入的。
- 用方法一时,要确保
CURLOPT_HTTPHEADER的其他自定义头不会和这个Expect头冲突,避免出现奇怪的请求问题。
内容的提问来源于stack exchange,提问作者Mini Rai
相关产品推荐
相关产品推荐

