> 백엔드 개발 > Golang > My Go HTTP 서버가 지연 후에 청크 데이터만 보내는 이유는 무엇이며, Content-Length를 0으로 설정하려면 어떻게 해야 합니까?

My Go HTTP 서버가 지연 후에 청크 데이터만 보내는 이유는 무엇이며, Content-Length를 0으로 설정하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2024-12-04 08:12:13
원래의
426명이 탐색했습니다.

Why Does My Go HTTP Server Only Send Chunked Data After a Delay, and How Can I Set Content-Length to 0?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿