繁体   English   中英

如何使用net / http打破大块?

[英]How to break a chunked in go using net/http?

我有一个带有端点的http服务器,该端点返回从db流传输的大量数据。 响应是分块的( < Transfer-Encoding: chunked )。 如果遇到错误(例如数据库崩溃),我可以使用panic&curl来警告我一个问题:

curl: (18) transfer closed with outstanding read data remaining

我不想恐慌-我只想要一条简单的日志消息。 而且,如果我recover()我不会在卷曲中收到错误,因此没有迹象表明发生了损坏。

有没有办法打破大块的http响应而不会出现恐慌?

您从curl看到的错误是因为HTTP服务器在看到紧急情况时立即关闭了该连接。 为了强制关闭连接而不会出现panic ,您必须劫持它:

// inside the http handler
// func(w http.ResponseWriter, r *http.Request) {

// to abort an HTTP/1.1 response
if w, ok := w.(http.Hijacker); ok {
    c, _, err := w.Hijack()
    if err != nil {
        log.Println("cannot close connection:", err)
        return
    }
    c.Close()
    return
}

在Go 1.7中,劫持(JimB的回答中提出)可能是最好的解决方案。 不幸的是,它仅在HTTP / 1.1中有效-在HTTP / 2中不会做任何有用的事情。

Go 1.8引入了一个新值ErrAbortHandler ,中断HTTP响应中途的官方方式是panic(http.ErrAbortHandler) ,该方法适用于HTTP / 1.1和HTTP.2。 问题17790中对此进行了描述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM