package main import ( "context" "fmt" "net/http" "time" "github.com/vladimirok5959/golang-ctrlc/ctrlc" ) func main() { MyAppFunc := func(ctx context.Context, shutdown context.CancelFunc) *[]ctrlc.Iface { // Some custom logic // With goroutine inside test := Run() // err1 := fmt.Errorf("Startup error 1") // err2 := fmt.Errorf("Startup error 2") // return ctrlc.MakeError(shutdown, ctrlc.AppError(err1), ctrlc.AppError(err2)) // Http web server mux := http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Printf("New web request (%s)!\n", r.URL.Path) // Do something hard inside (12 seconds) for i := 0; i < 12000; i++ { select { case <-ctx.Done(): // Interrupt request by server fmt.Printf("[BY SERVER] OK, I will cancel (%s)!\n", r.URL.Path) return case <-r.Context().Done(): // Interrupt request by client fmt.Printf("[BY CLIENT] OK, I will cancel (%s)!\n", r.URL.Path) return default: // Main some logic // Some very long logic, just for example time.Sleep(1 * time.Millisecond) } } fmt.Printf("After 12 seconds!\n") w.Header().Set("Content-Type", "text/html") if _, err := w.Write([]byte(`