aboutsummaryrefslogtreecommitdiffstats
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go87
1 files changed, 18 insertions, 69 deletions
diff --git a/main.go b/main.go
index 6404940..3fe9001 100644
--- a/main.go
+++ b/main.go
@@ -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)
- }
-}