From d8a25024de85ec72222583daf4f90c932cd196c0 Mon Sep 17 00:00:00 2001 From: Katalina Okano Date: Mon, 23 Nov 2020 05:09:41 -0500 Subject: [PATCH] add some gcf scaffolding --- src/common/faas/auth.go | 39 ++++++++++++ src/functions/cmd/main.go | 60 +++++++++++++++++++ src/functions/session-data/client/client.go | 0 src/functions/session-data/session-data.go | 10 ++++ .../session-prewarm/session-prewarm.go | 7 +++ 5 files changed, 116 insertions(+) create mode 100644 src/common/faas/auth.go create mode 100644 src/functions/cmd/main.go create mode 100644 src/functions/session-data/client/client.go create mode 100644 src/functions/session-data/session-data.go create mode 100644 src/functions/session-prewarm/session-prewarm.go diff --git a/src/common/faas/auth.go b/src/common/faas/auth.go new file mode 100644 index 0000000..93f9499 --- /dev/null +++ b/src/common/faas/auth.go @@ -0,0 +1,39 @@ +package faas + +import ( + "errors" + "net/http" +) + +type AuthLevel uint + +const ( + AuthGuest = AuthLevel(iota) + AuthUser + AuthAdmin + AuthSuper +) + +var ( + ErrNotAuthorized = errors.New("common/faas: session not authorized") +) + +func assertAuthLevel(err error, requiredAuthLevel AuthLevel, assertedAuthLevel AuthLevel) error { + if requiredAuthLevel == assertedAuthLevel { + return nil + } else { + return err + } +} + +// AuthMustMatch will assert the current session's authorization group/level; only can match for Guest, User, and Super. +func AuthMustMatch(request *http.Request, authLevel AuthLevel) error { + authCookie, err := request.Cookie("Authorization") + if errors.Is(err, http.ErrNoCookie) { + // No cookie is present, assert guest. + return assertAuthLevel(ErrNotAuthorized, authLevel, AuthGuest) + } else if err != nil { + return err + } + +} diff --git a/src/functions/cmd/main.go b/src/functions/cmd/main.go new file mode 100644 index 0000000..dfb8430 --- /dev/null +++ b/src/functions/cmd/main.go @@ -0,0 +1,60 @@ +package main + +import ( + "context" + "fmt" + "log" + "net/http" + "os" + + "github.com/GoogleCloudPlatform/functions-framework-go/funcframework" + sessiondata "github.com/roleypoly/roleypoly/src/functions/session-data" + sessionprewarm "github.com/roleypoly/roleypoly/src/functions/session-prewarm" +) + +var mappings map[string]http.HandlerFunc = map[string]http.HandlerFunc{ + "/session-prewarm": sessionprewarm.SessionPrewarm, + "/session-data": sessiondata.SessionData, +} + +var port string + +func main() { + ctx := context.Background() + + err := funcframework.RegisterHTTPFunctionContext(ctx, "/", rootHandler) + if err != nil { + log.Fatalf("funcframework.RegisterHTTPFunctionContext: %v\n", err) + } + + for path, handler := range mappings { + err := funcframework.RegisterHTTPFunctionContext(ctx, path, handler) + if err != nil { + log.Fatalf("funcframework.RegisterHTTPFunctionContext: %v\n", err) + } + + fmt.Println("Added", path) + } + + // Use PORT environment variable, or default to 6600. + port = "6600" + if envPort := os.Getenv("PORT"); envPort != "" { + port = envPort + } + + fmt.Printf("Starting on http://localhost:%s\n", port) + + if err := funcframework.Start(port); err != nil { + log.Fatalf("funcframework.Start: %v\n", err) + } +} + +func rootHandler(rw http.ResponseWriter, r *http.Request) { + body := `Roleypoly Functions

Function Index

` + + for path := range mappings { + body += fmt.Sprintf(`%s
`, port, path, path) + } + + fmt.Fprintln(rw, body) +} diff --git a/src/functions/session-data/client/client.go b/src/functions/session-data/client/client.go new file mode 100644 index 0000000..e69de29 diff --git a/src/functions/session-data/session-data.go b/src/functions/session-data/session-data.go new file mode 100644 index 0000000..791ea35 --- /dev/null +++ b/src/functions/session-data/session-data.go @@ -0,0 +1,10 @@ +package sessiondata + +import ( + "fmt" + "net/http" +) + +func SessionData(rw http.ResponseWriter, r *http.Request) { + fmt.Fprintln(rw, "Hello world!") +} diff --git a/src/functions/session-prewarm/session-prewarm.go b/src/functions/session-prewarm/session-prewarm.go new file mode 100644 index 0000000..c169136 --- /dev/null +++ b/src/functions/session-prewarm/session-prewarm.go @@ -0,0 +1,7 @@ +package sessionprewarm + +import "net/http" + +func SessionPrewarm(rw http.ResponseWriter, r *http.Request) { + rw.Write([]byte("hello work!")) +}