]> mj.ucw.cz Git - libucw.git/blobdiff - lib/perl/CGI.pm
CGI: Added "multiline" flag, which allows newline in parameter values.
[libucw.git] / lib / perl / CGI.pm
index bb2b14b09a1e5373e5fdb9b64540fd2c4b61fccf..55e76e1c7fb4b56a79ad20148a80b10b47cb4f11 100644 (file)
@@ -17,17 +17,26 @@ BEGIN {
        our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
        $VERSION = 1.0;
        @ISA = qw(Exporter);
-       @EXPORT = qw(&html_escape &url_escape &self_ref &self_form);
+       @EXPORT = qw(&html_escape &url_escape &url_param_escape &self_ref &self_form);
        @EXPORT_OK = qw();
        %EXPORT_TAGS = ();
 }
 
+### Escaping ###
+
 sub url_escape($) {
        my $x = shift @_;
        $x =~ s/([^-\$_.!*'(),0-9A-Za-z\x80-\xff])/"%".unpack('H2',$1)/ge;
        return $x;
 }
 
+sub url_param_escape($) {
+       my $x = shift @_;
+       $x = url_escape($x);
+       $x =~ s/%20/+/g;
+       return $x;
+}
+
 sub html_escape($) {
        my $x = shift @_;
        $x =~ s/&/&/g;
@@ -82,8 +91,10 @@ sub parse_arg_string($) {
                my $arg = $arg_table->{$1} or next;
                $_ = $2;
                s/\+/ /g;
-               s/%(..)/pack("c",hex $1)/eg;
-               s/(\r|\n|\t)/ /g;
+               s/%(..)/pack("H2",$1)/eg;
+               s/\r\n/\n/g;
+               s/\r/\n/g;
+               $arg->{'multiline'} || s/(\n|\t)/ /g;
                s/^\s+//;
                s/\s+$//;
                if (my $rx = $arg->{'check'}) {
@@ -155,7 +166,7 @@ sub make_out_args($) {
 sub self_ref(@) {
        my %h = @_;
        my $out = make_out_args(\%h);
-       return "?" . join(':', map { "$_=" . url_escape($out->{$_}) } sort keys %$out);
+       return "?" . join(':', map { "$_=" . url_param_escape($out->{$_}) } sort keys %$out);
 }
 
 sub self_form(@) {