请求主体太大导致Go中的连接重置

时间:2016-02-03 10:01:58

标签: go multipartform-data

我有一个简单的多部分表单,可以上传到Go应用。我想对上传大小设置限制,所以我做了以下内容:

func myHandler(rw http.ResponseWriter, request *http.Request){  
    request.Body = http.MaxBytesReader(rw, request.Body, 1024)
    err := request.ParseMultipartForm(1024)
    if err != nil{
    // Some response.
    } 
}  

每当上传超过最大大小时,我都会重置连接,如下所示: enter image description here

然后代码继续执行。我似乎无法向用户提供任何反馈。我没有切断连接,而是更喜欢说"你超过了尺寸限制"。这可能吗?

2 个答案:

答案 0 :(得分:4)

此代码按预期工作。 http.MaxBytesReader

的说明
  

MaxBytesReader与io.LimitReader类似,但适用于   限制传入请求主体的大小。与之相反   io.LimitReader,MaxBytesReader的结果是一个ReadCloser,返回一个   读取超出限制的非EOF错误,并关闭基础   读者在调用Close方法时。

     

MaxBytesReader可防止客户意外或恶意   发送大量请求并浪费服务器资源。

您可以使用io.LimitReader只读取N个字节,然后自行处理HTTP请求。

答案 1 :(得分:3)

强制客户端停止发送数据的唯一方法是强制关闭连接,这就是您使用http.MaxBytesReader所做的事情。

您可以使用io.LimitReader中包含的ioutil.NopCloser,并通知客户端错误状态。然后,您可以检查更多数据,并尝试将连接排除到另一个限制以保持打开状态。但是,对 19500101 20.7 19510101 230.1 19520101 -91.8 19530101 20.0 没有正确响应的客户端在这种情况下可能也不起作用。

处理这类事情的优雅方式是使用MaxBytesReader,但这只适用于除Web浏览器以外的客户端。