使用分块传输编码处理请求
Handling request with chunked transfer-encoding
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 开始,我看到有一个分块 reader,但似乎供内部使用。
本质上,我试图接受带有 'chunked' 传输编码的 HTTP PUT,并将其发送到后端服务器 'on-the-fly'(即不在 golang 中缓冲完整请求)。我无法控制上游请求。是否有推荐的方法来处理此类请求,或者是 Hijacker 的方法?
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
}
...
}
这些片段复制正文 'on the fly'。
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 开始,我看到有一个分块 reader,但似乎供内部使用。
本质上,我试图接受带有 'chunked' 传输编码的 HTTP PUT,并将其发送到后端服务器 'on-the-fly'(即不在 golang 中缓冲完整请求)。我无法控制上游请求。是否有推荐的方法来处理此类请求,或者是 Hijacker 的方法?
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
}
...
}
这些片段复制正文 'on the fly'。