commit 164b5ddc668e203c83442bd6cd0860eba648e885 from: Omar Polo via: Thomas Adam date: Sat Mar 11 21:50:57 2023 UTC gotwebd: reply with non-200 HTTP status code on error ok tracey@ commit - 161663e7ebf5aa10caf7b4048f013d5e45db5fe3 commit + 164b5ddc668e203c83442bd6cd0860eba648e885 blob - 647e83fe8caab03ac1c04ff0f1433a7d6da154ce blob + 3bdbcde3226d98fb2e000317c1e7861610299473 --- gotwebd/gotweb.c +++ gotwebd/gotweb.c @@ -142,12 +142,10 @@ gotweb_reply_file(struct request *c, const char *ctype void gotweb_process_request(struct request *c) { - const struct got_error *error = NULL, *error2 = NULL; + const struct got_error *error = NULL; struct server *srv = NULL; struct querystring *qs = NULL; struct repo_dir *repo_dir = NULL; - uint8_t err[] = "gotwebd experienced an error: "; - int r, html = 0; /* init the transport */ error = gotweb_init_transport(&c->t); @@ -187,15 +185,15 @@ gotweb_process_request(struct request *c) if (qs->action == BLAME || qs->action == BLOB || qs->action == BLOBRAW || qs->action == DIFF) { if (qs->commit == NULL) { - error2 = got_error(GOT_ERR_QUERYSTRING); - goto render; + error = got_error(GOT_ERR_QUERYSTRING); + goto err; } } if (qs->action != INDEX) { error = gotweb_init_repo_dir(&repo_dir, qs->path); if (error) - goto done; + goto err; error = gotweb_load_got_path(c, repo_dir); c->t->repo_dir = repo_dir; if (error && error->code != GOT_ERR_LONELY_PACKIDX) @@ -209,12 +207,12 @@ gotweb_process_request(struct request *c) error = got_get_repo_commits(c, 1); if (error) - goto done; + goto err; - error2 = got_open_blob_for_output(&c->t->blob, &c->t->fd, + error = got_open_blob_for_output(&c->t->blob, &c->t->fd, &binary, c); - if (error2) - goto render; + if (error) + goto err; if (binary) r = gotweb_reply_file(c, "application/octet-stream", @@ -222,20 +220,20 @@ gotweb_process_request(struct request *c) else r = gotweb_reply(c, 200, "text/plain", NULL); if (r == -1) - goto done; + return; for (;;) { error = got_object_blob_read_block(&len, c->t->blob); if (error) - goto done; + break; if (len == 0) break; buf = got_object_blob_get_read_buf(c->t->blob); if (fcgi_gen_binary_response(c, buf, len) == -1) - goto done; + break; } - goto done; + return; } if (qs->action == BLOB) { @@ -252,15 +250,15 @@ gotweb_process_request(struct request *c) error = got_get_repo_commits(c, 1); if (error) - goto done; + goto err; - error2 = got_open_blob_for_output(&c->t->blob, &c->t->fd, + error = got_open_blob_for_output(&c->t->blob, &c->t->fd, &binary, c); - if (error2) - goto render; + if (error) + goto err; if (binary) { gotweb_reply(c, 302, NULL, &url); - goto done; + return; } } @@ -268,28 +266,17 @@ gotweb_process_request(struct request *c) const char *ctype = "application/rss+xml;charset=utf-8"; if (gotweb_reply_file(c, ctype, repo_dir->name, ".rss") == -1) - goto done; + return; error = got_get_repo_tags(c, D_MAXSLCOMMDISP); if (error) { log_warnx("%s: %s", __func__, error->msg); - goto err; + return; } - if (gotweb_render_rss(c->tp) == -1) - goto err; - goto done; + gotweb_render_rss(c->tp); + return; } -render: - if (gotweb_reply(c, 200, "text/html", NULL) == -1) - goto done; - html = 1; - - if (error2) { - error = error2; - goto err; - } - switch(qs->action) { case BLAME: error = got_get_repo_commits(c, 1); @@ -297,26 +284,30 @@ render: log_warnx("%s: %s", __func__, error->msg); goto err; } - if (gotweb_render_page(c->tp, gotweb_render_blame) == -1) - goto done; - break; + if (gotweb_reply(c, 200, "text/html", NULL) == -1) + return; + gotweb_render_page(c->tp, gotweb_render_blame); + return; case BLOB: - if (gotweb_render_page(c->tp, gotweb_render_blob) == -1) - goto err; - break; + if (gotweb_reply(c, 200, "text/html", NULL) == -1) + return; + gotweb_render_page(c->tp, gotweb_render_blob); + return; case BRIEFS: - if (gotweb_render_page(c->tp, gotweb_render_briefs) == -1) - goto err; - break; + if (gotweb_reply(c, 200, "text/html", NULL) == -1) + return; + gotweb_render_page(c->tp, gotweb_render_briefs); + return; case COMMITS: error = got_get_repo_commits(c, srv->max_commits_display); if (error) { log_warnx("%s: %s", __func__, error->msg); goto err; } - if (gotweb_render_page(c->tp, gotweb_render_commits) == -1) - goto err; - break; + if (gotweb_reply(c, 200, "text/html", NULL) == -1) + return; + gotweb_render_page(c->tp, gotweb_render_commits); + return; case DIFF: error = got_get_repo_commits(c, 1); if (error) { @@ -328,9 +319,10 @@ render: log_warnx("%s: %s", __func__, error->msg); goto err; } - if (gotweb_render_page(c->tp, gotweb_render_diff) == -1) - goto err; - break; + if (gotweb_reply(c, 200, "text/html", NULL) == -1) + return; + gotweb_render_page(c->tp, gotweb_render_diff); + return; case INDEX: c->t->nrepos = scandir(srv->repos_path, &c->t->repos, NULL, alphasort); @@ -340,9 +332,10 @@ render: srv->repos_path); goto err; } - if (gotweb_render_page(c->tp, gotweb_render_index) == -1) - goto err; - break; + if (gotweb_reply(c, 200, "text/html", NULL) == -1) + return; + gotweb_render_page(c->tp, gotweb_render_index); + return; case SUMMARY: error = got_ref_list(&c->t->refs, c->t->repo, "refs/heads", got_ref_cmp_by_name, NULL); @@ -359,9 +352,10 @@ render: goto err; } qs->action = SUMMARY; - if (gotweb_render_page(c->tp, gotweb_render_summary) == -1) - goto done; - break; + if (gotweb_reply(c, 200, "text/html", NULL) == -1) + return; + gotweb_render_page(c->tp, gotweb_render_summary); + return; case TAG: error = got_get_repo_tags(c, 1); if (error) { @@ -373,53 +367,40 @@ render: "bad commit id"); goto err; } - if (gotweb_render_page(c->tp, gotweb_render_tag) == -1) - goto done; - break; + if (gotweb_reply(c, 200, "text/html", NULL) == -1) + return; + gotweb_render_page(c->tp, gotweb_render_tag); + return; case TAGS: error = got_get_repo_tags(c, srv->max_commits_display); if (error) { log_warnx("%s: %s", __func__, error->msg); goto err; } - if (gotweb_render_page(c->tp, gotweb_render_tags) == -1) - goto done; - break; + if (gotweb_reply(c, 200, "text/html", NULL) == -1) + return; + gotweb_render_page(c->tp, gotweb_render_tags); + return; case TREE: error = got_get_repo_commits(c, 1); if (error) { log_warnx("%s: %s", __func__, error->msg); goto err; } - if (gotweb_render_page(c->tp, gotweb_render_tree) == -1) - goto err; - break; + if (gotweb_reply(c, 200, "text/html", NULL) == -1) + return; + gotweb_render_page(c->tp, gotweb_render_tree); + return; case ERR: default: - r = fcgi_printf(c, "
%s
\n", - "Erorr: Bad Querystring"); - if (r == -1) - goto err; - break; + error = got_error(GOT_ERR_BAD_QUERYSTRING); } - goto done; err: - if (html && fcgi_printf(c, "
") == -1) + c->t->error = error; + if (gotweb_reply(c, 400, "text/html", NULL) == -1) return; - if (fcgi_printf(c, "\n%s", err) == -1) - return; - if (error) { - if (fcgi_printf(c, "%s", error->msg) == -1) - return; - } else { - if (fcgi_printf(c, "see daemon logs for details") == -1) - return; - } - if (html && fcgi_printf(c, "
\n") == -1) - return; -done: - return; + gotweb_render_page(c->tp, gotweb_render_error); } struct server * blob - 32ff7b9956d2a4af5dc1eff9cdef560e8457cd2f blob + 9e8e0a7344f99e5a308fc5d0932d6f1dc7d81e61 --- gotwebd/gotwebd.h +++ gotwebd/gotwebd.h @@ -199,6 +199,7 @@ struct transport { unsigned int next_disp; unsigned int prev_disp; unsigned int tag_count; + const struct got_error *error; struct got_blob_object *blob; int fd; FILE *fp; @@ -472,6 +473,7 @@ void gotweb_free_transport(struct transport *); /* pages.tmpl */ int gotweb_render_page(struct template *, int (*)(struct template *)); +int gotweb_render_error(struct template *); int gotweb_render_repo_table_hdr(struct template *); int gotweb_render_repo_fragment(struct template *, struct repo_dir *); int gotweb_render_briefs(struct template *); blob - d092e3fbcc837ec5abd7684b0cb9de5e0562319c blob + 8b26bcbc96871b207e0845e9f22006c1e15bcad8 --- gotwebd/pages.tmpl +++ gotwebd/pages.tmpl @@ -123,6 +123,20 @@ static inline int rss_author(struct template *, char * +{{ end }} + +{{ define gotweb_render_error(struct template *tp) }} +{! + struct request *c = tp->tp_arg; + struct transport *t = c->t; +!} +
+ {{ if t->error }} + {{ t->error->msg }} + {{ else }} + See daemon logs for details + {{ end }} +
{{ end }} {{ define gotweb_render_repo_table_hdr(struct template *tp) }}