diff options
Diffstat (limited to 'src/server.go')
| -rw-r--r-- | src/server.go | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/src/server.go b/src/server.go index 5757e160..9f1200da 100644 --- a/src/server.go +++ b/src/server.go @@ -46,15 +46,20 @@ type httpServer struct { type listenAddress struct { host string port int + sock string } func (addr listenAddress) IsLocal() bool { - return addr.host == "localhost" || addr.host == "127.0.0.1" + return addr.host == "localhost" || addr.host == "127.0.0.1" || len(addr.sock) > 0 } -var defaultListenAddr = listenAddress{"localhost", 0} +var defaultListenAddr = listenAddress{"localhost", 0, ""} func parseListenAddress(address string) (listenAddress, error) { + if strings.HasSuffix(address, ".sock") { + return listenAddress{"", 0, address}, nil + } + parts := strings.SplitN(address, ":", 3) if len(parts) == 1 { parts = []string{"localhost", parts[0]} @@ -70,7 +75,7 @@ func parseListenAddress(address string) (listenAddress, error) { if len(parts[0]) == 0 { parts[0] = "localhost" } - return listenAddress{parts[0], port}, nil + return listenAddress{parts[0], port, ""}, nil } func startHttpServer(address listenAddress, actionChannel chan []*action, getHandler func(getParams) string) (net.Listener, int, error) { @@ -80,21 +85,32 @@ func startHttpServer(address listenAddress, actionChannel chan []*action, getHan if !address.IsLocal() && len(apiKey) == 0 { return nil, port, errors.New("FZF_API_KEY is required to allow remote access") } - addrStr := fmt.Sprintf("%s:%d", host, port) - listener, err := net.Listen("tcp", addrStr) - if err != nil { - return nil, port, fmt.Errorf("failed to listen on %s", addrStr) - } - if port == 0 { - addr := listener.Addr().String() - parts := strings.Split(addr, ":") - if len(parts) < 2 { - return nil, port, fmt.Errorf("cannot extract port: %s", addr) + + var listener net.Listener + var err error + if len(address.sock) > 0 { + os.Remove(address.sock) + listener, err = net.Listen("unix", address.sock) + if err != nil { + return nil, 0, fmt.Errorf("failed to listen on %s", address.sock) } - var err error - port, err = strconv.Atoi(parts[len(parts)-1]) + } else { + addrStr := fmt.Sprintf("%s:%d", host, port) + listener, err = net.Listen("tcp", addrStr) if err != nil { - return nil, port, err + return nil, port, fmt.Errorf("failed to listen on %s", addrStr) + } + if port == 0 { + addr := listener.Addr().String() + parts := strings.Split(addr, ":") + if len(parts) < 2 { + return nil, port, fmt.Errorf("cannot extract port: %s", addr) + } + var err error + port, err = strconv.Atoi(parts[len(parts)-1]) + if err != nil { + return nil, port, err + } } } |
