@@ -13,6 +13,8 @@ import (
13
13
"net/http"
14
14
)
15
15
16
+ const DefaultNonHTTPEventPath = "/events"
17
+
16
18
type LambdaHandlerOption func (handler * LambdaHandler )
17
19
18
20
type SDKSessionProvider func () (* session.Session , error )
@@ -31,14 +33,27 @@ func WithAWSConfigProvider(sp SDKConfigProvider) LambdaHandlerOption {
31
33
}
32
34
}
33
35
36
+ func WithNonHTTPEventPath (path string ) LambdaHandlerOption {
37
+ return func (handler * LambdaHandler ) {
38
+ handler .nonHTTPEventPath = path
39
+ }
40
+ }
41
+
42
+ func WithoutNonHTTPEventPassThrough () LambdaHandlerOption {
43
+ return func (handler * LambdaHandler ) {
44
+ handler .nonHTTPEventPath = ""
45
+ }
46
+ }
47
+
34
48
type LambdaHandler struct {
35
- httpHandler http.Handler
36
- sessProv SDKSessionProvider
37
- sess * session.Session
38
- confProv SDKConfigProvider
39
- conf * aws.Config
40
- apiGW APIGatewayManagementAPI
41
- wsPathPrefix string
49
+ httpHandler http.Handler
50
+ sessProv SDKSessionProvider
51
+ sess * session.Session
52
+ confProv SDKConfigProvider
53
+ conf * aws.Config
54
+ apiGW APIGatewayManagementAPI
55
+ wsPathPrefix string
56
+ nonHTTPEventPath string
42
57
}
43
58
44
59
func NewLambdaHandlerWithOption (h http.Handler , options []interface {}) lambda.Handler {
@@ -47,7 +62,8 @@ func NewLambdaHandlerWithOption(h http.Handler, options []interface{}) lambda.Ha
47
62
confProv : func (ctx context.Context ) (aws.Config , error ) {
48
63
return config .LoadDefaultConfig (ctx )
49
64
},
50
- wsPathPrefix : DefaultWebsocketPathPrefix ,
65
+ wsPathPrefix : DefaultWebsocketPathPrefix ,
66
+ nonHTTPEventPath : DefaultNonHTTPEventPath ,
51
67
}
52
68
53
69
for _ , opt := range options {
@@ -96,6 +112,19 @@ func (l *LambdaHandler) InvokeALBTargetGroup(ctx context.Context, request *event
96
112
return ALBTargetResponse (w , multiValue )
97
113
}
98
114
115
+ func (l * LambdaHandler ) HandleNonHTTPEvent (ctx context.Context , event []byte , contentType string ) ([]byte , error ) {
116
+ if l .nonHTTPEventPath == "" {
117
+ return nil , fmt .Errorf ("unknown lambda integration type and non-http event path is not set" )
118
+ }
119
+ req , err := NewLambdaPassthroughRequest (ctx , event , l .nonHTTPEventPath , contentType )
120
+ if err != nil {
121
+ return nil , err
122
+ }
123
+ w := NewResponseWriter ()
124
+ l .httpHandler .ServeHTTP (w , req )
125
+ return w .buf .Bytes (), nil
126
+ }
127
+
99
128
func (l * LambdaHandler ) ProvideAPIGatewayClient (ctx context.Context , request * events.APIGatewayWebsocketProxyRequest ) (client APIGatewayManagementAPI , err error ) {
100
129
if l .apiGW != nil {
101
130
return l .apiGW , nil
@@ -158,46 +187,46 @@ func (l *LambdaHandler) Invoke(ctx context.Context, payload []byte) ([]byte, err
158
187
err error
159
188
)
160
189
161
- if err := json .Unmarshal (payload , & checker ); err != nil {
162
- return nil , err
163
- }
164
-
165
- switch checker .IntegrationType () {
166
- case APIGatewayRESTIntegration :
167
- event := & events.APIGatewayProxyRequest {}
168
- if err := json .Unmarshal (payload , event ); err != nil {
169
- return nil , err
170
- }
171
- if trace .RequestEvent != nil {
172
- trace .RequestEvent (ctx , payload )
173
- }
174
- res , err = l .InvokeRESTAPI (ctx , event )
175
- case APIGatewayHTTPIntegration :
176
- event := & events.APIGatewayV2HTTPRequest {}
177
- if err := json .Unmarshal (payload , event ); err != nil {
178
- return nil , err
179
- }
180
- if trace .RequestEvent != nil {
181
- trace .RequestEvent (ctx , payload )
182
- }
183
- res , err = l .InvokeHTTPAPI (ctx , event )
184
- case ALBTargetGroupIntegration :
185
- event := & events.ALBTargetGroupRequest {}
186
- if err := json .Unmarshal (payload , event ); err != nil {
187
- return nil , err
188
- }
189
- if trace .RequestEvent != nil {
190
- trace .RequestEvent (ctx , payload )
191
- }
192
- res , err = l .InvokeALBTargetGroup (ctx , event )
193
- case APIGatewayWebsocketIntegration :
194
- event := & events.APIGatewayWebsocketProxyRequest {}
195
- if err := json .Unmarshal (payload , event ); err != nil {
196
- return nil , err
190
+ if err = json .Unmarshal (payload , & checker ); err != nil {
191
+ res , err = l .HandleNonHTTPEvent (ctx , payload , http .DetectContentType (payload ))
192
+ } else {
193
+ switch checker .IntegrationType () {
194
+ case APIGatewayRESTIntegration :
195
+ event := & events.APIGatewayProxyRequest {}
196
+ if err := json .Unmarshal (payload , event ); err != nil {
197
+ return nil , err
198
+ }
199
+ if trace .RequestEvent != nil {
200
+ trace .RequestEvent (ctx , payload )
201
+ }
202
+ res , err = l .InvokeRESTAPI (ctx , event )
203
+ case APIGatewayHTTPIntegration :
204
+ event := & events.APIGatewayV2HTTPRequest {}
205
+ if err := json .Unmarshal (payload , event ); err != nil {
206
+ return nil , err
207
+ }
208
+ if trace .RequestEvent != nil {
209
+ trace .RequestEvent (ctx , payload )
210
+ }
211
+ res , err = l .InvokeHTTPAPI (ctx , event )
212
+ case ALBTargetGroupIntegration :
213
+ event := & events.ALBTargetGroupRequest {}
214
+ if err := json .Unmarshal (payload , event ); err != nil {
215
+ return nil , err
216
+ }
217
+ if trace .RequestEvent != nil {
218
+ trace .RequestEvent (ctx , payload )
219
+ }
220
+ res , err = l .InvokeALBTargetGroup (ctx , event )
221
+ case APIGatewayWebsocketIntegration :
222
+ event := & events.APIGatewayWebsocketProxyRequest {}
223
+ if err := json .Unmarshal (payload , event ); err != nil {
224
+ return nil , err
225
+ }
226
+ res , err = l .InvokeWebsocketAPI (ctx , event )
227
+ default :
228
+ res , err = l .HandleNonHTTPEvent (ctx , payload , "application/json" )
197
229
}
198
- res , err = l .InvokeWebsocketAPI (ctx , event )
199
- default :
200
- return nil , fmt .Errorf ("unknown lambda integration type" )
201
230
}
202
231
203
232
if err != nil {
@@ -208,9 +237,13 @@ func (l *LambdaHandler) Invoke(ctx context.Context, payload []byte) ([]byte, err
208
237
trace .ResponseEvent (ctx , res )
209
238
}
210
239
211
- if responseBytes , err := json . Marshal ( res ); err != nil {
212
- return nil , err
240
+ if b , ok := res .([] byte ); ok {
241
+ return b , nil
213
242
} else {
214
- return responseBytes , nil
243
+ if responseBytes , err := json .Marshal (res ); err != nil {
244
+ return nil , err
245
+ } else {
246
+ return responseBytes , nil
247
+ }
215
248
}
216
249
}
0 commit comments