Description
I would like to add a middleware to Gin which detects whether the HTTP status code has been set by another handler to anything from 400 and above, and if so, add an application/problem+json response body that is tailored to the status code.
With the built-in BasicAuthForRealm middleware, it currently seems impossible to detect that it has invoked c.AbortWithStatus(http.StatusUnauthorized) in my middleware, since c.Errors() is not invoked and I can't figure out in my handler that http.StatusUnauthorized is being set as the status code.
https://github.com/gin-gonic/gin/blob/a889c58de78711cb9b53de6cfcc9272c8518c729/auth.go#L45-L65
c.Request.Response.StatusCode is also unavailable, as c.Request.Response is nil.
How to reproduce
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
g := gin.Default()
g.Use(func(c *gin.Context) {
c.Next()
if c.IsAborted() {
c.JSON(200, gin.H{"message": "You are probably not authorized, but I can't tell for sure."})
}
})
accounts := gin.Accounts{"admin": "password"}
admin := g.Group("admin", gin.BasicAuth(accounts))
admin.GET("", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Hello admin, nice to meet you!"})
})
g.Run(":9000")
}
Expectations
I expect to be able to detect what previously run handlers have done to the response, so I can act upon it and enrich the response accordingly.
Actual result
It is currently not possible to see what a previously run handler have done to the response.
Environment
- go version:
go1.20.3 darwin/amd64 - gin version (or commit ref):
v1.9.0 - operating system: macOS
11.7.6
Comment From: asbjornu
I just discovered gin.Context.Writer.Status() which seems to return 401 as expected. Closing.