=================================================================== RCS file: /cvs/cvsweb/cvsweb.cgi,v retrieving revision 3.22 retrieving revision 3.23 diff -u -p -r3.22 -r3.23 --- cvsweb/cvsweb.cgi 2000/09/19 18:35:50 3.22 +++ cvsweb/cvsweb.cgi 2000/09/19 19:57:58 3.23 @@ -9,6 +9,7 @@ # Ken Coar # Dick Balaska # Akinori MUSHA +# Jens-Uwe Mager # # Based on: # * Bill Fenners cvsweb.cgi revision 1.28 available from: @@ -41,8 +42,8 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -# $zId: cvsweb.cgi,v 1.94 2000/08/24 06:41:22 hnordstrom Exp $ -# $Id: cvsweb.cgi,v 3.22 2000/09/19 18:35:50 knu Exp $ +# $zId: cvsweb.cgi,v 1.101 2000/09/13 22:44:05 jumager Exp $ +# $Id: cvsweb.cgi,v 3.23 2000/09/19 19:57:58 knu Exp $ # ### @@ -76,7 +77,7 @@ use vars qw ( $navigationHeaderColor $tableBorderColor $markupLogColor $tabstop $state $annTable $sel $curbranch @HideModules $module $use_descriptions %descriptions @mytz $dwhere $moddate - $use_moddate + $use_moddate $has_zlib $gzip_open ); sub printDiffSelect($); @@ -160,6 +161,13 @@ $tabstop = $use_moddate = $moddate = undef; use Time::Local; use IPC::Open2; +# Check if the zlib C library interface is installed, and if yes +# we can avoid using the extra gzip process. +eval { + require Compress::Zlib; +}; +$has_zlib = !$@; + $verbose = $v; $checkoutMagic = "~checkout~"; $pathinfo = defined($ENV{PATH_INFO}) ? $ENV{PATH_INFO} : ''; @@ -197,13 +205,12 @@ $nofilelinks = $is_textbased; # braindamaged MS-Internet Exploders claim that they # accept gzip .. but don't in fact and # display garbage then :-/ -# Turn off gzip if running under mod_perl. piping does -# not work as expected inside the server. One can probably -# achieve the same result using Apache::GZIPFilter. +# Turn off gzip if running under mod_perl and no zlib is available, +# piping does not work as expected inside the server. $maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip` || $is_mozilla3) && !$is_msie - && !$is_mod_perl); + && !($is_mod_perl && !$has_zlib)); # put here the variables we need in order # to hold our state - they will be added (with @@ -359,7 +366,7 @@ $defaultViewable = $allow_markup && viewable($mimetype # ge get an Internal Server Error if we try to pipe the # output through the nonexistent gzip .. # any more elegant ways to prevent this are welcome! -if ($allow_compress && $maycompress) { +if ($allow_compress && $maycompress && !$has_zlib) { foreach (split(/:/, $ENV{PATH})) { if (-x "$_/gzip") { $GZIPBIN = "$_/gzip"; @@ -710,7 +717,8 @@ elsif (-d $fullname) { foreach my $var (@stickyvars) { print "\n" if (defined($input{$var}) - && $input{$var} ne $DEFAULTVALUE{$var} + && (!defined($DEFAULTVALUE{$var}) + || $input{$var} ne $DEFAULTVALUE{$var}) && $input{$var} ne "" && $var ne "only_with_tag"); } @@ -772,15 +780,18 @@ elsif (-d $fullname) { elsif (-f $fullname . ',v') { if (defined($input{'rev'}) || $doCheckout) { &doCheckout($fullname, $input{'rev'}); + close(GZIP) if ($gzip_open); exit; } if (defined($input{'annotate'}) && $allow_annotate) { &doAnnotate($input{'annotate'}); + close(GZIP) if ($gzip_open); exit; } if (defined($input{'r1'}) && defined($input{'r2'})) { &doDiff($fullname, $input{'r1'}, $input{'tr1'}, $input{'r2'}, $input{'tr2'}, $input{'f'}); + close(GZIP) if ($gzip_open); exit; } print("going to dolog($fullname)\n") if ($verbose); @@ -803,6 +814,7 @@ elsif (-d $fullname) { # e.g. foo.c &doDiff($fullname, $input{'r1'}, $input{'tr1'}, $input{'r2'}, $input{'tr2'}, $input{'f'}); + close(GZIP) if ($gzip_open); exit; } elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| && @@ -836,6 +848,8 @@ elsif (-d $fullname) { } &fatal("404 Not Found","$where: no such file or directory"); } + +close(GZIP) if ($gzip_open); ## End MAIN sub printDiffSelect($) { @@ -1344,6 +1358,9 @@ sub cvswebMarkup($$$) { if ($mimetype =~ /^image/) { print "
"; } + elsif ($mimetype =~ m%^application/pdf%) { + print "
"; + } else { print "
";
 	foreach (@content) {
@@ -1356,7 +1373,7 @@ sub cvswebMarkup($$$) {
 sub viewable($) {
     my ($mimetype) = @_;
 
-    $mimetype =~ m%^(text|image)/%;
+    $mimetype =~ m%^((text|image)/|application/pdf)% ;
 }
 
 ###############################
@@ -1454,6 +1471,7 @@ sub doDiff($$$$$$) {
 	if ($human_readable) {
 	    http_header();
 	    &human_readable_diff($fh, $rev2);
+	    close(GZIP) if ($gzip_open);
 	    exit;
 	}
 	else {
@@ -2123,7 +2141,9 @@ EOF
         foreach (@stickyvars) {
 	    print "\n"
 		if (defined($input{$_})
-		    && ($input{$_} ne $DEFAULTVALUE{$_} && $input{$_} ne ""));
+		    && ((!defined($DEFAULTVALUE{$_})
+		         || $input{$_} ne $DEFAULTVALUE{$_})
+		        && $input{$_} ne ""));
 	}
 	print "\n";
 	print "
Diffs between \n"; @@ -2177,7 +2197,9 @@ EOF next if ($_ eq "only_with_tag"); next if ($_ eq "logsort"); print "\n" - if (defined($input{$_}) && $input{$_} ne $DEFAULTVALUE{$_} + if (defined($input{$_}) + && (!defined($DEFAULTVALUE{$_}) + || $input{$_} ne $DEFAULTVALUE{$_}) && $input{$_} ne ""); } print "
"; @@ -2388,7 +2410,7 @@ sub navigateHeader($$$$$) { $swhere = urlencode($filename) if ($swhere eq ""); print "<\!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; print "\n\n"; - print ''; + print ''; print "\n$path$filename - $title - $rev\n"; print "\n"; print ""; @@ -2689,7 +2711,7 @@ sub http_header(;$) { my $content_type = shift || "text/html"; if (defined($moddate)) { if ($is_mod_perl) { - Apache->request->header_out(Last_modified => scalar gmtime($moddate) . " GMT"); + Apache->request->header_out("Last-Modified" => scalar gmtime($moddate) . " GMT"); } else { print "Last-Modified: " . scalar gmtime($moddate) . " GMT\r\n"; @@ -2702,8 +2724,7 @@ sub http_header(;$) { print "Content-type: $content_type\r\n"; } if ($allow_compress && $maycompress) { - my $fh = do {local(*FH);}; - if (defined($GZIPBIN) && open($fh, "|$GZIPBIN -1 -c")) { + if ($has_zlib || (defined($GZIPBIN) && open(GZIP, "|$GZIPBIN -1 -c"))) { if ($is_mod_perl) { Apache->request->content_encoding("x-gzip"); Apache->request->header_out(Vary => "Accept-Encoding"); @@ -2715,7 +2736,11 @@ sub http_header(;$) { print "\r\n"; # Close headers } $| = 1; $| = 0; # Flush header output - select ($fh); + if ($has_zlib) { + tie *GZIP, __PACKAGE__, \*STDOUT; + } + select(GZIP); + $gzip_open = 1; # print "" if ($content_type eq "text/html"); } else { @@ -2740,7 +2765,7 @@ sub http_header(;$) { sub html_header($) { my ($title) = @_; - my $version = '$zRevision: 1.94 $ $Revision: 3.22 $'; #' + my $version = '$zRevision: 1.101 $ $Revision: 3.23 $'; #' http_header(); print < Compress::Zlib::Z_BEST_COMPRESSION(), + -WindowBits => -Compress::Zlib::MAX_WBITS()) or return undef; + my ($o) = { + handle => $out, + dh => $d, + crc => 0, + len => 0, + }; + my ($header) = pack("c10", MAGIC1, MAGIC2, Compress::Zlib::Z_DEFLATED(), 0,0,0,0,0,0, OSCODE); + print {$o->{handle}} $header; + return bless($o, $class); +} + +sub PRINT { + my ($o) = shift; + my ($buf) = join(defined $, ? $, : "",@_); + my ($len) = length($buf); + my ($compressed, $status) = $o->{dh}->deflate($buf); + print {$o->{handle}} $compressed if defined($compressed); + $o->{crc} = Compress::Zlib::crc32($buf, $o->{crc}); + $o->{len} += $len; + return $len; +} + +sub PRINTF { + my ($o) = shift; + my ($fmt) = shift; + my ($buf) = sprintf($fmt, @_); + my ($len) = length($buf); + my ($compressed, $status) = $o->{dh}->deflate($buf); + print {$o->{handle}} $compressed if defined($compressed); + $o->{crc} = Compress::Zlib::crc32($buf, $o->{crc}); + $o->{len} += $len; + return $len; +} + +sub WRITE { + my ($o, $buf, $len, $off) = @_; + my ($compressed, $status) = $o->{dh}->deflate(substr($buf, 0, $len)); + print {$o->{handle}} $compressed if defined($compressed); + $o->{crc} = Compress::Zlib::crc32(substr($buf, 0, $len), $o->{crc}); + $o->{len} += $len; + return $len; +} + +sub CLOSE { + my ($o) = @_; + return if !defined( $o->{dh}); + my ($buf) = $o->{dh}->flush(); + $buf .= pack("V V", $o->{crc}, $o->{len}); + print {$o->{handle}} $buf; + undef $o->{dh}; +} + +sub DESTROY { + my ($o) = @_; + CLOSE($o); }