Files
2025-01-27 14:05:55 +11:00

72 lines
1.4 KiB
Go

package middleware
import (
"net/http"
"time"
. "github.com/mickael-kerjean/filestash/server/common"
)
func init() {
Hooks.Register.Onload(func() {
go func() {
for {
time.Sleep(10 * time.Second)
telemetry.Flush()
}
}()
})
}
func NewMiddlewareChain(fn HandlerFunc, m []Middleware, app App) http.HandlerFunc {
return func(res http.ResponseWriter, req *http.Request) {
var resw ResponseWriter = NewResponseWriter(res)
var f func(*App, http.ResponseWriter, *http.Request) = fn
for i := len(m) - 1; i >= 0; i-- {
f = m[i](f)
}
app.Context = req.Context()
f(&app, &resw, req)
if req.Body != nil {
req.Body.Close()
}
go logger(app, &resw, req)
}
}
type ResponseWriter struct {
http.ResponseWriter
status int
start time.Time
}
func NewResponseWriter(res http.ResponseWriter) ResponseWriter {
return ResponseWriter{
ResponseWriter: res,
start: time.Now(),
}
}
func (w *ResponseWriter) WriteHeader(status int) {
w.status = status
w.ResponseWriter.WriteHeader(status)
}
func (w *ResponseWriter) Write(b []byte) (int, error) {
if w.status == 0 {
w.status = 200
}
return w.ResponseWriter.Write(b)
}
func (w *ResponseWriter) Flush() {
w.ResponseWriter.(http.Flusher).Flush()
}
func PluginInjector(fn HandlerFunc) HandlerFunc {
for _, middleware := range Hooks.Get.Middleware() {
fn = middleware(fn)
}
return fn
}