temporary precision notes
[kivitendo-erp.git] / SL / Dispatcher.pm
index 6322027..a37a01e 100644 (file)
@@ -41,6 +41,10 @@ use SL::InstanceConfiguration;
 use SL::Template::Plugin::HTMLFixes;
 use SL::User;
 
+use Rose::Object::MakeMethods::Generic (
+  scalar => [ qw(restart_after_request) ],
+);
+
 # Trailing new line is added so that Perl will not add the line
 # number 'die' was called in.
 use constant END_OF_REQUEST => "END-OF-REQUEST\n";
@@ -139,7 +143,7 @@ sub show_error {
   print $::form->parse_html_template($template, \%params);
   $::lxdebug->leave_sub;
 
-  ::end_of_request();
+  end_request();
 }
 
 sub pre_startup_setup {
@@ -229,11 +233,12 @@ sub handle_all_requests {
   my $request = FCGI::Request();
   while ($request->Accept() >= 0) {
     $self->handle_request($request);
-    if (_memory_usage_is_too_high()) {
-      $request->Flush();
-      last;
-    }
+
+    $self->restart_after_request(1) if $self->_interface_is_fcgi && $self->_memory_usage_is_too_high;
+    $request->LastCall              if $self->restart_after_request;
   }
+
+  exec $0 if $self->restart_after_request;
 }
 
 sub handle_request {
@@ -300,7 +305,7 @@ sub handle_request {
       action       => $action,
     );
 
-    ::end_of_request() unless $auth_result{auth_ok};
+    $self->end_request unless $auth_result{auth_ok};
 
     delete @{ $::form }{ grep { m/^\{AUTH\}/ } keys %{ $::form } } unless $auth_result{keep_auth_vars};
 
@@ -365,7 +370,7 @@ sub redirect_to_login {
   $action            .= '&error=' . $params{error} if $params{error};
 
   print $::request->cgi->redirect("controller.pl?action=${action}");
-  ::end_of_request();
+  $self->end_request;
 }
 
 sub unrequire_bin_mozilla {
@@ -476,7 +481,7 @@ sub _watch_for_changed_files {
   my $ok = all { (stat($_))[9] == $fcgi_file_cache{$_} } keys %fcgi_file_cache;
   return if $ok;
   $::lxdebug->message(LXDebug::DEBUG1(), "Program modifications detected. Restarting.");
-  exit;
+  $self->restart_after_request(1);
 }
 
 sub get_standard_filehandles {
@@ -493,7 +498,7 @@ sub _check_for_old_config_files {
   $::form->header;
   print $::form->parse_html_template('login_screen/old_configuration_files', { FILES => \@old_files });
 
-  ::end_of_request();
+  end_request();
 }
 
 sub _parse_number_with_unit {
@@ -544,11 +549,7 @@ sub _memory_usage_is_too_high {
   return 0;
 }
 
-package main;
-
-use strict;
-
-sub end_of_request {
+sub end_request {
   die SL::Dispatcher->END_OF_REQUEST;
 }