1 # Poor Man's CGI Module for Perl
3 # (c) 2002 Martin Mares <mj@ucw.cz>
4 # Slightly modified by Tomas Valla <tom@ucw.cz>
6 # This software may be freely distributed and used according to the terms
7 # of the GNU Lesser General Public License.
15 # The somewhat hairy Perl export mechanism
17 our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
20 @EXPORT = qw(&html_escape &url_escape &self_ref &self_form);
27 $x =~ s/([^-\$_.!*'(),0-9A-Za-z\x80-\xff])/"%".unpack('H2',$1)/ge;
42 sub parse_arg_string($) {
45 foreach $_ (split /[&:]/,$s) {
46 (/^([^=]+)=(.*)$/) or next;
47 my $arg = $arg_table->{$1} or next;
50 s/%(..)/pack("c",hex $1)/eg;
54 if (my $rx = $arg->{'check'}) {
55 if (!/^$rx$/) { $_ = $arg->{'default'}; }
58 if (defined $arg->{'array'}) {
59 push @{$arg->{'array'}}, $_;
61 ${$arg->{'var'}} = $_;
67 $arg_table = shift @_;
68 foreach my $a (values %$arg_table) {
69 defined($a->{'default'}) or $a->{'default'}="";
70 die "Should define either 'var' or 'array'" if defined($a->{'var'})+defined($a->{'array'})!=1;
71 defined $a->{'var'} and ${$a->{'var'}} = $a->{'default'};
72 defined $a->{'array'} and @{$a->{'array'}} = ();
74 defined $ENV{"GATEWAY_INTERFACE"} or die "Not called as a CGI script";
75 my $method = $ENV{"REQUEST_METHOD"};
76 if ($method eq "GET") {
77 parse_arg_string($ENV{"QUERY_STRING"});
78 } elsif ($method eq "POST") {
79 if ($ENV{"CONTENT_TYPE"} =~ /^application\/x-www-form-urlencoded\b/i) {
85 return "Unknown content type for POST data";
88 return "Unknown request method";
92 sub make_out_args($) {
95 foreach my $name (keys %$arg_table) {
96 my $arg = $arg_table->{$name};
97 defined $arg->{'pass'} && !$arg->{'pass'} && !exists $overrides->{$name} && next;
99 if (!defined($value = $overrides->{$name})) {
100 if (exists $overrides->{$name}) {
101 $value = $arg->{'default'};
103 $value = ${$arg->{'var'}};
106 if ($value ne $arg->{'default'}) {
107 $out->{$name} = $value;
115 my $out = make_out_args(\%h);
116 return "?" . join(':', map { "$_=" . url_escape($out->{$_}) } sort keys %$out);
121 my $out = make_out_args(\%h);
122 return join('', map { "<input type=hidden name=$_ value='" . html_escape($out->{$_}) . "'>\n" } sort keys %$out);