package app import ( "context" "errors" "fmt" "net" "net/http" "gitea.maximumdirect.net/eric/distributor/internal/config" ) type ServeOptions struct { ConfigPath string } func Serve(ctx context.Context, options ServeOptions) error { if ctx == nil { ctx = context.Background() } if err := ctx.Err(); err != nil { return err } configPath := options.ConfigPath if configPath == "" { configPath = config.DefaultConfigPath } cfg, err := config.LoadFile(configPath) if err != nil { return err } secretLoad, err := config.LoadSecretEnvironment(cfg.Secrets.Directory, nil) if err != nil { return err } handler, err := newUploadHTTPHandler(ctx, cfg, secretLoad.Environment) if err != nil { return err } listener, err := net.Listen("tcp", cfg.Server.HTTP.Bind) if err != nil { return fmt.Errorf("bind HTTP server %q: %w", cfg.Server.HTTP.Bind, err) } defer listener.Close() server := &http.Server{Handler: handler} shutdownDone := make(chan struct{}) go func() { defer close(shutdownDone) <-ctx.Done() _ = server.Shutdown(context.Background()) }() err = server.Serve(listener) if errors.Is(err, http.ErrServerClosed) { <-shutdownDone return nil } return err }