diff --git a/src/pages.go b/src/pages.go index 49197cf..2599830 100644 --- a/src/pages.go +++ b/src/pages.go @@ -70,6 +70,20 @@ func makeWebRoot(host string, projectName string) string { return fmt.Sprintf("%s/%s", strings.ToLower(host), projectName) } +func getWebRoot(r *http.Request) (string, error) { + host, err := GetHost(r) + if err != nil { + return "", err + } + + projectName, err := GetProjectName(r) + if err != nil { + return "", err + } + + return makeWebRoot(host, projectName), nil +} + func writeRedirect(w http.ResponseWriter, code int, path string) { w.Header().Set("Location", path) w.WriteHeader(code) @@ -433,18 +447,11 @@ func putPage(w http.ResponseWriter, r *http.Request) error { } } - host, err := GetHost(r) + webRoot, err := getWebRoot(r) if err != nil { return err } - projectName, err := GetProjectName(r) - if err != nil { - return err - } - - webRoot := makeWebRoot(host, projectName) - updateCtx, cancel := context.WithTimeout(r.Context(), time.Duration(config.Limits.UpdateTimeout)) defer cancel() @@ -514,25 +521,19 @@ func patchPage(w http.ResponseWriter, r *http.Request) error { } } - host, err := GetHost(r) + webRoot, err := getWebRoot(r) if err != nil { return err } - projectName, err := GetProjectName(r) - if err != nil { - return err - } - - webRoot := makeWebRoot(host, projectName) - - updateCtx, cancel := context.WithTimeout(r.Context(), time.Duration(config.Limits.UpdateTimeout)) - defer cancel() - if _, err = AuthorizeUpdateFromArchive(r); err != nil { return err } + if checkDryRun(w, r) { + return nil + } + // Providing atomic compare-and-swap operations might be difficult or impossible depending // on the backend in use and its configuration, but for applications where a mostly-atomic // compare-and-swap operation is good enough (e.g. generating page previews) we don't want @@ -553,9 +554,8 @@ func patchPage(w http.ResponseWriter, r *http.Request) error { return nil } - if checkDryRun(w, r) { - return nil - } + updateCtx, cancel := context.WithTimeout(r.Context(), time.Duration(config.Limits.UpdateTimeout)) + defer cancel() contentType := getMediaType(r.Header.Get("Content-Type")) reader := http.MaxBytesReader(w, r.Body, int64(config.Limits.MaxSiteSize.Bytes())) @@ -613,17 +613,12 @@ func reportUpdateResult(w http.ResponseWriter, result UpdateResult) error { } func deletePage(w http.ResponseWriter, r *http.Request) error { - _, err := AuthorizeUpdateFromRepository(r) + webRoot, err := getWebRoot(r) if err != nil { return err } - host, err := GetHost(r) - if err != nil { - return err - } - - projectName, err := GetProjectName(r) + _, err = AuthorizeUpdateFromRepository(r) if err != nil { return err } @@ -632,17 +627,13 @@ func deletePage(w http.ResponseWriter, r *http.Request) error { return nil } - err = backend.DeleteManifest(r.Context(), makeWebRoot(host, projectName), - ModifyManifestOptions{}) - if err != nil { + if err = backend.DeleteManifest(r.Context(), webRoot, ModifyManifestOptions{}); err != nil { w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintln(w, err) } else { w.Header().Add("Update-Result", "deleted") w.WriteHeader(http.StatusOK) } - if err != nil { - fmt.Fprintln(w, err) - } return err } @@ -651,23 +642,16 @@ func postPage(w http.ResponseWriter, r *http.Request) error { requestTimeout := 3 * time.Second requestTimer := time.NewTimer(requestTimeout) + webRoot, err := getWebRoot(r) + if err != nil { + return err + } + auth, err := AuthorizeUpdateFromRepository(r) if err != nil { return err } - host, err := GetHost(r) - if err != nil { - return err - } - - projectName, err := GetProjectName(r) - if err != nil { - return err - } - - webRoot := makeWebRoot(host, projectName) - eventName := "" for _, header := range []string{ "X-Forgejo-Event",