summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorBen Morrison <ben@gbmor.dev>2019-05-13 00:42:48 -0400
committerBen Morrison <ben@gbmor.dev>2019-05-13 00:42:48 -0400
commit5310d08bda170e2d394d27410655283e1797b7ff (patch)
tree730706dbe858d389ede0d5e39b191e6ec2a318d1
parent313ab715c896dce98966f7e902b94da877cca1b2 (diff)
downloadgetwtxt-5310d08bda170e2d394d27410655283e1797b7ff.tar.gz
watching for ^C. added comments.
-rw-r--r--init.go25
-rw-r--r--main.go14
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").
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312