Maison >développement back-end >Golang >Pourquoi mon serveur HTTP Go n'envoie-t-il des données fragmentées qu'après un délai et comment puis-je définir la longueur du contenu sur 0 ?

Pourquoi mon serveur HTTP Go n'envoie-t-il des données fragmentées qu'après un délai et comment puis-je définir la longueur du contenu sur 0 ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-04 08:12:13406parcourir

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

Réponse HTTP fragmentée continue du serveur Go

Dans le but de créer un serveur HTTP Go qui transmet en continu des morceaux de données, vous avez rencontré un défi. Au lieu de recevoir des fragments comme prévu chaque seconde, votre client ne reçoit la réponse complète qu'après une durée de 5 secondes. De plus, vous cherchez à envoyer l'en-tête Content-Length à 0 à la fin de la transmission.

Pour résoudre ce problème, il est essentiel d'intégrer l'interface Flusher dans l'implémentation de votre serveur. Voici une version modifiée de votre 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) {
    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")
}

En appelant Flusher.Flush() après l'écriture de chaque fragment, vous déclenchez l'encodage « fragmenté » et envoyez des fragments individuels. Cela garantit que le client reçoit les données dès qu'elles deviennent disponibles.

La vérification de ce comportement peut être réalisée via telnet, comme démontré ci-dessous :

$ 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

...

Ce code modifié permet d'envoyer une réponse HTTP en bloc continu. depuis votre serveur Go. N'oubliez pas de vérifier que vos ResponseWriters prennent en charge l'accès simultané sur plusieurs goroutines pour des performances optimales.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn