php - Socket accepte une requête http. Où peut-on déterminer la fin de la requête par lecture ?
三叔
三叔 2017-07-03 11:40:16
0
1
1043

Je souhaite créer un gadget proxy http en utilisant go :

   func main() {
        listener, err := net.Listen("tcp", ":8080")
        if err != nil {
            log.Panic(err)
        }
        for {
            client, err := listener.Accept()
            if err != nil {
                log.Panic(err)
            }
            go handleClientRequest(client)
        }
    }
    
    func handleClientRequest(client net.Conn) {
        if client == nil {
            return
        }
        defer client.Close()
    
        var buf [1024]byte
        n, err := client.Read(buf[:])
        if err != nil {
            log.Println(err)
            return
        }
        fmt.Println("recv msg:", string(buf[0:n]))
    }

1024 octets ne suffisent peut-être pas, il doit y avoir une marque de fin, non ?

三叔
三叔

répondre à tous(1)
三叔

Le protocole HTTP est basé sur le protocole TCP. Lorsque le navigateur a besoin d'obtenir des données de page Web auprès du serveur, il émet une requête HTTP. Http établira un canal de connexion au serveur via TCP Lorsque les données requises pour cette demande seront complétées, Http déconnectera immédiatement la connexion TCP

.

Le protocole TCP libère la connexion en envoyant le paquet FIN, le paquet FIN est donc la marque de fin, ce qui signifie qu'il est reçu jusqu'à ce que la connexion soit déconnectée.

Mais

Au fil du temps, la page HTML devient plus complexe et de nombreuses images peuvent y être intégrées. À l'heure actuelle, il est inefficace d'établir une connexion TCP à chaque fois pour accéder à l'image. C'est pourquoi Keep-Alive a été proposé pour résoudre le problème de la faible efficacité. À partir de HTTP/1.1, Keep-Alive est activé par défaut pour conserver la fonctionnalité de connexion. En termes simples, lorsqu'une page Web est ouverte, la connexion TCP utilisée pour transmettre les données HTTP entre le client et le serveur ne sera pas fermée. client Lorsque vous visitez à nouveau la page Web sur ce serveur, vous continuerez à utiliser cette connexion établie. Keep-Alive ne maintient pas la connexion en permanence. Il a une durée de rétention qui peut être définie dans différents logiciels serveur (tels qu'Apache). Bien que la connexion TCP soit maintenue ici pendant un certain temps, cette durée est limitée et sera toujours fermée à ce moment-là, nous la considérons donc également comme une fermeture après chaque connexion terminée.

Alors comment juger la fin après avoir activé Keep-Alive ?
En fait, l'en-tête HTTP a une longueur de contenu, qui correspond à la longueur du corps du paquet HTTP

Bien sûr, il existe également un cas où il n'y a pas de longueur de contenu, c'est-à-dire qu'un codage en bloc est utilisé. Les données sont divisées en une série de blocs et envoyées, et chaque bloc a une description de taille. Même si le serveur ne connaît pas la taille de l'entité entière lors de la génération de l'en-tête (généralement parce que l'entité est générée dynamiquement), le codage en fragments peut toujours être utilisé pour transmettre un certain nombre de fragments de taille connue.

L'encodage utilise plusieurs Chunks et se termine par un chunk marqué d'une longueur de 0. Chaque Chunk est constitué de deux parties. La première partie est la longueur et l'unité de longueur du Chunk (généralement non écrite), et la seconde partie précise la longueur. longueur. Contenu, chaque partie est séparée par CRLF (nom complet retour chariot
saut de ligne retour chariot/saut de ligne). Le contenu du dernier morceau de longueur 0 est appelé pied de page, qui contient des informations d'en-tête supplémentaires (qui peuvent généralement être ignorées directement).

De plus, l'en-tête et le corps du message HTTP sont séparés par CRLF (retour chariot et saut de ligne), rnrn

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal