]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/perl/UCW/CGI.pm
tableprinter: bugfix in TBL_COL_ITER macro
[libucw.git] / ucw / perl / UCW / CGI.pm
index c8ec08db22666699ea52207b87372d3561ef8faa..de39d226aad349f54810f9092338f0ac16b3ec27 100644 (file)
@@ -1,6 +1,6 @@
 #      Poor Man's CGI Module for Perl
 #
-#      (c) 2002--2010 Martin Mares <mj@ucw.cz>
+#      (c) 2002--2011 Martin Mares <mj@ucw.cz>
 #      Slightly modified by Tomas Valla <tom@ucw.cz>
 #
 #      This software may be freely distributed and used according to the terms
@@ -8,45 +8,6 @@
 
 package UCW::CGI;
 
-# First of all, set up error handling, so that even errors during parsing
-# will be reported properly.
-
-# Variables to be set by the calling module:
-#      $UCW::CGI::error_mail           mail address of the script admin (optional)
-#                                      (this one has to be set in the BEGIN block!)
-#      $UCW::CGI::error_hook           function to be called for reporting errors
-
-my $error_reported;
-my $exit_code;
-my $debug = 0;
-
-sub report_bug($)
-{
-       if (!defined $error_reported) {
-               $error_reported = 1;
-               print STDERR $_[0];
-               if (defined($UCW::CGI::error_hook)) {
-                       &$UCW::CGI::error_hook($_[0]);
-               } else {
-                       print "Content-Type: text/plain\n\n";
-                       print "Internal bug:\n";
-                       print $_[0], "\n";
-                       print "Please notify $UCW::CGI::error_mail\n" if defined $UCW::CGI::error_mail;
-               }
-       }
-       die;
-}
-
-BEGIN {
-       $SIG{__DIE__} = sub { report_bug($_[0]); };
-       $SIG{__WARN__} = sub { report_bug("WARNING: " . $_[0]); };
-       $exit_code = 0;
-}
-
-END {
-       $? = $exit_code;
-}
-
 use strict;
 use warnings;
 
@@ -56,6 +17,8 @@ our @ISA = qw(Exporter);
 our @EXPORT = qw(&html_escape &url_escape &url_deescape &url_param_escape &url_param_deescape &self_ref &self_form &http_get);
 our @EXPORT_OK = qw();
 
+# Configuration settings
+our $debug = 0;
 our $utf8_mode = 0;
 
 sub http_error($;@) {
@@ -68,6 +31,7 @@ sub http_error($;@) {
 
 sub url_escape($) {
        my $x = shift @_;
+       defined $x or return;
        utf8::encode($x) if $utf8_mode;
        $x =~ s/([^-\$_.!*'(),0-9A-Za-z\x80-\xff])/"%".unpack('H2',$1)/ge;
        utf8::decode($x) if $utf8_mode;
@@ -76,6 +40,7 @@ sub url_escape($) {
 
 sub url_deescape($) {
        my $x = shift @_;
+       defined $x or return;
        utf8::encode($x) if $utf8_mode;
        $x =~ s/%(..)/pack("H2",$1)/ge;
        utf8::decode($x) if $utf8_mode;
@@ -84,19 +49,24 @@ sub url_deescape($) {
 
 sub url_param_escape($) {
        my $x = shift @_;
-       $x = url_escape($x);
+       defined $x or return;
+       utf8::encode($x) if $utf8_mode;
+       $x =~ s/([^-\$_.!*'(),0-9A-Za-z])/"%".unpack('H2',$1)/ge;
        $x =~ s/%20/+/g;
+       utf8::decode($x) if $utf8_mode;
        return $x;
 }
 
 sub url_param_deescape($) {
        my $x = shift @_;
+       defined $x or return;
        $x =~ s/\+/ /g;
        return url_deescape($x);
 }
 
 sub html_escape($) {
        my $x = shift @_;
+       defined $x or return;
        $x =~ s/&/&amp;/g;
        $x =~ s/</&lt;/g;
        $x =~ s/>/&gt;/g;
@@ -134,7 +104,7 @@ sub rfc822_deescape($) {
 sub http_get($) {
        my $h = shift @_;
        $h =~ tr/a-z-/A-Z_/;
-       return $ENV{"HTTP_$h"} || $ENV{"$h"};
+       return $ENV{"HTTP_$h"} // $ENV{"$h"};
 }
 
 ### Parsing of Arguments ###
@@ -168,7 +138,7 @@ sub parse_multipart_form_data();
 sub init_args() {
        if (!defined $ENV{"GATEWAY_INTERFACE"}) {
                print STDERR "Must be called as a CGI script.\n";
-               $exit_code = 1;
+               $UCW::CGI::ErrorHandler::exit_code = 1;
                exit;
        }
 
@@ -191,7 +161,7 @@ sub init_args() {
                        exit;
                }
        } else {
-               http_error "405 Method Not Allowed", "Allow: GET, HEAD, PUT";
+               http_error "405 Method Not Allowed", "Allow: GET, HEAD, POST";
        }
 }
 
@@ -204,7 +174,7 @@ sub parse_args($) {                 # CAVEAT: attached files must be defined in the main arg t
 
        for my $a (values %$args) {
                my $r = ref($a->{'var'});
-               defined($a->{'default'}) or $a->{'default'}="";
+               $a->{'default'} //= '';
                if ($r eq 'SCALAR') {
                        ${$a->{'var'}} = $a->{'default'};
                } elsif ($r eq 'ARRAY') {
@@ -345,7 +315,7 @@ sub parse_multipart_form_data() {
 
        # BUG: IE 3.01 on Macintosh forgets to add the "--" at the start of the boundary string
        # as the MIME specs preach. Workaround borrowed from CGI.pm in Perl distribution.
-       my $agent = http_get("User-Agent") || "";
+       my $agent = http_get("User-Agent") // "";
        $boundary = "--$boundary" unless $agent =~ /MSIE\s+3\.0[12];\s*Mac/;
        $boundary = "\r\n$boundary";
        $boundary_len = length($boundary) + 2;
@@ -401,6 +371,10 @@ sub parse_multipart_form_data() {
                                print STDERR "FILE UPLOAD to $fn\n" if $debug;
                                ${$a->{"file"}} = $fn;
                                ${$a->{"fh"}} = $fh if defined $a->{"fh"};
+                               if (defined $a->{"filename"}){
+                                       my ($filename) = ($cdisp =~ /;filename=([^;]+)/);
+                                       (${$a->{"filename"}}) = rfc822_deescape($filename) if defined $filename;
+                               }
                                my $total_size = 0;
                                while (my $i = refill_mp_data(4096)) {
                                        print $fh substr($mp_buffer, $mp_buffer_i, $i);