github.com/iron-io/functions@v0.0.0-20180820112432-d59d7d1c40b2/examples/middleware/main.go (about) 1 package main 2 3 import ( 4 "context" 5 "encoding/json" 6 "errors" 7 "fmt" 8 "net/http" 9 "strings" 10 "time" 11 12 "github.com/iron-io/functions/api/models" 13 "github.com/iron-io/functions/api/server" 14 ) 15 16 func main() { 17 ctx := context.Background() 18 19 funcServer := server.NewFromEnv(ctx) 20 21 funcServer.AddMiddlewareFunc(func(ctx server.MiddlewareContext, w http.ResponseWriter, r *http.Request, app *models.App) error { 22 start := time.Now() 23 fmt.Println("CustomMiddlewareFunc called at:", start) 24 // TODO: probably need a way to let the chain go forward here and return back to the middleware, for things like timing, etc. 25 ctx.Next() 26 fmt.Println("Duration:", (time.Now().Sub(start))) 27 return nil 28 }) 29 funcServer.AddMiddleware(&CustomMiddleware{}) 30 31 funcServer.Start(ctx) 32 } 33 34 type CustomMiddleware struct { 35 } 36 37 func (h *CustomMiddleware) Serve(ctx server.MiddlewareContext, w http.ResponseWriter, r *http.Request, app *models.App) error { 38 fmt.Println("CustomMiddleware called") 39 40 // check auth header 41 tokenHeader := strings.SplitN(r.Header.Get("Authorization"), " ", 3) 42 if len(tokenHeader) < 2 || tokenHeader[1] != "KlaatuBaradaNikto" { 43 w.WriteHeader(http.StatusUnauthorized) 44 m := map[string]string{"error": "Invalid Authorization token. Sorry!"} 45 json.NewEncoder(w).Encode(m) 46 return errors.New("Invalid authorization token.") 47 } 48 fmt.Println("auth succeeded!") 49 return nil 50 }