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

Commit 2ddbcf9

Browse files
authored
flatten header array so it's easier to access headers (#374)
1 parent f254fae commit 2ddbcf9

File tree

4 files changed

+95
-79
lines changed

4 files changed

+95
-79
lines changed

event/http.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package event
22

33
// HTTPEvent is a event schema used for sending events to HTTP subscriptions.
44
type HTTPEvent struct {
5-
Headers map[string][]string `json:"headers"`
5+
Headers map[string]string `json:"headers"`
66
Query map[string][]string `json:"query"`
77
Body interface{} `json:"body"`
88
Host string `json:"host"`

event/system.go

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package event
22

33
import (
4-
"net/http"
5-
64
"github.com/serverless/event-gateway/function"
75
)
86

@@ -11,9 +9,9 @@ const SystemEventReceivedType = Type("gateway.event.received")
119

1210
// SystemEventReceivedData struct.
1311
type SystemEventReceivedData struct {
14-
Path string `json:"path"`
15-
Event Event `json:"event"`
16-
Headers http.Header `json:"header"`
12+
Path string `json:"path"`
13+
Event Event `json:"event"`
14+
Headers map[string]string `json:"headers"`
1715
}
1816

1917
// SystemFunctionInvokingType is a system event emitted before invoking a function.

router/event.go

+87-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package router
22

33
import (
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

1722
const (
18-
mimeJSON = "application/json"
19-
mimeOctetStrem = "application/octet-stream"
23+
mimeJSON = "application/json"
2024
)
2125

2226
func 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
}

router/router.go

+4-67
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ package router
33
import (
44
"encoding/json"
55
"errors"
6-
"io/ioutil"
76
"net/http"
8-
"regexp"
97
"strings"
108
"sync"
119
"time"
@@ -203,54 +201,6 @@ var (
203201
errUnableToLookUpRegisteredFunction = errors.New("unable to look up registered function")
204202
)
205203

206-
func (router *Router) eventFromRequest(r *http.Request) (*eventpkg.Event, string, error) {
207-
path := extractPath(r.Host, r.URL.Path)
208-
eventType := extractEventType(r)
209-
210-
mime := r.Header.Get("Content-Type")
211-
if mime == "" {
212-
mime = mimeOctetStrem
213-
}
214-
215-
body := []byte{}
216-
var err error
217-
if r.Body != nil {
218-
body, err = ioutil.ReadAll(r.Body)
219-
if err != nil {
220-
return nil, "", err
221-
}
222-
}
223-
224-
event := eventpkg.New(eventType, mime, body)
225-
if mime == mimeJSON && len(body) > 0 {
226-
err = json.Unmarshal(body, &event.Data)
227-
if err != nil {
228-
return nil, "", errors.New("malformed JSON body")
229-
}
230-
}
231-
232-
if event.Type == eventpkg.TypeHTTP {
233-
event.Data = &eventpkg.HTTPEvent{
234-
Headers: r.Header,
235-
Query: r.URL.Query(),
236-
Body: event.Data,
237-
Host: r.Host,
238-
Path: r.URL.Path, // it's not path var as user has to get path from request to platform's EG
239-
Method: r.Method,
240-
}
241-
}
242-
243-
router.log.Debug("Event received.", zap.String("path", path), zap.Object("event", event))
244-
err = router.emitSystemEventReceived(path, *event, r.Header)
245-
if err != nil {
246-
router.log.Debug("Event processing stopped because sync plugin subscription returned an error.",
247-
zap.Object("event", event),
248-
zap.Error(err))
249-
return nil, "", err
250-
}
251-
252-
return event, path, nil
253-
}
254204
func (router *Router) handleHTTPEvent(event *eventpkg.Event, w http.ResponseWriter, r *http.Request) {
255205
encoder := json.NewEncoder(w)
256206
reqMethod := r.Method
@@ -489,7 +439,7 @@ func (router *Router) processEvent(e backlogEvent) {
489439
}
490440
}
491441

492-
func (router *Router) emitSystemEventReceived(path string, event eventpkg.Event, headers http.Header) error {
442+
func (router *Router) emitSystemEventReceived(path string, event eventpkg.Event, headers map[string]string) error {
493443
system := eventpkg.New(
494444
eventpkg.SystemEventReceivedType,
495445
mimeJSON,
@@ -538,20 +488,7 @@ func (router *Router) isDraining() bool {
538488
return false
539489
}
540490

541-
func extractPath(host, path string) string {
542-
extracted := path
543-
rxp, _ := regexp.Compile(hostedDomain)
544-
if rxp.MatchString(host) {
545-
subdomain := strings.Split(host, ".")[0]
546-
extracted = "/" + subdomain + path
547-
}
548-
return extracted
549-
}
550-
551-
func extractEventType(r *http.Request) eventpkg.Type {
552-
eventType := eventpkg.Type(r.Header.Get("event"))
553-
if eventType == "" {
554-
eventType = eventpkg.TypeHTTP
555-
}
556-
return eventType
491+
type backlogEvent struct {
492+
path string
493+
event eventpkg.Event
557494
}

0 commit comments

Comments
 (0)