Skip to content
This repository was archived by the owner on May 21, 2025. It is now read-only.

Commit 310bb46

Browse files
authored
Merge pull request #115 from drakejin/master
gofiber adapter, fix injecting header logic
2 parents 3e0fdca + a5340e8 commit 310bb46

File tree

2 files changed

+263
-7
lines changed

2 files changed

+263
-7
lines changed

fiber/adapter.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ import (
1010
"net/http"
1111

1212
"github.com/aws/aws-lambda-go/events"
13-
"github.com/awslabs/aws-lambda-go-api-proxy/core"
1413
"github.com/gofiber/fiber/v2"
1514
"github.com/gofiber/fiber/v2/utils"
1615
"github.com/valyala/fasthttp"
16+
17+
"github.com/awslabs/aws-lambda-go-api-proxy/core"
1718
)
1819

1920
// FiberLambda makes it easy to send API Gateway proxy events to a fiber.App.
@@ -115,7 +116,16 @@ func (f *FiberLambda) adaptor(w http.ResponseWriter, r *http.Request) {
115116
req.SetHost(r.Host)
116117
for key, val := range r.Header {
117118
for _, v := range val {
118-
req.Header.Add(key, v)
119+
switch key {
120+
case fiber.HeaderHost,
121+
fiber.HeaderContentType,
122+
fiber.HeaderUserAgent,
123+
fiber.HeaderContentLength,
124+
fiber.HeaderConnection:
125+
req.Header.Set(key, v)
126+
default:
127+
req.Header.Add(key, v)
128+
}
119129
}
120130
}
121131

@@ -134,7 +144,7 @@ func (f *FiberLambda) adaptor(w http.ResponseWriter, r *http.Request) {
134144

135145
// Set response headers
136146
fctx.Response.Header.VisitAll(func(k, v []byte) {
137-
w.Header().Set(utils.UnsafeString(k), utils.UnsafeString(v))
147+
w.Header().Add(utils.UnsafeString(k), utils.UnsafeString(v))
138148
})
139149

140150
// Set response statuscode

fiber/fiberlambda_test.go

Lines changed: 250 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,21 @@ package fiberadapter_test
22

33
import (
44
"context"
5-
"log"
65

76
"github.com/aws/aws-lambda-go/events"
8-
fiberadaptor "github.com/awslabs/aws-lambda-go-api-proxy/fiber"
97
"github.com/gofiber/fiber/v2"
108

9+
fiberadaptor "github.com/awslabs/aws-lambda-go-api-proxy/fiber"
10+
1111
. "github.com/onsi/ginkgo"
1212
. "github.com/onsi/gomega"
1313
)
1414

1515
var _ = Describe("FiberLambda tests", func() {
1616
Context("Simple ping request", func() {
1717
It("Proxies the event correctly", func() {
18-
log.Println("Starting test")
1918
app := fiber.New()
2019
app.Get("/ping", func(c *fiber.Ctx) error {
21-
log.Println("Handler!!")
2220
return c.SendString("pong")
2321
})
2422

@@ -40,4 +38,252 @@ var _ = Describe("FiberLambda tests", func() {
4038
Expect(resp.StatusCode).To(Equal(200))
4139
})
4240
})
41+
42+
Context("Request header", func() {
43+
It("Check pass canonical header to fiber", func() {
44+
app := fiber.New()
45+
app.Post("/canonical_header", func(c *fiber.Ctx) error {
46+
Expect(c.Get(fiber.HeaderHost)).To(Equal("localhost"))
47+
Expect(c.Get(fiber.HeaderContentType)).To(Equal(fiber.MIMEApplicationJSONCharsetUTF8))
48+
Expect(c.Get(fiber.HeaderUserAgent)).To(Equal("fiber"))
49+
50+
Expect(c.Cookies("a")).To(Equal("b"))
51+
Expect(c.Cookies("b")).To(Equal("c"))
52+
Expect(c.Cookies("c")).To(Equal("d"))
53+
54+
Expect(c.Get(fiber.HeaderContentLength)).To(Equal("77"))
55+
Expect(c.Get(fiber.HeaderConnection)).To(Equal("Keep-Alive"))
56+
Expect(c.Get(fiber.HeaderKeepAlive)).To(Equal("timeout=5, max=1000"))
57+
Expect(c.Get(fiber.HeaderTransferEncoding)).To(Equal("gzip"))
58+
59+
return c.Status(fiber.StatusNoContent).Send(nil)
60+
})
61+
62+
adapter := fiberadaptor.New(app)
63+
64+
req := events.APIGatewayProxyRequest{
65+
Path: "/canonical_header",
66+
HTTPMethod: "POST",
67+
MultiValueHeaders: map[string][]string{
68+
fiber.HeaderHost: {"localhost"},
69+
fiber.HeaderContentType: {fiber.MIMEApplicationJSONCharsetUTF8},
70+
fiber.HeaderUserAgent: {"fiber"},
71+
72+
"cookie": {"a=b", "b=c;c=d"},
73+
74+
fiber.HeaderContentLength: {"77"},
75+
fiber.HeaderConnection: {"Keep-Alive"},
76+
fiber.HeaderKeepAlive: {"timeout=5, max=1000"},
77+
fiber.HeaderTransferEncoding: {"gzip"},
78+
},
79+
}
80+
81+
resp, err := adapter.ProxyWithContext(context.Background(), req)
82+
83+
Expect(err).To(BeNil())
84+
Expect(resp.StatusCode).To(Equal(fiber.StatusNoContent))
85+
Expect(resp.Body).To(Equal(""))
86+
})
87+
88+
It("Check pass non canonical header to fiber", func() {
89+
app := fiber.New()
90+
app.Post("/header", func(c *fiber.Ctx) error {
91+
Expect(c.Get(fiber.HeaderReferer)).To(Equal("https://github.com/gofiber/fiber"))
92+
Expect(c.Get(fiber.HeaderAuthorization)).To(Equal("Bearer drink_beer_not_coffee"))
93+
94+
c.Context().Request.Header.VisitAll(func(key, value []byte) {
95+
if string(key) == "K1" {
96+
Expect(Expect(c.Get("K1")).To(Or(Equal("v1"), Equal("v2"))))
97+
}
98+
})
99+
100+
return c.Status(fiber.StatusNoContent).Send(nil)
101+
})
102+
103+
adapter := fiberadaptor.New(app)
104+
105+
req := events.APIGatewayProxyRequest{
106+
Path: "/header",
107+
HTTPMethod: "POST",
108+
MultiValueHeaders: map[string][]string{
109+
fiber.HeaderReferer: {"https://github.com/gofiber/fiber"},
110+
fiber.HeaderAuthorization: {"Bearer drink_beer_not_coffee"},
111+
112+
"k1": {"v1", "v2"},
113+
},
114+
}
115+
116+
resp, err := adapter.ProxyWithContext(context.Background(), req)
117+
118+
Expect(err).To(BeNil())
119+
Expect(resp.StatusCode).To(Equal(fiber.StatusNoContent))
120+
Expect(resp.Body).To(Equal(""))
121+
})
122+
})
123+
124+
Context("Response header", func() {
125+
It("Check pass canonical header to fiber", func() {
126+
app := fiber.New()
127+
app.Post("/canonical_header", func(c *fiber.Ctx) error {
128+
c.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSONCharsetUTF8)
129+
c.Set(fiber.HeaderServer, "localhost")
130+
131+
c.Cookie(&fiber.Cookie{
132+
Name: "a",
133+
Value: "b",
134+
HTTPOnly: true,
135+
})
136+
c.Cookie(&fiber.Cookie{
137+
Name: "b",
138+
Value: "c",
139+
HTTPOnly: true,
140+
})
141+
c.Cookie(&fiber.Cookie{
142+
Name: "c",
143+
Value: "d",
144+
HTTPOnly: true,
145+
})
146+
147+
c.Set(fiber.HeaderContentLength, "77")
148+
c.Set(fiber.HeaderConnection, "keep-alive")
149+
150+
return c.Status(fiber.StatusNoContent).Send(nil)
151+
})
152+
153+
adapter := fiberadaptor.New(app)
154+
155+
req := events.APIGatewayProxyRequest{
156+
Path: "/canonical_header",
157+
HTTPMethod: "POST",
158+
}
159+
160+
resp, err := adapter.ProxyWithContext(context.Background(), req)
161+
162+
Expect(err).To(BeNil())
163+
Expect(resp.StatusCode).To(Equal(fiber.StatusNoContent))
164+
// NOTI: core.NewProxyResponseWriter().GetProxyResponse() => Doesn't use `resp.Header`
165+
Expect(resp.MultiValueHeaders[fiber.HeaderContentType]).To(Equal([]string{fiber.MIMEApplicationJSONCharsetUTF8}))
166+
Expect(resp.MultiValueHeaders[fiber.HeaderServer]).To(Equal([]string{"localhost"}))
167+
Expect(resp.MultiValueHeaders[fiber.HeaderSetCookie]).To(Equal([]string{"a=b; path=/; HttpOnly; SameSite=Lax", "b=c; path=/; HttpOnly; SameSite=Lax", "c=d; path=/; HttpOnly; SameSite=Lax"}))
168+
Expect(resp.MultiValueHeaders[fiber.HeaderContentLength]).To(Equal([]string{"77"}))
169+
Expect(resp.MultiValueHeaders[fiber.HeaderConnection]).To(Equal([]string{"keep-alive"}))
170+
Expect(resp.Body).To(Equal(""))
171+
})
172+
It("Check pass non canonical header to fiber", func() {
173+
app := fiber.New()
174+
app.Post("/header", func(c *fiber.Ctx) error {
175+
c.Links("http://api.example.com/users?page=2", "next", "http://api.example.com/users?page=5", "last")
176+
return c.Redirect("https://github.com/gofiber/fiber")
177+
})
178+
179+
adapter := fiberadaptor.New(app)
180+
181+
req := events.APIGatewayProxyRequest{
182+
Path: "/header",
183+
HTTPMethod: "POST",
184+
}
185+
186+
resp, err := adapter.ProxyWithContext(context.Background(), req)
187+
188+
Expect(err).To(BeNil())
189+
Expect(resp.StatusCode).To(Equal(fiber.StatusFound))
190+
Expect(resp.MultiValueHeaders[fiber.HeaderLocation]).To(Equal([]string{"https://github.com/gofiber/fiber"}))
191+
Expect(resp.MultiValueHeaders[fiber.HeaderLink]).To(Equal([]string{"<http://api.example.com/users?page=2>; rel=\"next\",<http://api.example.com/users?page=5>; rel=\"last\""}))
192+
Expect(resp.Body).To(Equal(""))
193+
})
194+
})
195+
196+
Context("Next method", func() {
197+
It("Check missing values in request header", func() {
198+
app := fiber.New()
199+
app.Post("/next", func(c *fiber.Ctx) error {
200+
c.Next()
201+
Expect(c.Get(fiber.HeaderHost)).To(Equal("localhost"))
202+
Expect(c.Get(fiber.HeaderContentType)).To(Equal(fiber.MIMEApplicationJSONCharsetUTF8))
203+
Expect(c.Get(fiber.HeaderUserAgent)).To(Equal("fiber"))
204+
205+
Expect(c.Cookies("a")).To(Equal("b"))
206+
Expect(c.Cookies("b")).To(Equal("c"))
207+
Expect(c.Cookies("c")).To(Equal("d"))
208+
209+
Expect(c.Get(fiber.HeaderContentLength)).To(Equal("77"))
210+
Expect(c.Get(fiber.HeaderConnection)).To(Equal("Keep-Alive"))
211+
Expect(c.Get(fiber.HeaderKeepAlive)).To(Equal("timeout=5, max=1000"))
212+
Expect(c.Get(fiber.HeaderTransferEncoding)).To(Equal("gzip"))
213+
214+
return c.Status(fiber.StatusNoContent).Send(nil)
215+
})
216+
adapter := fiberadaptor.New(app)
217+
218+
req := events.APIGatewayProxyRequest{
219+
Path: "/next",
220+
HTTPMethod: "POST",
221+
MultiValueHeaders: map[string][]string{
222+
fiber.HeaderHost: {"localhost"},
223+
fiber.HeaderContentType: {fiber.MIMEApplicationJSONCharsetUTF8},
224+
fiber.HeaderUserAgent: {"fiber"},
225+
226+
"cookie": {"a=b", "b=c;c=d"},
227+
228+
fiber.HeaderContentLength: {"77"},
229+
fiber.HeaderConnection: {"Keep-Alive"},
230+
fiber.HeaderKeepAlive: {"timeout=5, max=1000"},
231+
fiber.HeaderTransferEncoding: {"gzip"},
232+
},
233+
}
234+
235+
resp, err := adapter.ProxyWithContext(context.Background(), req)
236+
237+
Expect(err).To(BeNil())
238+
Expect(resp.StatusCode).To(Equal(fiber.StatusNoContent))
239+
Expect(resp.Body).To(Equal(""))
240+
})
241+
242+
It("Check missing values in response header", func() {
243+
app := fiber.New()
244+
app.Post("/next", func(c *fiber.Ctx) error {
245+
c.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSONCharsetUTF8)
246+
c.Set(fiber.HeaderServer, "localhost")
247+
248+
c.Cookie(&fiber.Cookie{
249+
Name: "a",
250+
Value: "b",
251+
HTTPOnly: true,
252+
})
253+
c.Cookie(&fiber.Cookie{
254+
Name: "b",
255+
Value: "c",
256+
HTTPOnly: true,
257+
})
258+
c.Cookie(&fiber.Cookie{
259+
Name: "c",
260+
Value: "d",
261+
HTTPOnly: true,
262+
})
263+
264+
c.Set(fiber.HeaderContentLength, "77")
265+
c.Set(fiber.HeaderConnection, "keep-alive")
266+
267+
c.Next()
268+
return c.Status(fiber.StatusNoContent).Send(nil)
269+
})
270+
adapter := fiberadaptor.New(app)
271+
272+
req := events.APIGatewayProxyRequest{
273+
Path: "/next",
274+
HTTPMethod: "POST",
275+
}
276+
277+
resp, err := adapter.ProxyWithContext(context.Background(), req)
278+
279+
Expect(err).To(BeNil())
280+
Expect(resp.StatusCode).To(Equal(fiber.StatusNoContent))
281+
Expect(resp.MultiValueHeaders[fiber.HeaderContentType]).To(Equal([]string{fiber.MIMEApplicationJSONCharsetUTF8}))
282+
Expect(resp.MultiValueHeaders[fiber.HeaderServer]).To(Equal([]string{"localhost"}))
283+
Expect(resp.MultiValueHeaders[fiber.HeaderSetCookie]).To(Equal([]string{"a=b; path=/; HttpOnly; SameSite=Lax", "b=c; path=/; HttpOnly; SameSite=Lax", "c=d; path=/; HttpOnly; SameSite=Lax"}))
284+
Expect(resp.MultiValueHeaders[fiber.HeaderContentLength]).To(Equal([]string{"77"}))
285+
Expect(resp.MultiValueHeaders[fiber.HeaderConnection]).To(Equal([]string{"keep-alive"}))
286+
Expect(resp.Body).To(Equal(""))
287+
})
288+
})
43289
})

0 commit comments

Comments
 (0)