Author: Pedro Lucas Porcellis <porcellis@eletrotupi.com>
cmd/momento: flesh out an initial server
cmd/momento/logging.go | 27 +++++++++++++++++++++++++++ cmd/momento/main.go | 40 ++++++++++++++++++++++++++++++++++++++++
diff --git a/cmd/momento/logging.go b/cmd/momento/logging.go new file mode 100644 index 0000000000000000000000000000000000000000..59c8fe8eec236720b430ea8888061d13ed8beee2 --- /dev/null +++ b/cmd/momento/logging.go @@ -0,0 +1,27 @@ +package main + +import ( + "log" + "net/http" + "time" +) + +func WithLogging(h http.Handler) http.Handler { + logger := func(w http.ResponseWriter, r *http.Request) { + defer func() { + if err := recover(); err != nil { + log.Printf("%s %s %s panic: %s", r.RemoteAddr, + r.RequestURI, r.Method, err) + } + }() + + start := time.Now() + h.ServeHTTP(w, r) + duration := time.Since(start) + + log.Printf("%s %s %s %s", r.RemoteAddr, r.RequestURI, + r.Method, duration.String()) + } + + return http.HandlerFunc(logger) +} diff --git a/cmd/momento/main.go b/cmd/momento/main.go new file mode 100644 index 0000000000000000000000000000000000000000..7bfb8c0b78e5e7169ccafed36da5d1ce3c206ec1 --- /dev/null +++ b/cmd/momento/main.go @@ -0,0 +1,40 @@ +package main + +import ( + "database/sql" + "log" + "net/http" + "os" + + _ "github.com/lib/pq" + + + "git.eletrotupi.com/momento/api" + "git.eletrotupi.com/momento/database" +) + +func main() { + // TODO: Allow to configure bind address and the connection string to be + // used + + db, err := sql.Open("postgres", os.Args[1]) + if err != nil { + log.Fatalf("Failed to open a database connection: %v", err) + } + + mux := http.NewServeMux() + mux.Handle("/api/", api.New()) + serve := database.Middleware(db)(mux) + serve = WithLogging(serve) + + server := &http.Server{ + Addr: ":8000", + Handler: serve, + } + + log.Printf("Listening on %s", server.Addr) + + if err := server.ListenAndServe(); err != nil { + log.Fatalf("Error: Couldn't serve %s", err.Error()) + } +}