/[suikacvs]/messaging/manakai/lib/Message/CGI/Carp.pm
Suika

Contents of /messaging/manakai/lib/Message/CGI/Carp.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Sun Sep 23 07:57:00 2007 UTC (17 years, 2 months ago) by wakaba
Branch: MAIN
CVS Tags: manakai-release-0-4-0, HEAD
++ manakai/lib/Message/CGI/ChangeLog	23 Sep 2007 07:56:57 -0000
2007-09-23  Wakaba  <wakaba@suika.fam.cx>

	* Makefile (all): |Carp.html| is added.

++ manakai/lib/Message/DOM/ChangeLog	23 Sep 2007 07:55:19 -0000
2007-09-23  Wakaba  <wakaba@suika.fam.cx>

	* SelectorsAPI.pm: New Perl module.

1 wakaba 1.1
2     =head1 NAME
3    
4     SuikaWiki::Output::CGICarp --- SuikaWiki : CGI::Carp modification to
5     return 500 status code
6    
7     =head1 DESCRIPTION
8    
9     At the time of writing, latest version of CGI::Carp (1.27)
10     does not output error dying message with 500 (Internal Server Error)
11     HTTP status code unless it is working on mod_perl.
12    
13     This module overrides some of CGI::Carp functions to return 500 status
14     code. Users of this module should take attention whether later revision
15     of CGI::Carp provides improved version of CGI outputing methods.
16    
17     This module is part of SuikaWiki.
18    
19     =cut
20    
21     package SuikaWiki::Output::CGICarp;
22     require CGI::Carp; # 1.27
23     use strict;
24     our $VERSION = do{my @r=(q$Revision: 1.4 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
25     our $CUSTOM_REASON_TEXT = 'Internal CGI Script Error';
26     our $CUSTOM_STATUS_CODE = 500;
27    
28     =head1 OPTIONS
29    
30     =over 4
31    
32     =item $SuikaWiki::Output::CGICarp::CUSTOM_REASON_TEXT (Default : Internal CGI Script Error)
33    
34     Short description of error status. This string should contains only
35     printable ASCII characters (including SPACE) for interoperability
36     and line break characters (CR and LF) MUST NOT be used.
37    
38     =item $SuikaWiki::Output::CGICarp::CUSTOM_STATUS_CODE (Default : 500)
39    
40     Three digit status code defined by HTTP specifications.
41    
42     =back
43    
44     =cut
45    
46     package CGI::Carp;
47     our $CUSTOM_MSG;
48     sub fatalsToBrowser {
49     my($msg) = @_;
50     $msg=~s/&/&amp;/g;
51     $msg=~s/>/&gt;/g;
52     $msg=~s/</&lt;/g;
53     $msg=~s/\"/&quot;/g;
54     my($wm) = $main::ENV{SERVER_ADMIN} ?
55     qq[the webmaster &lt;<a href="mailto:$main::ENV{SERVER_ADMIN}">$main::ENV{SERVER_ADMIN}</a>&gt;] :
56     "this site's webmaster";
57     my ($outer_message) = <<END;
58     For help, please send mail to $wm, giving this error message
59     and the time and date of the error.
60     END
61     ;
62     my $mod_perl = exists $main::ENV{MOD_PERL};
63    
64     warningsToBrowser(1); # emit warnings before dying
65    
66     if ($CUSTOM_MSG) {
67     if (ref($CUSTOM_MSG) eq 'CODE') {
68     my $bytes_written = eval{tell STDOUT};
69     unless (defined $bytes_written && $bytes_written > 0) {
70     print STDOUT "Status: @{[$SuikaWiki::Output::CGICarp::CUSTOM_STATUS_CODE+0]} $SuikaWiki::Output::CGICarp::CUSTOM_REASON_TEXT\n";
71     print STDOUT "Content-type: text/html; charset=iso-8859-1\n\n";
72     }
73     &$CUSTOM_MSG($msg); # nicer to perl 5.003 users
74     return;
75     } else {
76     $outer_message = $CUSTOM_MSG;
77     }
78     }
79    
80     my $mess = <<END;
81     <h1>Software error:</h1>
82     <pre>$msg</pre>
83     <p>
84     $outer_message
85     </p>
86     END
87     ;
88    
89     if ($mod_perl) {
90     require mod_perl;
91     if ($mod_perl::VERSION >= 1.99) {
92     $mod_perl = 2;
93     require Apache::RequestRec;
94     require Apache::RequestIO;
95     require Apache::RequestUtil;
96     require APR::Pool;
97     require ModPerl::Util;
98     require Apache::Response;
99     }
100     my $r = Apache->request;
101     # If bytes have already been sent, then
102     # we print the message out directly.
103     # Otherwise we make a custom error
104     # handler to produce the doc for us.
105     if ($r->bytes_sent) {
106     $r->print($mess);
107     $mod_perl == 2 ? ModPerl::Util::exit(0) : $r->exit;
108     } else {
109     # MSIE won't display a custom 500 response unless it is >512 bytes!
110     if ($main::ENV{HTTP_USER_AGENT} =~ /MSIE/) {
111     $mess = "<!-- " . (' ' x 513) . " -->\n$mess";
112     }
113     $r->custom_response($SuikaWiki::Output::CGICarp::CUSTOM_STATUS_CODE+0,$mess);
114     }
115     } else {
116     my $bytes_written = eval{tell STDOUT};
117     if (defined $bytes_written && $bytes_written > 0) {
118     print STDOUT $mess;
119     } else {
120     print STDOUT "Status: @{[$SuikaWiki::Output::CGICarp::CUSTOM_STATUS_CODE+0]} $SuikaWiki::Output::CGICarp::CUSTOM_REASON_TEXT\n";
121     print STDOUT "Content-type: text/html; charset=iso-8859-1\n\n";
122     print STDOUT $mess;
123     }
124     }
125     }
126    
127     =head1 EXAMPLE
128    
129     use CGI::Carp qw/fatalsToBrowser/;
130     require SuikaWiki::Output::CGICarp;
131    
132     die 'Something wrong';
133    
134     =head1 LICENSE
135    
136     Copyright 2003-2004 Wakaba <w@suika.fam.cx>
137    
138     This program is free software; you can redistribute it and/or
139     modify it under the same terms as Perl itself.
140    
141     =cut
142    
143     1; # $Date: 2004/01/17 09:18:38 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24