【问题标题】:Handling request with chunked transfer-encoding使用分块传输编码处理请求
【发布时间】:2017-12-22 20:25:15
【问题描述】:

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 中的完整请求)。我无法控制上游请求。有没有推荐的方式来处理这样的请求,或者 Hijacker 是这样做的方式吗?

【问题讨论】:

    标签: go httprequest chunked-encoding chunked transfer-encoding


    【解决方案1】:

    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
         }
         ...
      }
    

    这些 sn-ps 会“即时”复制主体。

    【讨论】:

    • 哇哦,这更简单了——谢谢!如果最初我只是想写入文件?
    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2023-03-16
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多