From: Omar Polo Subject: Re: gotwebd: set filename for RSS feeds To: Mark Jamsek Cc: gameoftrees@openbsd.org Date: Tue, 03 Jan 2023 15:47:04 +0100 On 2023/01/03 22:43:26 +1100, Mark Jamsek wrote: > On 23-01-03 12:22PM, Omar Polo wrote: > > a consequence i haven't realized when adding RSS support is that since > > gotwebd serves the pages from a path that's lacking a filename part, > > the browser call the RSS feed with a random string. > > > > This is not an issue for RSS readers (they extract all the needed info > > from the XML), but it's ugly, so let's fix it. > > > > Diff below uses Content-Disposition to 1) make the browser download > > the file instead of rendering it and 2) use a reasonable file name > > (got.git.rss) instead of the random string the browser will use > > otherwise (lHFP5B6d). > > > > ok? > > good catch! nice. ok Thanks! I wasn't sure about adding that extra PATH_MAX local buffer, since gotweb_render_content_type_file is just a glorified printf here's an equivalent diff that passes an extra "suffix" parameter. What do you think? diff /home/op/w/got2 commit - 1b18f4cd75fddf070589d9b045e083ac02d8baba path + /home/op/w/got2 blob - 89718fdd602637e74ca5a949af1e7cfda57b723d file + gotwebd/got_operations.c --- gotwebd/got_operations.c +++ gotwebd/got_operations.c @@ -1044,7 +1044,7 @@ got_output_file_blob(struct request *c) if (isbinary(buf, len - hdrlen)) { error = gotweb_render_content_type_file(c, "application/octet-stream", - qs->file); + qs->file, NULL); if (error) { log_warnx("%s: %s", __func__, error->msg); blob - 6f5a07850b9e8e153830292e5ce4f4d986782eff file + gotwebd/gotweb.c --- gotwebd/gotweb.c +++ gotwebd/gotweb.c @@ -179,8 +179,9 @@ gotweb_process_request(struct request *c) } if (qs->action == RSS) { - error = gotweb_render_content_type(c, - "application/rss+xml;charset=utf-8"); + 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; @@ -670,11 +671,11 @@ gotweb_render_content_type_file(struct request *c, con const struct got_error * gotweb_render_content_type_file(struct request *c, const char *type, - const char *file) + const char *file, const char *suffix) { fcgi_printf(c, "Content-type: %s\r\n" - "Content-disposition: attachment; filename=%s\r\n\r\n", - type, file); + "Content-disposition: attachment; filename=%s%s\r\n\r\n", + type, file, suffix ? suffix : ""); return NULL; } blob - 8a9deffd75b83126733cb4d76bb9170bc7604995 file + gotwebd/gotwebd.h --- gotwebd/gotwebd.h +++ gotwebd/gotwebd.h @@ -437,7 +437,7 @@ const struct got_error const uint8_t *); const struct got_error *gotweb_render_content_type_file(struct request *, const char *, - 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);