]> Lady’s Gitweb - Gitweb/commit
gitweb: Allow UTF-8 encoded CGI query parameters and path_info
authorJakub Narebski <redacted>
Fri, 3 Feb 2012 12:44:54 +0000 (13:44 +0100)
committerLady <redacted>
Mon, 6 Apr 2026 04:51:31 +0000 (00:51 -0400)
commite9025e586fc6c892ed46d9ba0718043f66753de435d10d09a24f204c4a51f2f9
tree2602b888009f0557312ed586f0afb82bd83cc746e043a5f8ac880b1a56789d19
parent2a1e06153b9e9bbf459721e4efcd9b4d4b84d33df4e0aff2b098a4927ba9e650
gitweb: Allow UTF-8 encoded CGI query parameters and path_info

Gitweb forgot to turn query parameters into UTF-8. This results in a bug
that one cannot search for a string with characters outside US-ASCII.  For
example searching for "Michał Kiedrowicz" (containing letter 'ł' - LATIN
SMALL LETTER L WITH STROKE, with Unicode codepoint U+0142, represented
with 0xc5 0x82 bytes in UTF-8 and percent-encoded as %C5%82) result in the
following incorrect data in search field

MichaÅ\202 Kiedrowicz

This is caused by CGI by default treating '0xc5 0x82' bytes as two
characters in Perl legacy encoding latin-1 (iso-8859-1), because 's'
query parameter is not processed explicitly as UTF-8 encoded string.

The solution used here follows "Using Unicode in a Perl CGI script"
article on http://www.lemoda.net/cgi/perl-unicode/index.html:

use CGI;
use Encode 'decode_utf8;
my $value = params('input');
$value = decode_utf8($value);

Decoding UTF-8 is done when filling %input_params hash and $path_info
variable; the former requires to move from explicit $cgi->param(<label>)
to $input_params{<name>} in a few places, which is a good idea anyway.

Also add -override=>1 parameter to $cgi->textfield() invocation in search
form.  Otherwise CGI would use values from query string if it is present,
filling value from $cgi->param... without decode_utf8().  As we are using
value of appropriate parameter anyway, -override=>1 doesn't change the
situation but makes gitweb fill search field correctly.

We could simply use the '-utf8' pragma (via "use CGI '-utf8';") to solve
this, but according to CGI.pm documentation, it may cause problems with
POST requests containing binary files, and it requires CGI 3.31 (I think),
released with perl v5.8.9.

Reported-by: Michał Kiedrowicz <redacted>
Signed-off-by: Jakub Narębski <redacted>
Tested-by: Michał Kiedrowicz <redacted>
Signed-off-by: Junio C Hamano <redacted>
gitweb.perl
This page took 0.224119 seconds and 5 git commands to generate.