Sto creando un server Go test HTTP e sto inviando un'intestazione di risposta di Transfer-Encoding: chunked in modo da poter inviare continuamente nuovi dati mentre lo recupero. Questo server dovrebbe scrivere un chunk su questo server ogni secondo. Il cliente dovrebbe essere in grado di riceverli su richiesta.Invia una risposta HTTP Chunked da un server Go
Sfortunatamente, il client (arricciatura in questo caso), riceve tutti i pezzi alla fine della durata, 5 secondi, invece di ricevere un pezzo ogni secondo. Inoltre, Go sembra inviare il Content-Length per me. Voglio inviare il Content-Length, alla fine, e voglio che il valore del colpo di testa di essere 0.
Ecco il codice del server:
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 del team Go postato qualcosa di simile l'altro giorno ... cercherò di trovarlo per voi. –
Ci scusiamo, non è esattamente la stessa cosa: dal client alla fine della richiesta. Tuttavia, potresti imparare qualcosa da questo: https://github.com/nf/dl/blob/master/dl.go –