fix https://github.com/kataras/iris/issues/1713 and add a simple usage example of the 'RemoveHandler'

This commit is contained in:
Gerasimos (Makis) Maropoulos 2021-01-27 01:22:20 +02:00
parent 197df1ef64
commit f7757c0793
No known key found for this signature in database
GPG Key ID: 5DBE766BD26A54E7
7 changed files with 60 additions and 34 deletions

View File

@ -48,6 +48,7 @@
* Middleware
* [Per Route](routing/writing-a-middleware/per-route/main.go)
* [Globally](routing/writing-a-middleware/globally/main.go)
* [Remove a Handler](routing/remove-handler/main.go)
* Share Values
* [Share Services](routing/writing-a-middleware/share-services/main.go)
* [Share Functions](routing/writing-a-middleware/share-funcs/main.go)

View File

@ -0,0 +1,29 @@
package main
import "github.com/kataras/iris/v12"
func main() {
app := newApp()
app.Listen(":8080")
}
func newApp() *iris.Application {
app := iris.New()
api := app.Party("/api")
api.Use(myMiddleware)
users := api.Party("/users")
users.Get("/", usersIndex).RemoveHandler(myMiddleware)
// OR for all routes under a Party (or Application):
// users.RemoveHandler(...)
return app
}
func myMiddleware(ctx iris.Context) {
ctx.WriteString("Middleware\n")
}
func usersIndex(ctx iris.Context) {
ctx.WriteString("OK")
}

View File

@ -0,0 +1,14 @@
package main
import (
"testing"
"github.com/kataras/iris/v12/httptest"
)
func TestSimpleRouteRemoveHandler(t *testing.T) {
app := newApp()
e := httptest.New(t, app)
e.GET("/api/users").Expect().Status(httptest.StatusOK).Body().Equal("OK")
}

View File

@ -2280,7 +2280,7 @@ type internalJSONDecoder interface {
func (cfg JSONReader) getDecoder(r io.Reader, globalShouldOptimize bool) (decoder internalJSONDecoder) {
if cfg.Optimize || globalShouldOptimize {
decoder = jsoniter.NewDecoder(r)
decoder = jsoniter.ConfigCompatibleWithStandardLibrary.NewDecoder(r)
} else {
decoder = json.NewDecoder(r)
}

View File

@ -16,48 +16,30 @@ import (
func FromStd(handler interface{}) context.Handler {
switch h := handler.(type) {
case context.Handler:
{
//
// it's already an Iris Handler
//
return h
}
return h
case func(*context.Context):
return h
case http.Handler:
{
//
// handlerFunc.ServeHTTP(w,r)
//
return func(ctx *context.Context) {
h.ServeHTTP(ctx.ResponseWriter(), ctx.Request())
}
// handlerFunc.ServeHTTP(w,r)
return func(ctx *context.Context) {
h.ServeHTTP(ctx.ResponseWriter(), ctx.Request())
}
case func(http.ResponseWriter, *http.Request):
{
//
// handlerFunc(w,r)
//
return FromStd(http.HandlerFunc(h))
}
// handlerFunc(w,r)
return FromStd(http.HandlerFunc(h))
case func(http.ResponseWriter, *http.Request, http.HandlerFunc):
{
//
// handlerFunc(w,r, http.HandlerFunc)
//
return FromStdWithNext(h)
}
// handlerFunc(w,r, http.HandlerFunc)
//
return FromStdWithNext(h)
default:
{
//
// No valid handler passed
//
panic(fmt.Errorf(`
// No valid handler passed
panic(fmt.Errorf(`
Passed argument is not a func(iris.Context) neither one of these types:
- http.Handler
- func(w http.ResponseWriter, r *http.Request)
- func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc)
---------------------------------------------------------------------
It seems to be a %T points to: %v`, handler, handler))
}
}
}

View File

@ -1210,7 +1210,7 @@ func (api *APIBuilder) RemoveHandler(namesOrHandlers ...interface{}) Party {
switch h := nameOrHandler.(type) {
case string:
handlerName = h
case context.Handler:
case context.Handler, func(*context.Context):
handlerName = context.HandlerName(h)
case *int:
counter = h

View File

@ -159,7 +159,7 @@ func (r *Route) RemoveHandler(namesOrHandlers ...interface{}) (count int) {
switch h := nameOrHandler.(type) {
case string:
handlerName = h
case context.Handler:
case context.Handler, func(*context.Context):
handlerName = context.HandlerName(h)
default:
panic(fmt.Sprintf("remove handler: unexpected type of %T", h))