/gateway

Drop-in replacement for Go net/http when running in AWS Lambda & API Gateway

Primary LanguageGoMIT LicenseMIT

Gateway

GoDoc Build Status

Fork of apex/gateway that sniffs content type using http.DetectContentType. Also allows writing headers after calling rw.WriteHeader() which apex/gateway does not for some reason.

About

Package gateway provides a drop-in replacement for net/http's ListenAndServe for use in AWS Lambda & API Gateway, simply swap it out for gateway.ListenAndServe. Extracted from Up which provides additional middleware features and operational functionality.

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"

	"github.com/haydenwoodhead/gateway"
)

func main() {
	http.HandleFunc("/", hello)
	log.Fatal(gateway.ListenAndServe(":3000", nil))
}

func hello(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "Hello World from Go")
}

Context example:

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"

	"github.com/haydenwoodhead/gateway"
	"github.com/aws/aws-lambda-go"
)

func main() {
	http.HandleFunc("/", hello)
	log.Fatal(gateway.ListenAndServe(":3000", nil))
}

func hello(w http.ResponseWriter, r *http.Request) {
	// example retrieving values from the api gateway proxy request context.
	requestContext, ok := gateway.RequestContext(r.Context())
	if !ok || requestContext.Authorizer["sub"] == nil {
		fmt.Fprint(w, "Hello World from Go")
		return
	}

	userID := requestContext.Authorizer["sub"].(string)
	fmt.Fprintf(w, "Hello %s from Go", userID)
}