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

From:
Stefan Sperling <stsp@stsp.name>
Subject:
Re: gotwebd: use SCRIPT_NAME to derive URLs
To:
Omar Polo <op@omarpolo.com>
Cc:
gameoftrees@openbsd.org
Date:
Tue, 30 Aug 2022 17:48:06 +0200

Download raw body.

Thread
On Tue, Aug 30, 2022 at 05:42:06PM +0200, Omar Polo wrote:
> good catch! yes, they were incorrectly generated.
> 
> here's an improved diff, now all the URLs except the CSS and the logo
> are all relative (i.e. they're all href="?...")
> 
> I've clicked around for a bit and all the pages seem to work.
> 
> > Just to confirm, this still works fine in your setup which
> > runs in location "/", correct?
> 
> I tried it on localhost and it works.  The httpd configuration can
> also be shortened a bit:

Excellent, thanks! I'll update the man page accordingly.

> server "localhost" {
> 	listen on * port 80
> 	root "/htdocs/gotwebd"
> 	location "/" {
> 		fastcgi socket tcp localhost 9001 # or whatever
> 	}
> }

ok stsp

> diff /home/op/w/got
> commit - b1328b3e37580e44e7c53530bfc32374b74514fc
> path + /home/op/w/got
> blob - ae872cfb0d22ad79db91ef2e1032bae6db071f17
> file + gotwebd/fcgi.c
> --- gotwebd/fcgi.c
> +++ gotwebd/fcgi.c
> @@ -274,19 +274,13 @@ fcgi_parse_params(uint8_t *buf, uint16_t n, struct req
>  			bcopy(buf, c->http_host, val_len);
>  			c->http_host[val_len] = '\0';
>  		}
> -		if (val_len < MAX_DOCUMENT_ROOT && strcmp(env_entry->val,
> -		    "DOCUMENT_ROOT") == 0 && c->document_root[0] == '\0') {
> -
> -			/* drop first char, as it's always / */
> -			dr_buf = &buf[1];
> -
> -			bcopy(dr_buf, c->document_root, val_len - 1);
> -			c->document_root[val_len] = '\0';
> +		if (val_len < MAX_SCRIPT_NAME && strcmp(env_entry->val,
> +		    "SCRIPT_NAME") == 0 && c->script_name[0] == '\0') {
> +			bcopy(dr_buf, c->script_name, val_len);
> +			c->script_name[val_len] = '\0';
>  		}
>  		if (val_len < MAX_SERVER_NAME && strcmp(env_entry->val,
>  		    "SERVER_NAME") == 0 && c->server_name[0] == '\0') {
> -			/* drop first char, as it's always / */
> -
>  			bcopy(buf, c->server_name, val_len);
>  			c->server_name[val_len] = '\0';
>  		}
> blob - 363270dc22f396c6ba871d5448b712f226c3a791
> file + gotwebd/gotweb.c
> --- gotwebd/gotweb.c
> +++ gotwebd/gotweb.c
> @@ -108,7 +108,7 @@ static const struct got_error *gotweb_render_branches(
>  static void gotweb_free_querystring(struct querystring *);
>  static void gotweb_free_repo_dir(struct repo_dir *);
>  
> -struct server *gotweb_get_server(uint8_t *, uint8_t *, uint8_t *);
> +struct server *gotweb_get_server(uint8_t *, uint8_t *);
>  
>  void
>  gotweb_process_request(struct request *c)
> @@ -130,7 +130,7 @@ gotweb_process_request(struct request *c)
>  	if (c->sock->client_status == CLIENT_DISCONNECT)
>  		return;
>  	/* get the gotwebd server */
> -	srv = gotweb_get_server(c->server_name, c->document_root, c->http_host);
> +	srv = gotweb_get_server(c->server_name, c->http_host);
>  	if (srv == NULL) {
>  		log_warnx("%s: error server is NULL", __func__);
>  		goto err;
> @@ -299,24 +299,17 @@ done:
>  }
>  
>  struct server *
> -gotweb_get_server(uint8_t *server_name, uint8_t *document_root,
> -    uint8_t *subdomain)
> +gotweb_get_server(uint8_t *server_name, uint8_t *subdomain)
>  {
>  	struct server *srv = NULL;
>  
> -	/* check against document_root first */
> +	/* check against the server name first */
>  	if (strlen(server_name) > 0)
>  		TAILQ_FOREACH(srv, &gotwebd_env->servers, entry)
>  			if (strcmp(srv->name, server_name) == 0)
>  				goto done;
>  
> -	/* check against document_root second */
> -	if (strlen(document_root) > 0)
> -		TAILQ_FOREACH(srv, &gotwebd_env->servers, entry)
> -			if (strcmp(srv->name, document_root) == 0)
> -				goto done;
> -
> -	/* check against subdomain third */
> +	/* check against subdomain second */
>  	if (strlen(subdomain) > 0)
>  		TAILQ_FOREACH(srv, &gotwebd_env->servers, entry)
>  			if (strcmp(srv->name, subdomain) == 0)
> @@ -650,16 +643,8 @@ gotweb_render_header(struct request *c)
>  {
>  	struct server *srv = c->srv;
>  	struct querystring *qs = c->t->qs;
> -	char droot[PATH_MAX];
>  	int r;
>  
> -	if (strlen(c->document_root) > 0) {
> -		r = snprintf(droot, sizeof(droot), "/%s/", c->document_root);
> -		if (r < 0 || (size_t)r >= sizeof(droot))
> -			return got_error(GOT_ERR_NO_SPACE);
> -	} else
> -		strlcpy(droot, "/", sizeof(droot));
> -
>  	r = fcgi_printf(c, "<!doctype html>\n"
>  	    "<html>\n"
>  	    "<head>\n"
> @@ -689,22 +674,21 @@ gotweb_render_header(struct request *c)
>  	    "</div>\n"		/* #header */
>  	    "<div id='site_path'>\n"
>  	    "<div id='site_link'>\n"
> -	    "<a href='/%s?index_page=%d'>%s</a>",
> +	    "<a href='?index_page=%d'>%s</a>",
>  	    srv->site_name,
> -	    droot, srv->custom_css,
> +	    c->script_name, srv->custom_css,
>  	    srv->logo_url,
> -	    droot, srv->logo,
> -	    c->document_root, qs->index_page, srv->site_link);
> +	    c->script_name, srv->logo,
> +	    qs->index_page, srv->site_link);
>  	if (r == -1)
>  		goto done;
>  
>  	if (qs != NULL) {
>  		if (qs->path != NULL) {
>  			r = fcgi_printf(c, " / "
> -			    "<a href='/%s?index_page=%d&path=%s&action=summary'>"
> +			    "<a href='?index_page=%d&path=%s&action=summary'>"
>  			    "%s</a>",
> -			    c->document_root, qs->index_page, qs->path,
> -			    qs->path);
> +			    qs->index_page, qs->path, qs->path);
>  			if (r == -1)
>  				goto done;
>  		}
> blob - 0e4e5d563e08acd3a08ee2114c3cb043cb55d2bd
> file + gotwebd/gotwebd.h
> --- gotwebd/gotwebd.h
> +++ gotwebd/gotwebd.h
> @@ -49,7 +49,7 @@
>  
>  /* GOTWEB DEFAULTS */
>  #define MAX_QUERYSTRING		 2048
> -#define MAX_DOCUMENT_ROOT	 255
> +#define MAX_SCRIPT_NAME		 255
>  #define MAX_SERVER_NAME		 255
>  
>  #define GOTWEB_GOT_DIR		 ".got"
> @@ -219,7 +219,7 @@ struct request {
>  
>  	char				 querystring[MAX_QUERYSTRING];
>  	char				 http_host[GOTWEBD_MAXTEXT];
> -	char				 document_root[MAX_DOCUMENT_ROOT];
> +	char				 script_name[MAX_SCRIPT_NAME];
>  	char				 server_name[MAX_SERVER_NAME];
>  
>  	struct env_head			 env;
> 
>