diff --git a/server.go b/server.go index c98d2b1..d2944a1 100644 --- a/server.go +++ b/server.go @@ -150,8 +150,12 @@ func (srv *Server) Listen() (net.Listener, error) { } ln = listener[0] } else { + network, name := "tcp", srv.Addr + if strings.HasPrefix(name, "unix:") { + network, name = "unix", name[5:] + } var err error - ln, err = net.Listen("tcp", srv.Addr) + ln, err = net.Listen(network, name) if err != nil { return nil, err } diff --git a/server_test.go b/server_test.go index d36446a..e0d5f10 100644 --- a/server_test.go +++ b/server_test.go @@ -5,8 +5,10 @@ package httpx_test import ( "crypto/tls" + "io/ioutil" "net" "net/http" + "os" "testing" "github.com/bojanz/httpx" @@ -97,4 +99,21 @@ func TestServer_Listen(t *testing.T) { if err != nil { t.Errorf("unexpected error %v", err) } + + // Name of a non existing file + fh, err := ioutil.TempFile("", "server-*.unix") + if err != nil { + t.Skip(err) + } + fh.Close() + // Race condition: if the file is created between Remove and Listen, we fail. + os.Remove(fh.Name()) + server = httpx.NewServer("unix:"+fh.Name(), http.DefaultServeMux) + ln, err = server.Listen() + if _, ok := ln.(*net.UnixListener); !ok { + t.Errorf("got %T, want *net.UnixListener", ln) + } + if err != nil { + t.Errorf("unexpected error %+v", err) + } }