io.Copy
對目標io.Writer
調用Write
。 http.ResponseWriter
的對Write
方法文檔指定此行爲:
// Write writes the data to the connection as part of an HTTP reply.
// If WriteHeader has not yet been called, Write calls WriteHeader(http.StatusOK)
// before writing the data. If the Header does not contain a
// Content-Type line, Write adds a Content-Type set to the result of passing
// the initial 512 bytes of written data to DetectContentType.
Write([]byte) (int, error)
這意味着它會先調用WriteHeader
:
// WriteHeader sends an HTTP response header with status code.
// If WriteHeader is not called explicitly, the first call to Write
// will trigger an implicit WriteHeader(http.StatusOK).
// Thus explicit calls to WriteHeader are mainly used to
// send error codes.
WriteHeader(int)
所以,是的,如果你的硬盤是Write
操作過程中失敗的somewhen你「 d已經寫了一個200 OK
響應,但是,如果您的響應指定了Content-Length
,那麼當您的響應長度不匹配時,客戶端就會知道有問題。
對於HTTP 1.1和分塊傳輸編碼,理論上可以在HTTP預告片中的響應之後指定失敗標頭。遺憾的是,當前最常用的Web瀏覽器不支持HTTP預告片。
@OneOfOne的貢獻:io.Copy
的錯誤不會指定哪一端失敗;如果服務器或客戶端。
因此,我們不能指出err應該被記錄爲4xx或5xx,對吧?
如果您正在記錄HTTP狀態標題,然後記錄您發送客戶端作爲響應;不是它應該的。
您還應該考慮使用'http.ServeFile'來返回內容。如果你出於某種原因不能,或者如果它奇蹟般地超過了你的需要,那麼就如何實施它。您可以看到它如何處理錯誤問題並將該處理複製到您的代碼中 - 假設您不能自己使用「ServeFile」。 – 2014-09-30 02:07:14