mirror of https://github.com/statping/statping
				
				
				
			
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
package handlers
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/hunterlong/statping/core"
 | 
						|
	"net/http"
 | 
						|
	"net/http/httptest"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
// authenticated is a middleware function to check if user is an Admin before running original request
 | 
						|
func authenticated(handler func(w http.ResponseWriter, r *http.Request), redirect bool) http.Handler {
 | 
						|
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | 
						|
		if !IsFullAuthenticated(r) {
 | 
						|
			if redirect {
 | 
						|
				http.Redirect(w, r, "/", http.StatusSeeOther)
 | 
						|
			} else {
 | 
						|
				sendUnauthorizedJson(w, r)
 | 
						|
			}
 | 
						|
			return
 | 
						|
		}
 | 
						|
		handler(w, r)
 | 
						|
	})
 | 
						|
}
 | 
						|
 | 
						|
// readOnly is a middleware function to check if user is a User before running original request
 | 
						|
func readOnly(handler func(w http.ResponseWriter, r *http.Request), redirect bool) http.Handler {
 | 
						|
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | 
						|
		if !IsReadAuthenticated(r) {
 | 
						|
			if redirect {
 | 
						|
				http.Redirect(w, r, "/", http.StatusSeeOther)
 | 
						|
			} else {
 | 
						|
				sendUnauthorizedJson(w, r)
 | 
						|
			}
 | 
						|
			return
 | 
						|
		}
 | 
						|
		handler(w, r)
 | 
						|
	})
 | 
						|
}
 | 
						|
 | 
						|
// cached is a middleware function that accepts a duration and content type and will cache the response of the original request
 | 
						|
func cached(duration, contentType string, handler func(w http.ResponseWriter, r *http.Request)) http.Handler {
 | 
						|
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | 
						|
		content := CacheStorage.Get(r.RequestURI)
 | 
						|
		w.Header().Set("Content-Type", contentType)
 | 
						|
		w.Header().Set("Access-Control-Allow-Origin", "*")
 | 
						|
		if core.Configs == nil {
 | 
						|
			handler(w, r)
 | 
						|
			return
 | 
						|
		}
 | 
						|
		if content != nil {
 | 
						|
			w.Write(content)
 | 
						|
		} else {
 | 
						|
			c := httptest.NewRecorder()
 | 
						|
			handler(c, r)
 | 
						|
			content := c.Body.Bytes()
 | 
						|
			result := c.Result()
 | 
						|
			if result.StatusCode != 200 {
 | 
						|
				w.WriteHeader(result.StatusCode)
 | 
						|
				w.Write(content)
 | 
						|
				return
 | 
						|
			}
 | 
						|
			w.Write(content)
 | 
						|
			if d, err := time.ParseDuration(duration); err == nil {
 | 
						|
				go CacheStorage.Set(r.RequestURI, content, d)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	})
 | 
						|
}
 |