mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-27 06:03:48 +03:00
reverseproxy: Keep path to unix socket as dial address (#4232)
This commit is contained in:
parent
42e140b1b2
commit
d882211080
2 changed files with 56 additions and 1 deletions
|
@ -436,3 +436,57 @@ func TestReverseProxyHealthCheckUnixSocket(t *testing.T) {
|
||||||
|
|
||||||
tester.AssertGetResponse("http://localhost:9080/", 200, "Hello, World!")
|
tester.AssertGetResponse("http://localhost:9080/", 200, "Hello, World!")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReverseProxyHealthCheckUnixSocketWithoutPort(t *testing.T) {
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
t.SkipNow()
|
||||||
|
}
|
||||||
|
tester := caddytest.NewTester(t)
|
||||||
|
f, err := ioutil.TempFile("", "*.sock")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("failed to create TempFile: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// a hack to get a file name within a valid path to use as socket
|
||||||
|
socketName := f.Name()
|
||||||
|
os.Remove(f.Name())
|
||||||
|
|
||||||
|
server := http.Server{
|
||||||
|
Handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||||
|
if strings.HasPrefix(req.URL.Path, "/health") {
|
||||||
|
w.Write([]byte("ok"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Write([]byte("Hello, World!"))
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
unixListener, err := net.Listen("unix", socketName)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("failed to listen on the socket: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
go server.Serve(unixListener)
|
||||||
|
t.Cleanup(func() {
|
||||||
|
server.Close()
|
||||||
|
})
|
||||||
|
runtime.Gosched() // Allow other goroutines to run
|
||||||
|
|
||||||
|
tester.InitServer(fmt.Sprintf(`
|
||||||
|
{
|
||||||
|
http_port 9080
|
||||||
|
https_port 9443
|
||||||
|
}
|
||||||
|
http://localhost:9080 {
|
||||||
|
reverse_proxy {
|
||||||
|
to unix/%s
|
||||||
|
|
||||||
|
health_path /health
|
||||||
|
health_interval 2s
|
||||||
|
health_timeout 5s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`, socketName), "caddyfile")
|
||||||
|
|
||||||
|
tester.AssertGetResponse("http://localhost:9080/", 200, "Hello, World!")
|
||||||
|
}
|
||||||
|
|
|
@ -189,13 +189,14 @@ func (h *Handler) doActiveHealthCheckForAllHosts() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
hostAddr := addr.JoinHostPort(0)
|
hostAddr := addr.JoinHostPort(0)
|
||||||
|
dialAddr := hostAddr
|
||||||
if addr.IsUnixNetwork() {
|
if addr.IsUnixNetwork() {
|
||||||
// this will be used as the Host portion of a http.Request URL, and
|
// this will be used as the Host portion of a http.Request URL, and
|
||||||
// paths to socket files would produce an error when creating URL,
|
// paths to socket files would produce an error when creating URL,
|
||||||
// so use a fake Host value instead; unix sockets are usually local
|
// so use a fake Host value instead; unix sockets are usually local
|
||||||
hostAddr = "localhost"
|
hostAddr = "localhost"
|
||||||
}
|
}
|
||||||
err = h.doActiveHealthCheck(DialInfo{Network: addr.Network, Address: hostAddr}, hostAddr, upstream.Host)
|
err = h.doActiveHealthCheck(DialInfo{Network: addr.Network, Address: dialAddr}, hostAddr, upstream.Host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.HealthChecks.Active.logger.Error("active health check failed",
|
h.HealthChecks.Active.logger.Error("active health check failed",
|
||||||
zap.String("address", hostAddr),
|
zap.String("address", hostAddr),
|
||||||
|
|
Loading…
Reference in a new issue