2017-05-04 334 views
0

我想在上傳文件時對文件大小實施限制。下面的代碼在文件(或者說請求主體,但足夠接近我的目的)大於1 MB時正確檢測。如果是這種情況,則返回的頁面是「連接已重置」頁面,而不是包含我自定義錯誤消息的頁面。如果該文件低於1 MB,我會正確地獲得一個頁面,指出「文件上傳正常」。Go http.MaxBytesReader重置連接

我想知道爲什麼服務器連接重置,而不是服務於我在下面的代碼中指定的一些指針。

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

回答

0

服務器確實寫入響應。問題是客戶端不讀取響應。

當MaxBytesReader限制被破壞時,服務器停止從客戶端讀取數據。此外,服務器在將響應寫入客戶端後半秒完全關閉連接。

許多HTTP客戶端在讀取響應之前寫入完整的請求主體,並在寫入請求主體時發生任何錯誤時停止寫入。當請求主體足夠大並且忽略服務器寫入的響應時,這些客戶端報告「連接重置」錯誤等。

服務器代碼指針:當MaxBytesReader限制被破壞時,響應的requestBodyLimitHit字段被設置爲true。所有相關的代碼都是該領域的近用途。