diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 87 |
1 files changed, 18 insertions, 69 deletions
@@ -3,31 +3,24 @@ package gopkgserver import ( "context" _ "embed" - "errors" "flag" "fmt" - "io" + "log/slog" - "net" "net/http" "os" "github.com/pelletier/go-toml/v2" - - "go-pkg-server/logging" - "go-pkg-server/logging/handler" - "go-pkg-server/repo" + "go.sudomsg.com/gopkgserver/repo" + httpServer "go.sudomsg.com/kit/http" + "go.sudomsg.com/kit/logging" + logHandler "go.sudomsg.com/kit/logging/http" ) -type ServerConfig struct { - Proto string `toml:"proto"` - Address string `toml:"address"` -} - type Config struct { - Server ServerConfig `toml:"server"` - Log logging.Config `toml:"log"` - Repos map[string]repo.Repo `toml:"repo"` + Server []httpServer.ServerConfig `toml:"server"` + Logging logging.LogConfig `toml:"logging"` + Repos map[string]repo.Repo `toml:"repo"` } func Run(ctx context.Context, fs *flag.FlagSet, args []string) error { @@ -40,8 +33,10 @@ func Run(ctx context.Context, fs *flag.FlagSet, args []string) error { return err } - logger := logging.SetupLogger(cfg.Log) - ctx = logging.WithLogger(ctx, logger) + if err := logging.Setup(cfg.Logging); err != nil { + return err + } + ctx = logging.WithLogger(ctx, slog.Default()) h, err := repo.New(cfg.Repos) if err != nil { @@ -52,7 +47,12 @@ func Run(ctx context.Context, fs *flag.FlagSet, args []string) error { mux.Handle("GET /robots.txt", Robot()) mux.Handle("GET /", h) - return RunServer(ctx, handler.New(mux), cfg.Server) + handler := logHandler.New(mux, nil) + + lns, err := httpServer.OpenListeners(ctx, cfg.Server) + defer lns.CloseAll() + + return httpServer.RunHTTPServers(ctx, lns, handler) } func LoadConfig(cfgFile string) (Config, error) { @@ -66,56 +66,5 @@ func LoadConfig(cfgFile string) (Config, error) { return Config{}, fmt.Errorf("parse config: %w", err) } - if cfg.Server.Proto == "" { - cfg.Server.Proto = "tcp" - } - return cfg, nil } - -func RunServer(ctx context.Context, mux http.Handler, config ServerConfig) error { - logger := logging.FromContext(ctx) - - srv := &http.Server{ - Handler: mux, - BaseContext: func(l net.Listener) context.Context { - logger := logger.With("address", l.Addr()) - ctx = logging.WithLogger(ctx, logger) - return ctx - }, - ErrorLog: slog.NewLogLogger(logger.Handler(), slog.LevelError), - } - - ln, err := net.Listen(config.Proto, config.Address) - if err != nil { - return err - } - - logger.Log(ctx, slog.LevelError, "Server Started on", "address", ln.Addr()) - - go func() { - <-ctx.Done() - shutdownCtx := context.Background() - // We received an interrupt signal, shut down. - if err := srv.Shutdown(shutdownCtx); err != nil { - slog.Log(shutdownCtx, slog.LevelError, "HTTP server Shutdown", "error", err) - } - }() - - if err := srv.Serve(ln); err != nil && !errors.Is(err, http.ErrServerClosed) { - return err - } - - return nil -} - -func Robot() http.HandlerFunc { - robots := `User-agent: * -Disallow: / -` - return func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "public, max-age=86400, immutable") - w.Header().Set("Content-Type", "text/plain") - io.WriteString(w, robots) - } -} |