Ich erstelle einen Test Go HTTP-Server, und ich sende eine Antwort-Header von Transfer-Encoding: Chunked, damit ich kontinuierlich neue Daten senden kann, wie ich es abrufen. Dieser Server sollte jede Sekunde einen Chunk auf diesen Server schreiben. Der Kunde sollte sie auf Anfrage erhalten können.Senden Sie eine Chunked HTTP-Antwort von einem Go-Server
Leider empfängt der Client (curl in diesem Fall) alle Chunks am Ende der Dauer, 5 Sekunden, anstatt einen Chunk alle eine Sekunde zu empfangen. Außerdem scheint Go die Inhaltslänge für mich zu senden. Ich mag die Content-Length am Ende senden, und ich mag der Wert ist der Header 0.
Hier zu sein, ist der Server-Code:
package main
import (
"fmt"
"io"
"log"
"net/http"
"time"
)
func main() {
http.HandleFunc("/test", HandlePost);
log.Fatal(http.ListenAndServe(":8080", nil))
}
func HandlePost(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Connection", "Keep-Alive")
w.Header().Set("Transfer-Encoding", "chunked")
w.Header().Set("X-Content-Type-Options", "nosniff")
ticker := time.NewTicker(time.Second)
go func() {
for t := range ticker.C {
io.WriteString(w, "Chunk")
fmt.Println("Tick at", t)
}
}()
time.Sleep(time.Second * 5)
ticker.Stop()
fmt.Println("Finished: should return Content-Length: 0 here")
w.Header().Set("Content-Length", "0")
}
Andrew Gerrand des Go-Teams so etwas wie dies neulich geschrieben ... Ich werde versuchen, es für Sie zu finden. –
Entschuldigung, es ist nicht ganz das gleiche - es ist vom Client-Ende der Anfrage. Trotzdem könntest du etwas daraus lernen: https://github.com/nf/dl/blob/master/dl.go –