mirror of
https://github.com/pocket-id/pocket-id.git
synced 2025-12-06 09:13:19 +03:00
feat: add HTTP HEAD method support (#1135)
This commit is contained in:
@@ -63,6 +63,7 @@ func initRouterInternal(db *gorm.DB, svc *services) (utils.Service, error) {
|
|||||||
rateLimitMiddleware := middleware.NewRateLimitMiddleware().Add(rate.Every(time.Second), 60)
|
rateLimitMiddleware := middleware.NewRateLimitMiddleware().Add(rate.Every(time.Second), 60)
|
||||||
|
|
||||||
// Setup global middleware
|
// Setup global middleware
|
||||||
|
r.Use(middleware.HeadMiddleware())
|
||||||
r.Use(middleware.NewCacheControlMiddleware().Add())
|
r.Use(middleware.NewCacheControlMiddleware().Add())
|
||||||
r.Use(middleware.NewCorsMiddleware().Add())
|
r.Use(middleware.NewCorsMiddleware().Add())
|
||||||
r.Use(middleware.NewCspMiddleware().Add())
|
r.Use(middleware.NewCspMiddleware().Add())
|
||||||
@@ -111,7 +112,17 @@ func initRouterInternal(db *gorm.DB, svc *services) (utils.Service, error) {
|
|||||||
srv := &http.Server{
|
srv := &http.Server{
|
||||||
MaxHeaderBytes: 1 << 20,
|
MaxHeaderBytes: 1 << 20,
|
||||||
ReadHeaderTimeout: 10 * time.Second,
|
ReadHeaderTimeout: 10 * time.Second,
|
||||||
Handler: r,
|
Handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||||
|
// HEAD requests don't get matched by Gin routes, so we convert them to GET
|
||||||
|
// middleware.HeadMiddleware will convert them back to HEAD later
|
||||||
|
if req.Method == http.MethodHead {
|
||||||
|
req.Method = http.MethodGet
|
||||||
|
ctx := context.WithValue(req.Context(), middleware.IsHeadRequestCtxKey{}, true)
|
||||||
|
req = req.WithContext(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
r.ServeHTTP(w, req)
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up the listener
|
// Set up the listener
|
||||||
|
|||||||
40
backend/internal/middleware/head_middleware.go
Normal file
40
backend/internal/middleware/head_middleware.go
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
package middleware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type IsHeadRequestCtxKey struct{}
|
||||||
|
|
||||||
|
type headWriter struct {
|
||||||
|
gin.ResponseWriter
|
||||||
|
size int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *headWriter) Write(b []byte) (int, error) {
|
||||||
|
w.size += len(b)
|
||||||
|
return w.size, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func HeadMiddleware() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
// Only process if it's a HEAD request
|
||||||
|
if c.Request.Context().Value(IsHeadRequestCtxKey{}) != true {
|
||||||
|
c.Next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace the ResponseWriter with our headWriter to swallow the body
|
||||||
|
hw := &headWriter{ResponseWriter: c.Writer}
|
||||||
|
c.Writer = hw
|
||||||
|
|
||||||
|
c.Next()
|
||||||
|
|
||||||
|
c.Writer.Header().Set("Content-Length", strconv.Itoa(hw.size))
|
||||||
|
c.Request.Method = http.MethodHead
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user