去http.MaxBytesReader重置连接

时间:2017-05-04 08:17:39

标签: http go

我正在尝试在上传文件时对文件大小实施限制。以下代码正确检测文件(或更确切地说是请求正文,但足够接近我的目的)大于1 MB。但是,如果是这种情况,则返回的页面为"连接已重置"页面,而不是包含我的自定义错误消息的页面。如果文件小于1 MB我正确地得到一个页面说"文件上传OK"。

我想知道为什么重置与服务器的连接而不是提供我在下面的代码中指定的内容的一些指示。

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)
}

1 个答案:

答案 0 :(得分:3)

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

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

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

服务器代码指针:当违反MaxBytesReader限制时,响应的requestBodyLimitHit字段设置为true。所有相关代码都近在咫尺。