拒绝 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 请求流程。请把诊断的状态和正文与它们对应的具体代理和目标一起保存。

相关文章