2017-05-04 4 views
0

ファイルをアップロードするときにファイルサイズの制限を実装しようとしています。次のコードは、ファイル(または要求本体ですが、私の目的に十分近い)が1 MBを超えると正しく検出します。しかし、この場合は、カスタムエラーメッセージが表示されたページではなく、「接続がリセットされました」ページが返されます。ファイルが1 MB未満の場合は、「ファイルアップロードOK」というページが正しく表示されます。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に設定されます。関連するすべてのコードは、このフィールドの近くの使用です。