From 5310d08bda170e2d394d27410655283e1797b7ff Mon Sep 17 00:00:00 2001 From: Ben Morrison Date: Mon, 13 May 2019 00:42:48 -0400 Subject: watching for ^C. added comments. --- init.go | 25 +++++++++++++++++++++++++ main.go | 14 ++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/init.go b/init.go index c16c49a..bef94af 100644 --- a/init.go +++ b/init.go @@ -4,6 +4,8 @@ import ( "fmt" "log" "os" + "os/signal" + "time" "github.com/fsnotify/fsnotify" "github.com/spf13/pflag" @@ -28,6 +30,7 @@ func init() { titleScreen() initConfig() initLogging() + watchForInterrupt() } func initConfig() { @@ -112,6 +115,28 @@ func rebindConfig() { initLogging() } +// Watch for SIGINT aka ^C +// Close the log file then exit +func watchForInterrupt() { + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt) + + go func() { + for sigint := range c { + log.Printf("\n\nCaught %v. Cleaning up ...\n", sigint) + + if !confObj.stdoutLogging { + // signal to close the log file + closelog <- true + time.Sleep(20 * time.Millisecond) + } + + close(closelog) + os.Exit(0) + } + }() +} + func titleScreen() { fmt.Printf(` diff --git a/main.go b/main.go index 267c4ea..25d95af 100644 --- a/main.go +++ b/main.go @@ -17,7 +17,7 @@ func main() { index := mux.NewRouter().StrictSlash(true) api := index.PathPrefix("/api").Subrouter() - // gorilla/mux makes path validation painless + // <3 gorilla/mux index.Path("/"). Methods("GET"). HandlerFunc(indexHandler) @@ -27,16 +27,26 @@ func main() { api.Path("/"). Methods("GET"). HandlerFunc(apiBaseHandler) + // twtxt will add support for other formats later. + // Maybe json? Making this future-proof. api.Path("/{format:(?:plain)}"). Methods("GET"). HandlerFunc(apiFormatHandler) + // Specifying the endpoint with and without query information. + // Will return 404 on empty queries otherwise. api.Path("/{format:(?:plain)}/{endpoint:(?:mentions|users|tweets)}"). Methods("GET"). + HandlerFunc(apiEndpointHandler) + // Using stdlib net/url to validate the input URLs rather than regex. + // Validating a URL with regex is unwieldly + api.Path("/{format:(?:plain)}/{endpoint:(?:mentions|users|tweets)}"). Queries("url", "{url}", "q", "{query}"). + Methods("GET"). HandlerFunc(apiEndpointHandler) + // This is for submitting new users api.Path("/{format:(?:plain)}/{endpoint:users}"). + Queries("url", "{url}", "nickname", "{nickname:[a-zA-Z0-9]+}"). Methods("POST"). - Queries("url", "{url}", "nickname", "{nickname}"). HandlerFunc(apiEndpointPOSTHandler) api.Path("/{format:(?:plain)}/tags"). Methods("GET"). -- cgit 1.4.1-2-gfad0