]> Lady’s Gitweb - Gitweb/blobdiff - gitweb.perl
gitweb: Move evaluate_gitweb_config out of run_request
[Gitweb] / gitweb.perl
index 8b61a75718e8937052e74d83ba4b1f647d689ff732a12d8db12c428bcc6bec8c..e533708f4224be48b0c5c49b5316e8de6ce90ecb4f027fcd0bf22ee9ce0552d6 100755 (executable)
@@ -1028,18 +1028,18 @@ sub dispatch {
        $actions{$action}->();
 }
 
-sub run_request {
+sub reset_timer {
        our $t0 = [Time::HiRes::gettimeofday()]
                if defined $t0;
+       our $number_of_git_cmds = 0;
+}
+
+sub run_request {
+       reset_timer();
 
        evaluate_uri();
-       evaluate_gitweb_config();
-       evaluate_git_version();
        check_loadavg();
 
-       # $projectroot and $projects_list might be set in gitweb config file
-       $projects_list ||= $projectroot;
-
        evaluate_query_params();
        evaluate_path_info();
        evaluate_and_validate_params();
@@ -1054,19 +1054,24 @@ our $is_last_request = sub { 1 };
 our ($pre_dispatch_hook, $post_dispatch_hook, $pre_listen_hook);
 our $CGI = 'CGI';
 our $cgi;
+sub configure_as_fcgi {
+       require CGI::Fast;
+       our $CGI = 'CGI::Fast';
+
+       my $request_number = 0;
+       # let each child service 100 requests
+       our $is_last_request = sub { ++$request_number > 100 };
+}
 sub evaluate_argv {
+       my $script_name = $ENV{'SCRIPT_NAME'} || $ENV{'SCRIPT_FILENAME'} || __FILE__;
+       configure_as_fcgi()
+               if $script_name =~ /\.fcgi$/;
+
        return unless (@ARGV);
 
        require Getopt::Long;
        Getopt::Long::GetOptions(
-               'fastcgi|fcgi|f' => sub {
-                       require CGI::Fast;
-                       our $CGI = 'CGI::Fast';
-
-                       my $request_number = 0;
-                       # let each child service 100 requests
-                       our $is_last_request = sub { ++$request_number > 100 };
-               },
+               'fastcgi|fcgi|f' => \&configure_as_fcgi,
                'nproc|n=i' => sub {
                        my ($arg, $val) = @_;
                        return unless eval { require FCGI::ProcManager; 1; };
@@ -1082,6 +1087,11 @@ sub evaluate_argv {
 
 sub run {
        evaluate_argv();
+       evaluate_gitweb_config();
+       evaluate_git_version();
+
+       # $projectroot and $projects_list might be set in gitweb config file
+       $projects_list ||= $projectroot;
 
        $pre_listen_hook->()
                if $pre_listen_hook;
@@ -1105,6 +1115,15 @@ sub run {
 
 run();
 
+if (defined caller) {
+       # wrapped in a subroutine processing requests,
+       # e.g. mod_perl with ModPerl::Registry, or PSGI with Plack::App::WrapCGI
+       return;
+} else {
+       # pure CGI script, serving single request
+       exit;
+}
+
 ## ======================================================================
 ## action links
 
@@ -3390,7 +3409,7 @@ sub git_header_html {
        }
        print $cgi->header(-type=>$content_type, -charset => 'utf-8',
                           -status=> $status, -expires => $expires)
-               unless ($opts{'-no_http_headers'});
+               unless ($opts{'-no_http_header'});
        my $mod_perl_version = $ENV{'MOD_PERL'} ? " $ENV{'MOD_PERL'}" : '';
        print <<EOF;
 <?xml version="1.0" encoding="utf-8"?>
This page took 0.24033 seconds and 4 git commands to generate.