I have a type implementing the http.Handler
interface where, in its ServeHTTP
method, incoming HTTP requests are inspected, some action is taken, and then the requests are forwarded to a reverse proxy handler (httputil.NewSingleHostReverseProxy
).
This works fine, so long as I'm only inspecting the basic request properties, such as the URL or headers.
When I want to inspect the body of an incoming POST request, e.g. by calling req.ParseForm()
and then using the req.Form
property, I run into an error once the request is passed onto the reverse proxy:
http: proxy error: http: Request.ContentLength=687 with Body length 0
I imagine this happens because looking at the body of the HTTP request causes the req.Body.Reader
stream to be drained, meaning it cannot be read again by the proxy handler.
I've been playing with things like io.Copy()
and bufio.Peek()
, but I'm not really getting anywhere.
Is there a way to peek at the HTTP request body (and use the built-in parsing of req.ParseForm
etc.), while leaving the original request object in its original state, so that it can be passed to the reverse proxy?