登录
首页 >  Golang >  Go问答

Golang 中写入响应后 HTTP 请求不完整

来源:stackoverflow

时间:2024-03-06 08:48:26 187浏览 收藏

你在学习Golang相关的知识吗?本文《Golang 中写入响应后 HTTP 请求不完整》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

我有一个 go 语言的服务器来处理文件上传。这是一个遗留代码,所以我不能太多地接触它。

如果服务器在请求标头中检测到某些错误,则应中断上传,并向客户端返回一条消息,表明出现问题。

处理函数如下所示:

func(w http.ResponseWriter, r *http.Request) {

            // Check the header. Could be more than one.
            if r.Header.Get("key") == "not as expected" {
                w.WriteHeader(500)
                w.Write("key is wrong")
                return
            }

        //handle the file upload

}

标头检查只是一个显示问题的示例

即使请求未完成(文件已​​收到),服务器也会在 write 后关闭连接并从函数返回。

在客户端(java)上,当我使用错误值的 key 和要作为正文上传的文件发出请求时,我收到损坏的管道异常,并且无法正确处理响应。 实际上我无法触及客户端代码。

服务器端有办法等到请求结束后再关闭连接吗?


解决方案


java 客户端上出现的“损坏的管道”错误表明客户端在尝试从服务器读取响应之前坚持发送其请求的有效负载(正文)。

在 http/1.1(和 1.0)中,客户端是正确的:规范中没有任何内容表明客户端必须期望服务器在整个请求之前响应 - 即标头 >和正文(如果有)- 被提交。

在您的特定情况下,最简单的方法是将客户端的主体通过管道传输到任何地方,然后返回错误。一种惯用的方法是使用 io/ioutil.Discard 类型:

func(w http.ResponseWriter, r *http.Request) {
    // Check the checksum header
    if r.Header.Get("key") == "not as expected" {
        _, err := io.Copy(ioutil.Discard, r.Body)
        if err != nil {
            // The client went away.
            // May be log something, then bail out.
            panic(http.ErrAbortHandler)
        }
        w.WriteHeader(500)
        w.Write("key is wrong")
        return
    }

    //handle the file upload
}

net/http.ErrAbortHandler可用于告诉http服务器库代码不应以正常方式执行请求。

顺便说一句,用 5xx 响应格式不正确的客户端请求是不正确的,您应该使用 4xx 来代替。但它是遗留代码,因此请将此作为未来开发的提示。

1 请参阅 send(2) manual page 中的 epipe

好了,本文到此结束,带大家了解了《Golang 中写入响应后 HTTP 请求不完整》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>