Skip to content
This repository was archived by the owner on Aug 6, 2025. It is now read-only.

Commit 2ab2f57

Browse files
authored
Merge pull request #9 from dave-malone/master
Support for Gorilla Mux, Negroni, and http.HandlerFunc
2 parents 0aaec66 + 45a34fa commit 2ab2f57

14 files changed

Lines changed: 355 additions & 18 deletions

core/types.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package core
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
7+
"github.com/aws/aws-lambda-go/events"
8+
)
9+
10+
// Returns a dafault Gateway Timeout (504) response
11+
func GatewayTimeout() events.APIGatewayProxyResponse {
12+
return events.APIGatewayProxyResponse{StatusCode: http.StatusGatewayTimeout}
13+
}
14+
15+
func NewLoggedError(format string, a ...interface{}) error {
16+
err := fmt.Errorf(format, a...)
17+
fmt.Println(err.Error())
18+
return err
19+
}

gin/ginlambda.go renamed to gin/adapter.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
// Packge ginlambda add Gin support for the aws-severless-go-api library.
22
// Uses the core package behind the scenes and exposes the New method to
33
// get a new instance and Proxy method to send request to the Gin engine.
4-
package ginlambda
4+
package ginadapter
55

66
import (
7-
"log"
87
"net/http"
98

109
"github.com/aws/aws-lambda-go/events"
@@ -35,25 +34,16 @@ func (g *GinLambda) Proxy(req events.APIGatewayProxyRequest) (events.APIGatewayP
3534
ginRequest, err := g.ProxyEventToHTTPRequest(req)
3635

3736
if err != nil {
38-
log.Println("Could not convert proxy event to request")
39-
log.Println(err)
40-
return gatewayTimeout(), err
37+
return core.GatewayTimeout(), core.NewLoggedError("Could not convert proxy event to request: %v", err)
4138
}
4239

4340
respWriter := core.NewProxyResponseWriter()
44-
4541
g.ginEngine.ServeHTTP(http.ResponseWriter(respWriter), ginRequest)
4642

4743
proxyResponse, err := respWriter.GetProxyResponse()
4844
if err != nil {
49-
log.Println("Error while generating proxy response")
50-
log.Println(err)
51-
return gatewayTimeout(), err
45+
return core.GatewayTimeout(), core.NewLoggedError("Error while generating proxy response: %v", err)
5246
}
53-
return proxyResponse, nil
54-
}
5547

56-
// Returns a dafault Gateway Timeout (504) response
57-
func gatewayTimeout() events.APIGatewayProxyResponse {
58-
return events.APIGatewayProxyResponse{StatusCode: http.StatusGatewayTimeout}
48+
return proxyResponse, nil
5949
}

gin/gin_suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ginlambda_test
1+
package ginadapter_test
22

33
import (
44
"testing"

gin/ginlambda_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ginlambda_test
1+
package ginadapter_test
22

33
import (
44
"log"
@@ -23,14 +23,14 @@ var _ = Describe("GinLambda tests", func() {
2323
})
2424
})
2525

26-
lambdaGin := ginlambda.New(r)
26+
adapter := ginadapter.New(r)
2727

2828
req := events.APIGatewayProxyRequest{
2929
Path: "/ping",
3030
HTTPMethod: "GET",
3131
}
3232

33-
resp, err := lambdaGin.Proxy(req)
33+
resp, err := adapter.Proxy(req)
3434

3535
Expect(err).To(BeNil())
3636
Expect(resp.StatusCode).To(Equal(200))

gorillamux/adapter.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package gorillamux
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/aws/aws-lambda-go/events"
7+
"github.com/awslabs/aws-lambda-go-api-proxy/core"
8+
"github.com/gorilla/mux"
9+
)
10+
11+
type GorillaMuxAdapter struct {
12+
core.RequestAccessor
13+
router *mux.Router
14+
}
15+
16+
func New(router *mux.Router) *GorillaMuxAdapter {
17+
return &GorillaMuxAdapter{
18+
router: router,
19+
}
20+
}
21+
22+
func (h *GorillaMuxAdapter) Proxy(event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
23+
req, err := h.ProxyEventToHTTPRequest(event)
24+
if err != nil {
25+
return core.GatewayTimeout(), core.NewLoggedError("Could not convert proxy event to request: %v", err)
26+
}
27+
28+
w := core.NewProxyResponseWriter()
29+
h.router.ServeHTTP(http.ResponseWriter(w), req)
30+
31+
resp, err := w.GetProxyResponse()
32+
if err != nil {
33+
return core.GatewayTimeout(), core.NewLoggedError("Error while generating proxy response: %v", err)
34+
}
35+
36+
return resp, nil
37+
}

gorillamux/adapter_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package gorillamux_test
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"net/http"
7+
8+
"github.com/aws/aws-lambda-go/events"
9+
"github.com/awslabs/aws-lambda-go-api-proxy/gorillamux"
10+
"github.com/gorilla/mux"
11+
12+
. "github.com/onsi/ginkgo"
13+
. "github.com/onsi/gomega"
14+
)
15+
16+
var _ = Describe("GorillaMuxAdapter tests", func() {
17+
Context("Simple ping request", func() {
18+
It("Proxies the event correctly", func() {
19+
log.Println("Starting test")
20+
21+
homeHandler := func(w http.ResponseWriter, req *http.Request) {
22+
w.Header().Add("unfortunately-required-header", "")
23+
fmt.Fprintf(w, "Home Page")
24+
}
25+
26+
productsHandler := func(w http.ResponseWriter, req *http.Request) {
27+
w.Header().Add("unfortunately-required-header", "")
28+
fmt.Fprintf(w, "Products Page")
29+
}
30+
31+
r := mux.NewRouter()
32+
r.HandleFunc("/", homeHandler)
33+
r.HandleFunc("/products", productsHandler)
34+
35+
adapter := gorillamux.New(r)
36+
37+
homePageReq := events.APIGatewayProxyRequest{
38+
Path: "/",
39+
HTTPMethod: "GET",
40+
}
41+
42+
homePageResp, homePageReqErr := adapter.Proxy(homePageReq)
43+
44+
Expect(homePageReqErr).To(BeNil())
45+
Expect(homePageResp.StatusCode).To(Equal(200))
46+
Expect(homePageResp.Body).To(Equal("Home Page"))
47+
48+
productsPageReq := events.APIGatewayProxyRequest{
49+
Path: "/products",
50+
HTTPMethod: "GET",
51+
}
52+
53+
productsPageResp, productsPageReqErr := adapter.Proxy(productsPageReq)
54+
55+
Expect(productsPageReqErr).To(BeNil())
56+
Expect(productsPageResp.StatusCode).To(Equal(200))
57+
Expect(productsPageResp.Body).To(Equal("Products Page"))
58+
})
59+
})
60+
})

gorillamux/gorilla_suite_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package gorillamux_test
2+
3+
import (
4+
"testing"
5+
6+
. "github.com/onsi/ginkgo"
7+
. "github.com/onsi/gomega"
8+
)
9+
10+
func TestGorillaMux(t *testing.T) {
11+
RegisterFailHandler(Fail)
12+
RunSpecs(t, "Gorilla Mux Suite")
13+
}

handlerfunc/adapter.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package handlerfunc
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/aws/aws-lambda-go/events"
7+
"github.com/awslabs/aws-lambda-go-api-proxy/core"
8+
)
9+
10+
type HandlerFuncAdapter struct {
11+
core.RequestAccessor
12+
handlerFunc http.HandlerFunc
13+
}
14+
15+
func New(handlerFunc http.HandlerFunc) *HandlerFuncAdapter {
16+
return &HandlerFuncAdapter{
17+
handlerFunc: handlerFunc,
18+
}
19+
}
20+
21+
func (h *HandlerFuncAdapter) Proxy(event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
22+
req, err := h.ProxyEventToHTTPRequest(event)
23+
if err != nil {
24+
return core.GatewayTimeout(), core.NewLoggedError("Could not convert proxy event to request: %v", err)
25+
}
26+
27+
w := core.NewProxyResponseWriter()
28+
h.handlerFunc.ServeHTTP(http.ResponseWriter(w), req)
29+
30+
resp, err := w.GetProxyResponse()
31+
if err != nil {
32+
return core.GatewayTimeout(), core.NewLoggedError("Error while generating proxy response: %v", err)
33+
}
34+
35+
return resp, nil
36+
}

handlerfunc/adapter_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package handlerfunc_test
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"net/http"
7+
8+
"github.com/aws/aws-lambda-go/events"
9+
"github.com/awslabs/aws-lambda-go-api-proxy/handlerfunc"
10+
11+
. "github.com/onsi/ginkgo"
12+
. "github.com/onsi/gomega"
13+
)
14+
15+
var _ = Describe("HandlerFuncAdapter tests", func() {
16+
Context("Simple ping request", func() {
17+
It("Proxies the event correctly", func() {
18+
log.Println("Starting test")
19+
20+
handler := func(w http.ResponseWriter, req *http.Request) {
21+
w.Header().Add("unfortunately-required-header", "")
22+
fmt.Fprintf(w, "Go Lambda!!")
23+
}
24+
25+
adapter := handlerfunc.New(handler)
26+
27+
req := events.APIGatewayProxyRequest{
28+
Path: "/ping",
29+
HTTPMethod: "GET",
30+
}
31+
32+
resp, err := adapter.Proxy(req)
33+
34+
Expect(err).To(BeNil())
35+
Expect(resp.StatusCode).To(Equal(200))
36+
})
37+
})
38+
})
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package handlerfunc_test
2+
3+
import (
4+
"testing"
5+
6+
. "github.com/onsi/ginkgo"
7+
. "github.com/onsi/gomega"
8+
)
9+
10+
func TestHandlerFunc(t *testing.T) {
11+
RegisterFailHandler(Fail)
12+
RunSpecs(t, "HandlerFuncAdapter Suite")
13+
}

0 commit comments

Comments
 (0)