用途
curl-logger-ktor-plugin 是一个 Ktor 客户端插件,用于把每个发出的请求记录成一条可直接粘贴到终端运行的 curl 命令。它被描述为“最便宜的复现工具”:在请求发出时拦截,打印等价 curl,粘贴到终端即可。无需代理、无需抓包工具,可在用户设备日志中工作。
主要能力
- 在
SendingRequest钩子中构建并输出 curl 命令。 - 使用 POSIX 单引号转义(
shellQuote),使包含单引号、美元符号或换行的请求体在粘贴后仍保持原样。 - 配置类
CurlLoggerConfig提供三个成员:logger: (String) -> Unit,默认{ println(it) }。redactHeaders: Set<String>,大小写不敏感,显示为<redacted>,默认为空集合。handleCompression: Boolean,默认true,丢弃Accept-Encoding并追加--compressed,让 curl 自行解码响应。
- 构建器将请求各部分用空格连接成单行字符串,不使用换行或反斜杠续行。
- 跳过
content-length头,让 curl 根据--data-raw自行计算。 - 若请求头中缺少
content-type,则从请求体对象补充。 - 日志调用包裹在 try/catch 中:先重新抛出
CancellationException,再吞掉其他异常,确保日志失败不会中断实际请求,同时不丢失协程取消信号。
使用方式
插件通过 createClientPlugin("CurlLogger", ::CurlLoggerConfig) 创建,并在 on(SendingRequest) 中调用 buildCurlCommand。构建过程遍历请求方法、URL、请求头与请求体,最终 joinToString(" ") 输出一行。请求体读取按内容类型分支:字节数组体可直接解码;写入通道的体可给予新通道;通道体或特殊体则跳过并返回 null。
适用场景
- 需要在用户设备日志中复现请求问题。
- 希望把请求直接粘贴到终端验证响应是否与应用一致。
- 仅应附加到被插桩的客户端上;对于上传或流式传输大负载的客户端,读取请求体到字符串会带来问题。
限制与注意事项
- 默认脱敏列表为空,意味着会话 cookie 或 bearer token 会原样进入日志;不应在发布构建中把日志输出指向任何持久化位置。
- 双引号不是转义:在
"…"内 shell 仍会展开$var、反引号和\,因此必须对所有动态部分(URL、每个请求头行、请求体)应用单引号转义。 - 必须构建完整字符串后一次性输出,避免多线程交错、截断或乱序。
- 请求体可能是一次性通道,读取会破坏被观察的请求;无法读取时应跳过,打印不带
--data-raw的命令是诚实做法。 - 验证方式为往返测试:取一条日志行粘贴到终端,确认响应与应用一致;应使用包含单引号和
$的请求体来暴露转义问题。 createClientPlugin与发送请求钩子属于 Ktor 3.x;转义与单行规则不绑定任何库。- 资料未提供安装命令、版本号、许可证或价格信息。