Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 在Golang中写入响应后,HTTP请求被中止_File_Go_Upload - Fatal编程技术网

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

File 在Golang中写入响应后,HTTP请求被中止,file,go,upload,File,Go,Upload,我有一个Go中的服务器来处理文件上传。这是一个遗留代码,所以我不能碰它这么多 如果服务器在请求头中检测到一些错误,它应该中断上传,并且应该向客户端返回一条消息,说明出现了问题 处理程序函数如下所示: func(w http.ResponseWriter,r*http.Request){ //检查标题。可以是多个标题。 如果r.Header.Get(“key”)=“不符合预期”{ w、 文书主任(500) w、 写(“钥匙错了”) 返回 } //处理文件上传 } 标题检查只是说明问题的一个示例

我有一个Go中的服务器来处理文件上传。这是一个遗留代码,所以我不能碰它这么多

如果服务器在请求头中检测到一些错误,它应该中断上传,并且应该向客户端返回一条消息,说明出现了问题

处理程序函数如下所示:


func(w http.ResponseWriter,r*http.Request){
//检查标题。可以是多个标题。
如果r.Header.Get(“key”)=“不符合预期”{
w、 文书主任(500)
w、 写(“钥匙错了”)
返回
}
//处理文件上传
}
标题检查只是说明问题的一个示例

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

在客户端(Java)上,当我用
键发出一个错误值的请求,并将文件作为一个主体上传时,我得到了一个断管异常,它无法正确处理响应。
实际上,我不能触摸客户端代码

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

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

在HTTP/1.1(和1.0)中,客户机是正确的:规范中没有规定客户机必须在提交整个请求(即,头和主体,如果有的话)之前期望服务器响应

在您的特殊情况下,最简单的方法是将客户的身体输送到任何地方,然后以错误进行响应。一种惯用方法是使用类型:


func(w http.ResponseWriter,r*http.Request){
//检查校验和标题
如果r.Header.Get(“key”)=“不符合预期”{
_,err:=io.Copy(ioutil.Discard,r.Body)
如果错误!=零{
//客户走了。
//可能是记录了些什么,然后逃走。
恐慌(http.ErrAbortHandler)
}
w、 文书主任(500)
w、 写(“钥匙错了”)
返回
}
//处理文件上传
}
可用于告诉HTTP服务器库代码不应以正常方式执行请求


顺便说一下,使用5xx响应格式错误的客户端请求是不正确的,您应该使用4xx。但这是一个遗留代码,所以请将此作为未来开发的提示



⑨请参阅中的
EPIPE

您在
写入后返回,这样请求就完成了。如果要读取请求正文,请确保已读取请求正文。