git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFD] gitweb: href() function to generate URLs for CGI

From
Junio C Hamano <junkio@cox.net>
Date
Aug 22, 2006, 08:55 UTC
Message-ID
<7vodudno88.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<eceekl$b0l$2@sea.gmane.org>
Jakub Narebski <jnareb@gmail.com> writes:
Show 13 quoted lines
> So perhaps
>
>         my %mapping = @mapping;
>         my @params_keys_sorted;
>         for (my $i = 0; $i < @mapping; $i += 2) {
>                 if (exists $params{$mapping[$i]}) {
>                         push @params_keys_sorted, $mapping[$i];
>                 }
>         }
>
> This way we have only one loop over all valid parameter names,
> and we wouldn't need grep nor conditional expression in map,
> and map would loop over all (valid) params keys only.

At that point I suspect that loop can do everything your map {} did, and would look simpler (albeit perhaps a little bit less Perlish) like this:

sub href(%) {
	my %params = @_;
	$params{"project"} ||= $project;
        my @mapping = ( project => "p",
                        action => "a",
                        hash => "h",
                        hash_parent => "hp",
                        hash_base => "hb",
                        file_name => "f",
                        file_parent => "fp",
                        page => "pg",
                        searchtext => "s",
                        );
	my @result = (); 
        for (my $i = 0; $i < @mapping; $i += 2) {
        	my ($name, $symbol) = ($mapping[$i], $mapping[$i+1]);
		if (defined $params{$name}) {
			push @result, "$symbol=$params{$name}";
		}
	}
        return "$my_uri?" . esc_param(join(';', @result));
}

By the way, is it really what we want to do to call esc_param() on joined result?

Maybe I am not reading this code correctly, but this feels quite counter-intuitive. Actually, it feels downright wrong.

Semicolons and equals are used as separators between key-value pairs (i.e. syntactic elements) so if we have a value $params{$name} that happens to contain a ';' or '=' character I suspect we would want to quote that but not the one we use before the value or between tuples. Otherwise, how is a search text that is "a = b;" encoded in the resulting href?

So the last part of the above should perhaps read:
	my @result = (); 
        for (my $i = 0; $i < @mapping; $i += 2) {
        	my ($name, $symbol) = ($mapping[$i], $mapping[$i+1]);
		if (defined $params{$name}) {
			push @result, join('=', esc_param($symbol),
						esc_param($params{$name}));
		}
	}
        return "$my_uri?" . join(';', @result);

We would also need to fix esc_param to quote ';' and '=' as well, which does not seem to quote them.

Previous: Jakub NarebskiNext: Jakub Narebski
Message 7 of 17 in “[RFD] gitweb: href() function to generate URLs for CGI”
  1. Jakub NarebskiAug 21, 2006
  2. Jakub NarebskiAug 21, 2006
  3. Junio C HamanoAug 21, 2006
  4. Jakub NarebskiAug 21, 2006
  5. Junio C HamanoAug 22, 2006
  6. Jakub NarebskiAug 22, 2006
  7. Junio C HamanoAug 22, 2006
  8. Jakub NarebskiAug 22, 2006
  9. Jakub NarebskiAug 22, 2006
  10. Junio C HamanoAug 22, 2006
  11. Jakub NarebskiAug 22, 2006
  12. Randal L. SchwartzAug 22, 2006
  13. Jakub NarebskiAug 22, 2006
  14. Jakub NarebskiAug 22, 2006
  15. Junio C HamanoAug 22, 2006
  16. 1/2 gitweb: Drop the href() params which keys are not in %mappingJakub Narebski, Aug 22, 2006
  17. 2/2 gitweb: Sort CGI parameters returned by href()Jakub Narebski, Aug 22, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.