Skip to content

Instantly share code, notes, and snippets.

@rgl
Created December 23, 2020 07:02
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save rgl/0351b6d9362abb32d6b55f86bd17ab65 to your computer and use it in GitHub Desktop.
Save rgl/0351b6d9362abb32d6b55f86bd17ab65 to your computer and use it in GitHub Desktop.
go http server with graceful shutdown
package main
import (
"context"
"flag"
"log"
"net/http"
"os"
"os/signal"
"time"
)
func main() {
log.SetFlags(0)
var listenAddress = flag.String("listen", ":8000", "Listen address.")
flag.Parse()
if flag.NArg() != 0 {
flag.Usage()
log.Fatalf("\nERROR You MUST NOT pass any positional arguments")
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
log.Printf("HTTP %s %s%s\n", r.Method, r.Host, r.URL)
if r.URL.Path != "/" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte(time.Now().Local().Format(time.RFC1123Z)))
})
log.Printf("Listening at http://%s", *listenAddress)
httpServer := http.Server{
Addr: *listenAddress,
}
idleConnectionsClosed := make(chan struct{})
go func() {
sigint := make(chan os.Signal, 1)
signal.Notify(sigint, os.Interrupt)
<-sigint
if err := httpServer.Shutdown(context.Background()); err != nil {
log.Printf("HTTP Server Shutdown Error: %v", err)
}
close(idleConnectionsClosed)
}()
if err := httpServer.ListenAndServe(); err != http.ErrServerClosed {
log.Fatalf("HTTP server ListenAndServe Error: %v", err)
}
<-idleConnectionsClosed
log.Printf("Bye bye")
}
@pseidemann
Copy link

hi,
I created a module which wraps this functionality: https://github.com/pseidemann/finish

@aliuygur
Copy link

aliuygur commented Oct 6, 2022

stop write packages for everything like node community

@pseidemann
Copy link

@alioygur

stop write packages for everything like node community

do you mean packages like these?

@JavaHutt
Copy link

JavaHutt commented Dec 2, 2022

@pseidemann lmao man, you got him

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment