gpt4 book ai didi

file - 在 Golang 中写入响应后,HTTP 请求被中止

转载 作者:行者123 更新时间:2023-12-01 22:44:18 26 4
gpt4 key购买 nike

我在 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

}

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

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

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

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

最佳答案

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

在 HTTP/1.1(和 1.0)中,客户端是正确的:规范中没有任何内容说客户端必须期望服务器在整个请求(即 header 和正文,如果有的话)被提交之前做出响应。

在您的特定情况下,最简单的方法是将客户的 body 传送到无处,然后以错误响应。一种惯用方法是使用 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 代替。但这是一个遗留代码,所以把它作为 future 发展的提示。

¹ 见 EPIPE send(2) manual page .

关于file - 在 Golang 中写入响应后,HTTP 请求被中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62267797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com