Skip to content
This repository was archived by the owner on Dec 11, 2023. It is now read-only.

Commit bc1ac73

Browse files
committed
API Gateway data wrapper added, triggermesh/ghbackend#104
1 parent ac94b2f commit bc1ac73

File tree

2 files changed

+82
-1
lines changed

2 files changed

+82
-1
lines changed

main.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import (
2525
"strings"
2626
"sync"
2727
"time"
28+
29+
"github.com/triggermesh/aws-custom-runtime/pkg/events/apiGateway"
2830
)
2931

3032
const (
@@ -39,6 +41,11 @@ type message struct {
3941
data []byte
4042
}
4143

44+
type responseWrapper struct {
45+
http.ResponseWriter
46+
Body []byte
47+
}
48+
4249
var (
4350
tasks chan message
4451
results map[string]chan message
@@ -60,6 +67,11 @@ var (
6067
}
6168
)
6269

70+
func (rw *responseWrapper) Write(data []byte) (int, error) {
71+
rw.Body = data
72+
return len(data), nil
73+
}
74+
6375
func setupEnv() error {
6476
environment["_HANDLER"], _ = os.LookupEnv("_HANDLER")
6577
environment["LAMBDA_TASK_ROOT"], _ = os.LookupEnv("LAMBDA_TASK_ROOT")
@@ -187,6 +199,21 @@ func responseHandler(w http.ResponseWriter, r *http.Request) {
187199
return
188200
}
189201

202+
func mapEvent(h http.Handler) http.Handler {
203+
eventType, _ := os.LookupEnv("EVENT")
204+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
205+
rw := responseWrapper{w, []byte{}}
206+
switch eventType {
207+
case "API_GATEWAY":
208+
apiGateway.Request(r)
209+
h.ServeHTTP(&rw, r)
210+
apiGateway.Response(w, rw.Body)
211+
default:
212+
h.ServeHTTP(w, r)
213+
}
214+
})
215+
}
216+
190217
func api() error {
191218
apiRouter := http.NewServeMux()
192219
apiRouter.HandleFunc(awsEndpoint+"/init/error", initError)
@@ -220,7 +247,8 @@ func main() {
220247
}
221248

222249
taskRouter := http.NewServeMux()
223-
taskRouter.HandleFunc("/", newTask)
250+
taskHandler := http.HandlerFunc(newTask)
251+
taskRouter.Handle("/", mapEvent(taskHandler))
224252
fmt.Println("Listening...")
225253
log.Fatalln(http.ListenAndServe(":8080", taskRouter))
226254
}

pkg/events/apiGateway/mapper.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package apiGateway
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"io/ioutil"
7+
"log"
8+
"net/http"
9+
"strings"
10+
11+
"github.com/aws/aws-lambda-go/events"
12+
)
13+
14+
func Request(r *http.Request) {
15+
event := events.APIGatewayProxyRequest{}
16+
body, err := ioutil.ReadAll(r.Body)
17+
if err != nil {
18+
log.Fatalln(err)
19+
}
20+
21+
event.Body = string(body)
22+
event.Headers = make(map[string]string)
23+
for k, v := range r.Header {
24+
event.Headers[k] = strings.Join(v, ",")
25+
}
26+
event.HTTPMethod = r.Method
27+
event.Path = r.URL.Path
28+
event.QueryStringParameters = make(map[string]string)
29+
for k, v := range r.URL.Query() {
30+
event.QueryStringParameters[k] = strings.Join(v, ",")
31+
}
32+
event.RequestContext = events.APIGatewayProxyRequestContext{}
33+
// event.Resource = ""
34+
// event.QueryStringParameters = make(map[string]string)
35+
// event.IsBase64Encoded = false
36+
js, err := json.Marshal(event)
37+
if err != nil {
38+
log.Fatalln(err)
39+
}
40+
r.Body = ioutil.NopCloser(bytes.NewBuffer(js))
41+
}
42+
43+
func Response(w http.ResponseWriter, data []byte) (int, error) {
44+
var js events.APIGatewayProxyResponse
45+
if err := json.Unmarshal(data, &js); err != nil {
46+
return 0, err
47+
}
48+
for k, v := range js.Headers {
49+
w.Header().Set(k, v)
50+
}
51+
w.WriteHeader(js.StatusCode)
52+
return w.Write([]byte(js.Body))
53+
}

0 commit comments

Comments
 (0)