1
0
dwelling-files/internal/http/http.go

77 lines
1.2 KiB
Go
Raw Normal View History

package http
2022-06-27 04:38:09 +04:00
import (
"context"
"log"
"net"
"net/http"
"net/netip"
2022-06-27 04:38:09 +04:00
"os"
"strings"
2022-06-27 04:38:09 +04:00
"time"
)
type HttpServer struct {
s http.Server
addr net.Addr
2022-06-27 04:38:09 +04:00
}
2023-06-13 00:02:41 +04:00
func NewHttpServer(r http.Handler) *HttpServer {
return &HttpServer{s: http.Server{
ReadTimeout: 3 * time.Second,
WriteTimeout: 3 * time.Second,
Handler: r}}
2022-06-27 04:38:09 +04:00
}
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"
}
}
2022-06-27 04:38:09 +04:00
listener, err := net.Listen(network, address)
if err != nil {
return err
}
if listener.Addr().Network() == "unix" {
os.Chmod(address, 0777)
}
s.addr = listener.Addr()
2022-06-27 04:38:09 +04:00
go func() {
2023-06-13 00:02:41 +04:00
if err = s.s.Serve(listener); err != nil && err != http.ErrServerClosed {
2022-06-27 04:38:09 +04:00
log.Fatalln(err)
}
}()
return nil
}
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())
}
2023-06-13 00:02:41 +04:00
if err := s.s.Shutdown(ctx); err != nil {
2022-06-27 04:38:09 +04:00
return err
}
return nil
}