"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Omar Polo <op@omarpolo.com>
Subject:
Re: gotwebd: set filename for RSS feeds
To:
Mark Jamsek <mark@jamsek.com>
Cc:
gameoftrees@openbsd.org
Date:
Tue, 03 Jan 2023 15:47:04 +0100

Download raw body.

Thread
On 2023/01/03 22:43:26 +1100, Mark Jamsek <mark@jamsek.com> 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);