curl libcurl CURLINFO_REQUEST_SIZE:查询已发送请求总字节数的 getinfo 详解
curl libcurl CURLINFO_REQUEST_SIZE查询已发送请求总字节数的 getinfo 详解【免费下载链接】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本文基于 curl 仓库中的官方手册页 CURLINFO_REQUEST_SIZE详解curl_easy_getinfo()中CURLINFO_REQUEST_SIZE这一信息项的用法、语义边界与底层实现。读完后你将知道该信息项统计的“请求大小”到底包含哪些字节、它在重定向场景下如何累计、long与curl_off_t两类返回类型为何在此处不统一以及 curl 命令行工具的%{size_request}变量与它的对应关系。基本信息一览项目内容信息项CURLINFO_REQUEST_SIZE语义已发送请求的总大小bytes获取方式curl_easy_getinfo(handle, CURLINFO_REQUEST_SIZE, long_var)返回类型long *枚举基址为CURLINFO_LONG 12引入版本7.4.1适用协议文档标注为 All但统计值目前仅对 HTTP 请求有效枚举定义位于 include/curl/curl.hCURLINFO_HEADER_SIZE CURLINFO_LONG 11, CURLINFO_REQUEST_SIZE CURLINFO_LONG 12,基址CURLINFO_LONG说明该信息项要求调用方传入一个long指针返回值会被强制转换为long存储这一点在 32 位平台上对超大请求量是需要注意的边界下文“实现细节”一节会展开。SYNOPSIS函数签名#include curl/curl.h CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REQUEST_SIZE, long *sizep);手册页对该信息项的原始描述是Pass a pointer to a long to receive the total size of the issued requests. This is so far only for HTTP requests. Note that this may be more than one request if CURLOPT_FOLLOWLOCATION(3) is enabled.即传入一个long指针接收已发出请求的总字节数。两个关键限定目前仅对 HTTP 请求有效so far only for HTTP requests。文档的 Protocol 一栏虽标注 All但实际计数逻辑只与 HTTP 传输挂钩启用CURLOPT_FOLLOWLOCATION后该值可能是多个请求的总和。例如一次 301 重定向链上每次重发请求含各自的请求行与请求头都会被累计进来因此返回值可能大于单条请求的预期长度。底层实现计数发生在哪一层结合源码可以看到该值从“初始化”到“累计”再到“读取”的完整链路如下。1. 初始化每个传输开始时清零在 lib/getinfo.c 的Curl_initinfo()中每次发起或重定向重新发起传输时统计字段被重置info-header_size 0; info-request_size 0;存储字段定义在 lib/urldata.hcurl_off_t request_size; /* the amount of bytes sent in the request(s) */注意内部累加器request_size本身是curl_off_t64 位但对外通过long返回读取时会做一次(long)截断。2. 累计每次实际写出的请求字节都计入计数发生在传输层发送函数Curl_xfer_send()中见 lib/transfer.cCURLcode Curl_xfer_send(struct Curl_easy *data, const void *buf, size_t blen, bool eos, size_t *pnwritten) { CURLcode result; ... result Curl_conn_send(data,>case CURLINFO_REQUEST_SIZE: *param_longp (long)data-info.request_size; break;此外在 DEBUGBUILD 编译版本中lib/getinfo.c 支持用环境变量CURL_DEBUG_SIZE同时伪造CURLINFO_HEADER_SIZE与CURLINFO_REQUEST_SIZE的返回值——这是官方测试框架用来验证依赖代码路径的调试手段正式发布构建中不可用见 docs/libcurl/libcurl-env-dbg.md。与 curl 命令行工具的关系%{size_request}curl 命令行工具的--write-out输出变量%{size_request}正是通过该 getinfo 信息项取值的。映射关系见 src/tool_writeout.c{ size_request, VAR_REQUEST_SIZE, CURLINFO_REQUEST_SIZE, writeLong },因此命令行写法与库 API 语义完全一致curl -s -o /dev/null -w %{size_request}\n https://example.com输出的即为本次会话中已发送请求的总字节数跟随重定向时同样会累计。完整示例继承自手册页手册页给出的最小可运行示例如下展示“请求完成后用 getinfo 取回请求大小”的标准姿势int main(void) { CURL *curl curl_easy_init(); if(curl) { CURLcode result; curl_easy_setopt(curl, CURLOPT_URL, https://example.com); result curl_easy_perform(curl); if(result CURLE_OK) { long req; result curl_easy_getinfo(curl, CURLINFO_REQUEST_SIZE, req); if(result CURLE_OK) printf(Request size: %ld bytes\n, req); } curl_easy_cleanup(curl); } }使用要点curl_easy_getinfo()必须在传输结束curl_easy_perform()返回后调用才有意义建议同时检查curl_easy_perform与curl_easy_getinfo的返回码后者同样返回CURLcode。返回值与错误处理curl_easy_getinfo(3)返回一个CURLcode表示成功或错误CURLE_OK0表示一切正常非零值表示发生错误具体含义参见 libcurl-errors。常见失败原因包括传入的handle无效、参数指针为 NULL 等具体以curl_easy_getinfo(3)手册页的约束为准。与相近信息项的对比信息项返回类型语义说明CURLINFO_REQUEST_SIZElong *已发送请求总字节数本文主角仅 HTTP 有效重定向时累计CURLINFO_HEADER_SIZElong *已接收的响应头总字节数与本文信息项成对使用同为CURLINFO_LONG家族见 CURLINFO_HEADER_SIZECURLINFO_SIZE_UPLOAD_Tcurl_off_t *已上传字节数off_t家族64 位适合大数据量CURLINFO_SIZE_DOWNLOAD_Tcurl_off_t *已下载字节数64 位旧的CURLINFO_SIZE_DOWNLOAD已自 7.55.0 起废弃见 CURLINFO_SIZE_DOWNLOAD_T从 include/curl/curl.h 可以看到SIZE_UPLOAD_T、SIZE_DOWNLOAD_T等下载/上传统计都已迁移到CURLINFO_OFF_T基址64 位curl_off_t而CURLINFO_REQUEST_SIZE至今仍保留在CURLINFO_LONG基址上没有对应的_T变体。对绝大多数 HTTP 请求而言long足够但从源码结构看若内部 64 位累加器超过平台long表示范围读取时会被截断处理异常大流量场景时应留意这一点。相关文档curl_easy_getinfo —— 所有 getinfo 信息项的总入口curl_easy_setopt —— 设置CURLOPT_FOLLOWLOCATION等选项CURLINFO_HEADER_SIZE —— 接收方向的对应指标CURLINFO_SIZE_DOWNLOAD_T —— 64 位下载量统计。小结CURLINFO_REQUEST_SIZE是一个轻量但语义清晰的传输统计接口它在Curl_initinfo()中清零、在Curl_xfer_send()中按实际写出字节累计、经curl_easy_getinfo()以long形式读出并在 curl 命令行中体现为%{size_request}变量。理解“仅 HTTP 有效”与“重定向时多请求累计”这两条边界是正确使用该信息项的前提。【免费下载链接】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),仅供参考