http - 去 http.MaxBytesReader 重置连接

标签 http go

我正在尝试在上传文件时对文件大小实现限制。只要文件(或者更确切地说是请求正文,但对于我的目的而言足够接近)大于 1 MB,以下代码就会正确检测到。但是,如果是这种情况,返回的页面是“连接已重置”页面,而不是带有我的自定义错误消息的页面。如果文件小于 1 MB,我会正确地看到一个页面,显示“文件上传正常”。

我希望得到一些关于为什么重置与服务器的连接而不是提供我在下面的代码中指定的内容的指示。

func baseHandler(writer http.ResponseWriter, request *http.Request) {
    request.Body = http.MaxBytesReader(writer, request.Body, 1024 * 1024)
    _, _, err := request.FormFile("uploadfile")

    if err != nil {
        fmt.Fprintf(writer, "ERROR: %v", err) // Should be displayed in browser, is not
        fmt.Printf("ERROR: %v", err) // Gets written to terminal, so any errors are correctly identified

        return
    }

    fmt.Fprintf(writer, "File upload OK")
}


func main() {
    http.HandleFunc("/", baseHandler)
    http.ListenAndServe(":8080", nil)
}

最佳答案

服务器确实写入了响应。问题是客户端没有读取响应。

当超出 MaxBytesReader 限制时,服务器将停止从客户端读取数据。此外,服务器在将响应写入客户端后半秒完全关闭连接。

许多 HTTP 客户端在读取响应之前写入完整的请求正文,并在写入请求正文时出现任何错误时停止。当请求正文足够大时,这些客户端会报告“连接重置”错误等,并忽略服务器写入的响应。

服务器代码指针:当超出 MaxBytesReader 限制时,响应的 requestBodyLimitHit字段设置为 true。所有相关代码都接近该字段的使用。

关于http - 去 http.MaxBytesReader 重置连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43777433/

相关文章:

http - 在 Go 中使用表单值发出 HTTP GET

docker - 将文件从 Golang 中的 docker 镜像拉取到本地文件系统

Golang 带有接收器的函数映射

http - 如何测试 HTTP 301 重定向?

angularjs - 如何将 eventHandlers 和 uploadEvntHandlers 与 angularjs 1 http 请求一起使用?

go - 有没有办法设置 `mtime`,同时使用 `atime` 模块保留 `os` ?

java - 为什么这段代码在 Go 和 Java 中运行的时间要长得多

go - 在 Go 中获取图像的子图像时遇到问题

http - 发送带参数的GET请求得到301状态码

http - 为什么 cookie 路径区分大小写?