Skip to content

Instantly share code, notes, and snippets.

@kpurdon
Created June 30, 2017 18:10
Show Gist options
  • Save kpurdon/f2965602b2f55a0d8199e5418bd4aacb to your computer and use it in GitHub Desktop.
Save kpurdon/f2965602b2f55a0d8199e5418bd4aacb to your computer and use it in GitHub Desktop.

Revisions

  1. kpurdon created this gist Jun 30, 2017.
    61 changes: 61 additions & 0 deletions main.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,61 @@
    package main

    import (
    "context"
    "flag"
    "fmt"
    "log"
    "net/http"
    "os"
    "os/signal"
    "time"
    )

    const (
    service = "fooapi"
    )

    var (
    port = flag.Int("port", 3333, "http port to listen on")
    shutdownTimeout = flag.Duration("shutdown-timeout", 10*time.Second,
    "shutdown timeout (5s,5m,5h) before connections are cancelled")
    )

    func main() {
    flag.Parse()

    mux := http.NewServeMux()
    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(200)
    })

    srv := &http.Server{
    Addr: fmt.Sprintf(":%d", *port),
    Handler: mux,
    }

    stop := make(chan os.Signal)
    signal.Notify(stop, os.Interrupt)

    go func() {
    log.Printf("%s listening on 0.0.0.0:%d with %v timeout", service, *port, *shutdownTimeout)
    if err := srv.ListenAndServe(); err != nil {
    if err != http.ErrServerClosed {
    log.Fatal(err)
    }
    }
    }()

    <-stop

    log.Printf("%s shutting down ...\n", service)

    ctx, cancel := context.WithTimeout(context.Background(), *shutdownTimeout)
    defer cancel()

    if err := srv.Shutdown(ctx); err != nil {
    log.Fatal(err)
    }

    log.Printf("%s down\n", service)
    }