La lecture du corps de http.Demande sans modification de la demande de l'état?

J'ai un type de mise en œuvre de la http.Handler interface où, dans son ServeHTTP méthode, les requêtes HTTP entrantes sont inspectés, certaines mesures sont prises, puis les demandes sont transmises à un serveur proxy inverse gestionnaire (httputil.NewSingleHostReverseProxy).

Cela fonctionne très bien, aussi longtemps que je suis seule inspection de la demande de base des propriétés, telles que l'URL ou les en-têtes.

Quand je veux inspecter le corps de la réception d'une requête POST, par exemple en appelant req.ParseForm() et puis, à l'aide de la req.Form bien, je tombe sur une erreur une fois que la demande est transmise sur le reverse proxy:

http: proxy error: http: Request.ContentLength=687 with Body length 0

J'imagine que ce qui se passe parce qu'en regardant le corps de la requête HTTP causes de la req.Body.Reader flux drainés, ce qui signifie qu'il ne peut pas être lu à nouveau par le proxy handler.

J'ai été jouer avec des choses comme io.Copy() et bufio.Peek(), mais je ne suis pas vraiment d'aller n'importe où.

Est-il un moyen de jeter un regard sur le corps de requête HTTP (et l'utilisation de l'intégré dans l'analyse de req.ParseForm etc.), tout en laissant l'original de la demande d'objet dans son état d'origine, de sorte qu'il peut être transmis à la reverse proxy?

  • Avez-vous essayé de remplacer le Body avec un seekable lecteur comme bytes.Reader? Vous pouvez définir Body à chaque valeur qui implémente ReadCloser.
  • Non testé (mais vaut la peine d'essayer): Faire une copie de la Demande au besoin, c'est à dire tous, mais pas le Corps et l' .*Forme. Ensuite, utilisez io.TeeReader cloner Demande.Corps, de l'envelopper dans un NopCloser et des trucs dans le propriétédeepcopy de la demande. Passer la copie en profondeur pour le proxy inverse.