@@ -13,6 +13,8 @@ import (
1313 "net/http"
1414)
1515
16+ const DefaultNonHTTPEventPath = "/events"
17+
1618type LambdaHandlerOption func (handler * LambdaHandler )
1719
1820type SDKSessionProvider func () (* session.Session , error )
@@ -31,14 +33,27 @@ func WithAWSConfigProvider(sp SDKConfigProvider) LambdaHandlerOption {
3133 }
3234}
3335
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+
3448type 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
4257}
4358
4459func NewLambdaHandlerWithOption (h http.Handler , options []interface {}) lambda.Handler {
@@ -47,7 +62,8 @@ func NewLambdaHandlerWithOption(h http.Handler, options []interface{}) lambda.Ha
4762 confProv : func (ctx context.Context ) (aws.Config , error ) {
4863 return config .LoadDefaultConfig (ctx )
4964 },
50- wsPathPrefix : DefaultWebsocketPathPrefix ,
65+ wsPathPrefix : DefaultWebsocketPathPrefix ,
66+ nonHTTPEventPath : DefaultNonHTTPEventPath ,
5167 }
5268
5369 for _ , opt := range options {
@@ -96,6 +112,19 @@ func (l *LambdaHandler) InvokeALBTargetGroup(ctx context.Context, request *event
96112 return ALBTargetResponse (w , multiValue )
97113}
98114
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+
99128func (l * LambdaHandler ) ProvideAPIGatewayClient (ctx context.Context , request * events.APIGatewayWebsocketProxyRequest ) (client APIGatewayManagementAPI , err error ) {
100129 if l .apiGW != nil {
101130 return l .apiGW , nil
@@ -159,45 +188,45 @@ func (l *LambdaHandler) Invoke(ctx context.Context, payload []byte) ([]byte, err
159188 )
160189
161190 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
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" )
197229 }
198- res , err = l .InvokeWebsocketAPI (ctx , event )
199- default :
200- return nil , fmt .Errorf ("unknown lambda integration type" )
201230 }
202231
203232 if err != nil {
@@ -208,9 +237,13 @@ func (l *LambdaHandler) Invoke(ctx context.Context, payload []byte) ([]byte, err
208237 trace .ResponseEvent (ctx , res )
209238 }
210239
211- if responseBytes , err := json . Marshal ( res ); err != nil {
212- return nil , err
240+ if b , ok := res .([] byte ); ok {
241+ return b , nil
213242 } 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+ }
215248 }
216249}
0 commit comments