Closed
Description
What version of Go are you using (go version
)?
$ go version go version go1.18beta1 darwin/amd64
Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (go env
)?
go env
Output
$ go env GO111MODULE="on" GOARCH="amd64" GOBIN="" GOCACHE="/Users/noahkreiger/Library/Caches/go-build" GOENV="/Users/noahkreiger/Library/Application Support/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOINSECURE="" GOMODCACHE="/Users/noahkreiger/go/pkg/mod" GONOPROXY="github.com/nkreiger" GONOSUMDB="github.com/nkreiger" GOOS="darwin" GOPATH="/Users/noahkreiger/go" GOPRIVATE="github.com/nkreiger" GOPROXY="https://proxy.golang.org,direct" GOROOT="/Users/noahkreiger/go/go1.18beta1" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/Users/noahkreiger/go/go1.18beta1/pkg/tool/darwin_amd64" GOVCS="" GOVERSION="go1.18beta1" GCCGO="gccgo" GOAMD64="v1" AR="ar" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="/dev/null" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="-Wno-error -Wno-nullability-completeness -Wno-expansion-to-defined -Wbuiltin-requires-header" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/4w/ymct9nsd21j2tmf_8k7csf340000gn/T/go-build285603268=/tmp/go-build -gno-record-gcc-switches -fno-common"
What did you do?
Attempted to serve a reverse proxy where the base URL had a RawPath and Path value of ""
, an empty string.
// Serve a reverse proxy for a given url
func serveReverseProxy(target string, res http.ResponseWriter, req *http.Request) {
// parse the url
url, _ := url.Parse(target)
// create the reverse proxy
proxy := httputil.NewSingleHostReverseProxy(url)
// Note that ServeHttp is non blocking and uses a go routine under the hood
proxy.ServeHTTP(res, req)
}
target = "http://localhost:808/health"
req.URL.Path = ""
req.URL.RawPath = ""
What did you expect to see?
I expected the new single host reverse proxy to rout the request to http://locahost:8080/health
What did you see instead?
It was routed to http://localhost:8080/health/
which causes the route to throw a 404 Not Found because of the extra suffix "/"
Potential Easy Fix
go/src/net/http/httputil/reverseproxy.go
Line 111 in b357b05
it this line to be
case !aslash && !bslash:
if b == "" {
return a
}
return a + "/" + b
}
so if the base path is empty, it just returns the new path passed in instead of appending an extra slash...