package http import ( "encoding/json" "errors" "net/http" "net/url" "os" "strings" libErrors "github.com/filebrowser/filebrowser/v2/errors" ) func renderJSON(w http.ResponseWriter, _ *http.Request, data interface{}) (int, error) { marsh, err := json.Marshal(data) if err != nil { return http.StatusInternalServerError, err } w.Header().Set("Content-Type", "application/json; charset=utf-8") if _, err := w.Write(marsh); err != nil { return http.StatusInternalServerError, err } return 0, nil } func errToStatus(err error) int { switch { case err == nil: return http.StatusOK case os.IsPermission(err): return http.StatusForbidden case os.IsNotExist(err), err == libErrors.ErrNotExist: return http.StatusNotFound case os.IsExist(err), err == libErrors.ErrExist: return http.StatusConflict case errors.Is(err, libErrors.ErrPermissionDenied): return http.StatusForbidden case errors.Is(err, libErrors.ErrInvalidRequestParams): return http.StatusBadRequest case errors.Is(err, libErrors.ErrRootUserDeletion): return http.StatusForbidden default: return http.StatusInternalServerError } } // This is an addaptation if http.StripPrefix in which we don't // return 404 if the page doesn't have the needed prefix. func stripPrefix(prefix string, h http.Handler) http.Handler { if prefix == "" || prefix == "/" { return h } return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { p := strings.TrimPrefix(r.URL.Path, prefix) rp := strings.TrimPrefix(r.URL.RawPath, prefix) r2 := new(http.Request) *r2 = *r r2.URL = new(url.URL) *r2.URL = *r.URL r2.URL.Path = p r2.URL.RawPath = rp h.ServeHTTP(w, r2) }) }