1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2025-03-10 13:38:20 +00:00
mycorrhiza/httpd.go
novenary 0f7525a23c
Don't exit when removing socket fails (#260)
Prior to migrating to slog, errors when removing the socket were
ignored.
This is fine and desirable: the most likely error condition is that the
socket did not exist in the first place. Exiting on error in that case
effectively prevents Mycorrhiza to be used with unix sockets.
If the removal fails for another reason, then starting the server will
fail, so logging a warning is sufficient for troubleshooting.
2024-12-12 00:20:24 +03:00

72 lines
1.5 KiB
Go

package main
import (
"errors"
"log/slog"
"net"
"net/http"
"os"
"strings"
"time"
"github.com/bouncepaw/mycorrhiza/internal/cfg"
)
func serveHTTP(handler http.Handler) (err error) {
server := &http.Server{
ReadTimeout: 300 * time.Second,
WriteTimeout: 300 * time.Second,
IdleTimeout: 300 * time.Second,
Handler: handler,
}
if strings.HasPrefix(cfg.ListenAddr, "/") {
err = startUnixSocketServer(server, cfg.ListenAddr)
} else {
server.Addr = cfg.ListenAddr
err = startHTTPServer(server)
}
return err
}
func startUnixSocketServer(server *http.Server, socketPath string) error {
err := os.Remove(socketPath)
if err != nil {
slog.Warn("Failed to clean up old socket", "err", err)
}
listener, err := net.Listen("unix", socketPath)
if err != nil {
slog.Error("Failed to start the server", "err", err)
return err
}
defer func(listener net.Listener) {
_ = listener.Close()
}(listener)
if err := os.Chmod(socketPath, 0666); err != nil {
slog.Error("Failed to set socket permissions", "err", err)
return err
}
slog.Info("Listening Unix socket", "addr", socketPath)
if err := server.Serve(listener); !errors.Is(err, http.ErrServerClosed) {
slog.Error("Failed to start the server", "err", err)
return err
}
return nil
}
func startHTTPServer(server *http.Server) error {
slog.Info("Listening over HTTP", "addr", server.Addr)
if err := server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) {
slog.Error("Failed to start the server", "err", err)
return err
}
return nil
}