Maison > développement back-end > Golang > Comment puis-je inspecter le corps d'une requête HTTP sans perdre de données pour les gestionnaires suivants ?

Comment puis-je inspecter le corps d'une requête HTTP sans perdre de données pour les gestionnaires suivants ?

Linda Hamilton
Libérer: 2024-12-25 01:27:14
original
496 Les gens l'ont consulté

How Can I Inspect an HTTP Request Body Without Losing Data for Subsequent Handlers?

Préserver l'état de la requête lors de l'inspection du corps avec HTTP.Handler

Dans le contexte de l'implémentation d'un gestionnaire HTTP, accéder au corps de la requête à l'aide de méthodes telles que req.ParseForm() peut créer un dilemme. Bien qu'une telle inspection soit souvent nécessaire, elle peut épuiser le flux corporel de la requête, le rendant inutilisable pour les gestionnaires ultérieurs (par exemple, les proxys inverses).

Le problème : le flux corporel drainé

Lorsque le corps de la requête est consommé par l'appel de méthodes telles que req.ParseForm(), le flux req.Body.Reader est vidé, ne laissant aucune donnée restante pour l'aval. gestionnaires. Cela entraîne des erreurs lors du transfert par proxy, car la longueur attendue du corps de la requête ne correspond plus à l'état épuisé.

La solution : diviser le flux de corps

Pour surmonter ce défi , une technique impliquant une couche tampon peut être utilisée. En lisant le corps de la requête dans un tampon et en utilisant ce tampon pour créer plusieurs nouveaux lecteurs, nous pouvons séparer l'inspection du flux du corps d'origine.

Étapes :

  1. Lisez le corps de la requête d'origine dans un tampon à l'aide de io.ReadAll(r.Body).
  2. Créez deux nouveaux lecteurs à partir du buffer.
  3. Utilisez un nouveau lecteur pour effectuer une inspection du corps (par exemple, doStuff(rdr1)).
  4. Attribuez le deuxième nouveau lecteur à r.Body, en préservant l'état d'origine pour les versions ultérieures. gestionnaires.

Exemple :

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

doStuff(rdr1)
r.Body = rdr2
Copier après la connexion

Avantages :

  1. Demande de réserves État : Le corps de la demande d'origine reste intact pour les gestionnaires.
  2. Prend en charge l'analyse du corps : Les méthodes d'inspection telles que req.ParseForm() peuvent être utilisées sur le lecteur séparé sans affecter l'état de la demande.
  3. Prend en charge les gestionnaires personnalisés. Traitement du corps : Le lecteur séparé permet une manipulation personnalisée du corps sans interférer avec les opérations en aval.

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