git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFD] gitweb: href() function to generate URLs for CGI
@ 2006-08-21 15:39 Jakub Narebski
  2006-08-21 15:52 ` Jakub Narebski
                   ` (3 more replies)
  0 siblings, 4 replies; 17+ messages in thread
From: Jakub Narebski @ 2006-08-21 15:39 UTC (permalink / raw)
  To: git

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

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2006-08-22 22:39 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-21 15:39 [RFD] gitweb: href() function to generate URLs for CGI Jakub Narebski
2006-08-21 15:52 ` Jakub Narebski
2006-08-21 18:22 ` Junio C Hamano
2006-08-21 18:38   ` Jakub Narebski
2006-08-22  7:09     ` Junio C Hamano
2006-08-22  8:18       ` Jakub Narebski
2006-08-22  8:55         ` Junio C Hamano
2006-08-22  9:34           ` Jakub Narebski
2006-08-22 10:47           ` Jakub Narebski
2006-08-22 22:26             ` Junio C Hamano
2006-08-22 22:39               ` Jakub Narebski
2006-08-22 18:35           ` Randal L. Schwartz
2006-08-22 19:55             ` Jakub Narebski
2006-08-22 20:01               ` Jakub Narebski
2006-08-22 22:21                 ` Junio C Hamano
2006-08-22 17:05 ` [PATCH 1/2] gitweb: Drop the href() params which keys are not in %mapping Jakub Narebski
2006-08-22 17:05 ` [PATCH 2/2] gitweb: Sort CGI parameters returned by href() Jakub Narebski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).