# Unquote form data sub unhtml { my ($str) = @_; $str =~ s/%([0-9a-f]{2})/chr(hex($1))/eig; $str =~ s/\+/ /g; $str; } # Make strings safe for form values sub html_safe { my ($str) = @_; $str =~ s/"/"/g; $str; } sub parse_query { my $QUERY_STRING; if ($ENV{REQUEST_METHOD} eq "POST") { read(STDIN,$QUERY_STRING,$ENV{CONTENT_LENGTH}); } else { $QUERY_STRING = $ENV{QUERY_STRING}; } chomp($QUERY_STRING); # $QUERY_STRING is of the form: "variable=value&var2=val2&.." my @querys=split(/[\&\?]/,$QUERY_STRING); my (%query,$var,$val); foreach my $str (@querys) { $var=$str if (!(($var,$val) = ($str =~ /([^=]*)=(.*)/))); $val=unhtml($val); $query{$var}=$val; } \%query; } sub check_form_page1 { my ($query) = @_; my @bad; $_ = $query->{first_name}; push(@bad,[first_name,""]) unless (/\S/); $_ = $query->{email}; push(@bad,[email,"email must be of form login\@somewhere.com"]) unless (/\S\@\S+\.\S+/); $_ = $query->{cost}; push(@bad,[cost,"cost must be a number"]) unless (/^\d+$/ && $_); push(@bad,[airport,"Must select one of the Airport: options"]) unless ($query->{airport}); $_ = $query->{airport}; push(@bad,[airport,""]) unless ($_ ne none || 0); $_ = $query->{airport}; push(@bad,[airport,"Mike lives in oak"]) unless ($_ ne oak || $query->{first_name} =~ /mike/); push(@bad,[fav_color,"Must select one of the Favorite color options"]) unless ($query->{fav_color}); $_ = $query->{fav_color}; push(@bad,[fav_color,"Only people named Mike like the color red"]) unless ($_ ne red || $query->{first_name} =~ /mike/); return unless @bad; print "

Error: fields are missing or invalid (marked in red)

\n"; my @bad_fields; foreach ( @bad ) { push(@bad_fields,$_->[0]); print "
  • $_->[1]\n" if ($_->[1]); } @bad_fields; } sub check_form_page2 { my ($query) = @_; my @bad; $_ = $query->{salary}; push(@bad,[salary,"Salary must be a number"]) unless (/^\d+$/ && $_); return unless @bad; print "

    Error: fields are missing or invalid (marked in red)

    \n"; my @bad_fields; foreach ( @bad ) { push(@bad_fields,$_->[0]); print "
  • $_->[1]\n" if ($_->[1]); } @bad_fields; } sub form_page1 { my ($query,@bad_fields) = @_; my %did_fields; print "
    \n"; print " \n"; $did_fields{form_number} = 1; print " \n"; print " \n"; print " \n"; $did_fields{first_name} = 1; print " \n"; if (grep(first_name eq $_, @bad_fields)) { print " \n"; } else { print " \n"; } print " \n"; print " \n"; $did_fields{email} = 1; print " \n"; if (grep(email eq $_, @bad_fields)) { print " \n"; } else { print " \n"; } print " \n"; print " \n"; $did_fields{cost} = 1; print " \n"; if (grep(cost eq $_, @bad_fields)) { print " \n"; } else { print " \n"; } print " \n"; print " \n"; $did_fields{airport} = 1; print " \n"; if (grep(airport eq $_, @bad_fields)) { print " \n"; } else { print " \n"; } print " \n"; $did_fields{fav_color} = 1; print " \n"; if (grep(fav_color eq $_, @bad_fields)) { print " \n"; } else { print " \n"; } print " \n"; print " \n"; print " \n"; print "
    First Name:First Name:{first_name}).'"'; print " size='25' maxsize='100'>
    Email:Email:{email}).'"'; print " size='25' maxsize='100'>
    Cost:Cost:{cost}).'"'; print " size='5' maxsize='10'>
    Airport:Airport:\n"; print "
    Favorite colorFavorite color\n"; print " {fav_color} eq "red"); print "> Red\n"; print " {fav_color} eq "green"); print "> Green\n"; print " {fav_color} eq "blue"); print "> Blue\n"; $did_fields{next} = 1; print "
    \n"; foreach my $k ( keys %$query ) { next if ($did_fields{$k}); print " {$k}).'"'; print ">\n"; } print "
    \n"; } sub form_page2 { my ($query,@bad_fields) = @_; my %did_fields; print "
    \n"; print " \n"; $did_fields{form_number} = 1; print " \n"; print " \n"; print " \n"; $did_fields{days} = 1; print " \n"; if (grep(days eq $_, @bad_fields)) { print " \n"; } else { print " \n"; } print " \n"; $did_fields{salary} = 1; print " \n"; if (grep(salary eq $_, @bad_fields)) { print " \n"; } else { print " \n"; } print " \n"; print " \n"; $did_fields{reg} = 1; print " \n"; print " \n"; print " \n"; print "
    Select daysSelect days\n"; print "
    Annual Salary: \$Annual Salary: \${salary}).'"'; print " size='5' maxsize='10'>
    \n"; foreach my $k ( keys %$query ) { next if ($did_fields{$k}); print " {$k}).'"'; print ">\n"; } print "
    \n"; } 1;