11package router
22
33import (
4+ "encoding/json"
5+ "errors"
6+ "io/ioutil"
47 "net/http"
8+ "regexp"
59 "strings"
610
7- "github.com/serverless/event-gateway/event"
11+ eventpkg "github.com/serverless/event-gateway/event"
12+ "go.uber.org/zap"
813)
914
1015// HTTPResponse is a response schema returned by subscribed function in case of HTTP event.
@@ -15,8 +20,7 @@ type HTTPResponse struct {
1520}
1621
1722const (
18- mimeJSON = "application/json"
19- mimeOctetStrem = "application/octet-stream"
23+ mimeJSON = "application/json"
2024)
2125
2226func isHTTPEvent (r * http.Request ) bool {
@@ -39,7 +43,84 @@ func isHTTPEvent(r *http.Request) bool {
3943 return true
4044}
4145
42- type backlogEvent struct {
43- path string
44- event event.Event
46+ func (router * Router ) eventFromRequest (r * http.Request ) (* eventpkg.Event , string , error ) {
47+ path := extractPath (r .Host , r .URL .Path )
48+ eventType := extractEventType (r )
49+ headers := transformHeaders (r .Header )
50+
51+ mime := r .Header .Get ("Content-Type" )
52+ if mime == "" {
53+ mime = "application/octet-stream"
54+ }
55+
56+ body := []byte {}
57+ var err error
58+ if r .Body != nil {
59+ body , err = ioutil .ReadAll (r .Body )
60+ if err != nil {
61+ return nil , "" , err
62+ }
63+ }
64+
65+ event := eventpkg .New (eventType , mime , body )
66+ if mime == mimeJSON && len (body ) > 0 {
67+ err = json .Unmarshal (body , & event .Data )
68+ if err != nil {
69+ return nil , "" , errors .New ("malformed JSON body" )
70+ }
71+ }
72+
73+ if event .Type == eventpkg .TypeHTTP {
74+ event .Data = & eventpkg.HTTPEvent {
75+ Headers : headers ,
76+ Query : r .URL .Query (),
77+ Body : event .Data ,
78+ Host : r .Host ,
79+ Path : r .URL .Path ,
80+ Method : r .Method ,
81+ }
82+ }
83+
84+ router .log .Debug ("Event received." , zap .String ("path" , path ), zap .Object ("event" , event ))
85+ err = router .emitSystemEventReceived (path , * event , headers )
86+ if err != nil {
87+ router .log .Debug ("Event processing stopped because sync plugin subscription returned an error." ,
88+ zap .Object ("event" , event ),
89+ zap .Error (err ))
90+ return nil , "" , err
91+ }
92+
93+ return event , path , nil
94+ }
95+
96+ func extractPath (host , path string ) string {
97+ extracted := path
98+ rxp , _ := regexp .Compile (hostedDomain )
99+ if rxp .MatchString (host ) {
100+ subdomain := strings .Split (host , "." )[0 ]
101+ extracted = "/" + subdomain + path
102+ }
103+ return extracted
104+ }
105+
106+ func extractEventType (r * http.Request ) eventpkg.Type {
107+ eventType := eventpkg .Type (r .Header .Get ("event" ))
108+ if eventType == "" {
109+ eventType = eventpkg .TypeHTTP
110+ }
111+ return eventType
112+ }
113+
114+ // transformHeaders takes http.Header and flatten value array (map[string][]string -> map[string]string) so it's easier
115+ // to access headers by user.
116+ func transformHeaders (req http.Header ) map [string ]string {
117+ headers := map [string ]string {}
118+ for key , header := range req {
119+ headers [key ] = header [0 ]
120+ if len (header ) > 1 {
121+ headers [key ] = strings .Join (header , ", " )
122+ }
123+ }
124+
125+ return headers
45126}
0 commit comments