commit - 96afb0d62311dd459395b8eba2216094c18dfb67
commit + 6cdf29f9353bcea609dcbab90131634430ac5a18
blob - 797edfaf4c9e729607677ddd55fb18312d1dd90f
blob + 47ec70cd7f1ff4721930aa83409682012b4e6d60
--- gotwebd/gotweb.c
+++ gotwebd/gotweb.c
struct server *gotweb_get_server(uint8_t *, uint8_t *);
+static int
+gotweb_reply(struct request *c, int status, const char *ctype,
+ struct gotweb_url *location)
+{
+ const char *csp;
+
+ if (status != 200 && fcgi_printf(c, "Status: %d\r\n", status) == -1)
+ return -1;
+
+ if (location) {
+ if (fcgi_puts(c->tp, "Location: ") == -1 ||
+ gotweb_render_url(c, location) == -1 ||
+ fcgi_puts(c->tp, "\r\n") == -1)
+ return -1;
+ }
+
+ csp = "Content-Security-Policy: default-src 'self'; "
+ "script-src 'none'; object-src 'none';\r\n";
+ if (fcgi_puts(c->tp, csp) == -1)
+ return -1;
+
+ if (ctype && fcgi_printf(c, "Content-Type: %s\r\n", ctype) == -1)
+ return -1;
+
+ return fcgi_puts(c->tp, "\r\n");
+}
+
+static int
+gotweb_reply_file(struct request *c, const char *ctype, const char *file,
+ const char *suffix)
+{
+ int r;
+
+ r = fcgi_printf(c, "Content-Disposition: attachment; "
+ "filename=%s%s\r\n", file, suffix ? suffix : "");
+ if (r == -1)
+ return -1;
+ return gotweb_reply(c, 200, ctype, NULL);
+}
+
void
gotweb_process_request(struct request *c)
{
if (qs->action == BLOBRAW) {
const uint8_t *buf;
size_t len;
- int binary;
+ int binary, r;
error = got_get_repo_commits(c, 1);
if (error)
goto render;
if (binary)
- error = gotweb_render_content_type_file(c,
- "application/octet-stream", qs->file, NULL);
+ r = gotweb_reply_file(c, "application/octet-stream",
+ qs->file, NULL);
else
- error = gotweb_render_content_type(c, "text/plain");
-
- if (error) {
- log_warnx("%s: %s", __func__, error->msg);
+ r = gotweb_reply(c, 200, "text/plain", NULL);
+ if (r == -1)
goto done;
- }
for (;;) {
error = got_object_blob_read_block(&len, blob);
if (error2)
goto render;
if (binary) {
- fcgi_puts(c->tp, "Status: 302\r\n");
- fcgi_puts(c->tp, "Location: ");
- gotweb_render_url(c, &url);
- fcgi_puts(c->tp, "\r\n\r\n");
+ gotweb_reply(c, 302, NULL, &url);
goto done;
}
}
if (qs->action == RSS) {
- error = gotweb_render_content_type_file(c,
- "application/rss+xml;charset=utf-8",
- repo_dir->name, ".rss");
- if (error) {
- log_warnx("%s: %s", __func__, error->msg);
- goto err;
- }
+ const char *ctype = "application/rss+xml;charset=utf-8";
+ if (gotweb_reply_file(c, ctype, repo_dir->name, ".rss") == -1)
+ goto done;
+
error = got_get_repo_tags(c, D_MAXSLCOMMDISP);
if (error) {
log_warnx("%s: %s", __func__, error->msg);
}
render:
- error = gotweb_render_content_type(c, "text/html");
- if (error) {
- log_warnx("%s: %s", __func__, error->msg);
- goto err;
- }
+ if (gotweb_reply(c, 200, "text/html", NULL) == -1)
+ goto done;
html = 1;
if (gotweb_render_header(c->tp) == -1)
free(t->next_id);
free(t->prev_id);
free(t);
-}
-
-const struct got_error *
-gotweb_render_content_type(struct request *c, const char *type)
-{
- const char *csp = "default-src 'self'; script-src 'none'; "
- "object-src 'none';";
-
- fcgi_printf(c,
- "Content-Security-Policy: %s\r\n"
- "Content-Type: %s\r\n\r\n",
- csp, type);
- return NULL;
}
-const struct got_error *
-gotweb_render_content_type_file(struct request *c, const char *type,
- const char *file, const char *suffix)
-{
- fcgi_printf(c, "Content-type: %s\r\n"
- "Content-disposition: attachment; filename=%s%s\r\n\r\n",
- type, file, suffix ? suffix : "");
- return NULL;
-}
-
void
gotweb_get_navs(struct request *c, struct gotweb_url *prev, int *have_prev,
struct gotweb_url *next, int *have_next)
blob - d6c9430018dfece4faeac6e6d2a51cda87ed4c56
blob + 3b5d3050768b060fb3d989730d25bac381291c95
--- gotwebd/gotwebd.h
+++ gotwebd/gotwebd.h
int sockets_privinit(struct gotwebd *, struct socket *);
/* gotweb.c */
-const struct got_error *gotweb_render_content_type(struct request *,
- const char *);
-const struct got_error
- *gotweb_render_content_type_file(struct request *, const char *,
- const char *, const char *);
void gotweb_get_navs(struct request *, struct gotweb_url *, int *,
struct gotweb_url *, int *);
const struct got_error *gotweb_get_time_str(char **, time_t, int);