Created
September 21, 2012 11:51
-
-
Save AbinashBishoyi/3761050 to your computer and use it in GitHub Desktop.
Perl Routines to Manipulate CGI input
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/local/bin/perl | |
# Perl Routines to Manipulate CGI input | |
# | |
# Copyright (c) 1995 Steven E. Brenner | |
# Permission granted to use and modify this library so long as the | |
# copyright above is maintained, modifications are documented, and | |
# credit is given for any use of the library. | |
# | |
# Thanks are due to many people for reporting bugs and suggestions | |
# especially Meng Weng Wong, Maki Watanabe, Bo Frese Rasmussen, | |
# Andrew Dalke, Mark-Jason Dominus, Dave Dittrich, Jason Mathews | |
# | |
# For more information, see: | |
# http://cgi-lib.berkeley.edu/ | |
# | |
# Minimalist http form and script (http://www.bio.cam.ac.uk/web/minimal.cgi): | |
# | |
# require "cgi-lib.pl"; | |
# if (&ReadParse(*input)) { | |
# print &PrintHeader, &PrintVariables(%input); | |
# } else { | |
# print &PrintHeader,'<form><input type="submit"> Data: <input name="myfield">'; | |
#} | |
# ReadParse | |
# Reads in GET or POST data, converts it to unescaped text, | |
# creates key/value pairs in %in, using '\0' to separate multiple | |
# selections | |
# Returns TRUE if there was input, FALSE if there was no input | |
# UNDEF may be used in the future to indicate some failure. | |
# Now that cgi scripts can be put in the normal file space, it is useful | |
# to combine both the form and the script in one place. If no parameters | |
# are given (i.e., ReadParse returns FALSE), then a form could be output. | |
# If a variable-glob parameter (e.g., *cgi_input) is passed to ReadParse, | |
# information is stored there, rather than in $in, @in, and %in. | |
sub ReadParse { | |
local (*in) = @_ if @_; | |
local ($i, $key, $val); | |
# Read in text | |
if (&MethGet) { | |
$in = $ENV{'QUERY_STRING'}; | |
} elsif (&MethPost) { | |
read(STDIN,$in,$ENV{'CONTENT_LENGTH'}); | |
} | |
@in = split(/[&;]/,$in); | |
foreach $i (0 .. $#in) { | |
# Convert plus's to spaces | |
$in[$i] =~ s/\+/ /g; | |
# Split into key and value. | |
($key, $val) = split(/=/,$in[$i],2); # splits on the first =. | |
# Convert %XX from hex numbers to alphanumeric | |
$key =~ s/%(..)/pack("c",hex($1))/ge; | |
$val =~ s/%(..)/pack("c",hex($1))/ge; | |
# Associate key and value | |
$in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple separator | |
$in{$key} .= $val; | |
} | |
return scalar(@in); | |
} | |
# PrintHeader | |
# Returns the magic line which tells WWW that we're an HTML document | |
sub PrintHeader { | |
return "Content-type: text/html\n\n"; | |
} | |
# HtmlTop | |
# Returns the <head> of a document and the beginning of the body | |
# with the title and a body <h1> header as specified by the parameter | |
sub HtmlTop | |
{ | |
local ($title) = @_; | |
return <<END_OF_TEXT; | |
<html> | |
<head> | |
<title>$title</title> | |
</head> | |
<body> | |
<h1>$title</h1> | |
END_OF_TEXT | |
} | |
# Html Bot | |
# Returns the </body>, </html> codes for the bottom of every HTML page | |
sub HtmlBot | |
{ | |
return "</body>\n</html>\n"; | |
} | |
# MethGet | |
# Return true if this cgi call was using the GET request, false otherwise | |
sub MethGet { | |
return ($ENV{'REQUEST_METHOD'} eq "GET"); | |
} | |
# MethPost | |
# Return true if this cgi call was using the POST request, false otherwise | |
sub MethPost { | |
return ($ENV{'REQUEST_METHOD'} eq "POST"); | |
} | |
# MyURL | |
# Returns a URL to the script | |
sub MyURL { | |
local ($port); | |
$port = ":" . $ENV{'SERVER_PORT'} if $ENV{'SERVER_PORT'} != 80; | |
return 'http://' . $ENV{'SERVER_NAME'} . $port . $ENV{'SCRIPT_NAME'}; | |
} | |
# CgiError | |
# Prints out an error message which which containes appropriate headers, | |
# markup, etcetera. | |
# Parameters: | |
# If no parameters, gives a generic error message | |
# Otherwise, the first parameter will be the title and the rest will | |
# be given as different paragraphs of the body | |
sub CgiError { | |
local (@msg) = @_; | |
local ($i,$name); | |
if (!@msg) { | |
$name = &MyURL; | |
@msg = ("Error: script $name encountered fatal error"); | |
}; | |
print &PrintHeader; | |
print "<html><head><title>$msg[0]</title></head>\n"; | |
print "<body><h1>$msg[0]</h1>\n"; | |
foreach $i (1 .. $#msg) { | |
print "<p>$msg[$i]</p>\n"; | |
} | |
print "</body></html>\n"; | |
} | |
# CgiDie | |
# Identical to CgiError, but also quits with the passed error message. | |
sub CgiDie { | |
local (@msg) = @_; | |
&CgiError (@msg); | |
die @msg; | |
} | |
# PrintVariables | |
# Nicely formats variables in an associative array passed as a parameter | |
# And returns the HTML string. | |
sub PrintVariables { | |
local (%in) = @_; | |
local ($old, $out, $output); | |
$old = $*; $* =1; | |
$output .= "\n<dl compact>\n"; | |
foreach $key (sort keys(%in)) { | |
foreach (split("\0", $in{$key})) { | |
($out = $_) =~ s/\n/<br>\n/g; | |
$output .= "<dt><b>$key</b>\n <dd><i>$out</i><br>\n"; | |
} | |
} | |
$output .= "</dl>\n"; | |
$* = $old; | |
return $output; | |
} | |
# PrintVariablesShort | |
# Now obsolete; just calls PrintVariables | |
sub PrintVariablesShort { | |
return &PrintVariables(@_); | |
} | |
1; #return true |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment