Les gestionnaires CONNECT de Node.js doivent préserver le tampon head
Gérez le socket CONNECT et le tampon head de Node à la frontière entre HTTP et tunnel, en préservant les octets déjà lus au-delà des en-têtes.
Un serveur HTTP Node traite une requête proxy ordinaire via son rappel de requête. CONNECT emprunte un autre chemin : le serveur émet connect avec la requête, le socket client et un tampon head.
Cet événement est la remise entre l'analyse HTTP et un tunnel. Il n'y a pas d'objet ServerResponse ordinaire à réutiliser pour le trafic tunnellisé.
| Argument | Ce qu'il transporte |
|---|---|
req | La requête CONNECT, y compris son autorité de destination et ses en-têtes |
clientSocket | La connexion vers le client |
head | Les données de tunnel que Node a déjà lues au-delà des en-têtes HTTP, éventuellement vides |
Terminez la décision HTTP avant de relayer les octets
Validez l'hôte et le port demandés, appliquez la politique d'accès et d'authentification du proxy, puis établissez la connexion amont. CONNECT identifie une autorité comme service.example:443 ; analysez cette forme en tenant compte des autorités IPv6 plutôt que de découper aveuglément à chaque deux-points.
Lorsque le tunnel est accepté, envoyez la réponse HTTP réussie suivie de sa ligne vide terminale. Transmettez ensuite les éventuels octets head en amont avant de poursuivre avec les octets suivants du socket client. Attacher un nouvel écouteur de données ne peut pas récupérer un tampon déjà remis séparément au gestionnaire.
L'exemple officiel de tunnel de Node effectue cette remise avec serverSocket.write(head) avant de connecter les deux directions de flux. Son petit exemple illustre la transition ; un proxy déployé a aussi besoin de tentatives de connexion bornées, de contrôles d'accès et d'une gestion du cycle de vie.
Après le succès, les octets appartiennent au protocole du service
Une réponse CONNECT réussie transforme la connexion en flux d'octets. Si la cible est un site HTTPS, son échange TLS circule à l'intérieur de ce flux. Le simple tunnelage n'exige pas que le proxy délivre un certificat de site de remplacement.
Avant d'accepter CONNECT, une erreur HTTP peut expliquer le refus. Après acceptation, écrire un HTTP 500 dans le flux injecterait des octets dans le protocole tunnellisé. Terminez ou détruisez plutôt les connexions appropriées lors d'échecs ultérieurs.
Connectez les deux directions avec gestion de flux consciente de la contre-pression, et décidez comment les événements end, error et close terminent le pair. Préservez le tampon head initial dans le même modèle de propriété ; ce sont des données applicatives, pas des en-têtes HTTP superflus à jeter.