>백엔드 개발 >Golang >My Go HTTP 서버가 청크 응답을 점진적으로 보내지 않는 이유는 무엇입니까?

My Go HTTP 서버가 청크 응답을 점진적으로 보내지 않는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-09 09:21:09160검색

Why Doesn't My Go HTTP Server Send Chunked Responses Progressively?

Go 서버의 HTTP 청크 응답

이 시나리오에서는 청크 HTTP 응답을 보내는 Go HTTP 서버를 만드는 것을 목표로 합니다. 전송 인코딩이 "청크"로 설정되었습니다. 서버는 클라이언트가 요청 시 청크를 수신할 수 있도록 1초 간격으로 청크를 작성하려고 합니다. 그러나 현재 구현은 문제에 직면합니다.

  1. 클라이언트가 의도한 대로 점진적으로 수신하는 대신 모든 청크를 한 번에 수신합니다.
  2. Content-Length 헤더는 Go에 의해 자동으로 설정됩니다. 0이 되기를 원하며 마지막에 추가합니다.

서버 코드

제공된 서버 코드는 다음과 같습니다.

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")
}

해결 방법

문제 해결 방법:

  1. http.ResponseWriter에 의해 구현된 "Flusher" 인터페이스를 사용하면 호출을 통해 청크 전송을 트리거할 수 있습니다. Flush() 함수. 각 청크가 작성된 후 이를 추가하면 클라이언트가 준비된 청크를 수신할 수 있습니다.
  2. Transfer-Encoding 헤더는 HTTP 작성자에 의해 자동으로 관리되므로 명시적으로 설정할 필요가 없습니다.

수정됨 코드

import (
  "fmt"
  "io"
  "log"
  "net/http"
  "time"
)

func main() {
  http.HandleFunc("/", func(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")
    for i := 1; i <= 10; i++ {
      fmt.Fprintf(w, "Chunk #%d\n", i)
      flusher.Flush() // Trigger "chunked" encoding and send a chunk...
      time.Sleep(500 * time.Millisecond)
    }
  })

  log.Print("Listening on localhost:8080")
  log.Fatal(http.ListenAndServe(":8080", nil))
}

확인

텔넷을 사용하여 서버에 연결합니다.

$ telnet localhost 8080
...
HTTP/1.1 200 OK
Date: ...
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked

9
Chunk #1

9
Chunk #2

...

각 청크는 다음과 같이 점진적으로 수신됩니다. 서버에서 보냅니다.

위 내용은 My Go HTTP 서버가 청크 응답을 점진적으로 보내지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.