|
NAMECGI::Minimal - A lightweight CGI form processing packageSYNOPSIS# use CGI::Minimal qw(:no_subprocess_env); # use CGI::Minimal qw(:preload); use CGI::Minimal; my $cgi = CGI::Minimal->new; if ($cgi->truncated) { &scream_about_bad_form; exit; } my $form_field_value = $cgi->param('some_field_name'); DESCRIPTIONProvides a micro-weight alternative to the CGI.pm moduleRather than attempt to address every possible need of a CGI programmer, it provides the _minimum_ functions needed for CGI such as form decoding (including file upload forms), URL encoding and decoding, HTTP usable date generation (RFC1123 compliant dates) and basic escaping and unescaping of HTMLized text. The ':preload' use time option is used to force all sub-component modules to load at compile time. It is not required for operation. It is solely a performance optimization for particular configurations. When used, it preloads the 'dehtmlize',' param_mime', 'param_filename', 'date_rfc1123', 'url_decode', 'calling_parms_table' and parameter setting supporting code. Those code sections are normally loaded automatically the first time they are needed. The ':no_subprocess_env' use time option is used under ModPerl2 to suppress populating the %ENV hash with the usual CGI environmental variables. This is primarily a performance enhancement for some configurations. The form decoding interface is somewhat compatible with the CGI.pm module. No provision is made for generating HTTP or HTML on your behalf - you are expected to be conversant with how to put together any HTML or HTTP you need. The parser accepts either '&' or ';' as CGI form field seperators. IOW a=b;c=d a=b&c=d both will decode as a=b and c=d The module supports command line testing of scripts by letting you type a GET style argument followed by pressing the 'enter/return' key when the module is called to decode a form when running a script from the shell. Example: bash> ./myscript a=b&b=d<return> Alternatively, you can set the environment variable REQUEST_METHOD to 'GET' and set the environment variable QUERY_STRING to pass your CGI parameters. Example: bash> REQUEST_METHOD=GET QUERY_STRING='a=b' ./myscript Performance HintsIf you are using this module as part of a conventional standalone CGI specifically to get a speedup over using CGI.pm, don't 'use warnings', 'use vars' or 'use Carp' in your final production code.The problem with 'use vars' or 'use warnings' is that (unless you are using Perl 5.8.6 or later) they add on the order of 40 kilobytes of code to your load and you will feel the slowdown. Half of that is from the Carp module (which is used by both the 'vars' and 'warnings' modules.) So a well written script tuned for performance will start like this: #!/usr/bin/perl -Tw use strict; use CGI::Minimal; my $cgi = CGI::Minimal->new; The ':no_subprocess_env' option is available ("use CGI::Minimal qw (:no_subprocess_env);") to suppress population of the %ENV hash with the standard CGI environment values when running under ModPerl2. This improves performance slightly under ModPerl2, but does not affect anything when running as standard CGI or under ModPerl1. WARNING: Due to the 'singleton' pattern used by CGI::Minimal, the ":no_subprocess_env" option is persistent between scripts, if you use it in any script, it may affect any ModPerl2 script running on the same Apache instance that uses CGI::Minimal if they run after a script that does use ':no_subprocess_env'. This would manifest as the %ENV hash as being unexpectedly mostly empty in a script that didn't use ':no_subprocess_env'. The fix for this is to call the "CGI::Minimal::subprocess_env" class method in any script that requires the %ENV hash to be populated if it is sharing an Apache instance with scripts that use ':no_subprocess_env'. The ':preload' option is available in CGI::Minimal ("use CGI::Minimal qw (:preload);") to compile all sub-components of the module at initial load time. This will slowdown your script unless you are using one or more of the following methods: dehtmlize param_mime param_filename date_rfc1123 url_decode calling_parms_table or are using the 'param' method to 'set' values (ie. "$cgi->param({'fieldname' => $field_value });"). If you are using one of those methods, then it should provide a slight speedup when being used as a conventional CGI script - but NOT when being used via mod_perl. When invoked via mod_perl, :preload is already implied. The ultimate performance hint, of course, is use mod_perl (or another persistent execution environment). While you can reach around 66 or so invokations per second on an AMD XP2100+ processor running a simple script using CGI::Minimal, you can exceed 400 per second using mod_perl. Here are some performance numbers using an extremely simple script using CGI.pm, CGI::Lite, CGI::Deurl, cgi-lib.pl, CGI::Thin, CGI::Simple and CGI::Minimal to read a single passed parameter (a=b) and print it. Also included are a 'null' Perl script and a 'null' compiled C program which didn't actually read the passed cgi parameter but output the same results as if they had. Notably, mod_perl outperforms the compiled C program by quite a lot for this simple case. Note also that using the :preload option slowed the CGI::Minimal script down from 66 fetches/second to only 52 fetches/second when used in standard CGI mode. With 10 parallel fetches repeated as fast as possible for 30 seconds with and without mod_perl (if supported) the tests gave the following results (sorted by speed): CGI.pm (3.05) via standard CGI - 16 fetches per second CGI::Simple (0.075) via standard CGI - 20 fetches per second CGI::Deurl (1.08) via standard CGI - 36 fetches per second CGI::Thin (0.52) via standard CGI - 38 fetches per second CGI::Lite (2.02) via standard CGI - 52 fetches per second CGI::Minimal (1.16, :preload) via standard CGI - 52 fetches per second CGI::Minimal (1.16) via standard CGI - 66 fetches per second cgi-lib.pl (2.18) via standard CGI - 71 fetches per second null Perl script via standard CGI - 103 fetches per second null C program via standard CGI - 174 fetches per second CGI::Simple (0.075) via mod_perl - 381 fetches per second CGI.pm (3.05) via mod_perl - 386 fetches per second CGI::Minimal (1.16) via mod_perl - 417 fetches per second null Perl script via mod_perl - 500 fetches per second CHANGES1.30 13 Jun 2020 - Maintainer update. Relicenced under the MIT License. Small tweaks to build process. Added meta_merge info for GitHub. No functional changes. 1.29 21 Aug 2007 - Documentation fix to performance hints section. No functional changes. 1.28 18 Aug 2007 - Improved mod_perl2 handling (patch courtesy of Jeremy Nixon). Added a ':no_subprocess_env' flag to suppress populating the %ENV environment hash. Added a 'subprocess_env' static class method to allow smooth co-existance of ModPerl2 scripts that use ':no_subprocess_env' with ModPerl2 scripts that do not on the same server. 1.27 25 May 2007 - Added example of a command line 'wrapper' script and of using environment variables as an alternate way to test scripts via the command line. Added example for use with FastCGI. Changed behavior for unsupported HTTP methods. The module used to 'croak' for unsupported methods, it now 'carp's instead and treats as a 'GET' (change at suggestion of Roman Mahirov to better support FastCGI). 1.26 06 Apr 2007 - Added decoding of Javascript/EMCAScript style unicode escaped (%uxxxx form) parameter data (both to the main 'param' method and to the 'url_decode'/'url_encode' methods) at the suggestion of Michael Kröll (the core code for this additional functionality is derived from CGI.pm). Added support for ModPerl2. Fixed META.yml problems introduced with 1.25. Changed POD/POD Coverage tests to only execute if specifically requested Added examples directory and scripts 1.25 20 Apr 2006 - Added 'allow_hybrid_post_get' class method. Tweaked file permissions. Added regression tests for hybrid forms. 1.24 23 Sep 2005 - Added 'Carp' to install requirements. Extended build tests. Fixed multi-part form decoding bug in handling of degenerate MIME boundaries. Added fatal errors for mis-calling of param_mime and param_filename methods. 1.23 18 Sep 2005 - Made Test::More optional in build tests. No functional changes. 1.22 13 Sep 2005 - Changed POD tests to be more friendly to CPANTS. 1.21 11 Sep 2005 - Fixed pod coverage build test for compatibility with Perl 5.005. 1.20 11 Sep 2005 - Fixed issue that caused mod_perl to issue 'Use of uninitialized value.' warnings. Extended build tests. 1.19 10 Sep 2005 - Fixed POD Coverage build test error. 1.18 08 Sep 2005 - Tweaked prerequisite modules lists. Extended regresssion tests to cover more of the code. 1.17 04 Sep 2005 - More tweaks to regression tests to work around MS-Windows problems with binary file handles under Perl 5.6.1. Added 'Build.PL' support back in. Added POD tests. Minor documentation tweaks. No functional changes. 1.16 12 Nov 2004 - Added CGI::Simple to the benchmarks table. Tweaked regresssion tests for MS-Windows. Added 'delete' and 'delete_all' methods and regression tests. Added ':preload' flag for preloading all sub-components at module 'use' time. Fixed bug introduced with 1.15 in param value setting. 1.15 9 Nov 2004 - Added more regression tests. Tweaked url encoder to comply better with RFC2396. Tuned performance some more. Extended benchmarks table to cover more CGI form decoders. 1.14 16 Oct 2004 - Tuned module load time (about a 40% improvement) and added performance hints to the documentation. 1.13 28 Sep 2004 - Removed support for Module::Build from module install. 1.12 25 Sep 2004 - Tweaked the default form parser to accept ';' as a field seperator in addition to '&'. Change suggested by Peter Karman. Eliminated the explicit application/sgml-form-urlencoded support as redundant (it still works, it is just not explicitly different than application/x-www-form-urlencoded support anymore). Adjusted the multipart form parser to be more robust against malformed MIME boundaries and the build tests to work around a bug in Perl 5.8.0 UTF8ness and split. Added documentation of command line script testing behavior. Tightened up the code to reduce size (went from 14.9K to 11K). Removed the 'sgml_safe_mode' redirect code since there was no exposed interface to it anyway. Squashed a bug where the global buffer might fail to initialize correctly for 0 byte POST forms (only impacted use of the 'raw' method for POST use). Added regression test for form truncation Added LICENSE section to documentation Added Module::Build installation support 1.11 28 Sep 2003 - Tweaked test script to avoid warnings about opening STDIN filehandle for writing. No functional changes. 1.10 04 Apr 2003 - Added 'binmode STDIN' on module load to correct for windows defaulting to 7-bit filehandles. Fixed problem where split would fail on unusual MIME boundary strings. Problems noticed by Markus Wichitill. Deferred loading of 'Carp' unless actually needed. Small code cleanups. Removed big disclaimer from .pm and moved in pod to 'DISCLAIMERS' section Added tests 1.09 19 Mar 2002 - Exposed 'reset_globals' static method for support of non-mod_perl persistent perl execution environments. 1.08 26 Jul 2001 - Added 'raw' method for obtaining a dump of the raw input buffer data without any parsing. Moved documentation into seperate POD file. 1.07 01 Dec 2000 - Added capability of taking a GET style parameter string via STDIN if running at the command line. 1.06 10 Apr 2000 - 'Unfixed' use of 'quotemeta' for multipart boundaries. 'split' is doing the 'wrong thing' according to the specs... 1.05 03 Apr 2000 - Fixed breakage in 'param;' from 1.04 changes 1.04 03 Apr 2000 - Added capability to set params via the param() method like 'CGI.pm' plus general code cleanup 1.03 02 Mar 2000 - 'mod_perl' compatibility added 1.02 09 Jun 1999 - Initial public release. METHODS
STATIC METHODS
BUGSNone known.TODOTo be determined. ^_^AUTHORJerilyn Franz <cpan@jerilyn.info>VERSIONVersion 1.30 13 Jun 2020COPYRIGHTCopyright (c) Jerilyn Franz. All rights reserved.LICENSEThis module is licensed under the MIT LicenseCopyright 2020 Jerilyn Franz Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. See https://opensource.org/licenses/MIT DISCLAIMERTHIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.Use of this software in any way or in any form, source or binary, is not allowed in any country which prohibits disclaimers of any implied warranties of merchantability or fitness for a particular purpose or any disclaimers of a similar nature. IN NO EVENT SHALL I BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION (INCLUDING, BUT NOT LIMITED TO, LOST PROFITS) EVEN IF I HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE SEE ALSOCGI
Visit the GSP FreeBSD Man Page Interface. |