ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

curl 多接口句柄选项 CURLMOPT_PIPELINING_SERVER_BL:HTTP/1.1 管道化服务器黑名单的前世今生

curl 多接口句柄选项 CURLMOPT_PIPELINING_SERVER_BL:HTTP/1.1 管道化服务器黑名单的前世今生 curl 多接口句柄选项 CURLMOPT_PIPELINING_SERVER_BLHTTP/1.1 管道化服务器黑名单的前世今生【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curlCURLMOPT_PIPELINING_SERVER_BL 是 libcurl 多接口multi interface时代用于配置 HTTP/1.1 管道化pipelining服务器黑名单的选项它让开发者可以按Server:响应头前缀屏蔽那些不支持管道化的服务器避免因服务端兼容性问题导致请求挂起或出错。本文将以 CURLMOPT_PIPELINING_SERVER_BL.md 为骨架结合当前仓库中 multi.c、multi.h 等源码完整讲解该选项的语法、匹配规则、默认值与返回值并说明它在 7.62.0 之后的历史地位——它已经是一个无实际功能的遗留选项。选项概览与核心事实选项名称CURLMOPT_PIPELINING_SERVER_BL用途设置 HTTP/1.1 管道化的服务器类型黑名单按Server:响应头前缀匹配归属接口多接口multi interface通过curl_multi_setopt(3)设置适用协议HTTP引入版本7.30.0[Added-in: 7.30.0]当前状态自 7.62.0 起 HTTP/1.1 管道化被移除该选项不再有任何实际功能但作为 ABI/API 兼容项仍然保留函数原型SYNOPSIS#include curl/curl.h CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SERVER_BL, char **servers);从函数签名可以看出该选项接收一个char **类型的字符串数组指针并借助curl_multi_setopt(3)将其应用到curl_multi_init(3)创建的多句柄上。返回值类型为CURLMcode。在仓库的选项注册表中该选项被登记为对象指针类型参数序号为 12其相邻选项恰好是CURLMOPT_PIPELINING_SITE_BL站点黑名单序号 11两者同属管道化黑名单家族multi.h 第 379383 行CURLMOPT_PIPELINING_SITE_BL类型CURLOPTTYPE_OBJECTPOINT值 11——a list of site names(port) that are blocked from pipeliningCURLMOPT_PIPELINING_SERVER_BL类型CURLOPTTYPE_OBJECTPOINT值 12——a list of server types that are blocked from pipelining这也解释了本文档名称中 SERVER 与姊妹选项 SITE 的区别SITE 黑名单针对站点名可带端口SERVER 黑名单针对服务器类型即Server:响应头中的产品标识。参数语义服务器黑名单数组数组结构与 NULL 结尾servers参数是一个char *数组必须以 NULL 条目结尾。数组中每个元素是一个服务器类型前缀字符串。例如static const char *server_block_list[] { Microsoft-IIS/6.0, nginx/0.8.54, NULL /* 必须以 NULL 结尾 */ };libcurl 会复制该数组The array is copied by libcurl因此调用方在curl_multi_setopt返回后可以安全地释放或修改自己的数组无需保持其生命周期。前缀匹配规则黑名单的判定规则是前缀匹配只要Server:响应头以黑名单中的字符串开头该服务器就被判定为不支持管道化从而被排除在管道化候选之外。文档中给出的典型例子是服务器返回Server: Ninja 1.2.3与Server: Ninja 1.4.0两个不同版本时只需在黑名单中放入Ninja即可同时屏蔽两者。这意味着黑名单不需要列出完整的版本号只需给出足够标识服务器产品族的前缀即可版本迭代不会导致黑名单失效。匹配时不区分完全相等只要求头部字符串以黑名单条目为前缀。清空黑名单传入NULL指针即可清除当前的黑名单设置使多句柄恢复无黑名单状态。默认值DEFAULT默认值为NULL即默认不存在任何服务器黑名单所有服务器在管道化能力判定上一视同仁。使用示例EXAMPLE文档给出的完整示例程序如下static const char *server_block_list[] { Microsoft-IIS/6.0, nginx/0.8.54, NULL }; int main(void) { CURLM *m curl_multi_init(); curl_multi_setopt(m, CURLMOPT_PIPELINING_SERVER_BL, server_block_list); }示例展示了最典型的使用流程定义一个static const的字符串数组元素为需要屏蔽的服务器类型前缀最后以NULL收尾调用curl_multi_init()创建多句柄调用curl_multi_setopt(m, CURLMOPT_PIPELINING_SERVER_BL, server_block_list)将黑名单应用到该句柄。从仓库源码看CURLMOPT_PIPELINING_SERVER_BL在 GCC 类型检查宏中也被正确登记为对象指针类选项见 typecheck-gcc.h 第 238239 行即使用-Werrorcurl之类的严格编译检查时传入非指针类型参数会得到编译期告警。返回值RETURN VALUEcurl_multi_setopt(3)返回CURLMcode类型的枚举值CURLM_OK值为 0表示设置成功非零值表示发生错误具体错误码见 libcurl-errors.md。CURLMcode枚举定义于 multi.h 第 6378 行包含CURLM_BAD_HANDLE、CURLM_BAD_EASY_HANDLE、CURLM_BAD_FUNCTION_ARGUMENT、CURLM_INTERNAL_ERROR等错误类型CURLM_OK为该枚举的第一个成员。姊妹选项与启用开关要真正让黑名单发挥作用前提是管道化功能处于启用状态。管道化的总开关是 CURLMOPT_PIPELINING.md它接受一个位掩码参数CURLPIPE_NOTHING0不进行任何复用尝试CURLPIPE_HTTP11自 7.62.0 起已废弃且不再生效CURLPIPE_MULTIPLEX2尝试在现有连接上复用新传输需要 HTTP/2 或 HTTP/3 支持自 7.62.0 起为默认值。这三个位掩码宏定义于 multi.h 第 8487 行。黑名单的意义在于当管道化/复用开启时某些已知不兼容的服务器类型如老版本的 IIS、nginx不应被选为管道化目标从而规避互操作问题。与CURLMOPT_PIPELINING_SERVER_BL对应的站点黑名单选项为 CURLMOPT_PIPELINING_SITE_BL.md两者通常配合使用分别从服务器类型与站点名端口两个维度约束管道化候选集合。源码中的现状7.62.0 后的空操作在 7.62.0 版本中libcurl 移除了 HTTP/1.1 管道化支持这一改动波及了所有相关选项。从当前仓库源码可以直接印证这一点在 multi.c 第 33653375 行 的curl_multi_setopt实现中源码注释明确写着/* options formerly used for pipelining */ case CURLMOPT_MAX_PIPELINE_LENGTH: break; case CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE: break; case CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE: break; case CURLMOPT_PIPELINING_SITE_BL: break; case CURLMOPT_PIPELINING_SERVER_BL: break;CURLMOPT_PIPELINING_SERVER_BL的分支直接break不做任何处理。也就是说即使你按照本文示例传入黑名单数组libcurl 当前版本也会将其静默忽略——它保留在 API 中纯粹是为了源码兼容性防止使用旧选项的既有程序在升级后出现编译错误或 ABI 破坏。仓库中其他管道化遗留选项CURLMOPT_MAX_PIPELINE_LENGTH、CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE、CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE的文档开头也都写着同样的说明No function since pipelining was removed in 7.62.0.参见 CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.md、CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.md、CURLMOPT_MAX_PIPELINE_LENGTH.md。对现代开发者的建议不要在新代码中使用该选项现代 libcurl7.62.0 及以上已不再支持 HTTP/1.1 管道化设置该选项不会产生任何效果。若你的代码仍依赖管道化提升性能应转向 HTTP/2/HTTP/3 的多路复用multiplexing通过CURLMOPT_PIPELINING的CURLPIPE_MULTIPLEX位启用默认即启用。维护旧代码时的注意事项如果是从 7.62.0 之前的 libcurl 迁移代码包含CURLMOPT_PIPELINING_SERVER_BL的curl_multi_setopt调用可以安全保留——它会静默成功返回CURLM_OK但请删除对它的依赖因为黑名单不再参与连接调度。理解历史设计该选项体现了早期 HTTP 连接复用时代的工程智慧——通过Server:头前缀快速识别互操作风险服务器用最小代价规避协议兼容性陷阱。这一设计思路在今天仍有参考价值例如在连接池管理中按对端产品类型做精细化调度。相关文档索引CURLMOPT_PIPELINING_SERVER_BL.md本文所依据的原始手册CURLMOPT_PIPELINING.md管道化/多路复用总开关CURLMOPT_PIPELINING_SITE_BL.md站点黑名单姊妹选项curl_multi_setopt.md多句柄选项设置入口curl_multi_init.md多句柄创建libcurl-errors.mdCURLMcode错误码说明multi.h选项注册表与CURLPIPE_*位掩码定义multi.ccurl_multi_setopt实现含遗留选项空操作分支【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表