How to use middlewares when using julienschmidt/httprouter in goLang?

Viewed 6227

What's the best way to chain middlewares while using julienschmidt/httprouter?

As far as I have googled, http.HandlerFunc accepts functions only in the form func (w ResponseWriter, r *Request) whereas httprouter.Handle functions are of the form func (w http.ResponseWriter, r *http.Request, ps httprouter.Params).

How to I chain middlewares without converting the httprouter.Handle function into http.HandlerFunc?

For example:
My routes.go is of the form,

router  :=  httprouter.New()
router.POST("/api/user/create", middlewares.EscapeStringsMiddleware(User.CreateUser))
log.Fatal(http.ListenAndServe(":8000",  router))

How do I write middleware functions for the above mentioned route?

Already tried methods:

1.

func EscapeStringsMiddleware(next http.Handler) httprouter.Handle {

    return func (response http.ResponseWriter, request *http.Request, ps httprouter.Params) {
        err := request.ParseForm()
        if err != nil {
            panic(err)
        }

        for key, values := range request.Form {
            for i, value := range values {
                value = template.HTMLEscapeString(value)
                value = template.JSEscapeString(value)
                request.Form[key][i] = value
            }
        }
        next.ServeHTTP(response, request)
    }
}

Error obtained:

cannot use User.CreateUser (type func(http.ResponseWriter, *http.Request, httprouter.Params)) as type http.Handler in argument to middlewares.EscapeStringsMiddleware:
func(http.ResponseWriter, *http.Request, httprouter.Params) does not implement http.Handler (missing ServeHTTP method)

2.

func EscapeStringsMiddleware(next httprouter.Handle) httprouter.Handle {

    return func (response http.ResponseWriter, request *http.Request, ps httprouter.Params) {
        err := request.ParseForm()
        if err != nil {
            panic(err)
        }

        for key, values := range request.Form {
            for i, value := range values {
                value = template.HTMLEscapeString(value)
                value = template.JSEscapeString(value)
                request.Form[key][i] = value
            }
        }
        next.ServeHTTP(response, request)
    }
}

Error obtained:

next.ServeHTTP undefined (type httprouter.Handle has no field or method ServeHTTP)

Also how do I chain multiple middleware?

For example,

router.POST("/api/user/create", middlewares.VerifyCSRF(middlewares.EscapeStringsMiddleware(User.CreateUser)))
2 Answers
Related