mirror of
https://github.com/mickael-kerjean/filestash.git
synced 2025-10-28 04:05:21 +08:00
72 lines
1.4 KiB
Go
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
|
|
}
|