猿问

请求正文太大导致 Go 中的连接重置

我有一个简单的多部分表单,可以上传到 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.

    } 

}  

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

然而代码继续执行。我似乎无法向用户提供任何反馈。我宁愿说“您已超出大小限制”,而不是切断连接。这可能吗?


一只名叫tom的猫
浏览 215回答 2
2回答

12345678_0001

此代码按预期工作。说明http.MaxBytesReaderMaxBytesReader 类似于 io.LimitReader 但旨在限制传入请求正文的大小。与 io.LimitReader 不同,MaxBytesReader 的结果是 ReadCloser,对于超出限制的 Read 返回非 EOF 错误,并在调用其 Close 方法时关闭底层读取器。MaxBytesReader 防止客户端意外或恶意发送大请求并浪费服务器资源。您可以使用io.LimitReader仅读取 N 个字节,然后自行处理 HTTP 请求。

繁星淼淼

强制客户端停止发送数据的唯一方法是强行关闭连接,这就是您正在使用的http.MaxBytesReader.您可以使用io.LimitReader包装在 a 中的ioutil.NopCloser,并将错误状态通知客户端。然后您可以检查更多数据,并尝试将连接排空到另一个限制以保持打开状态。但是,MaxBytesReader在这种情况下,未正确响应的客户端也可能无法正常工作。处理此类事情的优雅方式是使用Expect: 100-continue,但这仅适用于 Web 浏览器以外的客户端。
随时随地看视频慕课网APP

相关分类

Go
我要回答