/cgi-bin/form.lib
%formdata = (); # CGI parsing routine taken from "Perl and CGI for the World Wide Web" by # Elizabeth Castro if ($ENV{'REQUEST_METHOD'} eq 'GET') { @pairs = split(/&/, $ENV{'QUERY_STRING'}); &parse_querystring; } elsif ($ENV{'REQUEST_METHOD'} eq 'POST') { # Garth says the reason the server keeps crashing is because the form # uploads are using too much memory. I told him these old Solaris boxes # aren't cutting it and we should switch to Linux. This'll keep things # running. -cb if ($ENV{'CONTENT_LENGTH'} > 102400) { print "Status: 413 Request Entity Too Large\r\n"; print "Content-Type: text/plain\r\n\r\n"; print "Upload too large"; exit 0; } if ($ENV{'CONTENT_TYPE'} =~ /^multipart\/form-data/) { $boundary = (split(/;/, $ENV{'CONTENT_TYPE'}))[1]; $boundary = (split(/=/, $boundary))[1]; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @parts = split(/(?:\r\n)?--$boundary(?:\r\n)?/, $buffer); shift @parts; pop @parts; &parse_multipart; } else { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); &parse_querystring; } } sub parse_querystring { foreach $pair (@pairs) { ($key, $value) = split(/=/, $pair); $key =~ tr/+/ /; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # I don't even understand this -cb $value =~ s/<!--(.|\n)*-->//g; if ($formdata{$key}) { $formdata{$key} .= ", $value"; } else { $formdata{$key} = $value; } } } sub parse_multipart { for $part (@parts) { %part_headers = (); $name = ''; ($head, $content) = split(/\r\n\r\n/, $part); @fields = split(/\r\n/, $head); for $field (@fields) { ($key, $value) = split(/:\s*/, $field); if ($key eq 'Content-Disposition') { ($type, @extra) = split(/;\s*/, $value); if ($type ne 'form-data') { print "400 Bad Request\r\n\r\n"; print STDERR "Invalid form data type: $type\n"; exit 1; } for $e (@extra) { ($k, $v) = split(/=/, $e); $v =~ s/^"//; $v =~ s/"$//; if ($k eq 'name') { $name = $v; } elsif ($k eq 'filename') { $filenames{$name} = $v; } } } } $formdata{$name} = $content; } } 1;