diff --git a/cmd/dwelling-files/main.go b/cmd/dwelling-files/main.go index 7bd37bc..857f576 100644 --- a/cmd/dwelling-files/main.go +++ b/cmd/dwelling-files/main.go @@ -7,10 +7,8 @@ import ( "fmt" "log" "net/http" - "net/netip" "os" "os/signal" - "strings" "syscall" "git.arav.su/Arav/httpr" @@ -32,23 +30,6 @@ func main() { return } - var network string - if !strings.ContainsRune(*listenAddress, ':') { - network = "unix" - defer os.Remove(*listenAddress) - } else { - ap, err := netip.ParseAddrPort(*listenAddress) - if err != nil { - log.Fatalln(err) - } - - if ap.Addr().Is4() { - network = "tcp4" - } else if ap.Addr().Is6() { - network = "tcp6" - } - } - hand := dwhttp.New(directoryPath, !*enableFileHandler) r := httpr.New() @@ -58,7 +39,7 @@ func main() { r.Handler(http.MethodGet, "/", hand.Index) srv := dwhttp.NewHttpServer(r) - if err := srv.Start(network, *listenAddress); err != nil { + if err := srv.Start(*listenAddress); err != nil { log.Fatalln(err) } diff --git a/internal/http/http.go b/internal/http/http.go index 7a82e8b..477e662 100644 --- a/internal/http/http.go +++ b/internal/http/http.go @@ -5,12 +5,15 @@ import ( "log" "net" "net/http" + "net/netip" "os" + "strings" "time" ) type HttpServer struct { - s http.Server + s http.Server + addr net.Addr } func NewHttpServer(r http.Handler) *HttpServer { @@ -20,7 +23,23 @@ func NewHttpServer(r http.Handler) *HttpServer { Handler: r}} } -func (s *HttpServer) Start(network, address string) error { +func (s *HttpServer) Start(address string) error { + var network string + if !strings.ContainsRune(address, ':') { + network = "unix" + } else { + ap, err := netip.ParseAddrPort(address) + if err != nil { + return err + } + + if ap.Addr().Is4() { + network = "tcp4" + } else if ap.Addr().Is6() { + network = "tcp6" + } + } + listener, err := net.Listen(network, address) if err != nil { return err @@ -30,6 +49,8 @@ func (s *HttpServer) Start(network, address string) error { os.Chmod(address, 0777) } + s.addr = listener.Addr() + go func() { if err = s.s.Serve(listener); err != nil && err != http.ErrServerClosed { log.Fatalln(err) @@ -43,6 +64,10 @@ func (s *HttpServer) Stop() error { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() + if s.addr.Network() == "unix" { + defer os.Remove(s.addr.String()) + } + if err := s.s.Shutdown(ctx); err != nil { return err }