package app import ( "context" "errors" "fmt" "net" "net/http" ) 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 } setup, err := loadRuntimeSetup(options.ConfigPath) if err != nil { return err } handler, err := newUploadHTTPHandler(ctx, setup.Config, setup.Environment) if err != nil { return err } listener, err := net.Listen("tcp", setup.Config.Server.HTTP.Bind) if err != nil { return fmt.Errorf("bind HTTP server %q: %w", setup.Config.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 }