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

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

From
Jakub Narebski <jnareb@gmail.com>
Date
Aug 21, 2006, 15:39 UTC
Message-ID
<200608211739.32993.jnareb@gmail.com>

In first version of href() function we had (commit 06a9d86b49b826562e2b12b5c7e831e20b8f7dce)

	my $href = "$my_uri?";
	$href .= esc_param( join(";",
		map {
			"$mapping{$_}=$params{$_}"
		} keys %params
	) );

First, there was a question what happend if someone would enter parameter name incorrectly, and some key of %params is not found in %mapping hash. The above code would generate warnings (which web admins frown upon), and empty (because undef) parameters corresponding to e.g. mistyped parameter name.

One solution (sweeping under the carpet) would be to use parameter key as CGI parameter name if it is not found in the %mapping, i.e.

	my $href = "$my_uri?";
	$href .= esc_param( join(";",
		map {
			if (exists $mapping{$_}) {
				"$mapping{$_}=$params{$_}"
			} else {
				"$_=$params{$_}"
			}
		} keys %params
	) );

Another solution would be to skip parameters which are not found in %mapping. Correct way to do this is:

	my $href = "$my_uri?";
	$href .= esc_param( join(";",
		map {
			"$mapping{$_}=$params{$_}"
		} grep { exists $mapping{$_} } keys %params
	) );

(we cannot put condition in map BLOCK, because map does not filter, only act on elements, so the result would be empty parameter (e.g. ";;" in generated URL), I guess without warnings).

Which solutions should be chosen? If the one is chosen, I can send the patch.

Second problem is that using href() function, although it consolidates to generate URL for CGI, it changes the order of CGI parameters. It used to be that 'p' (project) parameter was first, then 'a' (action) parameter, then hashes ('h', 'hp', 'hb'), last 'f' (filename) or 'p' (page) or 's' (searchtext). The simplest and fastest solution would be to create array with all keys of %mapping in appropriate order and do something like this:

	my @mapping_sorted = ('project', 'action', 'hash',
		'hash_parent', 'hash_base', 'file_name', 'searchtext');
	my $href = "$my_uri?";
	$href .= esc_param( join(";",
		map {
			"$mapping{$_}=$params{$_}"
		} grep { exists $params{$_}} @mapping_sorted;
	) );
The problem is of course updating both %mappings and @mapping_sorted.

Is this really a problem, should this (ordering of CGI parameters) addressed?

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git
Next: Jakub Narebski
Message 1 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.