Go:如何在不加载正文的情况下创建 http 代理通行证

标签 go http curl

我在世界各地有 N 个代理商。我需要通过这些代理调用一些端点,但不加载它们的主体。 例如,我想调用 google.com,我将此 url 发送给所有 N 个代理,然后他们使用 GET 方法向 google.com 发送一个 http 请求,然后将响应发送给我。 问题是所有代理都正在加载完整的正文响应,但我只需要响应状态和 header 。 Golang 中是否有任何解决方案可以防止首先下载正文响应?

我尝试使用一些curl标志调用它,但它只是忽略显示响应正文并在后台下载正文

最佳答案

您想要实现的目标与 HTTP 协议(protocol)不兼容。

抛开 HEAD 与 GET 不谈,让我们从独立于语言/实现的角度来看待这个问题。

无论实现如何,您的 HTTP 客户端都会使用 GET/POST/PUT 方法向服务器发送 HTTP/1.1 请求。接下来发生的事情是服务器收到此请求,其负载如下(假设是 GET,但对所有负载都是相同的):

GET /somepath HTTP/1.1
Host: somedomain.com
<more request headers here>

此时,服务器将回复 HTTP 响应 header HTTP 响应正文。没有办法阻止这种情况发生,因为它实际上会破坏 HTTP 协议(protocol)。您始终可以避免在客户端读取响应正文,但响应正文将始终“通过线路”传输。

但是,对于 POST/PUT(需要发送请求正文的方法),您可以使用 Expect header 。

如果您在请求中包含 Expect: 100-continue header ,则服务器将向您发回 HTTP 100 Continue 响应,向客户端发出信号:很明显要发送请求体,此时就可以断开连接了。

但是,这意味着如果您发送了请求正文,您将无法获得将发送的实际 HTTP 响应代码。例如,如果您的有效负载无效,您不会收到 HTTP 400 错误请求,因为您实际上没有发送有效负载。如果您发送了有效负载,那么服务器将发回完整的响应,包括正文。

不幸的是,您想要实现的目标是不可能的。

关于Go:如何在不加载正文的情况下创建 http 代理通行证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76774512/

相关文章:

go - 条件(动态)结构标签

使用 SSL 时不再存储 PHP session

Azure-AKS:使用 Postman 测试启用了 TLS 的 Ingress

go - 如何防止 AVG 暂停我的 goLang 执行?

go - 使用Z精度格式化Go时间

go - [CodeEval][GO] CodeEval 错误 : Process was aborted due to timeout

javascript - Angular 2如何在http post后刷新表单

php - 需要页面等待 php 完成

wordpress - 使用 RCurl 登录 WordPress

curl - 如何列出替代证书主题名称