I'm very pleased to announce the release of our new website and documentation using the new toolchain with Hugo and AsciiDoctor. To get more information about the new toolchain please read the FreeBSD Documentation Project Primer[1], Hugo docs[2] and AsciiDoctor docs[3]. Acknowledgment: Benedict Reuschling <bcr@> Glen Barber <gjb@> Hiroki Sato <hrs@> Li-Wen Hsu <lwhsu@> Sean Chittenden <seanc@> The FreeBSD Foundation [1] https://docs.FreeBSD.org/en/books/fdp-primer/ [2] https://gohugo.io/documentation/ [3] https://docs.asciidoctor.org/home/ Approved by: doceng, core
122 lines
4 KiB
C
122 lines
4 KiB
C
#!/usr/bin/perl -- -*- C -*-
|
|
# Perl Routines to Manipulate CGI input
|
|
# S.E.Brenner@bioc.cam.ac.uk
|
|
#
|
|
# Copyright 1994 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 and Dave Dittrich.
|
|
# 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.
|
|
#
|
|
# $FreeBSD$
|
|
#
|
|
|
|
sub ReadParse {
|
|
local (*in) = @_ if @_;
|
|
local ($i, $key, $val);
|
|
# Read in text
|
|
if (&MethGet) {
|
|
$in = $ENV{'QUERY_STRING'};
|
|
} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
|
|
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;
|
|
$key =~ tr/[^A-Za-z0-9\-\_\$\+\=\~\.\,]//; # allow only safe chars
|
|
$val =~ s/%(..)/pack("c",hex($1))/ge;
|
|
$val =~ tr/[^A-Za-z0-9\-\_\$\+\=\~\.\,]//; # allow only safe chars
|
|
# Associate key and value
|
|
$in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple separator
|
|
$in{$key} .= $val;
|
|
}
|
|
return length($in);
|
|
}
|
|
# PrintHeader
|
|
# Returns the magic line which tells WWW that we're an HTML document
|
|
sub PrintHeader {
|
|
return "Content-type: text/html\n\n";
|
|
}
|
|
# MethGet
|
|
# Return true if this cgi call was using the GET request, false otherwise
|
|
sub MethGet {
|
|
return ($ENV{'REQUEST_METHOD'} eq "GET");
|
|
}
|
|
# MyURL
|
|
# Returns a URL to the script
|
|
sub MyURL {
|
|
return '//' . $ENV{'SERVER_NAME'} . $ENV{'SCRIPT_NAME'};
|
|
}
|
|
# CgiError
|
|
# Prints out an error message 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";
|
|
}
|
|
# 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 .= "<DL COMPACT>";
|
|
foreach $key (sort keys(%in)) {
|
|
foreach (split("\0", $in{$key})) {
|
|
($out = $_) =~ s/\n/<BR>/gm;
|
|
$output .= "<DT><B>$key</B><DD><I>$out</I><BR>";
|
|
}
|
|
}
|
|
$output .= "</DL>";
|
|
#$* = $old;
|
|
return $output;
|
|
}
|
|
1;
|