1

golang 的 net/http 包是否支持分块传输编码的请求?到目前为止,我已经能够使用 Hijacker 界面(https://golang.org/src/net/http/server.go?s=6173:6875#L156)至少不关闭连接并接收完整的分块请求,但尚未解析块,并怀疑我可能走错了路。

来自https://golang.org/src/net/http/httputil/httputil.go?s=688:732#L10,我看到有一个分块阅读器,但似乎是供内部使用的。

本质上,我正在尝试接受带有“分块”传输编码的 HTTP PUT,并将其“即时”发送到后端服务器(即不缓冲 golang 中的完整请求)。我无法控制上游请求。有没有推荐的方式来处理这样的请求,或者是劫持者的方式来做到这一点?

4

1 回答 1

5

net/http 客户端和服务器透明地读取和写入块体。

要接受分块请求并将其发送到另一个 HTTP 服务器,请将服务器请求正文作为客户端请求正文传递。现在将正文作为 PUT 转发到另一台服务器:

 func handler(w http.ResponseWriter, r *http.Request) {
    creq, err := http.NewRequest("PUT", url, r.Body)
    if err != nil {
       // handle error
    }
    if ct := r.Header.Get("Content-Type"); ct != "" {
        creq.Header.Set("Content-Type", ct)
    }
    cresp, err := http.DefaultClient.Do(creq)
    if err != nil {
        // handle error
    }
    ... do something with cresp.
 }

如果要复制到文件,则 io.Copy 请求正文到文件。

 func handler(w http.ResponseWriter, r *http.Request) {
     f, err := os.Create("fname")
     if err != nil {
         // handle error
     }
     _, err := io.Copy(f, r.Body)
     if err != nil {
          // handle error
     }
     ...
  }

这些片段“即时”复制身体。

于 2017-12-22T20:34:37.323 回答