diff options
-rw-r--r-- | CGI.pl | 79 | ||||
-rw-r--r-- | template/default/global/code-error.html.tmpl | 50 | ||||
-rw-r--r-- | template/default/global/user-error.html.tmpl | 39 |
3 files changed, 156 insertions, 12 deletions
@@ -52,6 +52,8 @@ use CGI::Carp qw(fatalsToBrowser); require 'globals.pl'; +use vars qw($template $vars); + # If Bugzilla is shut down, do not go any further, just display a message # to the user about the downtime. (do)editparams.cgi is exempted from # this message, of course, since it needs to be available in order for @@ -1199,27 +1201,80 @@ sub PutFooter { } +############################################################################### +# Error handling +# +# If you are doing incremental output, set $vars->{'header_done'} once you've +# done the header. +############################################################################### + +# DisplayError is deprecated. Use CodeError, UserError or TemplateError +# instead. sub DisplayError { - my ($message, $title) = (@_); - $title ||= "Error"; - $message ||= "An unknown error occurred."; + ($vars->{'error'}, $vars->{'title'}) = (@_); + $vars->{'title'} ||= "Error"; + + print "Content-type: text/html\n\n" if !$vars->{'header_done'}; + $template->process("global/user-error.html.tmpl", $vars) + || TemplateError($template->error()); + + return 1; +} + +# For "this shouldn't happen"-type places in the code. +# $vars->{'variables'} is a reference to a hash of useful debugging info. +sub CodeError { + ($vars->{'error'}, $vars->{'variables'}) = (@_); + $vars->{'title'} = "Code Error"; + + # We may optionally log something to file here. - print "Content-type: text/html\n\n"; - PutHeader($title); + print "Content-type: text/html\n\n" if !$vars->{'header_done'}; + $template->process("global/code-error.html.tmpl", $vars) + || TemplateError($template->error()); + + exit; +} - print PerformSubsts( Param("errorhtml") , {errormsg => $message} ); +# For errors made by the user. +sub UserError { + ($vars->{'error'}, $vars->{'title'}, my $unlock_tables) = (@_); + $vars->{'title'} ||= "Error"; - PutFooter(); + SendSQL("UNLOCK TABLES") if $unlock_tables; + + print "Content-type: text/html\n\n" if !$vars->{'header_done'}; + $template->process("global/user-error.html.tmpl", $vars) + || TemplateError($template->error()); + + exit; +} - return 1; +# If the template system isn't working, we can't use a template :-) +# The Content-Type will already have been printed. +sub TemplateError { + my ($error) = html_quote((@_)); + + print "<tt><p> + Bugzilla has suffered an internal error. Please save this page, and its + URL, and send it to "; + print Param("maintainer"); + print ", with details of what you were doing at the time this message + appeared.</p> + <p>Template->process() failed: $error.</p></tt>"; + + exit; } +# PuntTryAgain is deprecated. Use UserError with the unlock_tables parameter. sub PuntTryAgain ($) { - my ($str) = (@_); - print PerformSubsts(Param("errorhtml"), - {errormsg => $str}); + ($vars->{'error'}) = (@_); + SendSQL("UNLOCK TABLES"); - PutFooter(); + + $vars->{'header_done'} = "true"; + $template->process("global/user-error.html.tmpl", $vars) + || TemplateError($template->error()); exit; } diff --git a/template/default/global/code-error.html.tmpl b/template/default/global/code-error.html.tmpl new file mode 100644 index 000000000..4e73a7738 --- /dev/null +++ b/template/default/global/code-error.html.tmpl @@ -0,0 +1,50 @@ +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + #%] + +[% UNLESS header_done %] + [% INCLUDE global/header %] +[% END %] + + <p> + <tt> + Bugzilla has suffered an internal error. Please save this page and send + it, and its URL, to [% Param("maintainer") %], with details of what you + were doing at the time this message appeared. + </tt> + </p> + +<table cellpadding="20"> + <tr> + <td bgcolor="#ff0000"> + <font size="+2"> + [% error %] + </font> + </td> + </tr> +</table> + +<pre> +Variables: + [% FOREACH key = variables.keys %] + [%+ key %]: [%+ variables.$key %] + [% END %] +</pre> + +[% INCLUDE global/footer %] diff --git a/template/default/global/user-error.html.tmpl b/template/default/global/user-error.html.tmpl new file mode 100644 index 000000000..1e8e34b01 --- /dev/null +++ b/template/default/global/user-error.html.tmpl @@ -0,0 +1,39 @@ +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + #%] + +[% UNLESS header_done %] + [% INCLUDE global/header %] +[% END %] + +<table cellpadding="20"> + <tr> + <td bgcolor="#ff0000"> + <font size="+2"> + [% error %] + </font> + </td> + </tr> +</table> + +<p> + Please press <b>Back</b> and try again. +</p> + +[% INCLUDE global/footer %] |