簡體   English   中英

在HTTP中,HTTP ResponseWriter的寫入函數緩沖區會不會?

[英]Will HTTP ResponseWriter's write function buffer in Go?

假設我們有一個處理HTTP請求的函數,例如:

func handler(w http.ResponseWriter,  r *http.Request) {
    w.Write([]byte("first piece of data"))
    // do something
    w.Write([]byte("second piece of data"))
}  

我想知道如果第一次調用w.Write()被刷新到客戶端?

如果它被刷新,那么我們實際上會對客戶端做兩次響應,這很奇怪,因為我們怎樣才能在第二次寫入調用之前確定Content-Length

如果沒有刷新(比如數據在本地緩沖),那么如果我們在第一次調用時寫入大量數據會怎么樣? (堆棧會溢出嗎?)

任何解釋將不勝感激! :)

我想知道如果第一次調用w.Write()被刷新到客戶端?

net/http的默認ResonseWriter具有(目前4KB)大的輸出在緩沖net.Conn其寫入。 此外,OS通常會緩沖對套接字的寫入。 因此在大多數情況下會發生某種緩沖。

如果它被刷新,那么我們實際上會對客戶端做兩次響應,這很奇怪,因為我們怎樣才能在第二次寫入調用之前確定Content-Length?

那么HTTP 1.1允許持久連接。 此類響應通常不包括Content-Length標頭。 此外,還有HTTP預告片。

如果您的客戶端不支持HTTP 1.1和持久連接,那么它們將具有某種讀取超時,在此期間您可以根據需要多次寫入連接; 這是一個回應。

這與TCP套接字和HTTP實現的本質有關,而不是Go。

如果沒有刷新(比如數據在本地緩沖),那么如果我們在第一次調用時寫入大量數據會怎么樣? (堆棧會溢出嗎?)

不,在堆棧上分配緩沖區是沒有意義的 - 緩沖區的主體將存在於堆上。 如果您達到每進程內存限制,您的應用程序將驚慌失措“內存不足”。

也可以看看:

編輯以在評論中回答您的問題:

Chunked Transfer Encoding是HTTP 1.1規范的一部分,在HTTP 1.0中不受支持。

編輯澄清:

只要您編寫響應的兩個部分所花費的總時間不超過客戶端的讀取超時,並且您沒有指定Content-Length標頭,您只需編寫響應然后關閉連接。 這完全沒問題而不是“hacky”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM