package server import ( "encoding/json" "net/http" "strings" "git.pyer.club/kingecg/gohttpd/model" ) type Middleware func(w http.ResponseWriter, r *http.Request, next func()) func BasicAuth(w http.ResponseWriter, r *http.Request, next func()) { config := model.GetConfig() if config.Admin.Username == "" || config.Admin.Password == "" { next() return } user, pass, ok := r.BasicAuth() if ok && user == config.Admin.Username && pass == config.Admin.Password { next() } else { w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"`) http.Error(w, "Unauthorized.", http.StatusUnauthorized) } } func Parse[T any](w http.ResponseWriter, r *http.Request, next func()) { if r.Method == "POST" || r.Method == "PUT" { //判断r的content-type是否是application/x-www-form-urlencoded if r.Header.Get("Content-Type") == "application/x-www-form-urlencoded" { r.ParseForm() next() return } if r.Header.Get("Content-Type") == "multipart/form-data" { r.ParseMultipartForm(r.ContentLength) next() return } // 判断r的content-type是否是application/json contentType := r.Header.Get("Content-Type") if strings.Contains(contentType, "application/json") { var t T // 读取json数据 if err := json.NewDecoder(r.Body).Decode(&t); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } ctx := r.Context() m := ctx.Value(RequestCtxKey("data")).(map[string]interface{}) if m != nil { m["data"] = t } next() return } } next() }