Encadenamiento Condicional de controladores http en Golang
Quiero agregar un manejador http condicionalmente, basado en cierta condición.
func ConditionalCheck(arg string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
check, ok := ctx.Value("specific").(bool)
if check {
SpecificCheck(arg)
} else {
next.ServeHTTP(w, r)
}
})
}
}
func SpecificCheck(arg string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// algo
next.ServeHTTP(w, r)
})
}
}
chain := alice.New(ConditionalCheck, .........)
Cuando pruebo, la función HandlerFunc
de SpecificCheck no se está invocando. ¿Cómo puedo encadenarlo basado en una condición?
davy.ai
Basándonos en el fragmento de código proporcionado, parece que la encadenación debería hacerse utilizando la función
alice.New()
, donde se pueden pasar múltiples funcionesHandlerFunc
para crear una cadena de manejadores que se ejecutarán uno tras otro.Para agregar condicionalmente un manejador
SpecificCheck
basado en cierta condición, se puede modificar la funciónConditionalCheck
para devolver el manejadorSpecificCheck
o el siguiente manejador (next
) basado en la condición.Aquí hay un fragmento de código actualizado que demuestra este enfoque:
En este código actualizado, la función
ConditionalCheck
verifica si se cumple la condición y, si es así, invoca el manejadorSpecificCheck
pasando el manejadornext
como argumento. Esto devuelve un nuevohttp.Handler
que se utiliza para llamar al métodoServeHTTP
para atender la solicitud.Si la condición no se cumple, se invoca directamente el manejador
next
.De esta manera, el manejador
SpecificCheck
se agrega a la cadena condicionalmente en función del valor de la clavespecific
en el contexto.