SuperAPI AI 工具集

curl-logger-ktor-plugin

编程与开发

查看项目

更新于 10-17 16:16

技能介绍

用途

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;转义与单行规则不绑定任何库。
  • 资料未提供安装命令、版本号、许可证或价格信息。