Check if PerlIO::gzip is available, and if it is make it possible to enable (via 'compression' %feature) transparent compression of HTML output. Error messages and any non-HTML output are excluded from transparent compression. Signed-off-by: Jakub Narebski <jnareb@xxxxxxxxx> --- On Thu, 19 July 2007, Luben Tuikov wrote: > --- Jakub Narebski <jnareb@xxxxxxxxx> wrote: > > Luben Tuikov wrote: > > > > > I wouldn't mind an improvement in the snapshot area of gitweb. > > > I wasn't really happy with the snapshot feature as it was originally > > > implemented, as it would generate a tar file with ".tar.bz2" > > > name extension, but the file was NOT bz2, and I had to always > > > manually rename, bz2, and rename back. > > > > This was a *bug*, but it is now corrected (in 9aa17573). Gitweb used > > Content-Encoding, which is meant for _transparent_ compression. > > Yeah, that's what I suspected, since there was nothing obviously > wrong with the code. And _this_ patch adds support for true, intentional transparent compression. gitweb/gitweb.perl | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 48 insertions(+), 0 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 0acd0ca..d48a193 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -20,8 +20,12 @@ binmode STDOUT, ':utf8'; BEGIN { CGI->compile() if $ENV{'MOD_PERL'}; + + eval { require PerlIO::gzip; }; # needed for transparent compression } +our $enable_transparent_compression = !! $PerlIO::gzip::VERSION; + our $cgi = new CGI; our $version = "++GIT_VERSION++"; our $my_url = $cgi->url(); @@ -238,6 +242,22 @@ our %feature = ( 'override' => 0, 'default' => [1]}, + # Enable transparent compression, for now only for HTML output; + # this reduces network bandwidth at the cost of CPU usage. + # You need to have PerlIO::gzip for that, and browser has to accept + # (via Accept-Encoding: HTTP request header) 'gzip' encoding. + # Transparent compression is not used for error messages. + + # To enable system wide have in $GITWEB_CONFIG + # $feature{'compression'}{'default'} = [1]; + # To have project specific config enable override in $GITWEB_CONFIG + # $feature{'compression'}{'override'} = 1; + # and in project config gitweb.compression = 0|1; + 'compression' => { + 'sub' => \&feature_compression, + 'override' => 0, + 'default' => [0]}, + # Make gitweb use an alternative format of the URLs which can be # more readable and natural-looking: project name is embedded # directly in the path and the query string contains other @@ -336,6 +356,18 @@ sub feature_pickaxe { return ($_[0]); } +sub feature_compression { + my ($val) = git_get_project_config('compression', '--bool'); + + if ($val eq 'true') { + return (1); + } elsif ($val eq 'false') { + return (0); + } + + return ($_[0]); +} + # checking HEAD file with -e is fragile if the repository was # initialized long time ago (i.e. symlink HEAD) and was pack-ref'ed # and then pruned. @@ -2238,9 +2270,24 @@ sub git_header_html { } else { $content_type = 'text/html'; } + # transparent compression has to be supported, enabled, and accepted + # explicitely by UA; note that qvalue of 0 means "not acceptable." + my %content_encoding = (); + if ($enable_transparent_compression && + gitweb_check_feature('compression') && + defined $cgi->http('HTTP_ACCEPT_ENCODING') && + $cgi->http('HTTP_ACCEPT_ENCODING') =~ m/(^|,|;|\s)gzip(,|;|\s|$)/ && + $cgi->http('HTTP_ACCEPT_ENCODING') !~ m/(^|,|;|\s)gzip\s*;q=0(,|\s|$)/) { + %content_encoding = (-content_encoding => 'gzip'); + } print $cgi->header(-type=>$content_type, -charset => 'utf-8', + %content_encoding, -status=> $status, -expires => $expires); my $mod_perl_version = $ENV{'MOD_PERL'} ? " $ENV{'MOD_PERL'}" : ''; + if (%content_encoding) { + # implies $enable_transparent_compression + binmode STDOUT, ':gzip'; + } print <<EOF; <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> @@ -2375,6 +2422,7 @@ sub die_error { my $status = shift || "403 Forbidden"; my $error = shift || "Malformed query, file missing or permission denied"; + $enable_transparent_compression = 0; git_header_html($status); print <<EOF; <div class="page_body"> -- 1.5.2.4 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html