vendored
This commit is contained in:
1 parent
ffa5cd9cd7
commit
f380dfe58d
238 files changed
+151817
-41
No files matched your search
+27
-1
@@ -4,10 +4,13 @@ import (
|
||||
"context"
|
||||
"log"
|
||||
"strings"
|
||||
"expvar"
|
||||
"runtime"
|
||||
|
||||
//"html/template"
|
||||
"flag"
|
||||
"net/http"
|
||||
"fmt"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
|
||||
@@ -23,7 +26,8 @@ import (
|
||||
"party.at/party/internal/jsonlog"
|
||||
)
|
||||
|
||||
const version = "1.0.0"
|
||||
var version string
|
||||
var buildTime string
|
||||
|
||||
type config struct {
|
||||
port int
|
||||
@@ -102,8 +106,16 @@ func main() {
|
||||
return nil
|
||||
})
|
||||
|
||||
displayVersion := flag.Bool("version", false, "Display version and exit")
|
||||
|
||||
flag.Parse()
|
||||
|
||||
if *displayVersion {
|
||||
fmt.Printf("Version:\t%s\n", version)
|
||||
fmt.Printf("Build time:\t%s\n", buildTime)
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
logger := jsonlog.New(os.Stdout, jsonlog.LevelInfo)
|
||||
|
||||
log.Printf("%s\n", cfg.db.dsn)
|
||||
@@ -114,6 +126,20 @@ func main() {
|
||||
}
|
||||
|
||||
defer db.Close()
|
||||
|
||||
expvar.NewString("version").Set(version)
|
||||
|
||||
expvar.Publish("goroutines", expvar.Func(func() interface{} {
|
||||
return runtime.NumGoroutine()
|
||||
}))
|
||||
|
||||
expvar.Publish("database", expvar.Func(func() interface{} {
|
||||
return db.Stats()
|
||||
}))
|
||||
|
||||
expvar.Publish("timestamp", expvar.Func(func() interface{} {
|
||||
return time.Now().Unix()
|
||||
}))
|
||||
|
||||
app := &application{
|
||||
config: cfg,
|
||||
|
||||
@@ -8,6 +8,10 @@ import (
|
||||
"time"
|
||||
"strings"
|
||||
"errors"
|
||||
"expvar"
|
||||
"strconv"
|
||||
|
||||
"github.com/felixge/httpsnoop"
|
||||
|
||||
"golang.org/x/time/rate"
|
||||
"party.at/party/internal/data"
|
||||
@@ -213,3 +217,64 @@ func (app *application) requirePermission(code string, next http.HandlerFunc) ht
|
||||
// Wrap this with the requireActivatedUser() middleware before returning it.
|
||||
return app.requireActivatedUser(fn)
|
||||
}
|
||||
|
||||
func (app *application) enableCORS(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Add("Vary", "Origin")
|
||||
|
||||
w.Header().Add("Vary", "Access-Control-Request-Method")
|
||||
|
||||
origin := r.Header.Get("Origin")
|
||||
|
||||
if origin != "" && len(app.config.cors.trustedOrigins) != 0 {
|
||||
// Loop through the list of trusted origins, checking to see if the request
|
||||
// origin exactly matches one of them.
|
||||
for i := range app.config.cors.trustedOrigins {
|
||||
if origin == app.config.cors.trustedOrigins[i] {
|
||||
// If there is a match, then set a "Access-Control-Allow-Origin"
|
||||
// response header with the request origin as the value.
|
||||
w.Header().Set("Access-Control-Allow-Origin", origin)
|
||||
|
||||
if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" {
|
||||
// Set the necessary preflight response headers, as discussed
|
||||
// previously.
|
||||
w.Header().Set("Access-Control-Allow-Methods", "OPTIONS, PUT, PATCH, DELETE")
|
||||
w.Header().Set("Access-Control-Allow-Headers","Authorization, Content-Type")
|
||||
|
||||
// Write the headers along with a 200 OK status and return from
|
||||
// the middleware with no further action.
|
||||
w.WriteHeader(http.StatusOK)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
|
||||
func (app *application) metrics(next http.Handler) http.Handler {
|
||||
// Initialize the new expvar variables when the middleware chain is first built.
|
||||
totalRequestsReceived := expvar.NewInt("total_requests_received")
|
||||
totalResponsesSent := expvar.NewInt("total_responses_sent")
|
||||
totalProcessingTimeMicroseconds := expvar.NewInt("total_processing_time_μs")
|
||||
|
||||
totalResponsesSentByStatus := expvar.NewMap("total_responses_sent_by_status")
|
||||
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
totalRequestsReceived.Add(1)
|
||||
|
||||
// Call the next handler in the chain.
|
||||
metrics := httpsnoop.CaptureMetrics(next, w, r)
|
||||
|
||||
// On the way back up the middleware chain, increment the number of responses
|
||||
// sent by 1.
|
||||
totalResponsesSent.Add(1)
|
||||
|
||||
totalProcessingTimeMicroseconds.Add(metrics.Duration.Microseconds())
|
||||
|
||||
totalResponsesSentByStatus.Add(strconv.Itoa(metrics.Code), 1)
|
||||
})
|
||||
}
|
||||
+4
-1
@@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"expvar"
|
||||
"github.com/julienschmidt/httprouter"
|
||||
)
|
||||
|
||||
@@ -34,5 +35,7 @@ func (app *application) routes() http.Handler {
|
||||
|
||||
router.HandlerFunc(http.MethodPost, "/v1/tokens/authentication", app.createAuthenticationTokenHandler)
|
||||
|
||||
return app.recoverPanic(app.enableCORS(app.rateLimit(app.authenticate(router))))
|
||||
router.Handler(http.MethodGet, "/debug/vars", expvar.Handler())
|
||||
|
||||
return app.metrics(app.recoverPanic(app.enableCORS(app.rateLimit(app.authenticate(router)))))
|
||||
}
|
||||
Reference in new issue
Block a user