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  }