Skip to content

Commit

Permalink
Merge pull request #262 from XenitAB/errorhandler-gin-propagation
Browse files Browse the repository at this point in the history
Abort middleware chain correctly for Gin
  • Loading branch information
bittrance committed May 11, 2023
2 parents 0a38ecf + 97333a5 commit 8e49935
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 17 deletions.
4 changes: 2 additions & 2 deletions oidcecho/go.sum
Expand Up @@ -78,8 +78,8 @@ github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/xenitab/dispans v0.0.10 h1:S+gSUM14rDJWK7MYNrjb8JbjeQPip6mlNJyLX+g7Agc=
github.com/xenitab/go-oidc-middleware v0.0.41 h1:k37zfu3fyRKlrD+B+abcgbIUOU2cSjPE7xaFpgA8TJM=
github.com/xenitab/go-oidc-middleware v0.0.41/go.mod h1:+menF2rCe5yqS4jpVEtR0JgQS3dPZHuwty+4PQ4BbrE=
github.com/xenitab/go-oidc-middleware v0.0.42 h1:j7+tWjVF2h3oyzp/jdlp5R8EWezaWc1jtT0/x5LC3oQ=
github.com/xenitab/go-oidc-middleware v0.0.42/go.mod h1:+menF2rCe5yqS4jpVEtR0JgQS3dPZHuwty+4PQ4BbrE=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA=
Expand Down
4 changes: 2 additions & 2 deletions oidcfiber/go.sum
Expand Up @@ -98,8 +98,8 @@ github.com/valyala/fasthttp v1.44.0/go.mod h1:f6VbjjoI3z1NDOZOv17o6RvtRSWxC77seB
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
github.com/xenitab/dispans v0.0.10 h1:S+gSUM14rDJWK7MYNrjb8JbjeQPip6mlNJyLX+g7Agc=
github.com/xenitab/go-oidc-middleware v0.0.41 h1:k37zfu3fyRKlrD+B+abcgbIUOU2cSjPE7xaFpgA8TJM=
github.com/xenitab/go-oidc-middleware v0.0.41/go.mod h1:+menF2rCe5yqS4jpVEtR0JgQS3dPZHuwty+4PQ4BbrE=
github.com/xenitab/go-oidc-middleware v0.0.42 h1:j7+tWjVF2h3oyzp/jdlp5R8EWezaWc1jtT0/x5LC3oQ=
github.com/xenitab/go-oidc-middleware v0.0.42/go.mod h1:+menF2rCe5yqS4jpVEtR0JgQS3dPZHuwty+4PQ4BbrE=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
Expand Down
4 changes: 2 additions & 2 deletions oidcgin/gin.go
Expand Up @@ -39,6 +39,8 @@ func onError(c *gin.Context, errorHandler options.ErrorHandler, statusCode int,
c.Header(k, v)
}
c.Data(response.StatusCode, response.ContentType(), response.Body)
c.Error(err)
c.Abort()
return nil
}

Expand All @@ -61,7 +63,5 @@ func toGinHandler[T any](parseToken oidc.ParseTokenFunc[T], setters ...options.O
}

c.Set(string(opts.ClaimsContextKeyName), claims)

c.Next()
}
}
44 changes: 39 additions & 5 deletions oidcgin/gin_test.go
@@ -1,13 +1,16 @@
package oidcgin

import (
"context"
"io"
"net/http"
"net/http/httptest"
"testing"

"github.com/stretchr/testify/require"
"github.com/xenitab/go-oidc-middleware/internal/oidc"
"github.com/xenitab/go-oidc-middleware/internal/oidctesting"
"github.com/xenitab/go-oidc-middleware/optest"
"github.com/xenitab/go-oidc-middleware/options"

"github.com/gin-gonic/gin"
Expand All @@ -23,7 +26,7 @@ func BenchmarkSuite(b *testing.B) {
oidctesting.RunBenchmarks(b, testName, newTestHandler(b))
}

func testGetGinRouter(tb testing.TB, middleware gin.HandlerFunc) *gin.Engine {
func testGetGinRouter(tb testing.TB, middlewares []gin.HandlerFunc) *gin.Engine {
tb.Helper()

// remove debug output from tests
Expand All @@ -33,7 +36,9 @@ func testGetGinRouter(tb testing.TB, middleware gin.HandlerFunc) *gin.Engine {

r := gin.Default()

r.Use(middleware)
for _, m := range middlewares {
r.Use(m)
}

r.GET("/", func(c *gin.Context) {
claimsValue, found := c.Get("claims")
Expand Down Expand Up @@ -98,19 +103,48 @@ func (h *testHandler) NewHandlerFn(claimsValidationFn options.ClaimsValidationFn
h.tb.Helper()

middleware := New(claimsValidationFn, opts...)
return testGetGinRouter(h.tb, middleware)
return testGetGinRouter(h.tb, []gin.HandlerFunc{middleware})
}

func (h *testHandler) ToHandlerFn(parseToken oidc.ParseTokenFunc[oidctesting.TestClaims], opts ...options.Option) http.Handler {
h.tb.Helper()

middleware := toGinHandler(parseToken, opts...)
return testGetGinRouter(h.tb, middleware)
return testGetGinRouter(h.tb, []gin.HandlerFunc{middleware})
}

func (h *testHandler) NewTestServer(opts ...options.Option) oidctesting.ServerTester {
h.tb.Helper()

middleware := New[oidctesting.TestClaims](nil, opts...)
return newTestServer(h.tb, testGetGinRouter(h.tb, middleware))
return newTestServer(h.tb, testGetGinRouter(h.tb, []gin.HandlerFunc{middleware}))
}

func TestAbortion(t *testing.T) {
op := optest.NewTesting(t)
defer op.Close(t)

errorHandler := func(ctx context.Context, oidcErr *options.OidcError) *options.Response {
return &options.Response{
StatusCode: 418,
Headers: map[string]string{},
Body: []byte("badness"),
}
}
opts := []options.Option{
options.WithIssuer(op.GetURL(t)),
options.WithRequiredAudience("test-client"),
options.WithRequiredTokenType("JWT+AT"),
options.WithErrorHandler(errorHandler),
}
nextCalled := false
next := func(c *gin.Context) {
nextCalled = true
}

middleware := New[oidctesting.TestClaims](nil, opts...)
r := testGetGinRouter(t, []gin.HandlerFunc{middleware, next})
req := httptest.NewRequest(http.MethodGet, "/", nil)
r.ServeHTTP(httptest.NewRecorder(), req)
require.Equal(t, false, nextCalled)
}
6 changes: 4 additions & 2 deletions oidcgin/go.mod
Expand Up @@ -4,7 +4,10 @@ go 1.20

require github.com/xenitab/go-oidc-middleware v0.0.42

require github.com/gin-gonic/gin v1.8.2
require (
github.com/gin-gonic/gin v1.8.2
github.com/stretchr/testify v1.8.1
)

require (
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect
Expand All @@ -30,7 +33,6 @@ require (
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/testify v1.8.1 // indirect
github.com/ugorji/go/codec v1.2.9 // indirect
go.uber.org/ratelimit v0.2.0 // indirect
golang.org/x/crypto v0.6.0 // indirect
Expand Down
4 changes: 2 additions & 2 deletions oidcgin/go.sum
Expand Up @@ -90,8 +90,8 @@ github.com/tidwall/tinyqueue v0.1.1 h1:SpNEvEggbpyN5DIReaJ2/1ndroY8iyEGxPYxoSaym
github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU=
github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/xenitab/dispans v0.0.10 h1:S+gSUM14rDJWK7MYNrjb8JbjeQPip6mlNJyLX+g7Agc=
github.com/xenitab/go-oidc-middleware v0.0.41 h1:k37zfu3fyRKlrD+B+abcgbIUOU2cSjPE7xaFpgA8TJM=
github.com/xenitab/go-oidc-middleware v0.0.41/go.mod h1:+menF2rCe5yqS4jpVEtR0JgQS3dPZHuwty+4PQ4BbrE=
github.com/xenitab/go-oidc-middleware v0.0.42 h1:j7+tWjVF2h3oyzp/jdlp5R8EWezaWc1jtT0/x5LC3oQ=
github.com/xenitab/go-oidc-middleware v0.0.42/go.mod h1:+menF2rCe5yqS4jpVEtR0JgQS3dPZHuwty+4PQ4BbrE=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA=
Expand Down
4 changes: 2 additions & 2 deletions oidchttp/go.sum
Expand Up @@ -60,8 +60,8 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
github.com/tidwall/rtred v0.1.2 h1:exmoQtOLvDoO8ud++6LwVsAMTu0KPzLTUrMln8u1yu8=
github.com/tidwall/tinyqueue v0.1.1 h1:SpNEvEggbpyN5DIReaJ2/1ndroY8iyEGxPYxoSaymYE=
github.com/xenitab/dispans v0.0.10 h1:S+gSUM14rDJWK7MYNrjb8JbjeQPip6mlNJyLX+g7Agc=
github.com/xenitab/go-oidc-middleware v0.0.41 h1:k37zfu3fyRKlrD+B+abcgbIUOU2cSjPE7xaFpgA8TJM=
github.com/xenitab/go-oidc-middleware v0.0.41/go.mod h1:+menF2rCe5yqS4jpVEtR0JgQS3dPZHuwty+4PQ4BbrE=
github.com/xenitab/go-oidc-middleware v0.0.42 h1:j7+tWjVF2h3oyzp/jdlp5R8EWezaWc1jtT0/x5LC3oQ=
github.com/xenitab/go-oidc-middleware v0.0.42/go.mod h1:+menF2rCe5yqS4jpVEtR0JgQS3dPZHuwty+4PQ4BbrE=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA=
Expand Down

0 comments on commit 8e49935

Please sign in to comment.