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
Linda Hamiltonoriginal
2024-12-16 04:28:21445parcourir

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

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!

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