here is my code, when origin server return 302, reverse proxy will modify the request and serve it again, but if the request with a body, it print an error: http: invalid Read on closed Body
proxy = httputil.NewSingleHostReverseProxy(url)
proxy.ErrorLog = proxyLogger
proxy.ModifyResponse = func(response *http.Response) error {
if response.StatusCode > 300 && response.StatusCode < 400 {
location, err := response.Location()
if err != nil {
return err
}
return &RedirectErr{location: location}
}
return nil
}
var rewindBody func(r *http.Request)
proxy.Director = func(request *http.Request) {
if redirect := request.Header.Get("redirect"); redirect != "" {
request.Header.Del("redirect")
u, _ := urlpkg.Parse(redirect)
rewriteRequestURL(request, u)
return
}
rewriteRequestURL(request, url)
}
proxy.ErrorHandler = func(writer http.ResponseWriter, request *http.Request, err error) {
var redirect *RedirectErr
if redirect, ok = err.(*RedirectErr); !ok {
proxy.ErrorLog.Printf("http: proxy error: %v", err)
writer.WriteHeader(http.StatusBadGateway)
} else {
request.Header.Set("redirect", redirect.location.String())
proxy.ServeHTTP(writer, request)
return
}
}
I try to use fakeCloseReadCloser, but it comes new error: "error: net/http: HTTP/1.x transport connection broken: http: ContentLength=75 with Body length 0"