mirror of
				https://github.com/mickael-kerjean/filestash.git
				synced 2025-10-31 18:16:00 +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
 | |
| }
 | 
