Go 서버의 지속적인 청크 HTTP 응답
지속적으로 데이터 청크를 전송하는 Go HTTP 서버를 만들기 위한 노력의 일환으로 난관에 봉착했습니다. 클라이언트는 매초 의도한 대로 청크를 수신하는 대신 5초 후에 전체 응답만 수신합니다. 또한 전송이 끝날 때 Content-Length 헤더를 0으로 보내려고 합니다.
이 문제를 해결하려면 Flusher 인터페이스를 서버 구현에 통합하는 것이 중요합니다. 코드의 수정된 버전은 다음과 같습니다.
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) { flusher, ok := w.(http.Flusher) if !ok { panic("expected http.ResponseWriter to be an http.Flusher") } 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) flusher.Flush() } }() time.Sleep(time.Second * 5) ticker.Stop() fmt.Println("Finished: should return Content-Length: 0 here") w.Header().Set("Content-Length", "0") }
각 청크가 작성된 후 Flusher.Flush()를 호출하면 "청크" 인코딩을 트리거하고 개별 청크를 보낼 수 있습니다. 이렇게 하면 클라이언트가 데이터를 사용할 수 있을 때 수신할 수 있습니다.
아래 설명된 것처럼 텔넷을 통해 이 동작을 확인할 수 있습니다.
$ telnet localhost 8080 Trying ::1... Connected to localhost. Escape character is '^]'. GET / HTTP/1.1 HTTP/1.1 200 OK Date: Tue, 02 Jun 2015 18:16:38 GMT Content-Type: text/plain; charset=utf-8 Transfer-Encoding: chunked 9 Chunk #1 9 Chunk #2 ...
이 수정된 코드를 사용하면 연속 청크 HTTP 응답을 보낼 수 있습니다. Go 서버에서. 최적의 성능을 위해 ResponseWriter가 여러 고루틴에 걸쳐 동시 액세스를 지원하는지 확인하세요.
위 내용은 My Go HTTP 서버가 지연 후에 청크 데이터만 보내는 이유는 무엇이며, Content-Length를 0으로 설정하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!