📄 cgi_lib.pl
字号:
# Perl Routines to Manipulate CGI input# S.E.Brenner@bioc.cam.ac.uk# $Header: /cys/people/brenner/http/cgi-bin/RCS/cgi-lib.pl,v 1.14 1995/10/25 15:08:37 brenner Exp $## Copyright (c) 1995 Steven E. Brenner # Unpublished work.# 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://www.bio.cam.ac.uk/web/form.html # http://www.seas.upenn.edu/~mengwong/forms/ # 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, and puts# one key=value in each member of the list "@in"# Also 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 documentsub 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 parametersub 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 pagesub HtmlBot{ return "</body>\n</html>\n"; }# MethGet# Return true if this cgi call was using the GET request, false otherwisesub MethGet { return ($ENV{'REQUEST_METHOD'} eq "GET");}# MethPost# Return true if this cgi call was using the POST request, false otherwisesub MethPost { return ($ENV{'REQUEST_METHOD'} eq "POST");}# MyURL# Returns a URL to the scriptsub 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 bodysub 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;}return 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -