1
0
mirror of https://github.com/drakkan/sftpgo.git synced 2025-11-29 22:08:10 +02:00

httpd: add support for listening over a Unix-domain socket

Fixes #266
This commit is contained in:
Nicola Murino
2020-12-29 19:02:56 +01:00
parent 40e759c983
commit 0966d44c0f
8 changed files with 102 additions and 13 deletions

View File

@@ -18,6 +18,7 @@ import (
"io"
"io/ioutil"
"net"
"net/http"
"os"
"path"
"path/filepath"
@@ -381,3 +382,36 @@ func createDirPathIfMissing(file string, perm os.FileMode) error {
}
return nil
}
// HTTPListenAndServe is a wrapper for ListenAndServe that support both tcp
// and Unix-domain sockets
func HTTPListenAndServe(srv *http.Server, address string, port int, isTLS bool) error {
var listener net.Listener
var err error
if filepath.IsAbs(address) && runtime.GOOS != "windows" {
if !IsFileInputValid(address) {
return fmt.Errorf("invalid socket address %#v", address)
}
err = createDirPathIfMissing(address, os.ModePerm)
if err != nil {
logger.ErrorToConsole("error creating Unix-domain socket parent dir: %v", err)
logger.Error(logSender, "", "error creating Unix-domain socket parent dir: %v", err)
}
os.Remove(address)
listener, err = net.Listen("unix", address)
} else {
listener, err = net.Listen("tcp", fmt.Sprintf("%s:%d", address, port))
}
if err != nil {
return err
}
defer listener.Close()
if isTLS {
return srv.ServeTLS(listener, "", "")
}
return srv.Serve(listener)
}