Skip to content

Commit a3a04d4

Browse files
Support handler-specific middleware for gofiber (#2302)
* feat(fiber): add per-handler middleware support (HandlerMiddlewares) (#2) Add Fiber per-handler middleware support * fix(test/issue518): add models:true to config so generated code compiles (#4) * chore(fiber): regenerate existing fiber server files with middleware chain support (#5) --------- Co-authored-by: Courty <courty@courtyard.io>
1 parent c322d1a commit a3a04d4

File tree

10 files changed

+469
-30
lines changed

10 files changed

+469
-30
lines changed

internal/test/issues/issue-1529/strict-fiber/issue1529.gen.go

Lines changed: 21 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/test/issues/issue1469/main.gen.go

Lines changed: 21 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# yaml-language-server: $schema=../../../../configuration-schema.json
2+
package: issue518
3+
generate:
4+
fiber-server: true
5+
models: true
6+
output: main.gen.go
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package issue518
2+
3+
//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen --config=config.yaml spec.yaml

internal/test/issues/issue518/main.gen.go

Lines changed: 101 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package issue518
2+
3+
import (
4+
"net/http"
5+
"net/http/httptest"
6+
"testing"
7+
8+
"github.com/gofiber/fiber/v2"
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
type impl struct{}
13+
14+
// (GET /auth-check)
15+
func (i *impl) AuthCheck(c *fiber.Ctx) error {
16+
return c.SendStatus(fiber.StatusOK)
17+
}
18+
19+
// (GET /test)
20+
func (i *impl) Test(c *fiber.Ctx) error {
21+
return c.SendStatus(fiber.StatusOK)
22+
}
23+
24+
// hasSecurityScopes returns true if the BearerAuthScopes key was set in context,
25+
// even if the scopes slice is empty (an empty slice means the security scheme is
26+
// defined on the operation with no required scopes, which still requires auth).
27+
func hasSecurityScopes(c *fiber.Ctx) bool {
28+
_, ok := c.Context().UserValue(BearerAuthScopes).([]string)
29+
return ok
30+
}
31+
32+
func TestIssue518(t *testing.T) {
33+
server := &impl{}
34+
35+
assert.NotPanics(t, func() {
36+
r := fiber.New()
37+
RegisterHandlers(r, server)
38+
})
39+
40+
assert.NotPanics(t, func() {
41+
r := fiber.New()
42+
RegisterHandlersWithOptions(r, server, FiberServerOptions{
43+
Middlewares: []MiddlewareFunc{
44+
func(c *fiber.Ctx) error {
45+
return nil
46+
},
47+
},
48+
HandlerMiddlewares: []HandlerMiddlewareFunc{
49+
func(c *fiber.Ctx, next fiber.Handler) error {
50+
if hasSecurityScopes(c) && c.Get(fiber.HeaderAuthorization) == "" {
51+
return c.SendStatus(fiber.StatusUnauthorized)
52+
}
53+
return next(c)
54+
},
55+
},
56+
})
57+
})
58+
59+
t.Run("secured endpoint requires auth when scopes are present", func(t *testing.T) {
60+
r := fiber.New()
61+
RegisterHandlersWithOptions(r, server, FiberServerOptions{
62+
HandlerMiddlewares: []HandlerMiddlewareFunc{
63+
func(c *fiber.Ctx, next fiber.Handler) error {
64+
if hasSecurityScopes(c) && c.Get(fiber.HeaderAuthorization) == "" {
65+
return c.SendStatus(fiber.StatusUnauthorized)
66+
}
67+
return next(c)
68+
},
69+
},
70+
})
71+
72+
req := httptest.NewRequest(http.MethodGet, "/auth-check", nil)
73+
resp, err := r.Test(req)
74+
assert.NoError(t, err)
75+
assert.Equal(t, fiber.StatusUnauthorized, resp.StatusCode)
76+
77+
req = httptest.NewRequest(http.MethodGet, "/auth-check", nil)
78+
req.Header.Set(fiber.HeaderAuthorization, "Bearer token")
79+
resp, err = r.Test(req)
80+
assert.NoError(t, err)
81+
assert.Equal(t, fiber.StatusOK, resp.StatusCode)
82+
83+
req = httptest.NewRequest(http.MethodGet, "/test", nil)
84+
resp, err = r.Test(req)
85+
assert.NoError(t, err)
86+
assert.Equal(t, fiber.StatusOK, resp.StatusCode)
87+
})
88+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
openapi: "3.0.1"
2+
components:
3+
securitySchemes:
4+
bearerAuth:
5+
scheme: bearer
6+
type: http
7+
paths:
8+
/auth-check:
9+
get:
10+
operationId: authCheck
11+
security:
12+
- bearerAuth: []
13+
responses:
14+
200:
15+
description: good
16+
/test:
17+
get:
18+
operationId: test
19+
responses:
20+
200:
21+
description: good

0 commit comments

Comments
 (0)