@@ -1291,9 +1291,23 @@ sub run_request {
1291
1291
our ($pre_dispatch_hook , $post_dispatch_hook , $pre_listen_hook );
1292
1292
our $CGI = ' CGI' ;
1293
1293
our $cgi ;
1294
+ our $FCGI_Stream_PRINT_raw = \&FCGI::Stream::PRINT;
1294
1295
sub configure_as_fcgi {
1295
1296
require CGI::Fast;
1296
1297
our $CGI = ' CGI::Fast' ;
1298
+ # FCGI is not Unicode aware hence the UTF-8 encoding must be done manually.
1299
+ # However no encoding must be done within git_blob_plain() and git_snapshot()
1300
+ # which must still output in raw binary mode.
1301
+ no warnings ' redefine' ;
1302
+ my $enc = Encode::find_encoding(' UTF-8' );
1303
+ *FCGI::Stream::PRINT = sub {
1304
+ my @OUTPUT = @_ ;
1305
+ for (my $i = 1; $i < @_ ; $i ++) {
1306
+ $OUTPUT [$i ] = $enc -> encode($_ [$i ], Encode::FB_CROAK|Encode::LEAVE_SRC);
1307
+ }
1308
+ @_ = @OUTPUT ;
1309
+ goto $FCGI_Stream_PRINT_raw ;
1310
+ };
1297
1311
1298
1312
my $request_number = 0;
1299
1313
# let each child service 100 requests
@@ -7079,6 +7093,7 @@ sub git_blob_plain {
7079
7093
($sandbox ? ' attachment' : ' inline' )
7080
7094
. ' ; filename="' . $save_as . ' "' );
7081
7095
local $/ = undef ;
7096
+ local *FCGI::Stream::PRINT = $FCGI_Stream_PRINT_raw ;
7082
7097
binmode STDOUT , ' :raw' ;
7083
7098
print <$fd >;
7084
7099
binmode STDOUT , ' :utf8' ; # as set at the beginning of gitweb.cgi
@@ -7417,6 +7432,7 @@ sub git_snapshot {
7417
7432
7418
7433
open my $fd , " -|" , $cmd
7419
7434
or die_error(500, " Execute git-archive failed" );
7435
+ local *FCGI::Stream::PRINT = $FCGI_Stream_PRINT_raw ;
7420
7436
binmode STDOUT , ' :raw' ;
7421
7437
print <$fd >;
7422
7438
binmode STDOUT , ' :utf8' ; # as set at the beginning of gitweb.cgi
0 commit comments