用 curl 检查失败的代理 CONNECT 响应正文
将格式正确的诊断 CONNECT 请求直接发送给 HTTP 代理,并分别保存 HTTP 失败的响应头和正文。
拒绝 CONNECT 的代理可以返回一份 HTTP 错误文档,说明其策略或后续连接的失败原因。在获得授权的情况下对普通 HTTP 代理做诊断时,curl 可以直接发送该请求并保存响应:
curl --proxy '' --http1.1 --max-time 10 \
--request CONNECT \
--request-target service.example:443 \
--header 'Host: service.example:443' \
--dump-header tunnel.headers \
--output tunnel.body \
http://proxy.example:8080/
最后一个 URL 指向代理的监听端口。若要进行允许的公共代理比较,HTTP 代理列表可提供该监听 URL 的候选对象。--request 提供方法标记;--request-target 提供 CONNECT 权限。将两者分开即可生成 CONNECT service.example:443 HTTP/1.1。
空的 proxy 选项可防止 curl 让这次诊断经过另一个继承的代理。该命令有意省略 --fail,以便保留 HTTP 错误文档。
未经验证的尝试可能在到达所调查的失败之前就停在 407。重现已通过验证的请求时,请使用代理预期的身份验证安排。
这里用于检查失败响应。如果代理返回 2xx,连接就会变成隧道,而不是普通的 HTTP 正文传输。这种自定义方法诊断不会启动目标端的 TLS 交换,并且可能在被接受的开放隧道上达到其时间上限。
实际获取 HTTPS 时请使用常规的 --proxy 请求流程。请把诊断的状态和正文与它们对应的具体代理和目标一起保存。