123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- 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(`<div>After 12 seconds!</div>`)); err != nil {
- fmt.Printf("%s\n", err.Error())
- return
- }
- if _, err := w.Write([]byte(`<div>` + r.URL.Path + `</div>`)); err != nil {
- fmt.Printf("%s\n", err.Error())
- return
- }
- })
- srv := &http.Server{Addr: "127.0.0.1:8080", Handler: mux}
- go func() {
- fmt.Printf("Starting web server: http://127.0.0.1:8080/\n")
- if err := srv.ListenAndServe(); err != nil {
- if err != http.ErrServerClosed {
- fmt.Printf("Web server startup error: %s\n", err.Error())
- // Application can't working without http web server
- // Call cancel context func on error
- shutdown()
- return
- }
- }
- }()
- return &[]ctrlc.Iface{test, srv}
- }
- // Run application
- ctrlc.App(MyAppFunc)
- }
|