Maison > développement back-end > Golang > Comment puis-je préserver l'intégrité du corps de la requête HTTP lors du proxy inverse ?

Comment puis-je préserver l'intégrité du corps de la requête HTTP lors du proxy inverse ?

Linda Hamilton
Libérer: 2024-12-16 04:28:21
original
442 Les gens l'ont consulté

How Can I Preserve HTTP Request Body Integrity When Reverse Proxying?

Préserver l'intégrité du corps de la requête HTTP pour le proxy inverse

Problème :

Dans un gestionnaire HTTP personnalisé implémentant la méthode ServeHTTP, l'inspection du corps des requêtes POST entrantes à l'aide de req.ParseForm() provoque une erreur lorsque la requête est transmise à un proxy inverse. Cela se produit parce que la lecture du corps draine le flux req.Body.Reader, ne laissant rien aux consommateurs suivants.

Solution :

Pour conserver l'état de la demande d'origine tout en examinant le body, envisagez la technique suivante :

  1. Lisez le corps de la requête dans un tampon en utilisant io.ReadAll(r.Body).
  2. Créez deux nouveaux lecteurs, rdr1 et rdr2, sauvegardés par le tampon en utilisant io.NopCloser(bytes.NewBuffer(buf)).
  3. Utilisez rdr1 pour inspectez le corps et effectuez les actions souhaitées.
  4. Réinitialisez r.Body sur rdr2 pour conserver la demande d'origine état pour le proxy inverse.

Exemple de code :

buf, _ := io.ReadAll(r.Body)
rdr1 := io.NopCloser(bytes.NewBuffer(buf))
rdr2 := io.NopCloser(bytes.NewBuffer(buf))

doStuff(rdr1)
r.Body = rdr2 // Resets the request body without consuming any data
Copier après la connexion

Remarque :

bytes.Buffer n'implémente pas l'interface io.ReadCloser en raison de l'absence de méthode Close() ; par conséquent, chaque lecteur est enveloppé dans io.NopCloser.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal