为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
一只名叫tom的猫 2021-12-07 18:27:54
我有一个简单的多部分表单,可以上传到 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.    } }  每当上传超过最大大小时,我都会重置连接,如下所示:然而代码继续执行。我似乎无法向用户提供任何反馈。我宁愿说“您已超出大小限制”,而不是切断连接。这可能吗?
查看完整描述

2 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

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

MaxBytesReader 类似于 io.LimitReader 但旨在限制传入请求正文的大小。与 io.LimitReader 不同,MaxBytesReader 的结果是 ReadCloser,对于超出限制的 Read 返回非 EOF 错误,并在调用其 Close 方法时关闭底层读取器。

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

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


查看完整回答
反对 回复 2021-12-07
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

强制客户端停止发送数据的唯一方法是强行关闭连接,这就是您正在使用的http.MaxBytesReader.

您可以使用io.LimitReader包装在 a 中的ioutil.NopCloser,并将错误状态通知客户端。然后您可以检查更多数据,并尝试将连接排空到另一个限制以保持打开状态。但是,MaxBytesReader在这种情况下,未正确响应的客户端也可能无法正常工作。

处理此类事情的优雅方式是使用Expect: 100-continue,但这仅适用于 Web 浏览器以外的客户端。


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信