This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to CGI.pm-3.31. Includes version bump to CGI::Carp due to a Pod fix.
[perl5.git] / lib / CGI.pm
CommitLineData
54310121 1package CGI;
424ec8fa 2require 5.004;
ba056755 3use Carp 'croak';
54310121 4
5# See the bottom of this file for the POD documentation. Search for the
6# string '=head'.
7
8# You can run this file through either pod2man or pod2html to produce pretty
9# documentation in manual or html file format (these utilities are part of the
10# Perl 5 distribution).
11
424ec8fa 12# Copyright 1995-1998 Lincoln D. Stein. All rights reserved.
54310121 13# It may be used and modified freely, but I do request that this copyright
14# notice remain attached to the file. You may modify this module as you
15# wish, but if you redistribute a modified version, please attach a note
16# listing the modifications you have made.
17
18# The most recent version and complete docs are available at:
71f3e297 19# http://stein.cshl.org/WWW/software/CGI/
54310121 20
bb8b3399
SP
21$CGI::revision = '$Id: CGI.pm,v 1.240 2007/11/30 18:58:27 lstein Exp $';
22$CGI::VERSION='3.31';
54310121 23
24# HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES.
25# UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING.
ac734d8b 26# $CGITempFile::TMPDIRECTORY = '/usr/tmp';
2ed511ec 27use CGI::Util qw(rearrange make_attributes unescape escape expires ebcdic2ascii ascii2ebcdic);
54310121 28
3acbd4f5
JH
29#use constant XHTML_DTD => ['-//W3C//DTD XHTML Basic 1.0//EN',
30# 'http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd'];
31
32use constant XHTML_DTD => ['-//W3C//DTD XHTML 1.0 Transitional//EN',
33 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'];
6b4ac661 34
8f3ccfa2
JH
35{
36 local $^W = 0;
37 $TAINTED = substr("$0$^X",0,0);
38}
188ba755 39
8f3ccfa2 40$MOD_PERL = 0; # no mod_perl by default
13548fdf 41@SAVED_SYMBOLS = ();
8f3ccfa2 42
adb86593 43
424ec8fa
GS
44# >>>>> Here are some globals that you might want to adjust <<<<<<
45sub initialize_globals {
46 # Set this to 1 to enable copious autoloader debugging messages
47 $AUTOLOAD_DEBUG = 0;
2371fea9 48
6b4ac661
JH
49 # Set this to 1 to generate XTML-compatible output
50 $XHTML = 1;
424ec8fa
GS
51
52 # Change this to the preferred DTD to print in start_html()
53 # or use default_dtd('text of DTD to use');
3d1a2ec4
GS
54 $DEFAULT_DTD = [ '-//W3C//DTD HTML 4.01 Transitional//EN',
55 'http://www.w3.org/TR/html4/loose.dtd' ] ;
56
57 # Set this to 1 to enable NOSTICKY scripts
58 # or:
59 # 1) use CGI qw(-nosticky)
60 # 2) $CGI::nosticky(1)
61 $NOSTICKY = 0;
424ec8fa
GS
62
63 # Set this to 1 to enable NPH scripts
64 # or:
65 # 1) use CGI qw(-nph)
3d1a2ec4 66 # 2) CGI::nph(1)
424ec8fa
GS
67 # 3) print header(-nph=>1)
68 $NPH = 0;
69
3d1a2ec4
GS
70 # Set this to 1 to enable debugging from @ARGV
71 # Set to 2 to enable debugging from STDIN
72 $DEBUG = 1;
424ec8fa
GS
73
74 # Set this to 1 to make the temporary files created
75 # during file uploads safe from prying eyes
76 # or do...
77 # 1) use CGI qw(:private_tempfiles)
3d1a2ec4 78 # 2) CGI::private_tempfiles(1);
424ec8fa
GS
79 $PRIVATE_TEMPFILES = 0;
80
0a9bdad4
SP
81 # Set this to 1 to generate automatic tab indexes
82 $TABINDEX = 0;
83
8f3ccfa2
JH
84 # Set this to 1 to cause files uploaded in multipart documents
85 # to be closed, instead of caching the file handle
86 # or:
87 # 1) use CGI qw(:close_upload_files)
88 # 2) $CGI::close_upload_files(1);
89 # Uploads with many files run out of file handles.
90 # Also, for performance, since the file is already on disk,
91 # it can just be renamed, instead of read and written.
92 $CLOSE_UPLOAD_FILES = 0;
93
424ec8fa
GS
94 # Set this to a positive value to limit the size of a POSTing
95 # to a certain number of bytes:
96 $POST_MAX = -1;
97
98 # Change this to 1 to disable uploads entirely:
99 $DISABLE_UPLOADS = 0;
100
3538e1d5
GS
101 # Automatically determined -- don't change
102 $EBCDIC = 0;
103
71f3e297
JH
104 # Change this to 1 to suppress redundant HTTP headers
105 $HEADERS_ONCE = 0;
106
107 # separate the name=value pairs by semicolons rather than ampersands
3d1a2ec4 108 $USE_PARAM_SEMICOLONS = 1;
71f3e297 109
2371fea9
JH
110 # Do not include undefined params parsed from query string
111 # use CGI qw(-no_undef_params);
112 $NO_UNDEF_PARAMS = 0;
199d4a26 113
bb8b3399
SP
114 # return everything as utf-8
115 $PARAM_UTF8 = 0;
116
424ec8fa
GS
117 # Other globals that you shouldn't worry about.
118 undef $Q;
119 $BEEN_THERE = 0;
13548fdf 120 $DTD_PUBLIC_IDENTIFIER = "";
424ec8fa
GS
121 undef @QUERY_PARAM;
122 undef %EXPORT;
d45d855d
JH
123 undef $QUERY_CHARSET;
124 undef %QUERY_FIELDNAMES;
681699b9 125 undef %QUERY_TMPFILES;
424ec8fa
GS
126
127 # prevent complaints by mod_perl
128 1;
129}
130
54310121 131# ------------------ START OF THE LIBRARY ------------
132
13548fdf
RGS
133*end_form = \&endform;
134
424ec8fa
GS
135# make mod_perlhappy
136initialize_globals();
137
54310121 138# FIGURE OUT THE OS WE'RE RUNNING UNDER
139# Some systems support the $^O variable. If not
140# available then require() the Config library
141unless ($OS) {
142 unless ($OS = $^O) {
143 require Config;
144 $OS = $Config::Config{'osname'};
145 }
146}
ac1855b3 147if ($OS =~ /^MSWin/i) {
3538e1d5 148 $OS = 'WINDOWS';
ac1855b3 149} elsif ($OS =~ /^VMS/i) {
3538e1d5 150 $OS = 'VMS';
ac1855b3 151} elsif ($OS =~ /^dos/i) {
3538e1d5 152 $OS = 'DOS';
ac1855b3 153} elsif ($OS =~ /^MacOS/i) {
54310121 154 $OS = 'MACINTOSH';
ac1855b3 155} elsif ($OS =~ /^os2/i) {
54310121 156 $OS = 'OS2';
ac1855b3 157} elsif ($OS =~ /^epoc/i) {
fa6a1c44 158 $OS = 'EPOC';
188ba755
JH
159} elsif ($OS =~ /^cygwin/i) {
160 $OS = 'CYGWIN';
54310121 161} else {
162 $OS = 'UNIX';
163}
164
165# Some OS logic. Binary mode enabled on DOS, NT and VMS
188ba755 166$needs_binmode = $OS=~/^(WINDOWS|DOS|OS2|MSWin|CYGWIN)/;
54310121 167
168# This is the default class for the CGI object to use when all else fails.
169$DefaultClass = 'CGI' unless defined $CGI::DefaultClass;
424ec8fa 170
54310121 171# This is where to look for autoloaded routines.
172$AutoloadClass = $DefaultClass unless defined $CGI::AutoloadClass;
173
174# The path separator is a slash, backslash or semicolon, depending
175# on the paltform.
176$SL = {
8f3ccfa2
JH
177 UNIX => '/', OS2 => '\\', EPOC => '/', CYGWIN => '/',
178 WINDOWS => '\\', DOS => '\\', MACINTOSH => ':', VMS => '/'
54310121 179 }->{$OS};
180
424ec8fa 181# This no longer seems to be necessary
54310121 182# Turn on NPH scripts by default when running under IIS server!
424ec8fa
GS
183# $NPH++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/;
184$IIS++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/;
54310121 185
186# Turn on special checking for Doug MacEachern's modperl
8f3ccfa2 187if (exists $ENV{MOD_PERL}) {
8f3ccfa2
JH
188 # mod_perl handlers may run system() on scripts using CGI.pm;
189 # Make sure so we don't get fooled by inherited $ENV{MOD_PERL}
70194bd6 190 if (exists $ENV{MOD_PERL_API_VERSION} && $ENV{MOD_PERL_API_VERSION} == 2) {
741ff09d
RGS
191 $MOD_PERL = 2;
192 require Apache2::Response;
193 require Apache2::RequestRec;
194 require Apache2::RequestUtil;
70194bd6 195 require Apache2::RequestIO;
741ff09d
RGS
196 require APR::Pool;
197 } else {
198 $MOD_PERL = 1;
199 require Apache;
188ba755 200 }
8f3ccfa2 201}
188ba755 202
424ec8fa
GS
203# Turn on special checking for ActiveState's PerlEx
204$PERLEX++ if defined($ENV{'GATEWAY_INTERFACE'}) && $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-PerlEx/;
205
206# Define the CRLF sequence. I can't use a simple "\r\n" because the meaning
207# of "\n" is different on different OS's (sometimes it generates CRLF, sometimes LF
208# and sometimes CR). The most popular VMS web server
209# doesn't accept CRLF -- instead it wants a LR. EBCDIC machines don't
210# use ASCII, so \015\012 means something different. I find this all
211# really annoying.
212$EBCDIC = "\t" ne "\011";
213if ($OS eq 'VMS') {
3538e1d5 214 $CRLF = "\n";
424ec8fa 215} elsif ($EBCDIC) {
3538e1d5 216 $CRLF= "\r\n";
424ec8fa 217} else {
3538e1d5
GS
218 $CRLF = "\015\012";
219}
220
54310121 221if ($needs_binmode) {
2ed511ec
RGS
222 $CGI::DefaultClass->binmode(\*main::STDOUT);
223 $CGI::DefaultClass->binmode(\*main::STDIN);
224 $CGI::DefaultClass->binmode(\*main::STDERR);
54310121 225}
226
54310121 227%EXPORT_TAGS = (
424ec8fa
GS
228 ':html2'=>['h1'..'h6',qw/p br hr ol ul li dl dt dd menu code var strong em
229 tt u i b blockquote pre img a address cite samp dfn html head
230 base body Link nextid title meta kbd start_html end_html
3d1a2ec4 231 input Select option comment charset escapeHTML/],
71f3e297 232 ':html3'=>[qw/div table caption th td TR Tr sup Sub strike applet Param
1c87da1d 233 embed basefont style span layer ilayer font frameset frame script small big Area Map/],
3acbd4f5
JH
234 ':html4'=>[qw/abbr acronym bdo col colgroup del fieldset iframe
235 ins label legend noframes noscript object optgroup Q
236 thead tbody tfoot/],
424ec8fa
GS
237 ':netscape'=>[qw/blink fontsize center/],
238 ':form'=>[qw/textfield textarea filefield password_field hidden checkbox checkbox_group
239 submit reset defaults radio_group popup_menu button autoEscape
240 scrolling_list image_button start_form end_form startform endform
71f3e297 241 start_multipart_form end_multipart_form isindex tmpFileName uploadInfo URL_ENCODED MULTIPART/],
7dc108d1
SP
242 ':cgi'=>[qw/param upload path_info path_translated request_uri url self_url script_name
243 cookie Dump
3538e1d5 244 raw_cookie request_method query_string Accept user_agent remote_host content_type
2ed511ec
RGS
245 remote_addr referer server_name server_software server_port server_protocol virtual_port
246 virtual_host remote_ident auth_type http append
424ec8fa 247 save_parameters restore_parameters param_fetch
3538e1d5
GS
248 remote_user user_name header redirect import_names put
249 Delete Delete_all url_param cgi_error/],
424ec8fa 250 ':ssl' => [qw/https/],
3538e1d5 251 ':cgi-lib' => [qw/ReadParse PrintHeader HtmlTop HtmlBot SplitParam Vars/],
3acbd4f5
JH
252 ':html' => [qw/:html2 :html3 :html4 :netscape/],
253 ':standard' => [qw/:html2 :html3 :html4 :form :cgi/],
ba056755 254 ':push' => [qw/multipart_init multipart_start multipart_end multipart_final/],
3acbd4f5 255 ':all' => [qw/:html2 :html3 :netscape :form :cgi :internal :html4/]
424ec8fa 256 );
54310121 257
29ddc2a4
RGS
258# Custom 'can' method for both autoloaded and non-autoloaded subroutines.
259# Author: Cees Hek <cees@sitesuite.com.au>
260
261sub can {
262 my($class, $method) = @_;
263
264 # See if UNIVERSAL::can finds it.
265
266 if (my $func = $class -> SUPER::can($method) ){
267 return $func;
268 }
269
270 # Try to compile the function.
271
272 eval {
273 # _compile looks at $AUTOLOAD for the function name.
274
275 local $AUTOLOAD = join "::", $class, $method;
276 &_compile;
277 };
278
279 # Now that the function is loaded (if it exists)
280 # just use UNIVERSAL::can again to do the work.
281
282 return $class -> SUPER::can($method);
283}
284
54310121 285# to import symbols into caller
286sub import {
287 my $self = shift;
424ec8fa 288
188ba755 289 # This causes modules to clash.
b2d0d414
JH
290 undef %EXPORT_OK;
291 undef %EXPORT;
424ec8fa
GS
292
293 $self->_setup_symbols(@_);
54310121 294 my ($callpack, $callfile, $callline) = caller;
424ec8fa 295
54310121 296 # To allow overriding, search through the packages
297 # Till we find one in which the correct subroutine is defined.
298 my @packages = ($self,@{"$self\:\:ISA"});
299 foreach $sym (keys %EXPORT) {
300 my $pck;
301 my $def = ${"$self\:\:AutoloadClass"} || $DefaultClass;
302 foreach $pck (@packages) {
303 if (defined(&{"$pck\:\:$sym"})) {
304 $def = $pck;
305 last;
306 }
307 }
308 *{"${callpack}::$sym"} = \&{"$def\:\:$sym"};
309 }
310}
311
424ec8fa
GS
312sub compile {
313 my $pack = shift;
314 $pack->_setup_symbols('-compile',@_);
315}
316
54310121 317sub expand_tags {
318 my($tag) = @_;
71f3e297 319 return ("start_$1","end_$1") if $tag=~/^(?:\*|start_|end_)(.+)/;
54310121 320 my(@r);
321 return ($tag) unless $EXPORT_TAGS{$tag};
322 foreach (@{$EXPORT_TAGS{$tag}}) {
323 push(@r,&expand_tags($_));
324 }
325 return @r;
326}
327
328#### Method: new
329# The new routine. This will check the current environment
330# for an existing query string, and initialize itself, if so.
331####
332sub new {
8f3ccfa2
JH
333 my($class,@initializer) = @_;
334 my $self = {};
2ed511ec 335
8f3ccfa2 336 bless $self,ref $class || $class || $DefaultClass;
cb3b230c
SP
337
338 # always use a tempfile
339 $self->{'use_tempfile'} = 1;
340
8f3ccfa2
JH
341 if (ref($initializer[0])
342 && (UNIVERSAL::isa($initializer[0],'Apache')
343 ||
741ff09d 344 UNIVERSAL::isa($initializer[0],'Apache2::RequestRec')
8f3ccfa2
JH
345 )) {
346 $self->r(shift @initializer);
347 }
efc8e943
NC
348 if (ref($initializer[0])
349 && (UNIVERSAL::isa($initializer[0],'CODE'))) {
350 $self->upload_hook(shift @initializer, shift @initializer);
cb3b230c 351 $self->{'use_tempfile'} = shift @initializer if (@initializer > 0);
efc8e943 352 }
8f3ccfa2 353 if ($MOD_PERL) {
8f3ccfa2 354 if ($MOD_PERL == 1) {
741ff09d
RGS
355 $self->r(Apache->request) unless $self->r;
356 my $r = $self->r;
8f3ccfa2
JH
357 $r->register_cleanup(\&CGI::_reset_globals);
358 }
359 else {
360 # XXX: once we have the new API
361 # will do a real PerlOptions -SetupEnv check
741ff09d
RGS
362 $self->r(Apache2::RequestUtil->request) unless $self->r;
363 my $r = $self->r;
8f3ccfa2
JH
364 $r->subprocess_env unless exists $ENV{REQUEST_METHOD};
365 $r->pool->cleanup_register(\&CGI::_reset_globals);
424ec8fa 366 }
8f3ccfa2
JH
367 undef $NPH;
368 }
369 $self->_reset_globals if $PERLEX;
370 $self->init(@initializer);
371 return $self;
54310121 372}
373
2ed511ec
RGS
374# We provide a DESTROY method so that we can ensure that
375# temporary files are closed (via Fh->DESTROY) before they
376# are unlinked (via CGITempFile->DESTROY) because it is not
377# possible to unlink an open file on Win32. We explicitly
378# call DESTROY on each, rather than just undefing them and
379# letting Perl DESTROY them by garbage collection, in case the
380# user is still holding any reference to them as well.
381sub DESTROY {
382 my $self = shift;
0a9bdad4
SP
383 if ($OS eq 'WINDOWS') {
384 foreach my $href (values %{$self->{'.tmpfiles'}}) {
385 $href->{hndl}->DESTROY if defined $href->{hndl};
386 $href->{name}->DESTROY if defined $href->{name};
387 }
2ed511ec
RGS
388 }
389}
54310121 390
8f3ccfa2
JH
391sub r {
392 my $self = shift;
393 my $r = $self->{'.r'};
394 $self->{'.r'} = shift if @_;
395 $r;
396}
397
2ed511ec 398sub upload_hook {
0a9bdad4
SP
399 my $self;
400 if (ref $_[0] eq 'CODE') {
401 $CGI::Q = $self = $CGI::DefaultClass->new(@_);
402 } else {
403 $self = shift;
404 }
cb3b230c 405 my ($hook,$data,$use_tempfile) = @_;
2ed511ec
RGS
406 $self->{'.upload_hook'} = $hook;
407 $self->{'.upload_data'} = $data;
cb3b230c 408 $self->{'use_tempfile'} = $use_tempfile if defined $use_tempfile;
2ed511ec
RGS
409}
410
54310121 411#### Method: param
412# Returns the value(s)of a named parameter.
413# If invoked in a list context, returns the
414# entire list. Otherwise returns the first
415# member of the list.
416# If name is not provided, return a list of all
417# the known parameters names available.
418# If more than one argument is provided, the
419# second and subsequent arguments are used to
420# set the value of the parameter.
421####
422sub param {
423 my($self,@p) = self_or_default(@_);
424 return $self->all_parameters unless @p;
425 my($name,$value,@other);
426
427 # For compatibility between old calling style and use_named_parameters() style,
428 # we have to special case for a single parameter present.
429 if (@p > 1) {
3d1a2ec4 430 ($name,$value,@other) = rearrange([NAME,[DEFAULT,VALUE,VALUES]],@p);
54310121 431 my(@values);
432
3d1a2ec4 433 if (substr($p[0],0,1) eq '-') {
54310121 434 @values = defined($value) ? (ref($value) && ref($value) eq 'ARRAY' ? @{$value} : $value) : ();
435 } else {
436 foreach ($value,@other) {
437 push(@values,$_) if defined($_);
438 }
439 }
440 # If values is provided, then we set it.
fc786e8b 441 if (@values or defined $value) {
54310121 442 $self->add_parameter($name);
443 $self->{$name}=[@values];
444 }
445 } else {
446 $name = $p[0];
447 }
448
71f3e297 449 return unless defined($name) && $self->{$name};
fc786e8b 450
bb8b3399
SP
451 my @result = @{$self->{$name}};
452
453 if ($PARAM_UTF8) {
454 eval "require Encode; 1;" unless Encode->can('decode'); # bring in these functions
455 @result = map {ref $_ ? $_ : Encode::decode(utf8=>$_) } @result;
fc786e8b 456 }
bb8b3399
SP
457
458 return wantarray ? @result : $result[0];
54310121 459}
460
54310121 461sub self_or_default {
424ec8fa 462 return @_ if defined($_[0]) && (!ref($_[0])) &&($_[0] eq 'CGI');
54310121 463 unless (defined($_[0]) &&
424ec8fa
GS
464 (ref($_[0]) eq 'CGI' || UNIVERSAL::isa($_[0],'CGI')) # slightly optimized for common case
465 ) {
54310121 466 $Q = $CGI::DefaultClass->new unless defined($Q);
467 unshift(@_,$Q);
468 }
3d1a2ec4 469 return wantarray ? @_ : $Q;
54310121 470}
471
54310121 472sub self_or_CGI {
473 local $^W=0; # prevent a warning
474 if (defined($_[0]) &&
475 (substr(ref($_[0]),0,3) eq 'CGI'
424ec8fa 476 || UNIVERSAL::isa($_[0],'CGI'))) {
54310121 477 return @_;
478 } else {
479 return ($DefaultClass,@_);
480 }
481}
482
54310121 483########################################
484# THESE METHODS ARE MORE OR LESS PRIVATE
485# GO TO THE __DATA__ SECTION TO SEE MORE
486# PUBLIC METHODS
487########################################
488
489# Initialize the query object from the environment.
490# If a parameter list is found, this object will be set
491# to an associative array in which parameter names are keys
492# and the values are stored as lists
493# If a keyword list is found, this method creates a bogus
494# parameter list with the single parameter 'keywords'.
495
496sub init {
8f3ccfa2
JH
497 my $self = shift;
498 my($query_string,$meth,$content_length,$fh,@lines) = ('','','','');
499
8869a4b7
SP
500 my $is_xforms;
501
8f3ccfa2
JH
502 my $initializer = shift; # for backward compatibility
503 local($/) = "\n";
504
505 # set autoescaping on by default
506 $self->{'escape'} = 1;
54310121 507
508 # if we get called more than once, we want to initialize
509 # ourselves from the original query (which may be gone
510 # if it was read from STDIN originally.)
d45d855d 511 if (defined(@QUERY_PARAM) && !defined($initializer)) {
681699b9
SP
512 for my $name (@QUERY_PARAM) {
513 my $val = $QUERY_PARAM{$name}; # always an arrayref;
514 $self->param('-name'=>$name,'-value'=> $val);
515 if (defined $val and ref $val eq 'ARRAY') {
516 for my $fh (grep {defined(fileno($_))} @$val) {
517 seek($fh,0,0); # reset the filehandle.
518 }
519
520 }
521 }
522 $self->charset($QUERY_CHARSET);
523 $self->{'.fieldnames'} = {%QUERY_FIELDNAMES};
524 $self->{'.tmpfiles'} = {%QUERY_TMPFILES};
525 return;
54310121 526 }
527
528 $meth=$ENV{'REQUEST_METHOD'} if defined($ENV{'REQUEST_METHOD'});
424ec8fa 529 $content_length = defined($ENV{'CONTENT_LENGTH'}) ? $ENV{'CONTENT_LENGTH'} : 0;
3538e1d5 530
424ec8fa 531 $fh = to_filehandle($initializer) if $initializer;
54310121 532
a3b3a725
JH
533 # set charset to the safe ISO-8859-1
534 $self->charset('ISO-8859-1');
535
54310121 536 METHOD: {
54310121 537
3538e1d5
GS
538 # avoid unreasonably large postings
539 if (($POST_MAX > 0) && ($content_length > $POST_MAX)) {
fc786e8b
SP
540 #discard the post, unread
541 $self->cgi_error("413 Request entity too large");
542 last METHOD;
543 }
3538e1d5 544
424ec8fa
GS
545 # Process multipart postings, but only if the initializer is
546 # not defined.
547 if ($meth eq 'POST'
548 && defined($ENV{'CONTENT_TYPE'})
549 && $ENV{'CONTENT_TYPE'}=~m|^multipart/form-data|
550 && !defined($initializer)
551 ) {
71f3e297 552 my($boundary) = $ENV{'CONTENT_TYPE'} =~ /boundary=\"?([^\";,]+)\"?/;
424ec8fa
GS
553 $self->read_multipart($boundary,$content_length);
554 last METHOD;
555 }
556
8869a4b7
SP
557 # Process XForms postings. We know that we have XForms in the
558 # following cases:
559 # method eq 'POST' && content-type eq 'application/xml'
560 # method eq 'POST' && content-type =~ /multipart\/related.+start=/
561 # There are more cases, actually, but for now, we don't support other
562 # methods for XForm posts.
563 # In a XForm POST, the QUERY_STRING is parsed normally.
564 # If the content-type is 'application/xml', we just set the param
565 # XForms:Model (referring to the xml syntax) param containing the
566 # unparsed XML data.
567 # In the case of multipart/related we set XForms:Model as above, but
568 # the other parts are available as uploads with the Content-ID as the
569 # the key.
570 # See the URL below for XForms specs on this issue.
571 # http://www.w3.org/TR/2006/REC-xforms-20060314/slice11.html#submit-options
572 if ($meth eq 'POST' && defined($ENV{'CONTENT_TYPE'})) {
573 if ($ENV{'CONTENT_TYPE'} eq 'application/xml') {
574 my($param) = 'XForms:Model';
575 my($value) = '';
576 $self->add_parameter($param);
577 $self->read_from_client(\$value,$content_length,0)
578 if $content_length > 0;
579 push (@{$self->{$param}},$value);
580 $is_xforms = 1;
581 } elsif ($ENV{'CONTENT_TYPE'} =~ /multipart\/related.+boundary=\"?([^\";,]+)\"?.+start=\"?\<?([^\"\>]+)\>?\"?/) {
582 my($boundary,$start) = ($1,$2);
583 my($param) = 'XForms:Model';
584 $self->add_parameter($param);
585 my($value) = $self->read_multipart_related($start,$boundary,$content_length,0);
586 push (@{$self->{$param}},$value);
587 if ($MOD_PERL) {
588 $query_string = $self->r->args;
589 } else {
590 $query_string = $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
591 $query_string ||= $ENV{'REDIRECT_QUERY_STRING'} if defined $ENV{'REDIRECT_QUERY_STRING'};
592 }
593 $is_xforms = 1;
594 }
595 }
596
597
424ec8fa
GS
598 # If initializer is defined, then read parameters
599 # from it.
8869a4b7 600 if (!$is_xforms && defined($initializer)) {
424ec8fa
GS
601 if (UNIVERSAL::isa($initializer,'CGI')) {
602 $query_string = $initializer->query_string;
603 last METHOD;
604 }
54310121 605 if (ref($initializer) && ref($initializer) eq 'HASH') {
606 foreach (keys %$initializer) {
607 $self->param('-name'=>$_,'-value'=>$initializer->{$_});
608 }
609 last METHOD;
610 }
424ec8fa 611
2ed511ec
RGS
612 if (defined($fh) && ($fh ne '')) {
613 while (<$fh>) {
614 chomp;
615 last if /^=/;
616 push(@lines,$_);
617 }
618 # massage back into standard format
619 if ("@lines" =~ /=/) {
620 $query_string=join("&",@lines);
621 } else {
622 $query_string=join("+",@lines);
623 }
624 last METHOD;
625 }
626
424ec8fa
GS
627 # last chance -- treat it as a string
628 $initializer = $$initializer if ref($initializer) eq 'SCALAR';
54310121 629 $query_string = $initializer;
424ec8fa 630
54310121 631 last METHOD;
632 }
54310121 633
424ec8fa
GS
634 # If method is GET or HEAD, fetch the query from
635 # the environment.
8869a4b7 636 if ($is_xforms || $meth=~/^(GET|HEAD)$/) {
3538e1d5 637 if ($MOD_PERL) {
8f3ccfa2 638 $query_string = $self->r->args;
3538e1d5
GS
639 } else {
640 $query_string = $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
3d1a2ec4 641 $query_string ||= $ENV{'REDIRECT_QUERY_STRING'} if defined $ENV{'REDIRECT_QUERY_STRING'};
3538e1d5 642 }
424ec8fa
GS
643 last METHOD;
644 }
54310121 645
bb8b3399 646 if ($meth eq 'POST' || $meth eq 'PUT') {
2ed511ec 647 $self->read_from_client(\$query_string,$content_length,0)
424ec8fa 648 if $content_length > 0;
54310121 649 # Some people want to have their cake and eat it too!
650 # Uncomment this line to have the contents of the query string
651 # APPENDED to the POST data.
424ec8fa 652 # $query_string .= (length($query_string) ? '&' : '') . $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
54310121 653 last METHOD;
654 }
424ec8fa
GS
655
656 # If $meth is not of GET, POST or HEAD, assume we're being debugged offline.
54310121 657 # Check the command line and then the standard input for data.
658 # We use the shellwords package in order to behave the way that
659 # UN*X programmers expect.
2ed511ec
RGS
660 if ($DEBUG)
661 {
662 my $cmdline_ret = read_from_cmdline();
663 $query_string = $cmdline_ret->{'query_string'};
664 if (defined($cmdline_ret->{'subpath'}))
665 {
666 $self->path_info($cmdline_ret->{'subpath'});
667 }
668 }
54310121 669 }
424ec8fa 670
8f3ccfa2 671# YL: Begin Change for XML handler 10/19/2001
bb8b3399 672 if (!$is_xforms && ($meth eq 'POST' || $meth eq 'PUT')
8f3ccfa2 673 && defined($ENV{'CONTENT_TYPE'})
1c87da1d
JH
674 && $ENV{'CONTENT_TYPE'} !~ m|^application/x-www-form-urlencoded|
675 && $ENV{'CONTENT_TYPE'} !~ m|^multipart/form-data| ) {
bb8b3399 676 my($param) = $meth . 'DATA' ;
8f3ccfa2
JH
677 $self->add_parameter($param) ;
678 push (@{$self->{$param}},$query_string);
679 undef $query_string ;
680 }
681# YL: End Change for XML handler 10/19/2001
682
54310121 683 # We now have the query string in hand. We do slightly
684 # different things for keyword lists and parameter lists.
ba056755 685 if (defined $query_string && length $query_string) {
3d1a2ec4 686 if ($query_string =~ /[&=;]/) {
54310121 687 $self->parse_params($query_string);
688 } else {
689 $self->add_parameter('keywords');
690 $self->{'keywords'} = [$self->parse_keywordlist($query_string)];
691 }
692 }
693
694 # Special case. Erase everything if there is a field named
695 # .defaults.
696 if ($self->param('.defaults')) {
e70cb7eb 697 $self->delete_all();
54310121 698 }
699
700 # Associative array containing our defined fieldnames
701 $self->{'.fieldnames'} = {};
702 foreach ($self->param('.cgifields')) {
703 $self->{'.fieldnames'}->{$_}++;
704 }
705
706 # Clear out our default submission button flag if present
707 $self->delete('.submit');
708 $self->delete('.cgifields');
3d1a2ec4 709
8f3ccfa2 710 $self->save_request unless defined $initializer;
54310121 711}
712
54310121 713# FUNCTIONS TO OVERRIDE:
54310121 714# Turn a string into a filehandle
715sub to_filehandle {
424ec8fa
GS
716 my $thingy = shift;
717 return undef unless $thingy;
718 return $thingy if UNIVERSAL::isa($thingy,'GLOB');
719 return $thingy if UNIVERSAL::isa($thingy,'FileHandle');
720 if (!ref($thingy)) {
721 my $caller = 1;
722 while (my $package = caller($caller++)) {
723 my($tmp) = $thingy=~/[\':]/ ? $thingy : "$package\:\:$thingy";
724 return $tmp if defined(fileno($tmp));
725 }
54310121 726 }
424ec8fa 727 return undef;
54310121 728}
729
730# send output to the browser
731sub put {
732 my($self,@p) = self_or_default(@_);
733 $self->print(@p);
734}
735
736# print to standard output (for overriding in mod_perl)
737sub print {
738 shift;
739 CORE::print(@_);
740}
741
3538e1d5
GS
742# get/set last cgi_error
743sub cgi_error {
744 my ($self,$err) = self_or_default(@_);
745 $self->{'.cgi_error'} = $err if defined $err;
746 return $self->{'.cgi_error'};
747}
748
54310121 749sub save_request {
750 my($self) = @_;
751 # We're going to play with the package globals now so that if we get called
752 # again, we initialize ourselves in exactly the same way. This allows
753 # us to have several of these objects.
754 @QUERY_PARAM = $self->param; # save list of parameters
755 foreach (@QUERY_PARAM) {
3d1a2ec4
GS
756 next unless defined $_;
757 $QUERY_PARAM{$_}=$self->{$_};
54310121 758 }
d45d855d
JH
759 $QUERY_CHARSET = $self->charset;
760 %QUERY_FIELDNAMES = %{$self->{'.fieldnames'}};
681699b9 761 %QUERY_TMPFILES = %{ $self->{'.tmpfiles'} || {} };
54310121 762}
763
54310121 764sub parse_params {
765 my($self,$tosplit) = @_;
71f3e297 766 my(@pairs) = split(/[&;]/,$tosplit);
54310121 767 my($param,$value);
768 foreach (@pairs) {
424ec8fa 769 ($param,$value) = split('=',$_,2);
b2d0d414 770 next unless defined $param;
69c89ae7 771 next if $NO_UNDEF_PARAMS and not defined $value;
3d1a2ec4 772 $value = '' unless defined $value;
424ec8fa
GS
773 $param = unescape($param);
774 $value = unescape($value);
54310121 775 $self->add_parameter($param);
776 push (@{$self->{$param}},$value);
777 }
778}
779
780sub add_parameter {
781 my($self,$param)=@_;
3d1a2ec4 782 return unless defined $param;
54310121 783 push (@{$self->{'.parameters'}},$param)
784 unless defined($self->{$param});
785}
786
787sub all_parameters {
788 my $self = shift;
789 return () unless defined($self) && $self->{'.parameters'};
790 return () unless @{$self->{'.parameters'}};
791 return @{$self->{'.parameters'}};
792}
793
424ec8fa
GS
794# put a filehandle into binary mode (DOS)
795sub binmode {
2ed511ec 796 return unless defined($_[1]) && defined fileno($_[1]);
424ec8fa
GS
797 CORE::binmode($_[1]);
798}
799
800sub _make_tag_func {
71f3e297 801 my ($self,$tagname) = @_;
3538e1d5 802 my $func = qq(
3d1a2ec4 803 sub $tagname {
8f3ccfa2
JH
804 my (\$q,\$a,\@rest) = self_or_default(\@_);
805 my(\$attr) = '';
806 if (ref(\$a) && ref(\$a) eq 'HASH') {
807 my(\@attr) = make_attributes(\$a,\$q->{'escape'});
808 \$attr = " \@attr" if \@attr;
809 } else {
1c87da1d 810 unshift \@rest,\$a if defined \$a;
8f3ccfa2 811 }
3538e1d5 812 );
71f3e297 813 if ($tagname=~/start_(\w+)/i) {
6b4ac661 814 $func .= qq! return "<\L$1\E\$attr>";} !;
71f3e297 815 } elsif ($tagname=~/end_(\w+)/i) {
6b4ac661 816 $func .= qq! return "<\L/$1\E>"; } !;
71f3e297
JH
817 } else {
818 $func .= qq#
1c87da1d 819 return \$XHTML ? "\L<$tagname\E\$attr />" : "\L<$tagname\E\$attr>" unless \@rest;
6b4ac661 820 my(\$tag,\$untag) = ("\L<$tagname\E\$attr>","\L</$tagname>\E");
3d1a2ec4 821 my \@result = map { "\$tag\$_\$untag" }
8f3ccfa2 822 (ref(\$rest[0]) eq 'ARRAY') ? \@{\$rest[0]} : "\@rest";
424ec8fa 823 return "\@result";
71f3e297
JH
824 }#;
825 }
826return $func;
54310121 827}
828
829sub AUTOLOAD {
830 print STDERR "CGI::AUTOLOAD for $AUTOLOAD\n" if $CGI::AUTOLOAD_DEBUG;
424ec8fa
GS
831 my $func = &_compile;
832 goto &$func;
54310121 833}
834
424ec8fa
GS
835sub _compile {
836 my($func) = $AUTOLOAD;
837 my($pack,$func_name);
838 {
839 local($1,$2); # this fixes an obscure variable suicide problem.
840 $func=~/(.+)::([^:]+)$/;
841 ($pack,$func_name) = ($1,$2);
842 $pack=~s/::SUPER$//; # fix another obscure problem
843 $pack = ${"$pack\:\:AutoloadClass"} || $CGI::DefaultClass
844 unless defined(${"$pack\:\:AUTOLOADED_ROUTINES"});
845
846 my($sub) = \%{"$pack\:\:SUBS"};
847 unless (%$sub) {
848 my($auto) = \${"$pack\:\:AUTOLOADED_ROUTINES"};
29ddc2a4 849 local ($@,$!);
424ec8fa 850 eval "package $pack; $$auto";
ba056755 851 croak("$AUTOLOAD: $@") if $@;
424ec8fa
GS
852 $$auto = ''; # Free the unneeded storage (but don't undef it!!!)
853 }
854 my($code) = $sub->{$func_name};
855
856 $code = "sub $AUTOLOAD { }" if (!$code and $func_name eq 'DESTROY');
857 if (!$code) {
71f3e297 858 (my $base = $func_name) =~ s/^(start_|end_)//i;
424ec8fa
GS
859 if ($EXPORT{':any'} ||
860 $EXPORT{'-any'} ||
71f3e297 861 $EXPORT{$base} ||
424ec8fa 862 (%EXPORT_OK || grep(++$EXPORT_OK{$_},&expand_tags(':html')))
71f3e297
JH
863 && $EXPORT_OK{$base}) {
864 $code = $CGI::DefaultClass->_make_tag_func($func_name);
424ec8fa
GS
865 }
866 }
ba056755 867 croak("Undefined subroutine $AUTOLOAD\n") unless $code;
29ddc2a4 868 local ($@,$!);
424ec8fa
GS
869 eval "package $pack; $code";
870 if ($@) {
871 $@ =~ s/ at .*\n//;
ba056755 872 croak("$AUTOLOAD: $@");
424ec8fa
GS
873 }
874 }
3538e1d5 875 CORE::delete($sub->{$func_name}); #free storage
424ec8fa
GS
876 return "$pack\:\:$func_name";
877}
878
3acbd4f5
JH
879sub _selected {
880 my $self = shift;
881 my $value = shift;
882 return '' unless $value;
0a9bdad4 883 return $XHTML ? qq(selected="selected" ) : qq(selected );
3acbd4f5
JH
884}
885
886sub _checked {
887 my $self = shift;
888 my $value = shift;
889 return '' unless $value;
0a9bdad4 890 return $XHTML ? qq(checked="checked" ) : qq(checked );
3acbd4f5
JH
891}
892
424ec8fa
GS
893sub _reset_globals { initialize_globals(); }
894
895sub _setup_symbols {
896 my $self = shift;
897 my $compile = 0;
b2d0d414
JH
898
899 # to avoid reexporting unwanted variables
900 undef %EXPORT;
901
424ec8fa 902 foreach (@_) {
71f3e297
JH
903 $HEADERS_ONCE++, next if /^[:-]unique_headers$/;
904 $NPH++, next if /^[:-]nph$/;
3d1a2ec4
GS
905 $NOSTICKY++, next if /^[:-]nosticky$/;
906 $DEBUG=0, next if /^[:-]no_?[Dd]ebug$/;
907 $DEBUG=2, next if /^[:-][Dd]ebug$/;
71f3e297 908 $USE_PARAM_SEMICOLONS++, next if /^[:-]newstyle_urls$/;
bb8b3399 909 $PARAM_UTF8++, next if /^[:-]utf8$/;
6b4ac661
JH
910 $XHTML++, next if /^[:-]xhtml$/;
911 $XHTML=0, next if /^[:-]no_?xhtml$/;
3d1a2ec4 912 $USE_PARAM_SEMICOLONS=0, next if /^[:-]oldstyle_urls$/;
71f3e297 913 $PRIVATE_TEMPFILES++, next if /^[:-]private_tempfiles$/;
0a9bdad4 914 $TABINDEX++, next if /^[:-]tabindex$/;
13548fdf 915 $CLOSE_UPLOAD_FILES++, next if /^[:-]close_upload_files$/;
71f3e297
JH
916 $EXPORT{$_}++, next if /^[:-]any$/;
917 $compile++, next if /^[:-]compile$/;
199d4a26 918 $NO_UNDEF_PARAMS++, next if /^[:-]no_undef_params$/;
424ec8fa 919
71f3e297 920 # This is probably extremely evil code -- to be deleted some day.
424ec8fa
GS
921 if (/^[-]autoload$/) {
922 my($pkg) = caller(1);
923 *{"${pkg}::AUTOLOAD"} = sub {
924 my($routine) = $AUTOLOAD;
925 $routine =~ s/^.*::/CGI::/;
926 &$routine;
927 };
928 next;
929 }
930
931 foreach (&expand_tags($_)) {
932 tr/a-zA-Z0-9_//cd; # don't allow weird function names
933 $EXPORT{$_}++;
54310121 934 }
54310121 935 }
424ec8fa 936 _compile_all(keys %EXPORT) if $compile;
188ba755 937 @SAVED_SYMBOLS = @_;
54310121 938}
939
3d1a2ec4
GS
940sub charset {
941 my ($self,$charset) = self_or_default(@_);
942 $self->{'.charset'} = $charset if defined $charset;
943 $self->{'.charset'};
944}
945
29ddc2a4
RGS
946sub element_id {
947 my ($self,$new_value) = self_or_default(@_);
948 $self->{'.elid'} = $new_value if defined $new_value;
949 sprintf('%010d',$self->{'.elid'}++);
950}
951
952sub element_tab {
953 my ($self,$new_value) = self_or_default(@_);
70194bd6 954 $self->{'.etab'} ||= 1;
29ddc2a4 955 $self->{'.etab'} = $new_value if defined $new_value;
0a9bdad4
SP
956 my $tab = $self->{'.etab'}++;
957 return '' unless $TABINDEX or defined $new_value;
958 return qq(tabindex="$tab" );
29ddc2a4
RGS
959}
960
54310121 961###############################################################################
962################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND ####################
963###############################################################################
964$AUTOLOADED_ROUTINES = ''; # get rid of -w warning
965$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
966
967%SUBS = (
968
969'URL_ENCODED'=> <<'END_OF_FUNC',
970sub URL_ENCODED { 'application/x-www-form-urlencoded'; }
971END_OF_FUNC
972
973'MULTIPART' => <<'END_OF_FUNC',
974sub MULTIPART { 'multipart/form-data'; }
975END_OF_FUNC
976
424ec8fa 977'SERVER_PUSH' => <<'END_OF_FUNC',
ba056755 978sub SERVER_PUSH { 'multipart/x-mixed-replace;boundary="' . shift() . '"'; }
424ec8fa
GS
979END_OF_FUNC
980
424ec8fa
GS
981'new_MultipartBuffer' => <<'END_OF_FUNC',
982# Create a new multipart buffer
983sub new_MultipartBuffer {
2ed511ec
RGS
984 my($self,$boundary,$length) = @_;
985 return MultipartBuffer->new($self,$boundary,$length);
424ec8fa
GS
986}
987END_OF_FUNC
988
989'read_from_client' => <<'END_OF_FUNC',
990# Read data from a file handle
991sub read_from_client {
2ed511ec 992 my($self, $buff, $len, $offset) = @_;
424ec8fa 993 local $^W=0; # prevent a warning
2ed511ec
RGS
994 return $MOD_PERL
995 ? $self->r->read($$buff, $len, $offset)
996 : read(\*STDIN, $$buff, $len, $offset);
424ec8fa
GS
997}
998END_OF_FUNC
999
1000'delete' => <<'END_OF_FUNC',
1001#### Method: delete
1002# Deletes the named parameter entirely.
1003####
1004sub delete {
6b4ac661 1005 my($self,@p) = self_or_default(@_);
1c87da1d
JH
1006 my(@names) = rearrange([NAME],@p);
1007 my @to_delete = ref($names[0]) eq 'ARRAY' ? @$names[0] : @names;
8f3ccfa2
JH
1008 my %to_delete;
1009 foreach my $name (@to_delete)
1010 {
1011 CORE::delete $self->{$name};
1012 CORE::delete $self->{'.fieldnames'}->{$name};
1013 $to_delete{$name}++;
188ba755 1014 }
8f3ccfa2 1015 @{$self->{'.parameters'}}=grep { !exists($to_delete{$_}) } $self->param();
13548fdf 1016 return;
424ec8fa
GS
1017}
1018END_OF_FUNC
1019
1020#### Method: import_names
1021# Import all parameters into the given namespace.
1022# Assumes namespace 'Q' if not specified
1023####
1024'import_names' => <<'END_OF_FUNC',
1025sub import_names {
1026 my($self,$namespace,$delete) = self_or_default(@_);
1027 $namespace = 'Q' unless defined($namespace);
1028 die "Can't import names into \"main\"\n" if \%{"${namespace}::"} == \%::;
3538e1d5 1029 if ($delete || $MOD_PERL || exists $ENV{'FCGI_ROLE'}) {
424ec8fa
GS
1030 # can anyone find an easier way to do this?
1031 foreach (keys %{"${namespace}::"}) {
1032 local *symbol = "${namespace}::${_}";
1033 undef $symbol;
1034 undef @symbol;
1035 undef %symbol;
54310121 1036 }
424ec8fa
GS
1037 }
1038 my($param,@value,$var);
1039 foreach $param ($self->param) {
1040 # protect against silly names
1041 ($var = $param)=~tr/a-zA-Z0-9_/_/c;
1042 $var =~ s/^(?=\d)/_/;
1043 local *symbol = "${namespace}::$var";
1044 @value = $self->param($param);
1045 @symbol = @value;
1046 $symbol = $value[0];
54310121 1047 }
1048}
1049END_OF_FUNC
1050
1051#### Method: keywords
1052# Keywords acts a bit differently. Calling it in a list context
1053# returns the list of keywords.
1054# Calling it in a scalar context gives you the size of the list.
1055####
1056'keywords' => <<'END_OF_FUNC',
1057sub keywords {
1058 my($self,@values) = self_or_default(@_);
1059 # If values is provided, then we set it.
475342a6 1060 $self->{'keywords'}=[@values] if @values;
424ec8fa 1061 my(@result) = defined($self->{'keywords'}) ? @{$self->{'keywords'}} : ();
54310121 1062 @result;
1063}
1064END_OF_FUNC
1065
1066# These are some tie() interfaces for compatibility
1067# with Steve Brenner's cgi-lib.pl routines
3538e1d5
GS
1068'Vars' => <<'END_OF_FUNC',
1069sub Vars {
ffd2dff2 1070 my $q = shift;
3538e1d5 1071 my %in;
ffd2dff2 1072 tie(%in,CGI,$q);
3538e1d5
GS
1073 return %in if wantarray;
1074 return \%in;
1075}
1076END_OF_FUNC
1077
1078# These are some tie() interfaces for compatibility
1079# with Steve Brenner's cgi-lib.pl routines
54310121 1080'ReadParse' => <<'END_OF_FUNC',
1081sub ReadParse {
1082 local(*in);
1083 if (@_) {
1084 *in = $_[0];
1085 } else {
1086 my $pkg = caller();
1087 *in=*{"${pkg}::in"};
1088 }
1089 tie(%in,CGI);
424ec8fa 1090 return scalar(keys %in);
54310121 1091}
1092END_OF_FUNC
1093
1094'PrintHeader' => <<'END_OF_FUNC',
1095sub PrintHeader {
1096 my($self) = self_or_default(@_);
1097 return $self->header();
1098}
1099END_OF_FUNC
1100
1101'HtmlTop' => <<'END_OF_FUNC',
1102sub HtmlTop {
1103 my($self,@p) = self_or_default(@_);
1104 return $self->start_html(@p);
1105}
1106END_OF_FUNC
1107
1108'HtmlBot' => <<'END_OF_FUNC',
1109sub HtmlBot {
1110 my($self,@p) = self_or_default(@_);
1111 return $self->end_html(@p);
1112}
1113END_OF_FUNC
1114
1115'SplitParam' => <<'END_OF_FUNC',
1116sub SplitParam {
1117 my ($param) = @_;
1118 my (@params) = split ("\0", $param);
1119 return (wantarray ? @params : $params[0]);
1120}
1121END_OF_FUNC
1122
1123'MethGet' => <<'END_OF_FUNC',
1124sub MethGet {
1125 return request_method() eq 'GET';
1126}
1127END_OF_FUNC
1128
1129'MethPost' => <<'END_OF_FUNC',
1130sub MethPost {
1131 return request_method() eq 'POST';
1132}
1133END_OF_FUNC
1134
1135'TIEHASH' => <<'END_OF_FUNC',
8f3ccfa2
JH
1136sub TIEHASH {
1137 my $class = shift;
1138 my $arg = $_[0];
1139 if (ref($arg) && UNIVERSAL::isa($arg,'CGI')) {
1140 return $arg;
1141 }
1142 return $Q ||= $class->new(@_);
54310121 1143}
1144END_OF_FUNC
1145
1146'STORE' => <<'END_OF_FUNC',
1147sub STORE {
3d1a2ec4
GS
1148 my $self = shift;
1149 my $tag = shift;
6b4ac661
JH
1150 my $vals = shift;
1151 my @vals = index($vals,"\0")!=-1 ? split("\0",$vals) : $vals;
3d1a2ec4 1152 $self->param(-name=>$tag,-value=>\@vals);
54310121 1153}
1154END_OF_FUNC
1155
1156'FETCH' => <<'END_OF_FUNC',
1157sub FETCH {
1158 return $_[0] if $_[1] eq 'CGI';
1159 return undef unless defined $_[0]->param($_[1]);
1160 return join("\0",$_[0]->param($_[1]));
1161}
1162END_OF_FUNC
1163
1164'FIRSTKEY' => <<'END_OF_FUNC',
1165sub FIRSTKEY {
1166 $_[0]->{'.iterator'}=0;
1167 $_[0]->{'.parameters'}->[$_[0]->{'.iterator'}++];
1168}
1169END_OF_FUNC
1170
1171'NEXTKEY' => <<'END_OF_FUNC',
1172sub NEXTKEY {
1173 $_[0]->{'.parameters'}->[$_[0]->{'.iterator'}++];
1174}
1175END_OF_FUNC
1176
1177'EXISTS' => <<'END_OF_FUNC',
1178sub EXISTS {
1179 exists $_[0]->{$_[1]};
1180}
1181END_OF_FUNC
1182
1183'DELETE' => <<'END_OF_FUNC',
1184sub DELETE {
1185 $_[0]->delete($_[1]);
1186}
1187END_OF_FUNC
1188
1189'CLEAR' => <<'END_OF_FUNC',
1190sub CLEAR {
1191 %{$_[0]}=();
1192}
1193####
1194END_OF_FUNC
1195
1196####
1197# Append a new value to an existing query
1198####
1199'append' => <<'EOF',
1200sub append {
7dc108d1 1201 my($self,@p) = self_or_default(@_);
3d1a2ec4 1202 my($name,$value) = rearrange([NAME,[VALUE,VALUES]],@p);
54310121 1203 my(@values) = defined($value) ? (ref($value) ? @{$value} : $value) : ();
1204 if (@values) {
1205 $self->add_parameter($name);
1206 push(@{$self->{$name}},@values);
1207 }
1208 return $self->param($name);
1209}
1210EOF
1211
1212#### Method: delete_all
1213# Delete all parameters
1214####
1215'delete_all' => <<'EOF',
1216sub delete_all {
1217 my($self) = self_or_default(@_);
1c87da1d 1218 my @param = $self->param();
8f3ccfa2 1219 $self->delete(@param);
54310121 1220}
1221EOF
1222
424ec8fa
GS
1223'Delete' => <<'EOF',
1224sub Delete {
1225 my($self,@p) = self_or_default(@_);
1226 $self->delete(@p);
1227}
1228EOF
1229
1230'Delete_all' => <<'EOF',
1231sub Delete_all {
1232 my($self,@p) = self_or_default(@_);
1233 $self->delete_all(@p);
1234}
1235EOF
1236
54310121 1237#### Method: autoescape
1238# If you want to turn off the autoescaping features,
1239# call this method with undef as the argument
1240'autoEscape' => <<'END_OF_FUNC',
1241sub autoEscape {
1242 my($self,$escape) = self_or_default(@_);
188ba755
JH
1243 my $d = $self->{'escape'};
1244 $self->{'escape'} = $escape;
1245 $d;
54310121 1246}
1247END_OF_FUNC
1248
1249
1250#### Method: version
1251# Return the current version
1252####
1253'version' => <<'END_OF_FUNC',
1254sub version {
1255 return $VERSION;
1256}
1257END_OF_FUNC
1258
424ec8fa
GS
1259#### Method: url_param
1260# Return a parameter in the QUERY_STRING, regardless of
1261# whether this was a POST or a GET
1262####
1263'url_param' => <<'END_OF_FUNC',
1264sub url_param {
1265 my ($self,@p) = self_or_default(@_);
1266 my $name = shift(@p);
1267 return undef unless exists($ENV{QUERY_STRING});
1268 unless (exists($self->{'.url_param'})) {
1269 $self->{'.url_param'}={}; # empty hash
1270 if ($ENV{QUERY_STRING} =~ /=/) {
71f3e297 1271 my(@pairs) = split(/[&;]/,$ENV{QUERY_STRING});
424ec8fa
GS
1272 my($param,$value);
1273 foreach (@pairs) {
1274 ($param,$value) = split('=',$_,2);
1275 $param = unescape($param);
1276 $value = unescape($value);
1277 push(@{$self->{'.url_param'}->{$param}},$value);
1278 }
1279 } else {
1280 $self->{'.url_param'}->{'keywords'} = [$self->parse_keywordlist($ENV{QUERY_STRING})];
1281 }
1282 }
1283 return keys %{$self->{'.url_param'}} unless defined($name);
1284 return () unless $self->{'.url_param'}->{$name};
1285 return wantarray ? @{$self->{'.url_param'}->{$name}}
1286 : $self->{'.url_param'}->{$name}->[0];
1287}
1288END_OF_FUNC
1289
3d1a2ec4 1290#### Method: Dump
54310121 1291# Returns a string in which all the known parameter/value
1292# pairs are represented as nested lists, mainly for the purposes
1293# of debugging.
1294####
3d1a2ec4
GS
1295'Dump' => <<'END_OF_FUNC',
1296sub Dump {
54310121 1297 my($self) = self_or_default(@_);
1298 my($param,$value,@result);
3acbd4f5
JH
1299 return '<ul></ul>' unless $self->param;
1300 push(@result,"<ul>");
54310121 1301 foreach $param ($self->param) {
1302 my($name)=$self->escapeHTML($param);
1c87da1d 1303 push(@result,"<li><strong>$param</strong></li>");
3acbd4f5 1304 push(@result,"<ul>");
54310121 1305 foreach $value ($self->param($param)) {
1306 $value = $self->escapeHTML($value);
58129083 1307 $value =~ s/\n/<br \/>\n/g;
1c87da1d 1308 push(@result,"<li>$value</li>");
54310121 1309 }
3acbd4f5 1310 push(@result,"</ul>");
54310121 1311 }
3acbd4f5 1312 push(@result,"</ul>");
54310121 1313 return join("\n",@result);
1314}
1315END_OF_FUNC
1316
424ec8fa
GS
1317#### Method as_string
1318#
1319# synonym for "dump"
1320####
1321'as_string' => <<'END_OF_FUNC',
1322sub as_string {
3d1a2ec4 1323 &Dump(@_);
424ec8fa
GS
1324}
1325END_OF_FUNC
1326
1327#### Method: save
1328# Write values out to a filehandle in such a way that they can
1329# be reinitialized by the filehandle form of the new() method
54310121 1330####
1331'save' => <<'END_OF_FUNC',
1332sub save {
1333 my($self,$filehandle) = self_or_default(@_);
54310121 1334 $filehandle = to_filehandle($filehandle);
424ec8fa
GS
1335 my($param);
1336 local($,) = ''; # set print field separator back to a sane value
71f3e297 1337 local($\) = ''; # set output line separator to a sane value
54310121 1338 foreach $param ($self->param) {
424ec8fa 1339 my($escaped_param) = escape($param);
54310121 1340 my($value);
1341 foreach $value ($self->param($param)) {
3538e1d5 1342 print $filehandle "$escaped_param=",escape("$value"),"\n";
54310121 1343 }
1344 }
d45d855d
JH
1345 foreach (keys %{$self->{'.fieldnames'}}) {
1346 print $filehandle ".cgifields=",escape("$_"),"\n";
1347 }
54310121 1348 print $filehandle "=\n"; # end of record
1349}
1350END_OF_FUNC
1351
1352
424ec8fa
GS
1353#### Method: save_parameters
1354# An alias for save() that is a better name for exportation.
1355# Only intended to be used with the function (non-OO) interface.
1356####
1357'save_parameters' => <<'END_OF_FUNC',
1358sub save_parameters {
1359 my $fh = shift;
1360 return save(to_filehandle($fh));
1361}
1362END_OF_FUNC
1363
1364#### Method: restore_parameters
1365# A way to restore CGI parameters from an initializer.
1366# Only intended to be used with the function (non-OO) interface.
1367####
1368'restore_parameters' => <<'END_OF_FUNC',
1369sub restore_parameters {
1370 $Q = $CGI::DefaultClass->new(@_);
1371}
1372END_OF_FUNC
1373
1374#### Method: multipart_init
1375# Return a Content-Type: style header for server-push
ba056755 1376# This has to be NPH on most web servers, and it is advisable to set $| = 1
424ec8fa
GS
1377#
1378# Many thanks to Ed Jordan <ed@fidalgo.net> for this
ba056755 1379# contribution, updated by Andrew Benham (adsb@bigfoot.com)
424ec8fa
GS
1380####
1381'multipart_init' => <<'END_OF_FUNC',
1382sub multipart_init {
1383 my($self,@p) = self_or_default(@_);
3d1a2ec4 1384 my($boundary,@other) = rearrange([BOUNDARY],@p);
424ec8fa 1385 $boundary = $boundary || '------- =_aaaaaaaaaa0';
ba056755
JH
1386 $self->{'separator'} = "$CRLF--$boundary$CRLF";
1387 $self->{'final_separator'} = "$CRLF--$boundary--$CRLF";
424ec8fa
GS
1388 $type = SERVER_PUSH($boundary);
1389 return $self->header(
13548fdf 1390 -nph => 0,
424ec8fa
GS
1391 -type => $type,
1392 (map { split "=", $_, 2 } @other),
ba056755 1393 ) . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $self->multipart_end;
424ec8fa
GS
1394}
1395END_OF_FUNC
1396
1397
1398#### Method: multipart_start
1399# Return a Content-Type: style header for server-push, start of section
1400#
1401# Many thanks to Ed Jordan <ed@fidalgo.net> for this
ba056755 1402# contribution, updated by Andrew Benham (adsb@bigfoot.com)
424ec8fa
GS
1403####
1404'multipart_start' => <<'END_OF_FUNC',
1405sub multipart_start {
ba056755 1406 my(@header);
424ec8fa 1407 my($self,@p) = self_or_default(@_);
3d1a2ec4 1408 my($type,@other) = rearrange([TYPE],@p);
424ec8fa 1409 $type = $type || 'text/html';
ba056755
JH
1410 push(@header,"Content-Type: $type");
1411
1412 # rearrange() was designed for the HTML portion, so we
1413 # need to fix it up a little.
1414 foreach (@other) {
8f3ccfa2
JH
1415 # Don't use \s because of perl bug 21951
1416 next unless my($header,$value) = /([^ \r\n\t=]+)=\"?(.+?)\"?$/;
ba056755
JH
1417 ($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ': '.$self->unescapeHTML($value)/e;
1418 }
1419 push(@header,@other);
1420 my $header = join($CRLF,@header)."${CRLF}${CRLF}";
1421 return $header;
424ec8fa
GS
1422}
1423END_OF_FUNC
1424
1425
1426#### Method: multipart_end
ba056755 1427# Return a MIME boundary separator for server-push, end of section
424ec8fa
GS
1428#
1429# Many thanks to Ed Jordan <ed@fidalgo.net> for this
1430# contribution
1431####
1432'multipart_end' => <<'END_OF_FUNC',
1433sub multipart_end {
1434 my($self,@p) = self_or_default(@_);
1435 return $self->{'separator'};
1436}
1437END_OF_FUNC
1438
1439
ba056755
JH
1440#### Method: multipart_final
1441# Return a MIME boundary separator for server-push, end of all sections
1442#
1443# Contributed by Andrew Benham (adsb@bigfoot.com)
1444####
1445'multipart_final' => <<'END_OF_FUNC',
1446sub multipart_final {
1447 my($self,@p) = self_or_default(@_);
1448 return $self->{'final_separator'} . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $CRLF;
1449}
1450END_OF_FUNC
1451
1452
54310121 1453#### Method: header
1454# Return a Content-Type: style header
1455#
1456####
1457'header' => <<'END_OF_FUNC',
1458sub header {
1459 my($self,@p) = self_or_default(@_);
1460 my(@header);
1461
2ed511ec 1462 return "" if $self->{'.header_printed'}++ and $HEADERS_ONCE;
71f3e297 1463
8f3ccfa2 1464 my($type,$status,$cookie,$target,$expires,$nph,$charset,$attachment,$p3p,@other) =
3d1a2ec4
GS
1465 rearrange([['TYPE','CONTENT_TYPE','CONTENT-TYPE'],
1466 'STATUS',['COOKIE','COOKIES'],'TARGET',
6b4ac661 1467 'EXPIRES','NPH','CHARSET',
8f3ccfa2 1468 'ATTACHMENT','P3P'],@p);
3d1a2ec4
GS
1469
1470 $nph ||= $NPH;
55b5d700
SP
1471
1472 $type ||= 'text/html' unless defined($type);
1473
3d1a2ec4
GS
1474 if (defined $charset) {
1475 $self->charset($charset);
1476 } else {
55b5d700 1477 $charset = $self->charset if $type =~ /^text\//;
3d1a2ec4 1478 }
cb3b230c 1479 $charset ||= '';
54310121 1480
1481 # rearrange() was designed for the HTML portion, so we
1482 # need to fix it up a little.
1483 foreach (@other) {
8f3ccfa2
JH
1484 # Don't use \s because of perl bug 21951
1485 next unless my($header,$value) = /([^ \r\n\t=]+)=\"?(.+?)\"?$/;
1486 ($_ = $header) =~ s/^(\w)(.*)/"\u$1\L$2" . ': '.$self->unescapeHTML($value)/e;
54310121 1487 }
1488
cd755de4
JJ
1489 $type .= "; charset=$charset"
1490 if $type ne ''
1491 and $type !~ /\bcharset\b/
1492 and defined $charset
1493 and $charset ne '';
54310121 1494
424ec8fa
GS
1495 # Maybe future compatibility. Maybe not.
1496 my $protocol = $ENV{SERVER_PROTOCOL} || 'HTTP/1.0';
1497 push(@header,$protocol . ' ' . ($status || '200 OK')) if $nph;
ba056755 1498 push(@header,"Server: " . &server_software()) if $nph;
424ec8fa 1499
54310121 1500 push(@header,"Status: $status") if $status;
424ec8fa 1501 push(@header,"Window-Target: $target") if $target;
8f3ccfa2
JH
1502 if ($p3p) {
1503 $p3p = join ' ',@$p3p if ref($p3p) eq 'ARRAY';
1504 push(@header,qq(P3P: policyref="/w3c/p3p.xml", CP="$p3p"));
1505 }
54310121 1506 # push all the cookies -- there may be several
1507 if ($cookie) {
424ec8fa 1508 my(@cookie) = ref($cookie) && ref($cookie) eq 'ARRAY' ? @{$cookie} : $cookie;
54310121 1509 foreach (@cookie) {
71f3e297
JH
1510 my $cs = UNIVERSAL::isa($_,'CGI::Cookie') ? $_->as_string : $_;
1511 push(@header,"Set-Cookie: $cs") if $cs ne '';
54310121 1512 }
1513 }
1514 # if the user indicates an expiration time, then we need
1515 # both an Expires and a Date header (so that the browser is
1516 # uses OUR clock)
424ec8fa 1517 push(@header,"Expires: " . expires($expires,'http'))
7d37aa8e 1518 if $expires;
ba056755 1519 push(@header,"Date: " . expires(0,'http')) if $expires || $cookie || $nph;
54310121 1520 push(@header,"Pragma: no-cache") if $self->cache();
6b4ac661 1521 push(@header,"Content-Disposition: attachment; filename=\"$attachment\"") if $attachment;
69c89ae7 1522 push(@header,map {ucfirst $_} @other);
71f3e297 1523 push(@header,"Content-Type: $type") if $type ne '';
424ec8fa 1524 my $header = join($CRLF,@header)."${CRLF}${CRLF}";
bb8b3399 1525 if (($MOD_PERL==1) && !$nph) {
8f3ccfa2
JH
1526 $self->r->send_cgi_header($header);
1527 return '';
424ec8fa
GS
1528 }
1529 return $header;
54310121 1530}
1531END_OF_FUNC
1532
1533
1534#### Method: cache
1535# Control whether header() will produce the no-cache
1536# Pragma directive.
1537####
1538'cache' => <<'END_OF_FUNC',
1539sub cache {
1540 my($self,$new_value) = self_or_default(@_);
1541 $new_value = '' unless $new_value;
1542 if ($new_value ne '') {
1543 $self->{'cache'} = $new_value;
1544 }
1545 return $self->{'cache'};
1546}
1547END_OF_FUNC
1548
1549
1550#### Method: redirect
1551# Return a Location: style header
1552#
1553####
1554'redirect' => <<'END_OF_FUNC',
1555sub redirect {
1556 my($self,@p) = self_or_default(@_);
13548fdf
RGS
1557 my($url,$target,$status,$cookie,$nph,@other) =
1558 rearrange([[LOCATION,URI,URL],TARGET,STATUS,['COOKIE','COOKIES'],NPH],@p);
55b5d700 1559 $status = '302 Found' unless defined $status;
6b4ac661 1560 $url ||= $self->self_url;
54310121 1561 my(@o);
424ec8fa
GS
1562 foreach (@other) { tr/\"//d; push(@o,split("=",$_,2)); }
1563 unshift(@o,
13548fdf 1564 '-Status' => $status,
8f3ccfa2
JH
1565 '-Location'=> $url,
1566 '-nph' => $nph);
424ec8fa 1567 unshift(@o,'-Target'=>$target) if $target;
71f3e297 1568 unshift(@o,'-Type'=>'');
8f3ccfa2
JH
1569 my @unescaped;
1570 unshift(@unescaped,'-Cookie'=>$cookie) if $cookie;
1571 return $self->header((map {$self->unescapeHTML($_)} @o),@unescaped);
54310121 1572}
1573END_OF_FUNC
1574
1575
1576#### Method: start_html
1577# Canned HTML header
1578#
1579# Parameters:
1580# $title -> (optional) The title for this HTML document (-title)
1581# $author -> (optional) e-mail address of the author (-author)
1582# $base -> (optional) if set to true, will enter the BASE address of this document
1583# for resolving relative references (-base)
1584# $xbase -> (optional) alternative base at some remote location (-xbase)
1585# $target -> (optional) target window to load all links into (-target)
1586# $script -> (option) Javascript code (-script)
47e3cabd 1587# $no_script -> (option) Javascript <noscript> tag (-noscript)
54310121 1588# $meta -> (optional) Meta information tags
3acbd4f5 1589# $head -> (optional) any other elements you'd like to incorporate into the <head> tag
7d37aa8e
LS
1590# (a scalar or array ref)
1591# $style -> (optional) reference to an external style sheet
54310121 1592# @other -> (optional) any other named parameters you'd like to incorporate into
3acbd4f5 1593# the <body> tag.
54310121 1594####
1595'start_html' => <<'END_OF_FUNC',
1596sub start_html {
1597 my($self,@p) = &self_or_default(@_);
ac734d8b 1598 my($title,$author,$base,$xbase,$script,$noscript,
29ddc2a4
RGS
1599 $target,$meta,$head,$style,$dtd,$lang,$encoding,$declare_xml,@other) =
1600 rearrange([TITLE,AUTHOR,BASE,XBASE,SCRIPT,NOSCRIPT,TARGET,
1601 META,HEAD,STYLE,DTD,LANG,ENCODING,DECLARE_XML],@p);
1602
1603 $self->element_id(0);
1604 $self->element_tab(0);
ac734d8b 1605
55b5d700 1606 $encoding = lc($self->charset) unless defined $encoding;
54310121 1607
13548fdf 1608 # Need to sort out the DTD before it's okay to call escapeHTML().
ba056755 1609 my(@result,$xml_dtd);
3d1a2ec4 1610 if ($dtd) {
6b4ac661 1611 if (defined(ref($dtd)) and (ref($dtd) eq 'ARRAY')) {
3d1a2ec4
GS
1612 $dtd = $DEFAULT_DTD unless $dtd->[0] =~ m|^-//|;
1613 } else {
1614 $dtd = $DEFAULT_DTD unless $dtd =~ m|^-//|;
1615 }
1616 } else {
6b4ac661 1617 $dtd = $XHTML ? XHTML_DTD : $DEFAULT_DTD;
3d1a2ec4 1618 }
ba056755
JH
1619
1620 $xml_dtd++ if ref($dtd) eq 'ARRAY' && $dtd->[0] =~ /\bXHTML\b/i;
1621 $xml_dtd++ if ref($dtd) eq '' && $dtd =~ /\bXHTML\b/i;
29ddc2a4 1622 push @result,qq(<?xml version="1.0" encoding="$encoding"?>) if $xml_dtd && $declare_xml;
ba056755 1623
3d1a2ec4 1624 if (ref($dtd) && ref($dtd) eq 'ARRAY') {
b2d0d414 1625 push(@result,qq(<!DOCTYPE html\n\tPUBLIC "$dtd->[0]"\n\t "$dtd->[1]">));
13548fdf 1626 $DTD_PUBLIC_IDENTIFIER = $dtd->[0];
3d1a2ec4 1627 } else {
03b9648d 1628 push(@result,qq(<!DOCTYPE html\n\tPUBLIC "$dtd">));
13548fdf
RGS
1629 $DTD_PUBLIC_IDENTIFIER = $dtd;
1630 }
1631
1632 # Now that we know whether we're using the HTML 3.2 DTD or not, it's okay to
1633 # call escapeHTML(). Strangely enough, the title needs to be escaped as
1634 # HTML while the author needs to be escaped as a URL.
1635 $title = $self->escapeHTML($title || 'Untitled Document');
1636 $author = $self->escape($author);
1637
1638 if ($DTD_PUBLIC_IDENTIFIER =~ /[^X]HTML (2\.0|3\.2)/i) {
1639 $lang = "" unless defined $lang;
1640 $XHTML = 0;
3d1a2ec4 1641 }
13548fdf
RGS
1642 else {
1643 $lang = 'en-US' unless defined $lang;
1644 }
1645
29ddc2a4
RGS
1646 my $lang_bits = $lang ne '' ? qq( lang="$lang" xml:lang="$lang") : '';
1647 my $meta_bits = qq(<meta http-equiv="Content-Type" content="text/html; charset=$encoding" />)
1648 if $XHTML && $encoding && !$declare_xml;
1649
1650 push(@result,$XHTML ? qq(<html xmlns="http://www.w3.org/1999/xhtml"$lang_bits>\n<head>\n<title>$title</title>)
1651 : ($lang ? qq(<html lang="$lang">) : "<html>")
8f3ccfa2 1652 . "<head><title>$title</title>");
6b4ac661
JH
1653 if (defined $author) {
1654 push(@result,$XHTML ? "<link rev=\"made\" href=\"mailto:$author\" />"
29ddc2a4 1655 : "<link rev=\"made\" href=\"mailto:$author\">");
6b4ac661 1656 }
54310121 1657
1658 if ($base || $xbase || $target) {
424ec8fa 1659 my $href = $xbase || $self->url('-path'=>1);
6b4ac661
JH
1660 my $t = $target ? qq/ target="$target"/ : '';
1661 push(@result,$XHTML ? qq(<base href="$href"$t />) : qq(<base href="$href"$t>));
54310121 1662 }
1663
1664 if ($meta && ref($meta) && (ref($meta) eq 'HASH')) {
6b4ac661
JH
1665 foreach (keys %$meta) { push(@result,$XHTML ? qq(<meta name="$_" content="$meta->{$_}" />)
1666 : qq(<meta name="$_" content="$meta->{$_}">)); }
54310121 1667 }
7d37aa8e
LS
1668
1669 push(@result,ref($head) ? @$head : $head) if $head;
1670
424ec8fa 1671 # handle the infrequently-used -style and -script parameters
13548fdf 1672 push(@result,$self->_style($style)) if defined $style;
424ec8fa 1673 push(@result,$self->_script($script)) if defined $script;
29ddc2a4 1674 push(@result,$meta_bits) if defined $meta_bits;
424ec8fa
GS
1675
1676 # handle -noscript parameter
1677 push(@result,<<END) if $noscript;
6b4ac661 1678<noscript>
424ec8fa 1679$noscript
6b4ac661 1680</noscript>
424ec8fa
GS
1681END
1682 ;
1683 my($other) = @other ? " @other" : '';
29ddc2a4 1684 push(@result,"</head>\n<body$other>\n");
424ec8fa
GS
1685 return join("\n",@result);
1686}
1687END_OF_FUNC
1688
1689### Method: _style
1690# internal method for generating a CSS style section
1691####
1692'_style' => <<'END_OF_FUNC',
1693sub _style {
1694 my ($self,$style) = @_;
1695 my (@result);
8869a4b7 1696
424ec8fa 1697 my $type = 'text/css';
0664a57d 1698 my $rel = 'stylesheet';
a3b3a725 1699
8869a4b7 1700
a3b3a725
JH
1701 my $cdata_start = $XHTML ? "\n<!--/* <![CDATA[ */" : "\n<!-- ";
1702 my $cdata_end = $XHTML ? "\n/* ]]> */-->\n" : " -->\n";
1703
13548fdf 1704 my @s = ref($style) eq 'ARRAY' ? @$style : $style;
bb8b3399 1705 my $other = '';
13548fdf
RGS
1706
1707 for my $s (@s) {
1708 if (ref($s)) {
0664a57d
SP
1709 my($src,$code,$verbatim,$stype,$alternate,$foo,@other) =
1710 rearrange([qw(SRC CODE VERBATIM TYPE ALTERNATE FOO)],
13548fdf
RGS
1711 ('-foo'=>'bar',
1712 ref($s) eq 'ARRAY' ? @$s : %$s));
8869a4b7
SP
1713 my $type = defined $stype ? $stype : 'text/css';
1714 my $rel = $alternate ? 'alternate stylesheet' : 'stylesheet';
bb8b3399 1715 $other = "@other" if @other;
13548fdf
RGS
1716
1717 if (ref($src) eq "ARRAY") # Check to see if the $src variable is an array reference
1718 { # If it is, push a LINK tag for each one
1719 foreach $src (@$src)
1720 {
0664a57d
SP
1721 push(@result,$XHTML ? qq(<link rel="$rel" type="$type" href="$src" $other/>)
1722 : qq(<link rel="$rel" type="$type" href="$src"$other>)) if $src;
13548fdf 1723 }
6b4ac661 1724 }
13548fdf
RGS
1725 else
1726 { # Otherwise, push the single -src, if it exists.
0664a57d
SP
1727 push(@result,$XHTML ? qq(<link rel="$rel" type="$type" href="$src" $other/>)
1728 : qq(<link rel="$rel" type="$type" href="$src"$other>)
13548fdf
RGS
1729 ) if $src;
1730 }
1731 if ($verbatim) {
1732 my @v = ref($verbatim) eq 'ARRAY' ? @$verbatim : $verbatim;
1733 push(@result, "<style type=\"text/css\">\n$_\n</style>") foreach @v;
1734 }
1735 my @c = ref($code) eq 'ARRAY' ? @$code : $code if $code;
1736 push(@result,style({'type'=>$type},"$cdata_start\n$_\n$cdata_end")) foreach @c;
1737
1738 } else {
1739 my $src = $s;
0664a57d
SP
1740 push(@result,$XHTML ? qq(<link rel="$rel" type="$type" href="$src" $other/>)
1741 : qq(<link rel="$rel" type="$type" href="$src"$other>));
13548fdf 1742 }
7d37aa8e 1743 }
424ec8fa
GS
1744 @result;
1745}
1746END_OF_FUNC
1747
424ec8fa
GS
1748'_script' => <<'END_OF_FUNC',
1749sub _script {
1750 my ($self,$script) = @_;
1751 my (@result);
a3b3a725 1752
424ec8fa
GS
1753 my (@scripts) = ref($script) eq 'ARRAY' ? @$script : ($script);
1754 foreach $script (@scripts) {
7d37aa8e
LS
1755 my($src,$code,$language);
1756 if (ref($script)) { # script is a hash
8869a4b7
SP
1757 ($src,$code,$type) =
1758 rearrange(['SRC','CODE',['LANGUAGE','TYPE']],
7d37aa8e 1759 '-foo'=>'bar', # a trick to allow the '-' to be omitted
3538e1d5 1760 ref($script) eq 'ARRAY' ? @$script : %$script);
8869a4b7
SP
1761 $type ||= 'text/javascript';
1762 unless ($type =~ m!\w+/\w+!) {
1763 $type =~ s/[\d.]+$//;
1764 $type = "text/$type";
3d1a2ec4 1765 }
7d37aa8e 1766 } else {
8869a4b7 1767 ($src,$code,$type) = ('',$script, 'text/javascript');
7d37aa8e 1768 }
a3b3a725
JH
1769
1770 my $comment = '//'; # javascript by default
1771 $comment = '#' if $type=~/perl|tcl/i;
1772 $comment = "'" if $type=~/vbscript/i;
1773
58129083
JH
1774 my ($cdata_start,$cdata_end);
1775 if ($XHTML) {
1776 $cdata_start = "$comment<![CDATA[\n";
1777 $cdata_end .= "\n$comment]]>";
1778 } else {
1779 $cdata_start = "\n<!-- Hide script\n";
1780 $cdata_end = $comment;
1781 $cdata_end .= " End script hiding -->\n";
1782 }
1783 my(@satts);
1784 push(@satts,'src'=>$src) if $src;
58129083 1785 push(@satts,'type'=>$type);
29ddc2a4
RGS
1786 $code = $cdata_start . $code . $cdata_end if defined $code;
1787 push(@result,$self->script({@satts},$code || ''));
7d37aa8e 1788 }
424ec8fa 1789 @result;
54310121 1790}
1791END_OF_FUNC
1792
54310121 1793#### Method: end_html
1794# End an HTML document.
3acbd4f5 1795# Trivial method for completeness. Just returns "</body>"
54310121 1796####
1797'end_html' => <<'END_OF_FUNC',
1798sub end_html {
29ddc2a4 1799 return "\n</body>\n</html>";
54310121 1800}
1801END_OF_FUNC
1802
1803
1804################################
1805# METHODS USED IN BUILDING FORMS
1806################################
1807
1808#### Method: isindex
1809# Just prints out the isindex tag.
1810# Parameters:
1811# $action -> optional URL of script to run
1812# Returns:
188ba755 1813# A string containing a <isindex> tag
54310121 1814'isindex' => <<'END_OF_FUNC',
1815sub isindex {
1816 my($self,@p) = self_or_default(@_);
3d1a2ec4 1817 my($action,@other) = rearrange([ACTION],@p);
188ba755 1818 $action = qq/ action="$action"/ if $action;
54310121 1819 my($other) = @other ? " @other" : '';
188ba755 1820 return $XHTML ? "<isindex$action$other />" : "<isindex$action$other>";
54310121 1821}
1822END_OF_FUNC
1823
1824
1825#### Method: startform
1826# Start a form
1827# Parameters:
1828# $method -> optional submission method to use (GET or POST)
1829# $action -> optional URL of script to run
1830# $enctype ->encoding to use (URL_ENCODED or MULTIPART)
1831'startform' => <<'END_OF_FUNC',
1832sub startform {
1833 my($self,@p) = self_or_default(@_);
1834
1835 my($method,$action,$enctype,@other) =
3d1a2ec4 1836 rearrange([METHOD,ACTION,ENCTYPE],@p);
54310121 1837
13548fdf
RGS
1838 $method = $self->escapeHTML(lc($method) || 'post');
1839 $enctype = $self->escapeHTML($enctype || &URL_ENCODED);
1840 if (defined $action) {
1841 $action = $self->escapeHTML($action);
1842 }
1843 else {
0664a57d 1844 $action = $self->escapeHTML($self->request_uri || $self->self_url);
03b9648d
JH
1845 }
1846 $action = qq(action="$action");
54310121 1847 my($other) = @other ? " @other" : '';
1848 $self->{'.parametersToAdd'}={};
6b4ac661 1849 return qq/<form method="$method" $action enctype="$enctype"$other>\n/;
54310121 1850}
1851END_OF_FUNC
1852
1853
1854#### Method: start_form
1855# synonym for startform
1856'start_form' => <<'END_OF_FUNC',
1857sub start_form {
29ddc2a4 1858 $XHTML ? &start_multipart_form : &startform;
54310121 1859}
1860END_OF_FUNC
1861
71f3e297
JH
1862'end_multipart_form' => <<'END_OF_FUNC',
1863sub end_multipart_form {
1864 &endform;
1865}
1866END_OF_FUNC
54310121 1867
1868#### Method: start_multipart_form
1869# synonym for startform
1870'start_multipart_form' => <<'END_OF_FUNC',
1871sub start_multipart_form {
1872 my($self,@p) = self_or_default(@_);
0a9bdad4 1873 if (defined($p[0]) && substr($p[0],0,1) eq '-') {
adb86593 1874 return $self->startform(-enctype=>&MULTIPART,@p);
54310121 1875 } else {
1876 my($method,$action,@other) =
3d1a2ec4 1877 rearrange([METHOD,ACTION],@p);
54310121 1878 return $self->startform($method,$action,&MULTIPART,@other);
1879 }
1880}
1881END_OF_FUNC
1882
1883
1884#### Method: endform
1885# End a form
1886'endform' => <<'END_OF_FUNC',
1887sub endform {
0a9bdad4 1888 my($self,@p) = self_or_default(@_);
3d1a2ec4 1889 if ( $NOSTICKY ) {
6b4ac661 1890 return wantarray ? ("</form>") : "\n</form>";
3d1a2ec4 1891 } else {
0a9bdad4
SP
1892 if (my @fields = $self->get_fields) {
1893 return wantarray ? ("<div>",@fields,"</div>","</form>")
1894 : "<div>".(join '',@fields)."</div>\n</form>";
1895 } else {
1896 return "</form>";
1897 }
3d1a2ec4 1898 }
54310121 1899}
1900END_OF_FUNC
1901
1902
424ec8fa
GS
1903'_textfield' => <<'END_OF_FUNC',
1904sub _textfield {
1905 my($self,$tag,@p) = self_or_default(@_);
29ddc2a4
RGS
1906 my($name,$default,$size,$maxlength,$override,$tabindex,@other) =
1907 rearrange([NAME,[DEFAULT,VALUE,VALUES],SIZE,MAXLENGTH,[OVERRIDE,FORCE],TABINDEX],@p);
424ec8fa
GS
1908
1909 my $current = $override ? $default :
1910 (defined($self->param($name)) ? $self->param($name) : $default);
1911
a3b3a725 1912 $current = defined($current) ? $self->escapeHTML($current,1) : '';
424ec8fa 1913 $name = defined($name) ? $self->escapeHTML($name) : '';
ba056755
JH
1914 my($s) = defined($size) ? qq/ size="$size"/ : '';
1915 my($m) = defined($maxlength) ? qq/ maxlength="$maxlength"/ : '';
71f3e297
JH
1916 my($other) = @other ? " @other" : '';
1917 # this entered at cristy's request to fix problems with file upload fields
1918 # and WebTV -- not sure it won't break stuff
6b4ac661 1919 my($value) = $current ne '' ? qq(value="$current") : '';
29ddc2a4 1920 $tabindex = $self->element_tab($tabindex);
0a9bdad4 1921 return $XHTML ? qq(<input type="$tag" name="$name" $tabindex$value$s$m$other />)
b2d0d414 1922 : qq(<input type="$tag" name="$name" $value$s$m$other>);
424ec8fa
GS
1923}
1924END_OF_FUNC
1925
54310121 1926#### Method: textfield
1927# Parameters:
1928# $name -> Name of the text field
1929# $default -> Optional default value of the field if not
1930# already defined.
1931# $size -> Optional width of field in characaters.
1932# $maxlength -> Optional maximum number of characters.
1933# Returns:
188ba755 1934# A string containing a <input type="text"> field
54310121 1935#
1936'textfield' => <<'END_OF_FUNC',
1937sub textfield {
1938 my($self,@p) = self_or_default(@_);
424ec8fa 1939 $self->_textfield('text',@p);
54310121 1940}
1941END_OF_FUNC
1942
1943
1944#### Method: filefield
1945# Parameters:
1946# $name -> Name of the file upload field
1947# $size -> Optional width of field in characaters.
1948# $maxlength -> Optional maximum number of characters.
1949# Returns:
188ba755 1950# A string containing a <input type="file"> field
54310121 1951#
1952'filefield' => <<'END_OF_FUNC',
1953sub filefield {
1954 my($self,@p) = self_or_default(@_);
424ec8fa 1955 $self->_textfield('file',@p);
54310121 1956}
1957END_OF_FUNC
1958
1959
1960#### Method: password
1961# Create a "secret password" entry field
1962# Parameters:
1963# $name -> Name of the field
1964# $default -> Optional default value of the field if not
1965# already defined.
1966# $size -> Optional width of field in characters.
1967# $maxlength -> Optional maximum characters that can be entered.
1968# Returns:
188ba755 1969# A string containing a <input type="password"> field
54310121 1970#
1971'password_field' => <<'END_OF_FUNC',
1972sub password_field {
1973 my ($self,@p) = self_or_default(@_);
424ec8fa 1974 $self->_textfield('password',@p);
54310121 1975}
1976END_OF_FUNC
1977
54310121 1978#### Method: textarea
1979# Parameters:
1980# $name -> Name of the text field
1981# $default -> Optional default value of the field if not
1982# already defined.
1983# $rows -> Optional number of rows in text area
1984# $columns -> Optional number of columns in text area
1985# Returns:
3acbd4f5 1986# A string containing a <textarea></textarea> tag
54310121 1987#
1988'textarea' => <<'END_OF_FUNC',
1989sub textarea {
1990 my($self,@p) = self_or_default(@_);
29ddc2a4
RGS
1991 my($name,$default,$rows,$cols,$override,$tabindex,@other) =
1992 rearrange([NAME,[DEFAULT,VALUE],ROWS,[COLS,COLUMNS],[OVERRIDE,FORCE],TABINDEX],@p);
54310121 1993
1994 my($current)= $override ? $default :
1995 (defined($self->param($name)) ? $self->param($name) : $default);
1996
1997 $name = defined($name) ? $self->escapeHTML($name) : '';
1998 $current = defined($current) ? $self->escapeHTML($current) : '';
3acbd4f5
JH
1999 my($r) = $rows ? qq/ rows="$rows"/ : '';
2000 my($c) = $cols ? qq/ cols="$cols"/ : '';
54310121 2001 my($other) = @other ? " @other" : '';
29ddc2a4 2002 $tabindex = $self->element_tab($tabindex);
0a9bdad4 2003 return qq{<textarea name="$name" $tabindex$r$c$other>$current</textarea>};
54310121 2004}
2005END_OF_FUNC
2006
2007
2008#### Method: button
2009# Create a javascript button.
2010# Parameters:
2011# $name -> (optional) Name for the button. (-name)
2012# $value -> (optional) Value of the button when selected (and visible name) (-value)
2013# $onclick -> (optional) Text of the JavaScript to run when the button is
2014# clicked.
2015# Returns:
188ba755 2016# A string containing a <input type="button"> tag
54310121 2017####
2018'button' => <<'END_OF_FUNC',
2019sub button {
2020 my($self,@p) = self_or_default(@_);
2021
29ddc2a4
RGS
2022 my($label,$value,$script,$tabindex,@other) = rearrange([NAME,[VALUE,LABEL],
2023 [ONCLICK,SCRIPT],TABINDEX],@p);
54310121 2024
2025 $label=$self->escapeHTML($label);
a3b3a725 2026 $value=$self->escapeHTML($value,1);
54310121 2027 $script=$self->escapeHTML($script);
2028
2029 my($name) = '';
ba056755 2030 $name = qq/ name="$label"/ if $label;
54310121 2031 $value = $value || $label;
2032 my($val) = '';
6b4ac661
JH
2033 $val = qq/ value="$value"/ if $value;
2034 $script = qq/ onclick="$script"/ if $script;
54310121 2035 my($other) = @other ? " @other" : '';
29ddc2a4 2036 $tabindex = $self->element_tab($tabindex);
0a9bdad4 2037 return $XHTML ? qq(<input type="button" $tabindex$name$val$script$other />)
b2d0d414 2038 : qq(<input type="button"$name$val$script$other>);
54310121 2039}
2040END_OF_FUNC
2041
2042
2043#### Method: submit
2044# Create a "submit query" button.
2045# Parameters:
2046# $name -> (optional) Name for the button.
2047# $value -> (optional) Value of the button when selected (also doubles as label).
2048# $label -> (optional) Label printed on the button(also doubles as the value).
2049# Returns:
188ba755 2050# A string containing a <input type="submit"> tag
54310121 2051####
2052'submit' => <<'END_OF_FUNC',
2053sub submit {
2054 my($self,@p) = self_or_default(@_);
2055
29ddc2a4 2056 my($label,$value,$tabindex,@other) = rearrange([NAME,[VALUE,LABEL],TABINDEX],@p);
54310121 2057
2058 $label=$self->escapeHTML($label);
a3b3a725 2059 $value=$self->escapeHTML($value,1);
54310121 2060
0a9bdad4
SP
2061 my $name = $NOSTICKY ? '' : 'name=".submit" ';
2062 $name = qq/name="$label" / if defined($label);
424ec8fa 2063 $value = defined($value) ? $value : $label;
8f3ccfa2 2064 my $val = '';
0a9bdad4 2065 $val = qq/value="$value" / if defined($value);
29ddc2a4 2066 $tabindex = $self->element_tab($tabindex);
0a9bdad4
SP
2067 my($other) = @other ? "@other " : '';
2068 return $XHTML ? qq(<input type="submit" $tabindex$name$val$other/>)
2069 : qq(<input type="submit" $name$val$other>);
54310121 2070}
2071END_OF_FUNC
2072
2073
2074#### Method: reset
2075# Create a "reset" button.
2076# Parameters:
2077# $name -> (optional) Name for the button.
2078# Returns:
188ba755 2079# A string containing a <input type="reset"> tag
54310121 2080####
2081'reset' => <<'END_OF_FUNC',
2082sub reset {
2083 my($self,@p) = self_or_default(@_);
29ddc2a4 2084 my($label,$value,$tabindex,@other) = rearrange(['NAME',['VALUE','LABEL'],TABINDEX],@p);
54310121 2085 $label=$self->escapeHTML($label);
8f3ccfa2
JH
2086 $value=$self->escapeHTML($value,1);
2087 my ($name) = ' name=".reset"';
2088 $name = qq/ name="$label"/ if defined($label);
2089 $value = defined($value) ? $value : $label;
2090 my($val) = '';
2091 $val = qq/ value="$value"/ if defined($value);
54310121 2092 my($other) = @other ? " @other" : '';
29ddc2a4 2093 $tabindex = $self->element_tab($tabindex);
0a9bdad4 2094 return $XHTML ? qq(<input type="reset" $tabindex$name$val$other />)
8f3ccfa2 2095 : qq(<input type="reset"$name$val$other>);
54310121 2096}
2097END_OF_FUNC
2098
2099
2100#### Method: defaults
2101# Create a "defaults" button.
2102# Parameters:
2103# $name -> (optional) Name for the button.
2104# Returns:
188ba755 2105# A string containing a <input type="submit" name=".defaults"> tag
54310121 2106#
2107# Note: this button has a special meaning to the initialization script,
2108# and tells it to ERASE the current query string so that your defaults
2109# are used again!
2110####
2111'defaults' => <<'END_OF_FUNC',
2112sub defaults {
2113 my($self,@p) = self_or_default(@_);
2114
29ddc2a4 2115 my($label,$tabindex,@other) = rearrange([[NAME,VALUE],TABINDEX],@p);
54310121 2116
a3b3a725 2117 $label=$self->escapeHTML($label,1);
54310121 2118 $label = $label || "Defaults";
6b4ac661 2119 my($value) = qq/ value="$label"/;
54310121 2120 my($other) = @other ? " @other" : '';
29ddc2a4 2121 $tabindex = $self->element_tab($tabindex);
0a9bdad4 2122 return $XHTML ? qq(<input type="submit" name=".defaults" $tabindex$value$other />)
6b4ac661 2123 : qq/<input type="submit" NAME=".defaults"$value$other>/;
54310121 2124}
2125END_OF_FUNC
2126
2127
424ec8fa
GS
2128#### Method: comment
2129# Create an HTML <!-- comment -->
2130# Parameters: a string
2131'comment' => <<'END_OF_FUNC',
2132sub comment {
2133 my($self,@p) = self_or_CGI(@_);
2134 return "<!-- @p -->";
2135}
2136END_OF_FUNC
2137
54310121 2138#### Method: checkbox
2139# Create a checkbox that is not logically linked to any others.
2140# The field value is "on" when the button is checked.
2141# Parameters:
2142# $name -> Name of the checkbox
2143# $checked -> (optional) turned on by default if true
2144# $value -> (optional) value of the checkbox, 'on' by default
2145# $label -> (optional) a user-readable label printed next to the box.
2146# Otherwise the checkbox name is used.
2147# Returns:
188ba755 2148# A string containing a <input type="checkbox"> field
54310121 2149####
2150'checkbox' => <<'END_OF_FUNC',
2151sub checkbox {
2152 my($self,@p) = self_or_default(@_);
2153
bb8b3399
SP
2154 my($name,$checked,$value,$label,$labelattributes,$override,$tabindex,@other) =
2155 rearrange([NAME,[CHECKED,SELECTED,ON],VALUE,LABEL,LABELATTRIBUTES,
2156 [OVERRIDE,FORCE],TABINDEX],@p);
29ddc2a4 2157
424ec8fa
GS
2158 $value = defined $value ? $value : 'on';
2159
2160 if (!$override && ($self->{'.fieldnames'}->{$name} ||
2161 defined $self->param($name))) {
3acbd4f5 2162 $checked = grep($_ eq $value,$self->param($name)) ? $self->_checked(1) : '';
54310121 2163 } else {
3acbd4f5 2164 $checked = $self->_checked($checked);
54310121 2165 }
2166 my($the_label) = defined $label ? $label : $name;
2167 $name = $self->escapeHTML($name);
a3b3a725 2168 $value = $self->escapeHTML($value,1);
54310121 2169 $the_label = $self->escapeHTML($the_label);
0a9bdad4 2170 my($other) = @other ? "@other " : '';
29ddc2a4 2171 $tabindex = $self->element_tab($tabindex);
54310121 2172 $self->register_parameter($name);
bb8b3399
SP
2173 return $XHTML ? CGI::label($labelattributes,
2174 qq{<input type="checkbox" name="$name" value="$value" $tabindex$checked$other/>$the_label})
6b4ac661 2175 : qq{<input type="checkbox" name="$name" value="$value"$checked$other>$the_label};
54310121 2176}
2177END_OF_FUNC
2178
2179
54310121 2180
54310121 2181# Escape HTML -- used internally
2182'escapeHTML' => <<'END_OF_FUNC',
2183sub escapeHTML {
ac734d8b
JH
2184 # hack to work around earlier hacks
2185 push @_,$_[0] if @_==1 && $_[0] eq 'CGI';
a3b3a725 2186 my ($self,$toencode,$newlinestoo) = CGI::self_or_default(@_);
6b4ac661 2187 return undef unless defined($toencode);
188ba755 2188 return $toencode if ref($self) && !$self->{'escape'};
6b4ac661
JH
2189 $toencode =~ s{&}{&amp;}gso;
2190 $toencode =~ s{<}{&lt;}gso;
2191 $toencode =~ s{>}{&gt;}gso;
13548fdf
RGS
2192 if ($DTD_PUBLIC_IDENTIFIER =~ /[^X]HTML 3\.2/i) {
2193 # $quot; was accidentally omitted from the HTML 3.2 DTD -- see
2194 # <http://validator.w3.org/docs/errors.html#bad-entity> /
2195 # <http://lists.w3.org/Archives/Public/www-html/1997Mar/0003.html>.
2196 $toencode =~ s{"}{&#34;}gso;
2197 }
2198 else {
2199 $toencode =~ s{"}{&quot;}gso;
2200 }
a3b3a725
JH
2201 my $latin = uc $self->{'.charset'} eq 'ISO-8859-1' ||
2202 uc $self->{'.charset'} eq 'WINDOWS-1252';
2203 if ($latin) { # bug in some browsers
ba056755 2204 $toencode =~ s{'}{&#39;}gso;
188ba755
JH
2205 $toencode =~ s{\x8b}{&#8249;}gso;
2206 $toencode =~ s{\x9b}{&#8250;}gso;
a3b3a725
JH
2207 if (defined $newlinestoo && $newlinestoo) {
2208 $toencode =~ s{\012}{&#10;}gso;
2209 $toencode =~ s{\015}{&#13;}gso;
2210 }
2211 }
6b4ac661 2212 return $toencode;
54310121 2213}
2214END_OF_FUNC
2215
424ec8fa
GS
2216# unescape HTML -- used internally
2217'unescapeHTML' => <<'END_OF_FUNC',
2218sub unescapeHTML {
efc8e943
NC
2219 # hack to work around earlier hacks
2220 push @_,$_[0] if @_==1 && $_[0] eq 'CGI';
6b4ac661 2221 my ($self,$string) = CGI::self_or_default(@_);
424ec8fa 2222 return undef unless defined($string);
a3b3a725
JH
2223 my $latin = defined $self->{'.charset'} ? $self->{'.charset'} =~ /^(ISO-8859-1|WINDOWS-1252)$/i
2224 : 1;
71f3e297
JH
2225 # thanks to Randal Schwartz for the correct solution to this one
2226 $string=~ s[&(.*?);]{
2227 local $_ = $1;
2228 /^amp$/i ? "&" :
2229 /^quot$/i ? '"' :
2230 /^gt$/i ? ">" :
2231 /^lt$/i ? "<" :
6b4ac661
JH
2232 /^#(\d+)$/ && $latin ? chr($1) :
2233 /^#x([0-9a-f]+)$/i && $latin ? chr(hex($1)) :
71f3e297
JH
2234 $_
2235 }gex;
424ec8fa
GS
2236 return $string;
2237}
2238END_OF_FUNC
54310121 2239
2240# Internal procedure - don't use
2241'_tableize' => <<'END_OF_FUNC',
2242sub _tableize {
2243 my($rows,$columns,$rowheaders,$colheaders,@elements) = @_;
29ddc2a4
RGS
2244 my @rowheaders = $rowheaders ? @$rowheaders : ();
2245 my @colheaders = $colheaders ? @$colheaders : ();
54310121 2246 my($result);
2247
424ec8fa
GS
2248 if (defined($columns)) {
2249 $rows = int(0.99 + @elements/$columns) unless defined($rows);
2250 }
2251 if (defined($rows)) {
2252 $columns = int(0.99 + @elements/$rows) unless defined($columns);
2253 }
29ddc2a4 2254
54310121 2255 # rearrange into a pretty table
6b4ac661 2256 $result = "<table>";
54310121 2257 my($row,$column);
29ddc2a4
RGS
2258 unshift(@colheaders,'') if @colheaders && @rowheaders;
2259 $result .= "<tr>" if @colheaders;
2260 foreach (@colheaders) {
6b4ac661 2261 $result .= "<th>$_</th>";
54310121 2262 }
2263 for ($row=0;$row<$rows;$row++) {
6b4ac661 2264 $result .= "<tr>";
29ddc2a4 2265 $result .= "<th>$rowheaders[$row]</th>" if @rowheaders;
54310121 2266 for ($column=0;$column<$columns;$column++) {
6b4ac661 2267 $result .= "<td>" . $elements[$column*$rows + $row] . "</td>"
424ec8fa 2268 if defined($elements[$column*$rows + $row]);
54310121 2269 }
6b4ac661 2270 $result .= "</tr>";
54310121 2271 }
6b4ac661 2272 $result .= "</table>";
54310121 2273 return $result;
2274}
2275END_OF_FUNC
2276
2277
2278#### Method: radio_group
2279# Create a list of logically-linked radio buttons.
2280# Parameters:
2281# $name -> Common name for all the buttons.
2282# $values -> A pointer to a regular array containing the
2283# values for each button in the group.
2284# $default -> (optional) Value of the button to turn on by default. Pass '-'
2285# to turn _nothing_ on.
2286# $linebreak -> (optional) Set to true to place linebreaks
2287# between the buttons.
2288# $labels -> (optional)
2289# A pointer to an associative array of labels to print next to each checkbox
2290# in the form $label{'value'}="Long explanatory label".
2291# Otherwise the provided values are used as the labels.
2292# Returns:
188ba755 2293# An ARRAY containing a series of <input type="radio"> fields
54310121 2294####
2295'radio_group' => <<'END_OF_FUNC',
2296sub radio_group {
2297 my($self,@p) = self_or_default(@_);
29ddc2a4
RGS
2298 $self->_box_group('radio',@p);
2299}
2300END_OF_FUNC
2301
2302#### Method: checkbox_group
2303# Create a list of logically-linked checkboxes.
2304# Parameters:
2305# $name -> Common name for all the check boxes
2306# $values -> A pointer to a regular array containing the
2307# values for each checkbox in the group.
2308# $defaults -> (optional)
2309# 1. If a pointer to a regular array of checkbox values,
2310# then this will be used to decide which
2311# checkboxes to turn on by default.
2312# 2. If a scalar, will be assumed to hold the
2313# value of a single checkbox in the group to turn on.
2314# $linebreak -> (optional) Set to true to place linebreaks
2315# between the buttons.
2316# $labels -> (optional)
2317# A pointer to an associative array of labels to print next to each checkbox
2318# in the form $label{'value'}="Long explanatory label".
2319# Otherwise the provided values are used as the labels.
2320# Returns:
2321# An ARRAY containing a series of <input type="checkbox"> fields
2322####
2323
2324'checkbox_group' => <<'END_OF_FUNC',
2325sub checkbox_group {
2326 my($self,@p) = self_or_default(@_);
2327 $self->_box_group('checkbox',@p);
2328}
2329END_OF_FUNC
54310121 2330
29ddc2a4
RGS
2331'_box_group' => <<'END_OF_FUNC',
2332sub _box_group {
2333 my $self = shift;
2334 my $box_type = shift;
2335
bb8b3399
SP
2336 my($name,$values,$defaults,$linebreak,$labels,$labelattributes,
2337 $attributes,$rows,$columns,$rowheaders,$colheaders,
8869a4b7 2338 $override,$nolabels,$tabindex,$disabled,@other) =
bb8b3399
SP
2339 rearrange([NAME,[VALUES,VALUE],[DEFAULT,DEFAULTS],LINEBREAK,LABELS,LABELATTRIBUTES,
2340 ATTRIBUTES,ROWS,[COLUMNS,COLS],[ROWHEADERS,ROWHEADER],[COLHEADERS,COLHEADER],
2341 [OVERRIDE,FORCE],NOLABELS,TABINDEX,DISABLED
2342 ],@_);
2343
54310121 2344
8869a4b7 2345 my($result,$checked,@elements,@values);
29ddc2a4 2346
424ec8fa 2347 @values = $self->_set_values_and_labels($values,\$labels,$name);
29ddc2a4 2348 my %checked = $self->previous_or_default($name,$defaults,$override);
424ec8fa 2349
71f3e297 2350 # If no check array is specified, check the first by default
29ddc2a4
RGS
2351 $checked{$values[0]}++ if $box_type eq 'radio' && !%checked;
2352
71f3e297
JH
2353 $name=$self->escapeHTML($name);
2354
29ddc2a4 2355 my %tabs = ();
0a9bdad4 2356 if ($TABINDEX && $tabindex) {
29ddc2a4
RGS
2357 if (!ref $tabindex) {
2358 $self->element_tab($tabindex);
2359 } elsif (ref $tabindex eq 'ARRAY') {
2360 %tabs = map {$_=>$self->element_tab} @$tabindex;
2361 } elsif (ref $tabindex eq 'HASH') {
2362 %tabs = %$tabindex;
2363 }
2364 }
2365 %tabs = map {$_=>$self->element_tab} @values unless %tabs;
0a9bdad4 2366 my $other = @other ? "@other " : '';
29ddc2a4 2367 my $radio_checked;
8869a4b7
SP
2368
2369 # for disabling groups of radio/checkbox buttons
2370 my %disabled;
2371 foreach (@{$disabled}) {
2372 $disabled{$_}=1;
2373 }
2374
54310121 2375 foreach (@values) {
8869a4b7
SP
2376 my $disable="";
2377 if ($disabled{$_}) {
2378 $disable="disabled='1'";
2379 }
2380
29ddc2a4
RGS
2381 my $checkit = $self->_checked($box_type eq 'radio' ? ($checked{$_} && !$radio_checked++)
2382 : $checked{$_});
6b4ac661
JH
2383 my($break);
2384 if ($linebreak) {
ba056755 2385 $break = $XHTML ? "<br />" : "<br>";
6b4ac661
JH
2386 }
2387 else {
ba056755 2388 $break = '';
6b4ac661 2389 }
54310121 2390 my($label)='';
2391 unless (defined($nolabels) && $nolabels) {
2392 $label = $_;
424ec8fa 2393 $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
a3b3a725 2394 $label = $self->escapeHTML($label,1);
8869a4b7 2395 $label = "<span style=\"color:gray\">$label</span>" if $disabled{$_};
54310121 2396 }
29ddc2a4 2397 my $attribs = $self->_set_attributes($_, $attributes);
0a9bdad4 2398 my $tab = $tabs{$_};
54310121 2399 $_=$self->escapeHTML($_);
8869a4b7 2400
29ddc2a4
RGS
2401 if ($XHTML) {
2402 push @elements,
bb8b3399 2403 CGI::label($labelattributes,
8869a4b7 2404 qq(<input type="$box_type" name="$name" value="$_" $checkit$other$tab$attribs$disable/>$label)).${break};
29ddc2a4 2405 } else {
8869a4b7 2406 push(@elements,qq/<input type="$box_type" name="$name" value="$_"$checkit$other$tab$attribs$disable>${label}${break}/);
29ddc2a4 2407 }
54310121 2408 }
2409 $self->register_parameter($name);
29ddc2a4 2410 return wantarray ? @elements : "@elements"
424ec8fa 2411 unless defined($columns) || defined($rows);
54310121 2412 return _tableize($rows,$columns,$rowheaders,$colheaders,@elements);
2413}
2414END_OF_FUNC
2415
2416
2417#### Method: popup_menu
2418# Create a popup menu.
2419# Parameters:
2420# $name -> Name for all the menu
2421# $values -> A pointer to a regular array containing the
2422# text of each menu item.
2423# $default -> (optional) Default item to display
2424# $labels -> (optional)
2425# A pointer to an associative array of labels to print next to each checkbox
2426# in the form $label{'value'}="Long explanatory label".
2427# Otherwise the provided values are used as the labels.
2428# Returns:
2429# A string containing the definition of a popup menu.
2430####
2431'popup_menu' => <<'END_OF_FUNC',
2432sub popup_menu {
2433 my($self,@p) = self_or_default(@_);
2434
29ddc2a4 2435 my($name,$values,$default,$labels,$attributes,$override,$tabindex,@other) =
188ba755 2436 rearrange([NAME,[VALUES,VALUE],[DEFAULT,DEFAULTS],LABELS,
29ddc2a4 2437 ATTRIBUTES,[OVERRIDE,FORCE],TABINDEX],@p);
54310121 2438 my($result,$selected);
2439
2440 if (!$override && defined($self->param($name))) {
2441 $selected = $self->param($name);
2442 } else {
2443 $selected = $default;
2444 }
2445 $name=$self->escapeHTML($name);
2446 my($other) = @other ? " @other" : '';
2447
424ec8fa
GS
2448 my(@values);
2449 @values = $self->_set_values_and_labels($values,\$labels,$name);
29ddc2a4 2450 $tabindex = $self->element_tab($tabindex);
0a9bdad4 2451 $result = qq/<select name="$name" $tabindex$other>\n/;
54310121 2452 foreach (@values) {
188ba755
JH
2453 if (/<optgroup/) {
2454 foreach (split(/\n/)) {
2455 my $selectit = $XHTML ? 'selected="selected"' : 'selected';
2456 s/(value="$selected")/$selectit $1/ if defined $selected;
2457 $result .= "$_\n";
2458 }
2459 }
2460 else {
cb3b230c
SP
2461 my $attribs = $self->_set_attributes($_, $attributes);
2462 my($selectit) = defined($selected) ? $self->_selected($selected eq $_) : '';
2463 my($label) = $_;
2464 $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
2465 my($value) = $self->escapeHTML($_);
2466 $label=$self->escapeHTML($label,1);
2467 $result .= "<option${attribs} ${selectit}value=\"$value\">$label</option>\n";
188ba755 2468 }
54310121 2469 }
2470
69c89ae7 2471 $result .= "</select>";
54310121 2472 return $result;
2473}
2474END_OF_FUNC
2475
2476
188ba755
JH
2477#### Method: optgroup
2478# Create a optgroup.
2479# Parameters:
2480# $name -> Label for the group
2481# $values -> A pointer to a regular array containing the
2482# values for each option line in the group.
2483# $labels -> (optional)
2484# A pointer to an associative array of labels to print next to each item
2485# in the form $label{'value'}="Long explanatory label".
2486# Otherwise the provided values are used as the labels.
2487# $labeled -> (optional)
2488# A true value indicates the value should be used as the label attribute
2489# in the option elements.
2490# The label attribute specifies the option label presented to the user.
2491# This defaults to the content of the <option> element, but the label
2492# attribute allows authors to more easily use optgroup without sacrificing
2493# compatibility with browsers that do not support option groups.
2494# $novals -> (optional)
2495# A true value indicates to suppress the val attribute in the option elements
2496# Returns:
2497# A string containing the definition of an option group.
2498####
2499'optgroup' => <<'END_OF_FUNC',
2500sub optgroup {
2501 my($self,@p) = self_or_default(@_);
2502 my($name,$values,$attributes,$labeled,$noval,$labels,@other)
2503 = rearrange([NAME,[VALUES,VALUE],ATTRIBUTES,LABELED,NOVALS,LABELS],@p);
2504
2505 my($result,@values);
2506 @values = $self->_set_values_and_labels($values,\$labels,$name,$labeled,$novals);
2507 my($other) = @other ? " @other" : '';
2508
2509 $name=$self->escapeHTML($name);
2510 $result = qq/<optgroup label="$name"$other>\n/;
2511 foreach (@values) {
2512 if (/<optgroup/) {
2513 foreach (split(/\n/)) {
2514 my $selectit = $XHTML ? 'selected="selected"' : 'selected';
2515 s/(value="$selected")/$selectit $1/ if defined $selected;
2516 $result .= "$_\n";
2517 }
2518 }
2519 else {
2520 my $attribs = $self->_set_attributes($_, $attributes);
2521 my($label) = $_;
2522 $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
2523 $label=$self->escapeHTML($label);
2524 my($value)=$self->escapeHTML($_,1);
2525 $result .= $labeled ? $novals ? "<option$attribs label=\"$value\">$label</option>\n"
2526 : "<option$attribs label=\"$value\" value=\"$value\">$label</option>\n"
2527 : $novals ? "<option$attribs>$label</option>\n"
2528 : "<option$attribs value=\"$value\">$label</option>\n";
2529 }
2530 }
2531 $result .= "</optgroup>";
2532 return $result;
2533}
2534END_OF_FUNC
2535
2536
54310121 2537#### Method: scrolling_list
2538# Create a scrolling list.
2539# Parameters:
2540# $name -> name for the list
2541# $values -> A pointer to a regular array containing the
2542# values for each option line in the list.
2543# $defaults -> (optional)
2544# 1. If a pointer to a regular array of options,
2545# then this will be used to decide which
2546# lines to turn on by default.
2547# 2. Otherwise holds the value of the single line to turn on.
2548# $size -> (optional) Size of the list.
2549# $multiple -> (optional) If set, allow multiple selections.
2550# $labels -> (optional)
2551# A pointer to an associative array of labels to print next to each checkbox
2552# in the form $label{'value'}="Long explanatory label".
2553# Otherwise the provided values are used as the labels.
2554# Returns:
2555# A string containing the definition of a scrolling list.
2556####
2557'scrolling_list' => <<'END_OF_FUNC',
2558sub scrolling_list {
2559 my($self,@p) = self_or_default(@_);
29ddc2a4 2560 my($name,$values,$defaults,$size,$multiple,$labels,$attributes,$override,$tabindex,@other)
3d1a2ec4 2561 = rearrange([NAME,[VALUES,VALUE],[DEFAULTS,DEFAULT],
29ddc2a4 2562 SIZE,MULTIPLE,LABELS,ATTRIBUTES,[OVERRIDE,FORCE],TABINDEX],@p);
54310121 2563
424ec8fa
GS
2564 my($result,@values);
2565 @values = $self->_set_values_and_labels($values,\$labels,$name);
2566
54310121 2567 $size = $size || scalar(@values);
2568
2569 my(%selected) = $self->previous_or_default($name,$defaults,$override);
ac734d8b 2570 my($is_multiple) = $multiple ? qq/ multiple="multiple"/ : '';
6b4ac661 2571 my($has_size) = $size ? qq/ size="$size"/: '';
54310121 2572 my($other) = @other ? " @other" : '';
2573
2574 $name=$self->escapeHTML($name);
29ddc2a4 2575 $tabindex = $self->element_tab($tabindex);
0a9bdad4 2576 $result = qq/<select name="$name" $tabindex$has_size$is_multiple$other>\n/;
54310121 2577 foreach (@values) {
3acbd4f5 2578 my($selectit) = $self->_selected($selected{$_});
54310121 2579 my($label) = $_;
424ec8fa 2580 $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
54310121 2581 $label=$self->escapeHTML($label);
a3b3a725 2582 my($value)=$self->escapeHTML($_,1);
188ba755 2583 my $attribs = $self->_set_attributes($_, $attributes);
1f426928 2584 $result .= "<option ${selectit}${attribs}value=\"$value\">$label</option>\n";
54310121 2585 }
69c89ae7 2586 $result .= "</select>";
54310121 2587 $self->register_parameter($name);
2588 return $result;
2589}
2590END_OF_FUNC
2591
2592
2593#### Method: hidden
2594# Parameters:
2595# $name -> Name of the hidden field
2596# @default -> (optional) Initial values of field (may be an array)
2597# or
2598# $default->[initial values of field]
2599# Returns:
188ba755 2600# A string containing a <input type="hidden" name="name" value="value">
54310121 2601####
2602'hidden' => <<'END_OF_FUNC',
2603sub hidden {
2604 my($self,@p) = self_or_default(@_);
2605
2606 # this is the one place where we departed from our standard
2607 # calling scheme, so we have to special-case (darn)
2608 my(@result,@value);
2609 my($name,$default,$override,@other) =
3d1a2ec4 2610 rearrange([NAME,[DEFAULT,VALUE,VALUES],[OVERRIDE,FORCE]],@p);
54310121 2611
2612 my $do_override = 0;
3d1a2ec4 2613 if ( ref($p[0]) || substr($p[0],0,1) eq '-') {
54310121 2614 @value = ref($default) ? @{$default} : $default;
2615 $do_override = $override;
2616 } else {
2617 foreach ($default,$override,@other) {
2618 push(@value,$_) if defined($_);
2619 }
2620 }
2621
2622 # use previous values if override is not set
2623 my @prev = $self->param($name);
2624 @value = @prev if !$do_override && @prev;
2625
2626 $name=$self->escapeHTML($name);
2627 foreach (@value) {
a3b3a725 2628 $_ = defined($_) ? $self->escapeHTML($_,1) : '';
13548fdf
RGS
2629 push @result,$XHTML ? qq(<input type="hidden" name="$name" value="$_" @other />)
2630 : qq(<input type="hidden" name="$name" value="$_" @other>);
54310121 2631 }
2632 return wantarray ? @result : join('',@result);
2633}
2634END_OF_FUNC
2635
2636
2637#### Method: image_button
2638# Parameters:
2639# $name -> Name of the button
2640# $src -> URL of the image source
2641# $align -> Alignment style (TOP, BOTTOM or MIDDLE)
2642# Returns:
188ba755 2643# A string containing a <input type="image" name="name" src="url" align="alignment">
54310121 2644####
2645'image_button' => <<'END_OF_FUNC',
2646sub image_button {
2647 my($self,@p) = self_or_default(@_);
2648
2649 my($name,$src,$alignment,@other) =
3d1a2ec4 2650 rearrange([NAME,SRC,ALIGN],@p);
54310121 2651
0664a57d 2652 my($align) = $alignment ? " align=\L\"$alignment\"" : '';
54310121 2653 my($other) = @other ? " @other" : '';
2654 $name=$self->escapeHTML($name);
6b4ac661
JH
2655 return $XHTML ? qq(<input type="image" name="$name" src="$src"$align$other />)
2656 : qq/<input type="image" name="$name" src="$src"$align$other>/;
54310121 2657}
2658END_OF_FUNC
2659
2660
2661#### Method: self_url
2662# Returns a URL containing the current script and all its
2663# param/value pairs arranged as a query. You can use this
2664# to create a link that, when selected, will reinvoke the
2665# script with all its state information preserved.
2666####
2667'self_url' => <<'END_OF_FUNC',
2668sub self_url {
424ec8fa
GS
2669 my($self,@p) = self_or_default(@_);
2670 return $self->url('-path_info'=>1,'-query'=>1,'-full'=>1,@p);
54310121 2671}
2672END_OF_FUNC
2673
2674
2675# This is provided as a synonym to self_url() for people unfortunate
2676# enough to have incorporated it into their programs already!
2677'state' => <<'END_OF_FUNC',
2678sub state {
2679 &self_url;
2680}
2681END_OF_FUNC
2682
2683
2684#### Method: url
2685# Like self_url, but doesn't return the query string part of
2686# the URL.
2687####
2688'url' => <<'END_OF_FUNC',
2689sub url {
424ec8fa 2690 my($self,@p) = self_or_default(@_);
0a9bdad4
SP
2691 my ($relative,$absolute,$full,$path_info,$query,$base,$rewrite) =
2692 rearrange(['RELATIVE','ABSOLUTE','FULL',['PATH','PATH_INFO'],['QUERY','QUERY_STRING'],'BASE','REWRITE'],@p);
2693 my $url = '';
2371fea9 2694 $full++ if $base || !($relative || $absolute);
0a9bdad4 2695 $rewrite++ unless defined $rewrite;
424ec8fa 2696
0a9bdad4
SP
2697 my $path = $self->path_info;
2698 my $script_name = $self->script_name;
cb3b230c 2699 my $request_uri = unescape($self->request_uri) || '';
0a9bdad4
SP
2700 my $query_str = $self->query_string;
2701
2702 my $rewrite_in_use = $request_uri && $request_uri !~ /^$script_name/;
2703 undef $path if $rewrite_in_use && $rewrite; # path not valid when rewriting active
2704
2705 my $uri = $rewrite && $request_uri ? $request_uri : $script_name;
edc47407 2706 $uri =~ s/\?.*$//; # remove query string
adb86593 2707 $uri =~ s/\Q$path\E$// if defined $path; # remove path
d45d855d 2708
424ec8fa
GS
2709 if ($full) {
2710 my $protocol = $self->protocol();
2711 $url = "$protocol://";
2c454cbd
SP
2712 my $vh = http('x_forwarded_host') || http('host') || '';
2713 $vh =~ s/\:\d+$//; # some clients add the port number (incorrectly). Get rid of it.
424ec8fa
GS
2714 if ($vh) {
2715 $url .= $vh;
2716 } else {
2717 $url .= server_name();
424ec8fa 2718 }
8869a4b7
SP
2719 my $port = $self->server_port;
2720 $url .= ":" . $port
2721 unless (lc($protocol) eq 'http' && $port == 80)
2722 || (lc($protocol) eq 'https' && $port == 443);
03b9648d 2723 return $url if $base;
0a9bdad4 2724 $url .= $uri;
424ec8fa 2725 } elsif ($relative) {
cb3b230c 2726 ($url) = $uri =~ m!([^/]+)$!;
424ec8fa 2727 } elsif ($absolute) {
0a9bdad4 2728 $url = $uri;
424ec8fa 2729 }
03b9648d 2730
0a9bdad4
SP
2731 $url .= $path if $path_info and defined $path;
2732 $url .= "?$query_str" if $query and $query_str ne '';
2371fea9 2733 $url =~ s/([^a-zA-Z0-9_.%;&?\/\\:+=~-])/sprintf("%%%02X",ord($1))/eg;
424ec8fa 2734 return $url;
54310121 2735}
2736
2737END_OF_FUNC
2738
2739#### Method: cookie
2740# Set or read a cookie from the specified name.
2741# Cookie can then be passed to header().
2742# Usual rules apply to the stickiness of -value.
2743# Parameters:
2744# -name -> name for this cookie (optional)
2745# -value -> value of this cookie (scalar, array or hash)
2746# -path -> paths for which this cookie is valid (optional)
2747# -domain -> internet domain in which this cookie is valid (optional)
2748# -secure -> if true, cookie only passed through secure channel (optional)
7d37aa8e 2749# -expires -> expiry date in format Wdy, DD-Mon-YYYY HH:MM:SS GMT (optional)
54310121 2750####
2751'cookie' => <<'END_OF_FUNC',
54310121 2752sub cookie {
2753 my($self,@p) = self_or_default(@_);
fc786e8b
SP
2754 my($name,$value,$path,$domain,$secure,$expires,$httponly) =
2755 rearrange([NAME,[VALUE,VALUES],PATH,DOMAIN,SECURE,EXPIRES,HTTPONLY],@p);
54310121 2756
424ec8fa 2757 require CGI::Cookie;
54310121 2758
2759 # if no value is supplied, then we retrieve the
2760 # value of the cookie, if any. For efficiency, we cache the parsed
424ec8fa
GS
2761 # cookies in our state variables.
2762 unless ( defined($value) ) {
2763 $self->{'.cookies'} = CGI::Cookie->fetch
2764 unless $self->{'.cookies'};
54310121 2765
2766 # If no name is supplied, then retrieve the names of all our cookies.
2767 return () unless $self->{'.cookies'};
424ec8fa
GS
2768 return keys %{$self->{'.cookies'}} unless $name;
2769 return () unless $self->{'.cookies'}->{$name};
2770 return $self->{'.cookies'}->{$name}->value if defined($name) && $name ne '';
54310121 2771 }
54310121 2772
424ec8fa 2773 # If we get here, we're creating a new cookie
ba056755 2774 return undef unless defined($name) && $name ne ''; # this is an error
54310121 2775
424ec8fa
GS
2776 my @param;
2777 push(@param,'-name'=>$name);
2778 push(@param,'-value'=>$value);
2779 push(@param,'-domain'=>$domain) if $domain;
2780 push(@param,'-path'=>$path) if $path;
2781 push(@param,'-expires'=>$expires) if $expires;
2782 push(@param,'-secure'=>$secure) if $secure;
fc786e8b 2783 push(@param,'-httponly'=>$httponly) if $httponly;
54310121 2784
6b4ac661 2785 return new CGI::Cookie(@param);
54310121 2786}
2787END_OF_FUNC
2788
424ec8fa
GS
2789'parse_keywordlist' => <<'END_OF_FUNC',
2790sub parse_keywordlist {
2791 my($self,$tosplit) = @_;
2792 $tosplit = unescape($tosplit); # unescape the keywords
2793 $tosplit=~tr/+/ /; # pluses to spaces
2794 my(@keywords) = split(/\s+/,$tosplit);
2795 return @keywords;
2796}
2797END_OF_FUNC
2798
2799'param_fetch' => <<'END_OF_FUNC',
2800sub param_fetch {
2801 my($self,@p) = self_or_default(@_);
3d1a2ec4 2802 my($name) = rearrange([NAME],@p);
424ec8fa
GS
2803 unless (exists($self->{$name})) {
2804 $self->add_parameter($name);
2805 $self->{$name} = [];
2806 }
2807
2808 return $self->{$name};
2809}
2810END_OF_FUNC
2811
54310121 2812###############################################
2813# OTHER INFORMATION PROVIDED BY THE ENVIRONMENT
2814###############################################
2815
2816#### Method: path_info
2817# Return the extra virtual path information provided
2818# after the URL (if any)
2819####
2820'path_info' => <<'END_OF_FUNC',
2821sub path_info {
424ec8fa
GS
2822 my ($self,$info) = self_or_default(@_);
2823 if (defined($info)) {
2824 $info = "/$info" if $info ne '' && substr($info,0,1) ne '/';
2825 $self->{'.path_info'} = $info;
2826 } elsif (! defined($self->{'.path_info'}) ) {
7dc108d1
SP
2827 my (undef,$path_info) = $self->_name_and_path_from_env;
2828 $self->{'.path_info'} = $path_info || '';
424ec8fa
GS
2829 }
2830 return $self->{'.path_info'};
54310121 2831}
2832END_OF_FUNC
2833
7dc108d1
SP
2834# WE USE THIS TO COMPENSATE FOR A BUG IN APACHE 2 PRESENT AT LEAST UP THROUGH 2.0.54
2835'_name_and_path_from_env' => <<'END_OF_FUNC',
2836sub _name_and_path_from_env {
2837 my $self = shift;
2838 my $raw_script_name = $ENV{SCRIPT_NAME} || '';
2839 my $raw_path_info = $ENV{PATH_INFO} || '';
cb3b230c 2840 my $uri = unescape($self->request_uri) || '';
7dc108d1 2841
adb86593
SP
2842 my $protected = quotemeta($raw_path_info);
2843 $raw_script_name =~ s/$protected$//;
0a9bdad4 2844
7dc108d1
SP
2845 my @uri_double_slashes = $uri =~ m^(/{2,}?)^g;
2846 my @path_double_slashes = "$raw_script_name $raw_path_info" =~ m^(/{2,}?)^g;
2847
2848 my $apache_bug = @uri_double_slashes != @path_double_slashes;
2849 return ($raw_script_name,$raw_path_info) unless $apache_bug;
2850
cb3b230c 2851 my $path_info_search = quotemeta($raw_path_info);
7dc108d1
SP
2852 $path_info_search =~ s!/!/+!g;
2853 if ($uri =~ m/^(.+)($path_info_search)/) {
2854 return ($1,$2);
2855 } else {
2856 return ($raw_script_name,$raw_path_info);
2857 }
2858}
2859END_OF_FUNC
2860
54310121 2861
2862#### Method: request_method
2863# Returns 'POST', 'GET', 'PUT' or 'HEAD'
2864####
2865'request_method' => <<'END_OF_FUNC',
2866sub request_method {
2867 return $ENV{'REQUEST_METHOD'};
2868}
2869END_OF_FUNC
2870
3538e1d5
GS
2871#### Method: content_type
2872# Returns the content_type string
2873####
2874'content_type' => <<'END_OF_FUNC',
2875sub content_type {
2876 return $ENV{'CONTENT_TYPE'};
2877}
2878END_OF_FUNC
2879
54310121 2880#### Method: path_translated
2881# Return the physical path information provided
2882# by the URL (if any)
2883####
2884'path_translated' => <<'END_OF_FUNC',
2885sub path_translated {
2886 return $ENV{'PATH_TRANSLATED'};
2887}
2888END_OF_FUNC
2889
2890
7dc108d1
SP
2891#### Method: request_uri
2892# Return the literal request URI
2893####
2894'request_uri' => <<'END_OF_FUNC',
2895sub request_uri {
2896 return $ENV{'REQUEST_URI'};
2897}
2898END_OF_FUNC
2899
2900
54310121 2901#### Method: query_string
2902# Synthesize a query string from our current
2903# parameters
2904####
2905'query_string' => <<'END_OF_FUNC',
2906sub query_string {
2907 my($self) = self_or_default(@_);
2908 my($param,$value,@pairs);
2909 foreach $param ($self->param) {
424ec8fa 2910 my($eparam) = escape($param);
54310121 2911 foreach $value ($self->param($param)) {
424ec8fa 2912 $value = escape($value);
3538e1d5 2913 next unless defined $value;
54310121 2914 push(@pairs,"$eparam=$value");
2915 }
2916 }
d45d855d
JH
2917 foreach (keys %{$self->{'.fieldnames'}}) {
2918 push(@pairs,".cgifields=".escape("$_"));
2919 }
71f3e297 2920 return join($USE_PARAM_SEMICOLONS ? ';' : '&',@pairs);
54310121 2921}
2922END_OF_FUNC
2923
2924
2925#### Method: accept
2926# Without parameters, returns an array of the
2927# MIME types the browser accepts.
2928# With a single parameter equal to a MIME
2929# type, will return undef if the browser won't
2930# accept it, 1 if the browser accepts it but
2931# doesn't give a preference, or a floating point
2932# value between 0.0 and 1.0 if the browser
2933# declares a quantitative score for it.
2934# This handles MIME type globs correctly.
2935####
71f3e297
JH
2936'Accept' => <<'END_OF_FUNC',
2937sub Accept {
54310121 2938 my($self,$search) = self_or_CGI(@_);
2939 my(%prefs,$type,$pref,$pat);
2940
2941 my(@accept) = split(',',$self->http('accept'));
2942
2943 foreach (@accept) {
2944 ($pref) = /q=(\d\.\d+|\d+)/;
2945 ($type) = m#(\S+/[^;]+)#;
2946 next unless $type;
2947 $prefs{$type}=$pref || 1;
2948 }
2949
2950 return keys %prefs unless $search;
2951
2952 # if a search type is provided, we may need to
2953 # perform a pattern matching operation.
2954 # The MIME types use a glob mechanism, which
2955 # is easily translated into a perl pattern match
2956
2957 # First return the preference for directly supported
2958 # types:
2959 return $prefs{$search} if $prefs{$search};
2960
2961 # Didn't get it, so try pattern matching.
2962 foreach (keys %prefs) {
2963 next unless /\*/; # not a pattern match
2964 ($pat = $_) =~ s/([^\w*])/\\$1/g; # escape meta characters
2965 $pat =~ s/\*/.*/g; # turn it into a pattern
2966 return $prefs{$_} if $search=~/$pat/;
2967 }
2968}
2969END_OF_FUNC
2970
2971
2972#### Method: user_agent
2973# If called with no parameters, returns the user agent.
2974# If called with one parameter, does a pattern match (case
2975# insensitive) on the user agent.
2976####
2977'user_agent' => <<'END_OF_FUNC',
2978sub user_agent {
2979 my($self,$match)=self_or_CGI(@_);
2980 return $self->http('user_agent') unless $match;
2981 return $self->http('user_agent') =~ /$match/i;
2982}
2983END_OF_FUNC
2984
2985
424ec8fa
GS
2986#### Method: raw_cookie
2987# Returns the magic cookies for the session.
2988# The cookies are not parsed or altered in any way, i.e.
2989# cookies are returned exactly as given in the HTTP
2990# headers. If a cookie name is given, only that cookie's
2991# value is returned, otherwise the entire raw cookie
2992# is returned.
54310121 2993####
2994'raw_cookie' => <<'END_OF_FUNC',
2995sub raw_cookie {
424ec8fa
GS
2996 my($self,$key) = self_or_CGI(@_);
2997
2998 require CGI::Cookie;
2999
3000 if (defined($key)) {
3001 $self->{'.raw_cookies'} = CGI::Cookie->raw_fetch
3002 unless $self->{'.raw_cookies'};
3003
3004 return () unless $self->{'.raw_cookies'};
3005 return () unless $self->{'.raw_cookies'}->{$key};
3006 return $self->{'.raw_cookies'}->{$key};
3007 }
54310121 3008 return $self->http('cookie') || $ENV{'COOKIE'} || '';
3009}
3010END_OF_FUNC
3011
3012#### Method: virtual_host
3013# Return the name of the virtual_host, which
3014# is not always the same as the server
3015######
3016'virtual_host' => <<'END_OF_FUNC',
3017sub virtual_host {
13548fdf 3018 my $vh = http('x_forwarded_host') || http('host') || server_name();
424ec8fa
GS
3019 $vh =~ s/:\d+$//; # get rid of port number
3020 return $vh;
54310121 3021}
3022END_OF_FUNC
3023
3024#### Method: remote_host
3025# Return the name of the remote host, or its IP
3026# address if unavailable. If this variable isn't
3027# defined, it returns "localhost" for debugging
3028# purposes.
3029####
3030'remote_host' => <<'END_OF_FUNC',
3031sub remote_host {
3032 return $ENV{'REMOTE_HOST'} || $ENV{'REMOTE_ADDR'}
3033 || 'localhost';
3034}
3035END_OF_FUNC
3036
3037
3038#### Method: remote_addr
3039# Return the IP addr of the remote host.
3040####
3041'remote_addr' => <<'END_OF_FUNC',
3042sub remote_addr {
3043 return $ENV{'REMOTE_ADDR'} || '127.0.0.1';
3044}
3045END_OF_FUNC
3046
3047
3048#### Method: script_name
3049# Return the partial URL to this script for
3050# self-referencing scripts. Also see
3051# self_url(), which returns a URL with all state information
3052# preserved.
3053####
3054'script_name' => <<'END_OF_FUNC',
3055sub script_name {
7dc108d1
SP
3056 my ($self,@p) = self_or_default(@_);
3057 if (@p) {
2c454cbd 3058 $self->{'.script_name'} = shift @p;
7dc108d1
SP
3059 } elsif (!exists $self->{'.script_name'}) {
3060 my ($script_name,$path_info) = $self->_name_and_path_from_env();
3061 $self->{'.script_name'} = $script_name;
3062 }
3063 return $self->{'.script_name'};
54310121 3064}
3065END_OF_FUNC
3066
3067
3068#### Method: referer
3069# Return the HTTP_REFERER: useful for generating
3070# a GO BACK button.
3071####
3072'referer' => <<'END_OF_FUNC',
3073sub referer {
3074 my($self) = self_or_CGI(@_);
3075 return $self->http('referer');
3076}
3077END_OF_FUNC
3078
3079
3080#### Method: server_name
3081# Return the name of the server
3082####
3083'server_name' => <<'END_OF_FUNC',
3084sub server_name {
3085 return $ENV{'SERVER_NAME'} || 'localhost';
3086}
3087END_OF_FUNC
3088
3089#### Method: server_software
3090# Return the name of the server software
3091####
3092'server_software' => <<'END_OF_FUNC',
3093sub server_software {
3094 return $ENV{'SERVER_SOFTWARE'} || 'cmdline';
3095}
3096END_OF_FUNC
3097
2ed511ec
RGS
3098#### Method: virtual_port
3099# Return the server port, taking virtual hosts into account
3100####
3101'virtual_port' => <<'END_OF_FUNC',
3102sub virtual_port {
3103 my($self) = self_or_default(@_);
13548fdf 3104 my $vh = $self->http('x_forwarded_host') || $self->http('host');
0a9bdad4 3105 my $protocol = $self->protocol;
2ed511ec 3106 if ($vh) {
0a9bdad4 3107 return ($vh =~ /:(\d+)$/)[0] || ($protocol eq 'https' ? 443 : 80);
2ed511ec
RGS
3108 } else {
3109 return $self->server_port();
3110 }
3111}
3112END_OF_FUNC
3113
54310121 3114#### Method: server_port
3115# Return the tcp/ip port the server is running on
3116####
3117'server_port' => <<'END_OF_FUNC',
3118sub server_port {
3119 return $ENV{'SERVER_PORT'} || 80; # for debugging
3120}
3121END_OF_FUNC
3122
3123#### Method: server_protocol
3124# Return the protocol (usually HTTP/1.0)
3125####
3126'server_protocol' => <<'END_OF_FUNC',
3127sub server_protocol {
3128 return $ENV{'SERVER_PROTOCOL'} || 'HTTP/1.0'; # for debugging
3129}
3130END_OF_FUNC
3131
3132#### Method: http
3133# Return the value of an HTTP variable, or
3134# the list of variables if none provided
3135####
3136'http' => <<'END_OF_FUNC',
3137sub http {
3138 my ($self,$parameter) = self_or_CGI(@_);
3139 return $ENV{$parameter} if $parameter=~/^HTTP/;
3538e1d5 3140 $parameter =~ tr/-/_/;
54310121 3141 return $ENV{"HTTP_\U$parameter\E"} if $parameter;
3142 my(@p);
3143 foreach (keys %ENV) {
3144 push(@p,$_) if /^HTTP/;
3145 }
3146 return @p;
3147}
3148END_OF_FUNC
3149
3150#### Method: https
3151# Return the value of HTTPS
3152####
3153'https' => <<'END_OF_FUNC',
3154sub https {
3155 local($^W)=0;
3156 my ($self,$parameter) = self_or_CGI(@_);
3157 return $ENV{HTTPS} unless $parameter;
3158 return $ENV{$parameter} if $parameter=~/^HTTPS/;
3538e1d5 3159 $parameter =~ tr/-/_/;
54310121 3160 return $ENV{"HTTPS_\U$parameter\E"} if $parameter;
3161 my(@p);
3162 foreach (keys %ENV) {
3163 push(@p,$_) if /^HTTPS/;
3164 }
3165 return @p;
3166}
3167END_OF_FUNC
3168
3169#### Method: protocol
3170# Return the protocol (http or https currently)
3171####
3172'protocol' => <<'END_OF_FUNC',
3173sub protocol {
3174 local($^W)=0;
3175 my $self = shift;
424ec8fa 3176 return 'https' if uc($self->https()) eq 'ON';
54310121 3177 return 'https' if $self->server_port == 443;
3178 my $prot = $self->server_protocol;
3179 my($protocol,$version) = split('/',$prot);
3180 return "\L$protocol\E";
3181}
3182END_OF_FUNC
3183
3184#### Method: remote_ident
3185# Return the identity of the remote user
3186# (but only if his host is running identd)
3187####
3188'remote_ident' => <<'END_OF_FUNC',
3189sub remote_ident {
3190 return $ENV{'REMOTE_IDENT'};
3191}
3192END_OF_FUNC
3193
3194
3195#### Method: auth_type
3196# Return the type of use verification/authorization in use, if any.
3197####
3198'auth_type' => <<'END_OF_FUNC',
3199sub auth_type {
3200 return $ENV{'AUTH_TYPE'};
3201}
3202END_OF_FUNC
3203
3204
3205#### Method: remote_user
3206# Return the authorization name used for user
3207# verification.
3208####
3209'remote_user' => <<'END_OF_FUNC',
3210sub remote_user {
3211 return $ENV{'REMOTE_USER'};
3212}
3213END_OF_FUNC
3214
3215
3216#### Method: user_name
3217# Try to return the remote user's name by hook or by
3218# crook
3219####
3220'user_name' => <<'END_OF_FUNC',
3221sub user_name {
3222 my ($self) = self_or_CGI(@_);
3223 return $self->http('from') || $ENV{'REMOTE_IDENT'} || $ENV{'REMOTE_USER'};
3224}
3225END_OF_FUNC
3226
3d1a2ec4
GS
3227#### Method: nosticky
3228# Set or return the NOSTICKY global flag
3229####
3230'nosticky' => <<'END_OF_FUNC',
3231sub nosticky {
3232 my ($self,$param) = self_or_CGI(@_);
3233 $CGI::NOSTICKY = $param if defined($param);
3234 return $CGI::NOSTICKY;
3235}
3236END_OF_FUNC
3237
54310121 3238#### Method: nph
3239# Set or return the NPH global flag
3240####
3241'nph' => <<'END_OF_FUNC',
3242sub nph {
3243 my ($self,$param) = self_or_CGI(@_);
7d37aa8e
LS
3244 $CGI::NPH = $param if defined($param);
3245 return $CGI::NPH;
3246}
3247END_OF_FUNC
3248
3249#### Method: private_tempfiles
3250# Set or return the private_tempfiles global flag
3251####
3252'private_tempfiles' => <<'END_OF_FUNC',
3253sub private_tempfiles {
3254 my ($self,$param) = self_or_CGI(@_);
424ec8fa 3255 $CGI::PRIVATE_TEMPFILES = $param if defined($param);
7d37aa8e 3256 return $CGI::PRIVATE_TEMPFILES;
54310121 3257}
3258END_OF_FUNC
8f3ccfa2
JH
3259#### Method: close_upload_files
3260# Set or return the close_upload_files global flag
3261####
3262'close_upload_files' => <<'END_OF_FUNC',
3263sub close_upload_files {
3264 my ($self,$param) = self_or_CGI(@_);
3265 $CGI::CLOSE_UPLOAD_FILES = $param if defined($param);
3266 return $CGI::CLOSE_UPLOAD_FILES;
3267}
3268END_OF_FUNC
3269
54310121 3270
424ec8fa
GS
3271#### Method: default_dtd
3272# Set or return the default_dtd global
3273####
3274'default_dtd' => <<'END_OF_FUNC',
3275sub default_dtd {
3d1a2ec4
GS
3276 my ($self,$param,$param2) = self_or_CGI(@_);
3277 if (defined $param2 && defined $param) {
3278 $CGI::DEFAULT_DTD = [ $param, $param2 ];
3279 } elsif (defined $param) {
3280 $CGI::DEFAULT_DTD = $param;
3281 }
424ec8fa
GS
3282 return $CGI::DEFAULT_DTD;
3283}
3284END_OF_FUNC
3285
54310121 3286# -------------- really private subroutines -----------------
3287'previous_or_default' => <<'END_OF_FUNC',
3288sub previous_or_default {
3289 my($self,$name,$defaults,$override) = @_;
3290 my(%selected);
3291
3292 if (!$override && ($self->{'.fieldnames'}->{$name} ||
3293 defined($self->param($name)) ) ) {
3294 grep($selected{$_}++,$self->param($name));
3295 } elsif (defined($defaults) && ref($defaults) &&
3296 (ref($defaults) eq 'ARRAY')) {
3297 grep($selected{$_}++,@{$defaults});
3298 } else {
3299 $selected{$defaults}++ if defined($defaults);
3300 }
3301
3302 return %selected;
3303}
3304END_OF_FUNC
3305
3306'register_parameter' => <<'END_OF_FUNC',
3307sub register_parameter {
3308 my($self,$param) = @_;
3309 $self->{'.parametersToAdd'}->{$param}++;
3310}
3311END_OF_FUNC
3312
3313'get_fields' => <<'END_OF_FUNC',
3314sub get_fields {
3315 my($self) = @_;
424ec8fa
GS
3316 return $self->CGI::hidden('-name'=>'.cgifields',
3317 '-values'=>[keys %{$self->{'.parametersToAdd'}}],
3318 '-override'=>1);
54310121 3319}
3320END_OF_FUNC
3321
3322'read_from_cmdline' => <<'END_OF_FUNC',
3323sub read_from_cmdline {
54310121 3324 my($input,@words);
3325 my($query_string);
2ed511ec 3326 my($subpath);
3d1a2ec4 3327 if ($DEBUG && @ARGV) {
424ec8fa 3328 @words = @ARGV;
3d1a2ec4 3329 } elsif ($DEBUG > 1) {
424ec8fa 3330 require "shellwords.pl";
2ed511ec 3331 print STDERR "(offline mode: enter name=value pairs on standard input; press ^D or ^Z when done)\n";
424ec8fa 3332 chomp(@lines = <STDIN>); # remove newlines
54310121 3333 $input = join(" ",@lines);
424ec8fa
GS
3334 @words = &shellwords($input);
3335 }
3336 foreach (@words) {
3337 s/\\=/%3D/g;
3338 s/\\&/%26/g;
54310121 3339 }
3340
54310121 3341 if ("@words"=~/=/) {
3342 $query_string = join('&',@words);
3343 } else {
3344 $query_string = join('+',@words);
3345 }
2ed511ec
RGS
3346 if ($query_string =~ /^(.*?)\?(.*)$/)
3347 {
3348 $query_string = $2;
3349 $subpath = $1;
3350 }
3351 return { 'query_string' => $query_string, 'subpath' => $subpath };
54310121 3352}
3353END_OF_FUNC
3354
3355#####
3356# subroutine: read_multipart
3357#
3358# Read multipart data and store it into our parameters.
3359# An interesting feature is that if any of the parts is a file, we
3360# create a temporary file and open up a filehandle on it so that the
3361# caller can read from it if necessary.
3362#####
3363'read_multipart' => <<'END_OF_FUNC',
3364sub read_multipart {
2ed511ec
RGS
3365 my($self,$boundary,$length) = @_;
3366 my($buffer) = $self->new_MultipartBuffer($boundary,$length);
54310121 3367 return unless $buffer;
3368 my(%header,$body);
424ec8fa 3369 my $filenumber = 0;
54310121 3370 while (!$buffer->eof) {
3371 %header = $buffer->readHeader;
3538e1d5
GS
3372
3373 unless (%header) {
3374 $self->cgi_error("400 Bad request (malformed multipart POST)");
3375 return;
3376 }
54310121 3377
c29edf6c 3378 my($param)= $header{'Content-Disposition'}=~/ name="([^"]*)"/;
188ba755 3379 $param .= $TAINTED;
54310121 3380
424ec8fa 3381 # Bug: Netscape doesn't escape quotation marks in file names!!!
c29edf6c 3382 my($filename) = $header{'Content-Disposition'}=~/ filename="([^"]*)"/;
8f3ccfa2
JH
3383 # Test for Opera's multiple upload feature
3384 my($multipart) = ( defined( $header{'Content-Type'} ) &&
3385 $header{'Content-Type'} =~ /multipart\/mixed/ ) ?
3386 1 : 0;
54310121 3387
3388 # add this parameter to our list
3389 $self->add_parameter($param);
3390
3391 # If no filename specified, then just read the data and assign it
3392 # to our parameter list.
8f3ccfa2 3393 if ( ( !defined($filename) || $filename eq '' ) && !$multipart ) {
54310121 3394 my($value) = $buffer->readBody;
188ba755 3395 $value .= $TAINTED;
54310121 3396 push(@{$self->{$param}},$value);
3397 next;
3398 }
3399
424ec8fa
GS
3400 my ($tmpfile,$tmp,$filehandle);
3401 UPLOADS: {
3402 # If we get here, then we are dealing with a potentially large
3403 # uploaded form. Save the data to a temporary file, then open
3404 # the file for reading.
54310121 3405
424ec8fa
GS
3406 # skip the file if uploads disabled
3407 if ($DISABLE_UPLOADS) {
3408 while (defined($data = $buffer->read)) { }
3409 last UPLOADS;
3410 }
7d37aa8e 3411
8f3ccfa2
JH
3412 # set the filename to some recognizable value
3413 if ( ( !defined($filename) || $filename eq '' ) && $multipart ) {
3414 $filename = "multipart/mixed";
3415 }
3416
3538e1d5 3417 # choose a relatively unpredictable tmpfile sequence number
29ddc2a4 3418 my $seqno = unpack("%16C*",join('',localtime,grep {defined $_} values %ENV));
3538e1d5 3419 for (my $cnt=10;$cnt>0;$cnt--) {
ac734d8b 3420 next unless $tmpfile = new CGITempFile($seqno);
3538e1d5 3421 $tmp = $tmpfile->as_string;
ffd2dff2 3422 last if defined($filehandle = Fh->new($filename,$tmp,$PRIVATE_TEMPFILES));
3538e1d5
GS
3423 $seqno += int rand(100);
3424 }
69c89ae7 3425 die "CGI open of tmpfile: $!\n" unless defined $filehandle;
2ed511ec
RGS
3426 $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode
3427 && defined fileno($filehandle);
424ec8fa 3428
8f3ccfa2 3429 # if this is an multipart/mixed attachment, save the header
2ed511ec 3430 # together with the body for later parsing with an external
8f3ccfa2
JH
3431 # MIME parser module
3432 if ( $multipart ) {
3433 foreach ( keys %header ) {
3434 print $filehandle "$_: $header{$_}${CRLF}";
3435 }
3436 print $filehandle "${CRLF}";
3437 }
3438
424ec8fa 3439 my ($data);
71f3e297 3440 local($\) = '';
bb8b3399 3441 my $totalbytes = 0;
2ed511ec
RGS
3442 while (defined($data = $buffer->read)) {
3443 if (defined $self->{'.upload_hook'})
3444 {
3445 $totalbytes += length($data);
3446 &{$self->{'.upload_hook'}}($filename ,$data, $totalbytes, $self->{'.upload_data'});
3447 }
cb3b230c 3448 print $filehandle $data if ($self->{'use_tempfile'});
2ed511ec 3449 }
424ec8fa
GS
3450
3451 # back up to beginning of file
3452 seek($filehandle,0,0);
8f3ccfa2
JH
3453
3454 ## Close the filehandle if requested this allows a multipart MIME
3455 ## upload to contain many files, and we won't die due to too many
3456 ## open file handles. The user can access the files using the hash
3457 ## below.
3458 close $filehandle if $CLOSE_UPLOAD_FILES;
424ec8fa
GS
3459 $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode;
3460
3461 # Save some information about the uploaded file where we can get
3462 # at it later.
0a9bdad4
SP
3463 # Use the typeglob as the key, as this is guaranteed to be
3464 # unique for each filehandle. Don't use the file descriptor as
3465 # this will be re-used for each filehandle if the
3466 # close_upload_files feature is used.
3467 $self->{'.tmpfiles'}->{$$filehandle}= {
2ed511ec 3468 hndl => $filehandle,
424ec8fa
GS
3469 name => $tmpfile,
3470 info => {%header},
3471 };
3472 push(@{$self->{$param}},$filehandle);
3473 }
54310121 3474 }
3475}
3476END_OF_FUNC
3477
8869a4b7
SP
3478#####
3479# subroutine: read_multipart_related
3480#
3481# Read multipart/related data and store it into our parameters. The
3482# first parameter sets the start of the data. The part identified by
3483# this Content-ID will not be stored as a file upload, but will be
3484# returned by this method. All other parts will be available as file
3485# uploads accessible by their Content-ID
3486#####
3487'read_multipart_related' => <<'END_OF_FUNC',
3488sub read_multipart_related {
3489 my($self,$start,$boundary,$length) = @_;
3490 my($buffer) = $self->new_MultipartBuffer($boundary,$length);
3491 return unless $buffer;
3492 my(%header,$body);
3493 my $filenumber = 0;
3494 my $returnvalue;
3495 while (!$buffer->eof) {
3496 %header = $buffer->readHeader;
3497
3498 unless (%header) {
3499 $self->cgi_error("400 Bad request (malformed multipart POST)");
3500 return;
3501 }
3502
3503 my($param) = $header{'Content-ID'}=~/\<([^\>]*)\>/;
3504 $param .= $TAINTED;
3505
3506 # If this is the start part, then just read the data and assign it
3507 # to our return variable.
3508 if ( $param eq $start ) {
3509 $returnvalue = $buffer->readBody;
3510 $returnvalue .= $TAINTED;
3511 next;
3512 }
3513
3514 # add this parameter to our list
3515 $self->add_parameter($param);
3516
3517 my ($tmpfile,$tmp,$filehandle);
3518 UPLOADS: {
3519 # If we get here, then we are dealing with a potentially large
3520 # uploaded form. Save the data to a temporary file, then open
3521 # the file for reading.
3522
3523 # skip the file if uploads disabled
3524 if ($DISABLE_UPLOADS) {
3525 while (defined($data = $buffer->read)) { }
3526 last UPLOADS;
3527 }
3528
3529 # choose a relatively unpredictable tmpfile sequence number
3530 my $seqno = unpack("%16C*",join('',localtime,grep {defined $_} values %ENV));
3531 for (my $cnt=10;$cnt>0;$cnt--) {
3532 next unless $tmpfile = new CGITempFile($seqno);
3533 $tmp = $tmpfile->as_string;
3534 last if defined($filehandle = Fh->new($param,$tmp,$PRIVATE_TEMPFILES));
3535 $seqno += int rand(100);
3536 }
3537 die "CGI open of tmpfile: $!\n" unless defined $filehandle;
3538 $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode
3539 && defined fileno($filehandle);
3540
3541 my ($data);
3542 local($\) = '';
3543 my $totalbytes;
3544 while (defined($data = $buffer->read)) {
3545 if (defined $self->{'.upload_hook'})
3546 {
3547 $totalbytes += length($data);
3548 &{$self->{'.upload_hook'}}($param ,$data, $totalbytes, $self->{'.upload_data'});
3549 }
3550 print $filehandle $data if ($self->{'use_tempfile'});
3551 }
3552
3553 # back up to beginning of file
3554 seek($filehandle,0,0);
3555
3556 ## Close the filehandle if requested this allows a multipart MIME
3557 ## upload to contain many files, and we won't die due to too many
3558 ## open file handles. The user can access the files using the hash
3559 ## below.
3560 close $filehandle if $CLOSE_UPLOAD_FILES;
3561 $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode;
3562
3563 # Save some information about the uploaded file where we can get
3564 # at it later.
3565 # Use the typeglob as the key, as this is guaranteed to be
3566 # unique for each filehandle. Don't use the file descriptor as
3567 # this will be re-used for each filehandle if the
3568 # close_upload_files feature is used.
3569 $self->{'.tmpfiles'}->{$$filehandle}= {
3570 hndl => $filehandle,
3571 name => $tmpfile,
3572 info => {%header},
3573 };
3574 push(@{$self->{$param}},$filehandle);
3575 }
3576 }
3577 return $returnvalue;
3578}
3579END_OF_FUNC
3580
3581
3538e1d5
GS
3582'upload' =><<'END_OF_FUNC',
3583sub upload {
3584 my($self,$param_name) = self_or_default(@_);
0664a57d 3585 my @param = grep {ref($_) && defined(fileno($_))} $self->param($param_name);
199d4a26
JH
3586 return unless @param;
3587 return wantarray ? @param : $param[0];
3538e1d5
GS
3588}
3589END_OF_FUNC
3590
54310121 3591'tmpFileName' => <<'END_OF_FUNC',
3592sub tmpFileName {
3593 my($self,$filename) = self_or_default(@_);
0a9bdad4
SP
3594 return $self->{'.tmpfiles'}->{$$filename}->{name} ?
3595 $self->{'.tmpfiles'}->{$$filename}->{name}->as_string
7d37aa8e 3596 : '';
54310121 3597}
3598END_OF_FUNC
3599
424ec8fa 3600'uploadInfo' => <<'END_OF_FUNC',
54310121 3601sub uploadInfo {
3602 my($self,$filename) = self_or_default(@_);
0a9bdad4 3603 return $self->{'.tmpfiles'}->{$$filename}->{info};
54310121 3604}
3605END_OF_FUNC
3606
424ec8fa
GS
3607# internal routine, don't use
3608'_set_values_and_labels' => <<'END_OF_FUNC',
3609sub _set_values_and_labels {
3610 my $self = shift;
3611 my ($v,$l,$n) = @_;
3612 $$l = $v if ref($v) eq 'HASH' && !ref($$l);
3613 return $self->param($n) if !defined($v);
3614 return $v if !ref($v);
3615 return ref($v) eq 'HASH' ? keys %$v : @$v;
3616}
3617END_OF_FUNC
3618
188ba755
JH
3619# internal routine, don't use
3620'_set_attributes' => <<'END_OF_FUNC',
3621sub _set_attributes {
3622 my $self = shift;
3623 my($element, $attributes) = @_;
3624 return '' unless defined($attributes->{$element});
3625 $attribs = ' ';
3626 foreach my $attrib (keys %{$attributes->{$element}}) {
13548fdf
RGS
3627 (my $clean_attrib = $attrib) =~ s/^-//;
3628 $attribs .= "@{[lc($clean_attrib)]}=\"$attributes->{$element}{$attrib}\" ";
188ba755
JH
3629 }
3630 $attribs =~ s/ $//;
3631 return $attribs;
3632}
3633END_OF_FUNC
3634
424ec8fa
GS
3635'_compile_all' => <<'END_OF_FUNC',
3636sub _compile_all {
3637 foreach (@_) {
3638 next if defined(&$_);
3639 $AUTOLOAD = "CGI::$_";
3640 _compile();
3641 }
3642}
3643END_OF_FUNC
3644
54310121 3645);
3646END_OF_AUTOLOAD
3647;
3648
424ec8fa
GS
3649#########################################################
3650# Globals and stubs for other packages that we use.
3651#########################################################
3652
3653################### Fh -- lightweight filehandle ###############
3654package Fh;
3655use overload
3656 '""' => \&asString,
3657 'cmp' => \&compare,
3658 'fallback'=>1;
3659
3660$FH='fh00000';
3661
3662*Fh::AUTOLOAD = \&CGI::AUTOLOAD;
3663
29ddc2a4
RGS
3664sub DESTROY {
3665 my $self = shift;
3666 close $self;
3667}
3668
424ec8fa
GS
3669$AUTOLOADED_ROUTINES = ''; # prevent -w error
3670$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
3671%SUBS = (
3672'asString' => <<'END_OF_FUNC',
3673sub asString {
3674 my $self = shift;
71f3e297 3675 # get rid of package name
ffd2dff2 3676 (my $i = $$self) =~ s/^\*(\w+::fh\d{5})+//;
ba056755 3677 $i =~ s/%(..)/ chr(hex($1)) /eg;
188ba755 3678 return $i.$CGI::TAINTED;
71f3e297
JH
3679# BEGIN DEAD CODE
3680# This was an extremely clever patch that allowed "use strict refs".
3681# Unfortunately it relied on another bug that caused leaky file descriptors.
3682# The underlying bug has been fixed, so this no longer works. However
3683# "strict refs" still works for some reason.
3684# my $self = shift;
3685# return ${*{$self}{SCALAR}};
3686# END DEAD CODE
424ec8fa
GS
3687}
3688END_OF_FUNC
3689
3690'compare' => <<'END_OF_FUNC',
3691sub compare {
3692 my $self = shift;
3693 my $value = shift;
3694 return "$self" cmp $value;
3695}
3696END_OF_FUNC
3697
3698'new' => <<'END_OF_FUNC',
3699sub new {
3700 my($pack,$name,$file,$delete) = @_;
188ba755 3701 _setup_symbols(@SAVED_SYMBOLS) if @SAVED_SYMBOLS;
424ec8fa 3702 require Fcntl unless defined &Fcntl::O_RDWR;
ba056755
JH
3703 (my $safename = $name) =~ s/([':%])/ sprintf '%%%02X', ord $1 /eg;
3704 my $fv = ++$FH . $safename;
6b4ac661 3705 my $ref = \*{"Fh::$fv"};
bb8b3399 3706 $file =~ m!^([a-zA-Z0-9_\+ \'\":/.\$\\-]+)$! || return;
188ba755
JH
3707 my $safe = $1;
3708 sysopen($ref,$safe,Fcntl::O_RDWR()|Fcntl::O_CREAT()|Fcntl::O_EXCL(),0600) || return;
3709 unlink($safe) if $delete;
6b4ac661 3710 CORE::delete $Fh::{$fv};
71f3e297 3711 return bless $ref,$pack;
424ec8fa
GS
3712}
3713END_OF_FUNC
3714
424ec8fa
GS
3715);
3716END_OF_AUTOLOAD
3717
3718######################## MultipartBuffer ####################
54310121 3719package MultipartBuffer;
3720
2ed511ec
RGS
3721use constant DEBUG => 0;
3722
54310121 3723# how many bytes to read at a time. We use
71f3e297
JH
3724# a 4K buffer by default.
3725$INITIAL_FILLUNIT = 1024 * 4;
3726$TIMEOUT = 240*60; # 4 hour timeout for big files
3727$SPIN_LOOP_MAX = 2000; # bug fix for some Netscape servers
54310121 3728$CRLF=$CGI::CRLF;
3729
3730#reuse the autoload function
3731*MultipartBuffer::AUTOLOAD = \&CGI::AUTOLOAD;
3732
424ec8fa
GS
3733# avoid autoloader warnings
3734sub DESTROY {}
3735
54310121 3736###############################################################################
3737################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND ####################
3738###############################################################################
3739$AUTOLOADED_ROUTINES = ''; # prevent -w error
3740$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
3741%SUBS = (
3742
3743'new' => <<'END_OF_FUNC',
3744sub new {
2ed511ec 3745 my($package,$interface,$boundary,$length) = @_;
424ec8fa 3746 $FILLUNIT = $INITIAL_FILLUNIT;
2ed511ec 3747 $CGI::DefaultClass->binmode($IN); # if $CGI::needs_binmode; # just do it always
29ddc2a4 3748
54310121 3749 # If the user types garbage into the file upload field,
3750 # then Netscape passes NOTHING to the server (not good).
3751 # We may hang on this read in that case. So we implement
3752 # a read timeout. If nothing is ready to read
3753 # by then, we return.
3754
3755 # Netscape seems to be a little bit unreliable
3756 # about providing boundary strings.
3d1a2ec4 3757 my $boundary_read = 0;
54310121 3758 if ($boundary) {
3759
3760 # Under the MIME spec, the boundary consists of the
3761 # characters "--" PLUS the Boundary string
424ec8fa
GS
3762
3763 # BUG: IE 3.01 on the Macintosh uses just the boundary -- not
71f3e297 3764 # the two extra hyphens. We do a special case here on the user-agent!!!!
69c89ae7 3765 $boundary = "--$boundary" unless CGI::user_agent('MSIE\s+3\.0[12];\s*Mac|DreamPassport');
424ec8fa 3766
54310121 3767 } else { # otherwise we find it ourselves
3768 my($old);
3769 ($old,$/) = ($/,$CRLF); # read a CRLF-delimited line
2ed511ec 3770 $boundary = <STDIN>; # BUG: This won't work correctly under mod_perl
54310121 3771 $length -= length($boundary);
3772 chomp($boundary); # remove the CRLF
3773 $/ = $old; # restore old line separator
3d1a2ec4 3774 $boundary_read++;
54310121 3775 }
3776
3777 my $self = {LENGTH=>$length,
29ddc2a4 3778 CHUNKED=>!defined $length,
54310121 3779 BOUNDARY=>$boundary,
54310121 3780 INTERFACE=>$interface,
3781 BUFFER=>'',
3782 };
3783
3784 $FILLUNIT = length($boundary)
3785 if length($boundary) > $FILLUNIT;
3786
424ec8fa
GS
3787 my $retval = bless $self,ref $package || $package;
3788
3789 # Read the preamble and the topmost (boundary) line plus the CRLF.
3d1a2ec4
GS
3790 unless ($boundary_read) {
3791 while ($self->read(0)) { }
3792 }
2ed511ec 3793 die "Malformed multipart POST: data truncated\n" if $self->eof;
424ec8fa
GS
3794
3795 return $retval;
54310121 3796}
3797END_OF_FUNC
3798
3799'readHeader' => <<'END_OF_FUNC',
3800sub readHeader {
3801 my($self) = @_;
3802 my($end);
3803 my($ok) = 0;
47e3cabd 3804 my($bad) = 0;
424ec8fa 3805
2ed511ec 3806 local($CRLF) = "\015\012" if $CGI::OS eq 'VMS' || $CGI::EBCDIC;
424ec8fa 3807
54310121 3808 do {
3809 $self->fillBuffer($FILLUNIT);
3810 $ok++ if ($end = index($self->{BUFFER},"${CRLF}${CRLF}")) >= 0;
3811 $ok++ if $self->{BUFFER} eq '';
47e3cabd 3812 $bad++ if !$ok && $self->{LENGTH} <= 0;
424ec8fa
GS
3813 # this was a bad idea
3814 # $FILLUNIT *= 2 if length($self->{BUFFER}) >= $FILLUNIT;
47e3cabd
LS
3815 } until $ok || $bad;
3816 return () if $bad;
54310121 3817
2ed511ec
RGS
3818 #EBCDIC NOTE: translate header into EBCDIC, but watch out for continuation lines!
3819
54310121 3820 my($header) = substr($self->{BUFFER},0,$end+2);
3821 substr($self->{BUFFER},0,$end+4) = '';
3822 my %return;
424ec8fa 3823
2ed511ec
RGS
3824 if ($CGI::EBCDIC) {
3825 warn "untranslated header=$header\n" if DEBUG;
3826 $header = CGI::Util::ascii2ebcdic($header);
3827 warn "translated header=$header\n" if DEBUG;
3828 }
3829
424ec8fa
GS
3830 # See RFC 2045 Appendix A and RFC 822 sections 3.4.8
3831 # (Folding Long Header Fields), 3.4.3 (Comments)
3832 # and 3.4.5 (Quoted-Strings).
3833
3834 my $token = '[-\w!\#$%&\'*+.^_\`|{}~]';
3835 $header=~s/$CRLF\s+/ /og; # merge continuation lines
188ba755 3836
424ec8fa 3837 while ($header=~/($token+):\s+([^$CRLF]*)/mgox) {
188ba755 3838 my ($field_name,$field_value) = ($1,$2);
424ec8fa
GS
3839 $field_name =~ s/\b(\w)/uc($1)/eg; #canonicalize
3840 $return{$field_name}=$field_value;
54310121 3841 }
3842 return %return;
3843}
3844END_OF_FUNC
3845
3846# This reads and returns the body as a single scalar value.
3847'readBody' => <<'END_OF_FUNC',
3848sub readBody {
3849 my($self) = @_;
3850 my($data);
3851 my($returnval)='';
2ed511ec
RGS
3852
3853 #EBCDIC NOTE: want to translate returnval into EBCDIC HERE
3854
54310121 3855 while (defined($data = $self->read)) {
3856 $returnval .= $data;
3857 }
2ed511ec
RGS
3858
3859 if ($CGI::EBCDIC) {
3860 warn "untranslated body=$returnval\n" if DEBUG;
3861 $returnval = CGI::Util::ascii2ebcdic($returnval);
3862 warn "translated body=$returnval\n" if DEBUG;
3863 }
54310121 3864 return $returnval;
3865}
3866END_OF_FUNC
3867
3868# This will read $bytes or until the boundary is hit, whichever happens
3869# first. After the boundary is hit, we return undef. The next read will
3870# skip over the boundary and begin reading again;
3871'read' => <<'END_OF_FUNC',
3872sub read {
3873 my($self,$bytes) = @_;
3874
3875 # default number of bytes to read
2ed511ec 3876 $bytes = $bytes || $FILLUNIT;
54310121 3877
3878 # Fill up our internal buffer in such a way that the boundary
3879 # is never split between reads.
3880 $self->fillBuffer($bytes);
3881
2ed511ec
RGS
3882 my $boundary_start = $CGI::EBCDIC ? CGI::Util::ebcdic2ascii($self->{BOUNDARY}) : $self->{BOUNDARY};
3883 my $boundary_end = $CGI::EBCDIC ? CGI::Util::ebcdic2ascii($self->{BOUNDARY}.'--') : $self->{BOUNDARY}.'--';
3884
54310121 3885 # Find the boundary in the buffer (it may not be there).
2ed511ec
RGS
3886 my $start = index($self->{BUFFER},$boundary_start);
3887
3888 warn "boundary=$self->{BOUNDARY} length=$self->{LENGTH} start=$start\n" if DEBUG;
54310121 3889
29ddc2a4
RGS
3890 # protect against malformed multipart POST operations
3891 die "Malformed multipart POST\n" unless $self->{CHUNKED} || ($start >= 0 || $self->{LENGTH} > 0);
2ed511ec
RGS
3892
3893 #EBCDIC NOTE: want to translate boundary search into ASCII here.
3894
54310121 3895 # If the boundary begins the data, then skip past it
03b9648d 3896 # and return undef.
54310121 3897 if ($start == 0) {
3898
3899 # clear us out completely if we've hit the last boundary.
2ed511ec 3900 if (index($self->{BUFFER},$boundary_end)==0) {
54310121 3901 $self->{BUFFER}='';
3902 $self->{LENGTH}=0;
3903 return undef;
3904 }
3905
3906 # just remove the boundary.
2ed511ec 3907 substr($self->{BUFFER},0,length($boundary_start))='';
03b9648d 3908 $self->{BUFFER} =~ s/^\012\015?//;
54310121 3909 return undef;
3910 }
3911
8f3ccfa2 3912 my $bytesToReturn;
54310121 3913 if ($start > 0) { # read up to the boundary
8f3ccfa2 3914 $bytesToReturn = $start-2 > $bytes ? $bytes : $start;
54310121 3915 } else { # read the requested number of bytes
3916 # leave enough bytes in the buffer to allow us to read
3917 # the boundary. Thanks to Kevin Hendrick for finding
3918 # this one.
2ed511ec 3919 $bytesToReturn = $bytes - (length($boundary_start)+1);
54310121 3920 }
3921
3922 my $returnval=substr($self->{BUFFER},0,$bytesToReturn);
3923 substr($self->{BUFFER},0,$bytesToReturn)='';
3924
3925 # If we hit the boundary, remove the CRLF from the end.
8f3ccfa2 3926 return ($bytesToReturn==$start)
ac734d8b 3927 ? substr($returnval,0,-2) : $returnval;
54310121 3928}
3929END_OF_FUNC
3930
3931
3932# This fills up our internal buffer in such a way that the
3933# boundary is never split between reads
3934'fillBuffer' => <<'END_OF_FUNC',
3935sub fillBuffer {
3936 my($self,$bytes) = @_;
29ddc2a4 3937 return unless $self->{CHUNKED} || $self->{LENGTH};
54310121 3938
3939 my($boundaryLength) = length($self->{BOUNDARY});
3940 my($bufferLength) = length($self->{BUFFER});
3941 my($bytesToRead) = $bytes - $bufferLength + $boundaryLength + 2;
29ddc2a4 3942 $bytesToRead = $self->{LENGTH} if !$self->{CHUNKED} && $self->{LENGTH} < $bytesToRead;
54310121 3943
2ed511ec
RGS
3944 # Try to read some data. We may hang here if the browser is screwed up.
3945 my $bytesRead = $self->{INTERFACE}->read_from_client(\$self->{BUFFER},
54310121 3946 $bytesToRead,
3947 $bufferLength);
2ed511ec 3948 warn "bytesToRead=$bytesToRead, bufferLength=$bufferLength, buffer=$self->{BUFFER}\n" if DEBUG;
71f3e297 3949 $self->{BUFFER} = '' unless defined $self->{BUFFER};
54310121 3950
47e3cabd 3951 # An apparent bug in the Apache server causes the read()
54310121 3952 # to return zero bytes repeatedly without blocking if the
3953 # remote user aborts during a file transfer. I don't know how
3954 # they manage this, but the workaround is to abort if we get
3955 # more than SPIN_LOOP_MAX consecutive zero reads.
29ddc2a4 3956 if ($bytesRead <= 0) {
54310121 3957 die "CGI.pm: Server closed socket during multipart read (client aborted?).\n"
3958 if ($self->{ZERO_LOOP_COUNTER}++ >= $SPIN_LOOP_MAX);
3959 } else {
3960 $self->{ZERO_LOOP_COUNTER}=0;
3961 }
3962
29ddc2a4 3963 $self->{LENGTH} -= $bytesRead if !$self->{CHUNKED} && $bytesRead;
54310121 3964}
3965END_OF_FUNC
3966
3967
3968# Return true when we've finished reading
3969'eof' => <<'END_OF_FUNC'
3970sub eof {
3971 my($self) = @_;
3972 return 1 if (length($self->{BUFFER}) == 0)
3973 && ($self->{LENGTH} <= 0);
3974 undef;
3975}
3976END_OF_FUNC
3977
3978);
3979END_OF_AUTOLOAD
3980
3981####################################################################################
3982################################## TEMPORARY FILES #################################
3983####################################################################################
ac734d8b 3984package CGITempFile;
54310121 3985
cff99809 3986sub find_tempdir {
cff99809
JH
3987 $SL = $CGI::SL;
3988 $MAC = $CGI::OS eq 'MACINTOSH';
3989 my ($vol) = $MAC ? MacPerl::Volumes() =~ /:(.*)/ : "";
0a9bdad4 3990 unless (defined $TMPDIRECTORY) {
424ec8fa 3991 @TEMP=("${SL}usr${SL}tmp","${SL}var${SL}tmp",
3538e1d5 3992 "C:${SL}temp","${SL}tmp","${SL}temp",
3d1a2ec4 3993 "${vol}${SL}Temporary Items",
ba056755
JH
3994 "${SL}WWW_ROOT", "${SL}SYS\$SCRATCH",
3995 "C:${SL}system${SL}temp");
188ba755 3996 unshift(@TEMP,$ENV{'TMPDIR'}) if defined $ENV{'TMPDIR'};
3538e1d5 3997
3d1a2ec4
GS
3998 # this feature was supposed to provide per-user tmpfiles, but
3999 # it is problematic.
3538e1d5
GS
4000 # unshift(@TEMP,(getpwuid($<))[7].'/tmp') if $CGI::OS eq 'UNIX';
4001 # Rob: getpwuid() is unfortunately UNIX specific. On brain dead OS'es this
4002 # : can generate a 'getpwuid() not implemented' exception, even though
4003 # : it's never called. Found under DOS/Win with the DJGPP perl port.
4004 # : Refer to getpwuid() only at run-time if we're fortunate and have UNIX.
3d1a2ec4 4005 # unshift(@TEMP,(eval {(getpwuid($>))[7]}).'/tmp') if $CGI::OS eq 'UNIX' and $> != 0;
3538e1d5 4006
54310121 4007 foreach (@TEMP) {
cff99809 4008 do {$TMPDIRECTORY = $_; last} if -d $_ && -w _;
54310121 4009 }
cff99809
JH
4010 }
4011 $TMPDIRECTORY = $MAC ? "" : "." unless $TMPDIRECTORY;
54310121 4012}
4013
cff99809
JH
4014find_tempdir();
4015
424ec8fa 4016$MAXTRIES = 5000;
54310121 4017
4018# cute feature, but overload implementation broke it
4019# %OVERLOAD = ('""'=>'as_string');
ac734d8b 4020*CGITempFile::AUTOLOAD = \&CGI::AUTOLOAD;
54310121 4021
2371fea9
JH
4022sub DESTROY {
4023 my($self) = @_;
188ba755
JH
4024 $$self =~ m!^([a-zA-Z0-9_ \'\":/.\$\\-]+)$! || return;
4025 my $safe = $1; # untaint operation
4026 unlink $safe; # get rid of the file
2371fea9
JH
4027}
4028
54310121 4029###############################################################################
4030################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND ####################
4031###############################################################################
4032$AUTOLOADED_ROUTINES = ''; # prevent -w error
4033$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
4034%SUBS = (
4035
4036'new' => <<'END_OF_FUNC',
4037sub new {
3538e1d5
GS
4038 my($package,$sequence) = @_;
4039 my $filename;
cff99809 4040 find_tempdir() unless -w $TMPDIRECTORY;
3538e1d5
GS
4041 for (my $i = 0; $i < $MAXTRIES; $i++) {
4042 last if ! -f ($filename = sprintf("${TMPDIRECTORY}${SL}CGItemp%d",$sequence++));
424ec8fa 4043 }
188ba755 4044 # check that it is a more-or-less valid filename
bb8b3399 4045 return unless $filename =~ m!^([a-zA-Z0-9_\+ \'\":/.\$\\-]+)$!;
188ba755
JH
4046 # this used to untaint, now it doesn't
4047 # $filename = $1;
3538e1d5 4048 return bless \$filename;
54310121 4049}
4050END_OF_FUNC
4051
54310121 4052'as_string' => <<'END_OF_FUNC'
4053sub as_string {
4054 my($self) = @_;
4055 return $$self;
4056}
4057END_OF_FUNC
4058
4059);
4060END_OF_AUTOLOAD
4061
4062package CGI;
4063
4064# We get a whole bunch of warnings about "possibly uninitialized variables"
4065# when running with the -w switch. Touch them all once to get rid of the
4066# warnings. This is ugly and I hate it.
4067if ($^W) {
4068 $CGI::CGI = '';
4069 $CGI::CGI=<<EOF;
4070 $CGI::VERSION;
4071 $MultipartBuffer::SPIN_LOOP_MAX;
4072 $MultipartBuffer::CRLF;
4073 $MultipartBuffer::TIMEOUT;
424ec8fa 4074 $MultipartBuffer::INITIAL_FILLUNIT;
54310121 4075EOF
4076 ;
4077}
4078
424ec8fa 40791;
54310121 4080
4081__END__
4082
4083=head1 NAME
4084
4085CGI - Simple Common Gateway Interface Class
4086
dc848c6f 4087=head1 SYNOPSIS
4088
424ec8fa
GS
4089 # CGI script that creates a fill-out form
4090 # and echoes back its values.
4091
4092 use CGI qw/:standard/;
4093 print header,
4094 start_html('A Simple Example'),
4095 h1('A Simple Example'),
4096 start_form,
4097 "What's your name? ",textfield('name'),p,
4098 "What's the combination?", p,
4099 checkbox_group(-name=>'words',
4100 -values=>['eenie','meenie','minie','moe'],
4101 -defaults=>['eenie','minie']), p,
4102 "What's your favorite color? ",
4103 popup_menu(-name=>'color',
4104 -values=>['red','green','blue','chartreuse']),p,
4105 submit,
4106 end_form,
4107 hr;
4108
4109 if (param()) {
7dc108d1
SP
4110 my $name = param('name');
4111 my $keywords = join ', ',param('words');
4112 my $color = param('color');
4113 print "Your name is",em(escapeHTML($name)),p,
4114 "The keywords are: ",em(escapeHTML($keywords)),p,
4115 "Your favorite color is ",em(escapeHTML($color)),
424ec8fa
GS
4116 hr;
4117 }
dc848c6f 4118
54310121 4119=head1 ABSTRACT
4120
424ec8fa
GS
4121This perl library uses perl5 objects to make it easy to create Web
4122fill-out forms and parse their contents. This package defines CGI
4123objects, entities that contain the values of the current query string
4124and other state variables. Using a CGI object's methods, you can
4125examine keywords and parameters passed to your script, and create
4126forms whose initial values are taken from the current query (thereby
4127preserving state information). The module provides shortcut functions
4128that produce boilerplate HTML, reducing typing and coding errors. It
4129also provides functionality for some of the more advanced features of
4130CGI scripting, including support for file uploads, cookies, cascading
4131style sheets, server push, and frames.
4132
4133CGI.pm also provides a simple function-oriented programming style for
4134those who don't need its object-oriented features.
54310121 4135
4136The current version of CGI.pm is available at
4137
4138 http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html
4139 ftp://ftp-genome.wi.mit.edu/pub/software/WWW/
4140
424ec8fa 4141=head1 DESCRIPTION
47e3cabd 4142
424ec8fa
GS
4143=head2 PROGRAMMING STYLE
4144
4145There are two styles of programming with CGI.pm, an object-oriented
4146style and a function-oriented style. In the object-oriented style you
4147create one or more CGI objects and then use object methods to create
4148the various elements of the page. Each CGI object starts out with the
4149list of named parameters that were passed to your CGI script by the
4150server. You can modify the objects, save them to a file or database
4151and recreate them. Because each object corresponds to the "state" of
4152the CGI script, and because each object's parameter list is
4153independent of the others, this allows you to save the state of the
4154script and restore it later.
4155
f610777f 4156For example, using the object oriented style, here is how you create
424ec8fa
GS
4157a simple "Hello World" HTML page:
4158
3538e1d5 4159 #!/usr/local/bin/perl -w
424ec8fa
GS
4160 use CGI; # load CGI routines
4161 $q = new CGI; # create new CGI object
4162 print $q->header, # create the HTTP header
4163 $q->start_html('hello world'), # start the HTML
4164 $q->h1('hello world'), # level 1 header
4165 $q->end_html; # end the HTML
4166
4167In the function-oriented style, there is one default CGI object that
4168you rarely deal with directly. Instead you just call functions to
4169retrieve CGI parameters, create HTML tags, manage cookies, and so
4170on. This provides you with a cleaner programming interface, but
4171limits you to using one CGI object at a time. The following example
4172prints the same page, but uses the function-oriented interface.
4173The main differences are that we now need to import a set of functions
4174into our name space (usually the "standard" functions), and we don't
4175need to create the CGI object.
4176
71f3e297 4177 #!/usr/local/bin/perl
424ec8fa
GS
4178 use CGI qw/:standard/; # load standard CGI routines
4179 print header, # create the HTTP header
4180 start_html('hello world'), # start the HTML
4181 h1('hello world'), # level 1 header
4182 end_html; # end the HTML
4183
4184The examples in this document mainly use the object-oriented style.
4185See HOW TO IMPORT FUNCTIONS for important information on
4186function-oriented programming in CGI.pm
4187
4188=head2 CALLING CGI.PM ROUTINES
4189
4190Most CGI.pm routines accept several arguments, sometimes as many as 20
4191optional ones! To simplify this interface, all routines use a named
4192argument calling style that looks like this:
4193
4194 print $q->header(-type=>'image/gif',-expires=>'+3d');
4195
4196Each argument name is preceded by a dash. Neither case nor order
4197matters in the argument list. -type, -Type, and -TYPE are all
4198acceptable. In fact, only the first argument needs to begin with a
4199dash. If a dash is present in the first argument, CGI.pm assumes
4200dashes for the subsequent ones.
4201
424ec8fa
GS
4202Several routines are commonly called with just one argument. In the
4203case of these routines you can provide the single argument without an
4204argument name. header() happens to be one of these routines. In this
4205case, the single argument is the document type.
4206
4207 print $q->header('text/html');
4208
4209Other such routines are documented below.
4210
4211Sometimes named arguments expect a scalar, sometimes a reference to an
4212array, and sometimes a reference to a hash. Often, you can pass any
4213type of argument and the routine will do whatever is most appropriate.
4214For example, the param() routine is used to set a CGI parameter to a
4215single or a multi-valued value. The two cases are shown below:
4216
4217 $q->param(-name=>'veggie',-value=>'tomato');
3d1a2ec4 4218 $q->param(-name=>'veggie',-value=>['tomato','tomahto','potato','potahto']);
424ec8fa
GS
4219
4220A large number of routines in CGI.pm actually aren't specifically
4221defined in the module, but are generated automatically as needed.
4222These are the "HTML shortcuts," routines that generate HTML tags for
4223use in dynamically-generated pages. HTML tags have both attributes
4224(the attribute="value" pairs within the tag itself) and contents (the
4225part between the opening and closing pairs.) To distinguish between
4226attributes and contents, CGI.pm uses the convention of passing HTML
4227attributes as a hash reference as the first argument, and the
4228contents, if any, as any subsequent arguments. It works out like
4229this:
4230
4231 Code Generated HTML
4232 ---- --------------
3acbd4f5
JH
4233 h1() <h1>
4234 h1('some','contents'); <h1>some contents</h1>
188ba755
JH
4235 h1({-align=>left}); <h1 align="LEFT">
4236 h1({-align=>left},'contents'); <h1 align="LEFT">contents</h1>
424ec8fa 4237
188ba755 4238HTML tags are described in more detail later.
424ec8fa
GS
4239
4240Many newcomers to CGI.pm are puzzled by the difference between the
4241calling conventions for the HTML shortcuts, which require curly braces
4242around the HTML tag attributes, and the calling conventions for other
4243routines, which manage to generate attributes without the curly
4244brackets. Don't be confused. As a convenience the curly braces are
4245optional in all but the HTML shortcuts. If you like, you can use
4246curly braces when calling any routine that takes named arguments. For
4247example:
4248
4249 print $q->header( {-type=>'image/gif',-expires=>'+3d'} );
4250
4251If you use the B<-w> switch, you will be warned that some CGI.pm argument
4252names conflict with built-in Perl functions. The most frequent of
4253these is the -values argument, used to create multi-valued menus,
4254radio button clusters and the like. To get around this warning, you
4255have several choices:
54310121 4256
424ec8fa 4257=over 4
54310121 4258
551e1d92
RB
4259=item 1.
4260
4261Use another name for the argument, if one is available.
4262For example, -value is an alias for -values.
54310121 4263
551e1d92 4264=item 2.
54310121 4265
551e1d92
RB
4266Change the capitalization, e.g. -Values
4267
4268=item 3.
4269
4270Put quotes around the argument name, e.g. '-values'
54310121 4271
424ec8fa 4272=back
54310121 4273
424ec8fa
GS
4274Many routines will do something useful with a named argument that it
4275doesn't recognize. For example, you can produce non-standard HTTP
4276header fields by providing them as named arguments:
54310121 4277
424ec8fa
GS
4278 print $q->header(-type => 'text/html',
4279 -cost => 'Three smackers',
4280 -annoyance_level => 'high',
4281 -complaints_to => 'bit bucket');
54310121 4282
424ec8fa
GS
4283This will produce the following nonstandard HTTP header:
4284
4285 HTTP/1.0 200 OK
4286 Cost: Three smackers
4287 Annoyance-level: high
4288 Complaints-to: bit bucket
4289 Content-type: text/html
4290
4291Notice the way that underscores are translated automatically into
4292hyphens. HTML-generating routines perform a different type of
4293translation.
4294
4295This feature allows you to keep up with the rapidly changing HTTP and
4296HTML "standards".
54310121 4297
424ec8fa 4298=head2 CREATING A NEW QUERY OBJECT (OBJECT-ORIENTED STYLE):
54310121 4299
4300 $query = new CGI;
4301
4302This will parse the input (from both POST and GET methods) and store
681699b9
SP
4303it into a perl5 object called $query.
4304
4305Any filehandles from file uploads will have their position reset to
4306the beginning of the file.
54310121 4307
4308=head2 CREATING A NEW QUERY OBJECT FROM AN INPUT FILE
4309
4310 $query = new CGI(INPUTFILE);
4311
424ec8fa
GS
4312If you provide a file handle to the new() method, it will read
4313parameters from the file (or STDIN, or whatever). The file can be in
4314any of the forms describing below under debugging (i.e. a series of
4315newline delimited TAG=VALUE pairs will work). Conveniently, this type
4316of file is created by the save() method (see below). Multiple records
4317can be saved and restored.
54310121 4318
4319Perl purists will be pleased to know that this syntax accepts
4320references to file handles, or even references to filehandle globs,
4321which is the "official" way to pass a filehandle:
4322
4323 $query = new CGI(\*STDIN);
4324
424ec8fa
GS
4325You can also initialize the CGI object with a FileHandle or IO::File
4326object.
4327
4328If you are using the function-oriented interface and want to
4329initialize CGI state from a file handle, the way to do this is with
4330B<restore_parameters()>. This will (re)initialize the
4331default CGI object from the indicated file handle.
4332
4333 open (IN,"test.in") || die;
4334 restore_parameters(IN);
4335 close IN;
4336
54310121 4337You can also initialize the query object from an associative array
4338reference:
4339
4340 $query = new CGI( {'dinosaur'=>'barney',
4341 'song'=>'I love you',
4342 'friends'=>[qw/Jessica George Nancy/]}
4343 );
4344
4345or from a properly formatted, URL-escaped query string:
4346
4347 $query = new CGI('dinosaur=barney&color=purple');
4348
424ec8fa
GS
4349or from a previously existing CGI object (currently this clones the
4350parameter list, but none of the other object-specific fields, such as
4351autoescaping):
4352
4353 $old_query = new CGI;
4354 $new_query = new CGI($old_query);
4355
54310121 4356To create an empty query, initialize it from an empty string or hash:
4357
424ec8fa
GS
4358 $empty_query = new CGI("");
4359
4360 -or-
4361
4362 $empty_query = new CGI({});
54310121 4363
4364=head2 FETCHING A LIST OF KEYWORDS FROM THE QUERY:
4365
4366 @keywords = $query->keywords
4367
4368If the script was invoked as the result of an <ISINDEX> search, the
4369parsed keywords can be obtained as an array using the keywords() method.
4370
4371=head2 FETCHING THE NAMES OF ALL THE PARAMETERS PASSED TO YOUR SCRIPT:
4372
4373 @names = $query->param
4374
4375If the script was invoked with a parameter list
3d1a2ec4
GS
4376(e.g. "name1=value1&name2=value2&name3=value3"), the param() method
4377will return the parameter names as a list. If the script was invoked
4378as an <ISINDEX> script and contains a string without ampersands
4379(e.g. "value1+value2+value3") , there will be a single parameter named
4380"keywords" containing the "+"-delimited keywords.
54310121 4381
4382NOTE: As of version 1.5, the array of parameter names returned will
4383be in the same order as they were submitted by the browser.
4384Usually this order is the same as the order in which the
4385parameters are defined in the form (however, this isn't part
4386of the spec, and so isn't guaranteed).
4387
4388=head2 FETCHING THE VALUE OR VALUES OF A SINGLE NAMED PARAMETER:
4389
4390 @values = $query->param('foo');
4391
4392 -or-
4393
4394 $value = $query->param('foo');
4395
4396Pass the param() method a single argument to fetch the value of the
4397named parameter. If the parameter is multivalued (e.g. from multiple
4398selections in a scrolling list), you can ask to receive an array. Otherwise
4399the method will return a single value.
4400
3d1a2ec4
GS
4401If a value is not given in the query string, as in the queries
4402"name1=&name2=" or "name1&name2", it will be returned as an empty
4403string. This feature is new in 2.63.
4404
8f3ccfa2
JH
4405
4406If the parameter does not exist at all, then param() will return undef
4407in a scalar context, and the empty list in a list context.
4408
4409
54310121 4410=head2 SETTING THE VALUE(S) OF A NAMED PARAMETER:
4411
4412 $query->param('foo','an','array','of','values');
4413
4414This sets the value for the named parameter 'foo' to an array of
4415values. This is one way to change the value of a field AFTER
4416the script has been invoked once before. (Another way is with
4417the -override parameter accepted by all methods that generate
4418form elements.)
4419
4420param() also recognizes a named parameter style of calling described
4421in more detail later:
4422
4423 $query->param(-name=>'foo',-values=>['an','array','of','values']);
4424
4425 -or-
4426
4427 $query->param(-name=>'foo',-value=>'the value');
4428
4429=head2 APPENDING ADDITIONAL VALUES TO A NAMED PARAMETER:
4430
424ec8fa 4431 $query->append(-name=>'foo',-values=>['yet','more','values']);
54310121 4432
4433This adds a value or list of values to the named parameter. The
4434values are appended to the end of the parameter if it already exists.
4435Otherwise the parameter is created. Note that this method only
4436recognizes the named argument calling syntax.
4437
4438=head2 IMPORTING ALL PARAMETERS INTO A NAMESPACE:
4439
4440 $query->import_names('R');
4441
4442This creates a series of variables in the 'R' namespace. For example,
4443$R::foo, @R:foo. For keyword lists, a variable @R::keywords will appear.
4444If no namespace is given, this method will assume 'Q'.
4445WARNING: don't import anything into 'main'; this is a major security
4446risk!!!!
4447
8f3ccfa2
JH
4448NOTE 1: Variable names are transformed as necessary into legal Perl
4449variable names. All non-legal characters are transformed into
4450underscores. If you need to keep the original names, you should use
4451the param() method instead to access CGI variables by name.
4452
4453NOTE 2: In older versions, this method was called B<import()>. As of version 2.20,
54310121 4454this name has been removed completely to avoid conflict with the built-in
4455Perl module B<import> operator.
4456
4457=head2 DELETING A PARAMETER COMPLETELY:
4458
188ba755 4459 $query->delete('foo','bar','baz');
54310121 4460
188ba755
JH
4461This completely clears a list of parameters. It sometimes useful for
4462resetting parameters that you don't want passed down between script
4463invocations.
54310121 4464
424ec8fa
GS
4465If you are using the function call interface, use "Delete()" instead
4466to avoid conflicts with Perl's built-in delete operator.
4467
54310121 4468=head2 DELETING ALL PARAMETERS:
4469
424ec8fa 4470 $query->delete_all();
54310121 4471
4472This clears the CGI object completely. It might be useful to ensure
4473that all the defaults are taken when you create a fill-out form.
4474
424ec8fa
GS
4475Use Delete_all() instead if you are using the function call interface.
4476
0a9bdad4
SP
4477=head2 HANDLING NON-URLENCODED ARGUMENTS
4478
4479
4480If POSTed data is not of type application/x-www-form-urlencoded or
4481multipart/form-data, then the POSTed data will not be processed, but
4482instead be returned as-is in a parameter named POSTDATA. To retrieve
4483it, use code like this:
4484
4485 my $data = $query->param('POSTDATA');
4486
bb8b3399
SP
4487Likewise if PUTed data can be retrieved with code like this:
4488
4489 my $data = $query->param('PUTDATA');
4490
0a9bdad4
SP
4491(If you don't know what the preceding means, don't worry about it. It
4492only affects people trying to use CGI for XML processing and other
4493specialized tasks.)
4494
4495
424ec8fa
GS
4496=head2 DIRECT ACCESS TO THE PARAMETER LIST:
4497
4498 $q->param_fetch('address')->[1] = '1313 Mockingbird Lane';
4499 unshift @{$q->param_fetch(-name=>'address')},'George Munster';
4500
4501If you need access to the parameter list in a way that isn't covered
4502by the methods above, you can obtain a direct reference to it by
4503calling the B<param_fetch()> method with the name of the . This
4504will return an array reference to the named parameters, which you then
4505can manipulate in any way you like.
4506
4507You can also use a named argument style using the B<-name> argument.
4508
3538e1d5
GS
4509=head2 FETCHING THE PARAMETER LIST AS A HASH:
4510
4511 $params = $q->Vars;
4512 print $params->{'address'};
4513 @foo = split("\0",$params->{'foo'});
4514 %params = $q->Vars;
4515
4516 use CGI ':cgi-lib';
4517 $params = Vars;
4518
4519Many people want to fetch the entire parameter list as a hash in which
4520the keys are the names of the CGI parameters, and the values are the
4521parameters' values. The Vars() method does this. Called in a scalar
4522context, it returns the parameter list as a tied hash reference.
4523Changing a key changes the value of the parameter in the underlying
a3b3a725 4524CGI parameter list. Called in a list context, it returns the
3538e1d5
GS
4525parameter list as an ordinary hash. This allows you to read the
4526contents of the parameter list, but not to change it.
4527
4528When using this, the thing you must watch out for are multivalued CGI
4529parameters. Because a hash cannot distinguish between scalar and
a3b3a725 4530list context, multivalued parameters will be returned as a packed
3538e1d5
GS
4531string, separated by the "\0" (null) character. You must split this
4532packed string in order to get at the individual values. This is the
4533convention introduced long ago by Steve Brenner in his cgi-lib.pl
4534module for Perl version 4.
4535
4536If you wish to use Vars() as a function, import the I<:cgi-lib> set of
4537function calls (also see the section on CGI-LIB compatibility).
4538
424ec8fa 4539=head2 SAVING THE STATE OF THE SCRIPT TO A FILE:
54310121 4540
29ddc2a4 4541 $query->save(\*FILEHANDLE)
54310121 4542
4543This will write the current state of the form to the provided
4544filehandle. You can read it back in by providing a filehandle
4545to the new() method. Note that the filehandle can be a file, a pipe,
4546or whatever!
4547
4548The format of the saved file is:
4549
4550 NAME1=VALUE1
4551 NAME1=VALUE1'
4552 NAME2=VALUE2
4553 NAME3=VALUE3
4554 =
4555
4556Both name and value are URL escaped. Multi-valued CGI parameters are
4557represented as repeated names. A session record is delimited by a
4558single = symbol. You can write out multiple records and read them
4559back in with several calls to B<new>. You can do this across several
4560sessions by opening the file in append mode, allowing you to create
4561primitive guest books, or to keep a history of users' queries. Here's
4562a short example of creating multiple session records:
4563
4564 use CGI;
4565
4566 open (OUT,">>test.out") || die;
4567 $records = 5;
4568 foreach (0..$records) {
4569 my $q = new CGI;
4570 $q->param(-name=>'counter',-value=>$_);
29ddc2a4 4571 $q->save(\*OUT);
54310121 4572 }
4573 close OUT;
4574
4575 # reopen for reading
4576 open (IN,"test.out") || die;
4577 while (!eof(IN)) {
29ddc2a4 4578 my $q = new CGI(\*IN);
54310121 4579 print $q->param('counter'),"\n";
4580 }
4581
4582The file format used for save/restore is identical to that used by the
4583Whitehead Genome Center's data exchange format "Boulderio", and can be
4584manipulated and even databased using Boulderio utilities. See
3cb6de81 4585
3538e1d5 4586 http://stein.cshl.org/boulder/
54310121 4587
4588for further details.
4589
424ec8fa
GS
4590If you wish to use this method from the function-oriented (non-OO)
4591interface, the exported name for this method is B<save_parameters()>.
54310121 4592
3538e1d5
GS
4593=head2 RETRIEVING CGI ERRORS
4594
4595Errors can occur while processing user input, particularly when
4596processing uploaded files. When these errors occur, CGI will stop
4597processing and return an empty parameter list. You can test for
4598the existence and nature of errors using the I<cgi_error()> function.
4599The error messages are formatted as HTTP status codes. You can either
4600incorporate the error text into an HTML page, or use it as the value
4601of the HTTP status:
4602
4603 my $error = $q->cgi_error;
4604 if ($error) {
4605 print $q->header(-status=>$error),
4606 $q->start_html('Problems'),
4607 $q->h2('Request not processed'),
4608 $q->strong($error);
4609 exit 0;
4610 }
4611
4612When using the function-oriented interface (see the next section),
4613errors may only occur the first time you call I<param()>. Be ready
4614for this!
4615
424ec8fa 4616=head2 USING THE FUNCTION-ORIENTED INTERFACE
54310121 4617
424ec8fa
GS
4618To use the function-oriented interface, you must specify which CGI.pm
4619routines or sets of routines to import into your script's namespace.
4620There is a small overhead associated with this importation, but it
4621isn't much.
54310121 4622
424ec8fa 4623 use CGI <list of methods>;
54310121 4624
424ec8fa
GS
4625The listed methods will be imported into the current package; you can
4626call them directly without creating a CGI object first. This example
4627shows how to import the B<param()> and B<header()>
4628methods, and then use them directly:
54310121 4629
424ec8fa
GS
4630 use CGI 'param','header';
4631 print header('text/plain');
4632 $zipcode = param('zipcode');
54310121 4633
424ec8fa 4634More frequently, you'll import common sets of functions by referring
f610777f 4635to the groups by name. All function sets are preceded with a ":"
424ec8fa 4636character as in ":html3" (for tags defined in the HTML 3 standard).
54310121 4637
424ec8fa 4638Here is a list of the function sets you can import:
54310121 4639
424ec8fa 4640=over 4
54310121 4641
424ec8fa 4642=item B<:cgi>
54310121 4643
424ec8fa
GS
4644Import all CGI-handling methods, such as B<param()>, B<path_info()>
4645and the like.
54310121 4646
424ec8fa 4647=item B<:form>
54310121 4648
424ec8fa 4649Import all fill-out form generating methods, such as B<textfield()>.
54310121 4650
424ec8fa 4651=item B<:html2>
54310121 4652
424ec8fa 4653Import all methods that generate HTML 2.0 standard elements.
54310121 4654
424ec8fa 4655=item B<:html3>
54310121 4656
3acbd4f5 4657Import all methods that generate HTML 3.0 elements (such as
424ec8fa 4658<table>, <super> and <sub>).
54310121 4659
3acbd4f5
JH
4660=item B<:html4>
4661
4662Import all methods that generate HTML 4 elements (such as
4663<abbrev>, <acronym> and <thead>).
4664
424ec8fa 4665=item B<:netscape>
54310121 4666
424ec8fa 4667Import all methods that generate Netscape-specific HTML extensions.
54310121 4668
424ec8fa 4669=item B<:html>
54310121 4670
424ec8fa
GS
4671Import all HTML-generating shortcuts (i.e. 'html2' + 'html3' +
4672'netscape')...
54310121 4673
424ec8fa 4674=item B<:standard>
54310121 4675
3acbd4f5 4676Import "standard" features, 'html2', 'html3', 'html4', 'form' and 'cgi'.
54310121 4677
424ec8fa 4678=item B<:all>
54310121 4679
424ec8fa 4680Import all the available methods. For the full list, see the CGI.pm
3538e1d5 4681code, where the variable %EXPORT_TAGS is defined.
424ec8fa
GS
4682
4683=back
4684
4685If you import a function name that is not part of CGI.pm, the module
4686will treat it as a new HTML tag and generate the appropriate
4687subroutine. You can then use it like any other HTML tag. This is to
4688provide for the rapidly-evolving HTML "standard." For example, say
3acbd4f5 4689Microsoft comes out with a new tag called <gradient> (which causes the
424ec8fa
GS
4690user's desktop to be flooded with a rotating gradient fill until his
4691machine reboots). You don't need to wait for a new version of CGI.pm
d23a249d 4692to start using it immediately:
424ec8fa
GS
4693
4694 use CGI qw/:standard :html3 gradient/;
4695 print gradient({-start=>'red',-end=>'blue'});
4696
4697Note that in the interests of execution speed CGI.pm does B<not> use
4698the standard L<Exporter> syntax for specifying load symbols. This may
4699change in the future.
4700
4701If you import any of the state-maintaining CGI or form-generating
4702methods, a default CGI object will be created and initialized
4703automatically the first time you use any of the methods that require
4704one to be present. This includes B<param()>, B<textfield()>,
4705B<submit()> and the like. (If you need direct access to the CGI
4706object, you can find it in the global variable B<$CGI::Q>). By
4707importing CGI.pm methods, you can create visually elegant scripts:
4708
4709 use CGI qw/:standard/;
4710 print
4711 header,
4712 start_html('Simple Script'),
4713 h1('Simple Script'),
4714 start_form,
4715 "What's your name? ",textfield('name'),p,
4716 "What's the combination?",
4717 checkbox_group(-name=>'words',
4718 -values=>['eenie','meenie','minie','moe'],
4719 -defaults=>['eenie','moe']),p,
4720 "What's your favorite color?",
4721 popup_menu(-name=>'color',
4722 -values=>['red','green','blue','chartreuse']),p,
4723 submit,
4724 end_form,
4725 hr,"\n";
4726
4727 if (param) {
4728 print
4729 "Your name is ",em(param('name')),p,
4730 "The keywords are: ",em(join(", ",param('words'))),p,
4731 "Your favorite color is ",em(param('color')),".\n";
4732 }
4733 print end_html;
4734
4735=head2 PRAGMAS
4736
4737In addition to the function sets, there are a number of pragmas that
4738you can import. Pragmas, which are always preceded by a hyphen,
4739change the way that CGI.pm functions in various ways. Pragmas,
4740function sets, and individual functions can all be imported in the
4741same use() line. For example, the following use statement imports the
3d1a2ec4
GS
4742standard set of functions and enables debugging mode (pragma
4743-debug):
424ec8fa 4744
3d1a2ec4 4745 use CGI qw/:standard -debug/;
424ec8fa
GS
4746
4747The current list of pragmas is as follows:
4748
4749=over 4
4750
4751=item -any
4752
4753When you I<use CGI -any>, then any method that the query object
4754doesn't recognize will be interpreted as a new HTML tag. This allows
4755you to support the next I<ad hoc> Netscape or Microsoft HTML
4756extension. This lets you go wild with new and unsupported tags:
4757
4758 use CGI qw(-any);
4759 $q=new CGI;
4760 print $q->gradient({speed=>'fast',start=>'red',end=>'blue'});
4761
4762Since using <cite>any</cite> causes any mistyped method name
4763to be interpreted as an HTML tag, use it with care or not at
4764all.
54310121 4765
424ec8fa 4766=item -compile
54310121 4767
424ec8fa
GS
4768This causes the indicated autoloaded methods to be compiled up front,
4769rather than deferred to later. This is useful for scripts that run
4770for an extended period of time under FastCGI or mod_perl, and for
8869a4b7 4771those destined to be crunched by Malcolm Beattie's Perl compiler. Use
f610777f 4772it in conjunction with the methods or method families you plan to use.
424ec8fa
GS
4773
4774 use CGI qw(-compile :standard :html3);
4775
4776or even
4777
4778 use CGI qw(-compile :all);
4779
4780Note that using the -compile pragma in this way will always have
4781the effect of importing the compiled functions into the current
4782namespace. If you want to compile without importing use the
188ba755
JH
4783compile() method instead:
4784
4785 use CGI();
4786 CGI->compile();
4787
4788This is particularly useful in a mod_perl environment, in which you
4789might want to precompile all CGI routines in a startup script, and
4790then import the functions individually in each mod_perl script.
424ec8fa 4791
3d1a2ec4
GS
4792=item -nosticky
4793
29ddc2a4
RGS
4794By default the CGI module implements a state-preserving behavior
4795called "sticky" fields. The way this works is that if you are
4796regenerating a form, the methods that generate the form field values
4797will interrogate param() to see if similarly-named parameters are
4798present in the query string. If they find a like-named parameter, they
4799will use it to set their default values.
4800
4801Sometimes this isn't what you want. The B<-nosticky> pragma prevents
4802this behavior. You can also selectively change the sticky behavior in
4803each element that you generate.
3d1a2ec4 4804
0a9bdad4
SP
4805=item -tabindex
4806
4807Automatically add tab index attributes to each form field. With this
4808option turned off, you can still add tab indexes manually by passing a
4809-tabindex option to each field-generating method.
4810
199d4a26
JH
4811=item -no_undef_params
4812
4813This keeps CGI.pm from including undef params in the parameter list.
4814
6b4ac661
JH
4815=item -no_xhtml
4816
4817By default, CGI.pm versions 2.69 and higher emit XHTML
4818(http://www.w3.org/TR/xhtml1/). The -no_xhtml pragma disables this
4819feature. Thanks to Michalis Kabrianis <kabrianis@hellug.gr> for this
4820feature.
4821
13548fdf
RGS
4822If start_html()'s -dtd parameter specifies an HTML 2.0 or 3.2 DTD,
4823XHTML will automatically be disabled without needing to use this
4824pragma.
4825
bb8b3399
SP
4826=item -utf8
4827
4828This makes CGI.pm treat all parameters as UTF-8 strings. Use this with
4829care, as it will interfere with the processing of binary uploads. It
4830is better to manually select which fields are expected to return utf-8
4831strings and convert them using code like this:
4832
4833 use Encode;
4834 my $arg = decode utf8=>param('foo');
4835
424ec8fa
GS
4836=item -nph
4837
4838This makes CGI.pm produce a header appropriate for an NPH (no
4839parsed header) script. You may need to do other things as well
4840to tell the server that the script is NPH. See the discussion
4841of NPH scripts below.
4842
71f3e297
JH
4843=item -newstyle_urls
4844
4845Separate the name=value pairs in CGI parameter query strings with
4846semicolons rather than ampersands. For example:
4847
4848 ?name=fred;age=24;favorite_color=3
4849
4850Semicolon-delimited query strings are always accepted, but will not be
4851emitted by self_url() and query_string() unless the -newstyle_urls
4852pragma is specified.
4853
3d1a2ec4
GS
4854This became the default in version 2.64.
4855
4856=item -oldstyle_urls
4857
4858Separate the name=value pairs in CGI parameter query strings with
4859ampersands rather than semicolons. This is no longer the default.
4860
424ec8fa
GS
4861=item -autoload
4862
4863This overrides the autoloader so that any function in your program
4864that is not recognized is referred to CGI.pm for possible evaluation.
4865This allows you to use all the CGI.pm functions without adding them to
4866your symbol table, which is of concern for mod_perl users who are
4867worried about memory consumption. I<Warning:> when
4868I<-autoload> is in effect, you cannot use "poetry mode"
4869(functions without the parenthesis). Use I<hr()> rather
4870than I<hr>, or add something like I<use subs qw/hr p header/>
4871to the top of your script.
4872
4873=item -no_debug
4874
4875This turns off the command-line processing features. If you want to
4876run a CGI.pm script from the command line to produce HTML, and you
3d1a2ec4
GS
4877don't want it to read CGI parameters from the command line or STDIN,
4878then use this pragma:
424ec8fa
GS
4879
4880 use CGI qw(-no_debug :standard);
4881
3d1a2ec4 4882=item -debug
424ec8fa 4883
3d1a2ec4
GS
4884This turns on full debugging. In addition to reading CGI arguments
4885from the command-line processing, CGI.pm will pause and try to read
4886arguments from STDIN, producing the message "(offline mode: enter
4887name=value pairs on standard input)" features.
3cb6de81 4888
424ec8fa
GS
4889See the section on debugging for more details.
4890
4891=item -private_tempfiles
4892
3538e1d5
GS
4893CGI.pm can process uploaded file. Ordinarily it spools the uploaded
4894file to a temporary directory, then deletes the file when done.
4895However, this opens the risk of eavesdropping as described in the file
4896upload section. Another CGI script author could peek at this data
4897during the upload, even if it is confidential information. On Unix
4898systems, the -private_tempfiles pragma will cause the temporary file
4899to be unlinked as soon as it is opened and before any data is written
4900into it, reducing, but not eliminating the risk of eavesdropping
4901(there is still a potential race condition). To make life harder for
4902the attacker, the program chooses tempfile names by calculating a 32
4903bit checksum of the incoming HTTP headers.
4904
4905To ensure that the temporary file cannot be read by other CGI scripts,
4906use suEXEC or a CGI wrapper program to run your script. The temporary
4907file is created with mode 0600 (neither world nor group readable).
4908
4909The temporary directory is selected using the following algorithm:
4910
4911 1. if the current user (e.g. "nobody") has a directory named
4912 "tmp" in its home directory, use that (Unix systems only).
4913
4914 2. if the environment variable TMPDIR exists, use the location
4915 indicated.
4916
4917 3. Otherwise try the locations /usr/tmp, /var/tmp, C:\temp,
4918 /tmp, /temp, ::Temporary Items, and \WWW_ROOT.
4919
4920Each of these locations is checked that it is a directory and is
4921writable. If not, the algorithm tries the next choice.
71f3e297
JH
4922
4923=back
4924
4925=head2 SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS
4926
4927Many of the methods generate HTML tags. As described below, tag
4928functions automatically generate both the opening and closing tags.
4929For example:
4930
4931 print h1('Level 1 Header');
4932
4933produces
4934
3acbd4f5 4935 <h1>Level 1 Header</h1>
71f3e297
JH
4936
4937There will be some times when you want to produce the start and end
4938tags yourself. In this case, you can use the form start_I<tag_name>
4939and end_I<tag_name>, as in:
4940
4941 print start_h1,'Level 1 Header',end_h1;
4942
4943With a few exceptions (described below), start_I<tag_name> and
4944end_I<tag_name> functions are not generated automatically when you
4945I<use CGI>. However, you can specify the tags you want to generate
4946I<start/end> functions for by putting an asterisk in front of their
4947name, or, alternatively, requesting either "start_I<tag_name>" or
4948"end_I<tag_name>" in the import list.
4949
4950Example:
4951
4952 use CGI qw/:standard *table start_ul/;
4953
4954In this example, the following functions are generated in addition to
4955the standard ones:
4956
4957=over 4
4958
3acbd4f5 4959=item 1. start_table() (generates a <table> tag)
71f3e297 4960
3acbd4f5 4961=item 2. end_table() (generates a </table> tag)
71f3e297 4962
3acbd4f5 4963=item 3. start_ul() (generates a <ul> tag)
71f3e297 4964
3acbd4f5 4965=item 4. end_ul() (generates a </ul> tag)
71f3e297 4966
424ec8fa
GS
4967=back
4968
4969=head1 GENERATING DYNAMIC DOCUMENTS
4970
4971Most of CGI.pm's functions deal with creating documents on the fly.
4972Generally you will produce the HTTP header first, followed by the
4973document itself. CGI.pm provides functions for generating HTTP
4974headers of various types as well as for generating HTML. For creating
4975GIF images, see the GD.pm module.
4976
4977Each of these functions produces a fragment of HTML or HTTP which you
4978can print out directly so that it displays in the browser window,
4979append to a string, or save to a file for later use.
4980
4981=head2 CREATING A STANDARD HTTP HEADER:
4982
4983Normally the first thing you will do in any CGI script is print out an
4984HTTP header. This tells the browser what type of document to expect,
4985and gives other optional information, such as the language, expiration
4986date, and whether to cache the document. The header can also be
4987manipulated for special purposes, such as server push and pay per view
4988pages.
54310121 4989
29ddc2a4 4990 print header;
54310121 4991
4992 -or-
4993
29ddc2a4 4994 print header('image/gif');
54310121 4995
4996 -or-
4997
29ddc2a4 4998 print header('text/html','204 No response');
54310121 4999
5000 -or-
5001
29ddc2a4 5002 print header(-type=>'image/gif',
54310121 5003 -nph=>1,
5004 -status=>'402 Payment required',
5005 -expires=>'+3d',
5006 -cookie=>$cookie,
3d1a2ec4 5007 -charset=>'utf-7',
6b4ac661 5008 -attachment=>'foo.gif',
54310121 5009 -Cost=>'$2.00');
5010
5011header() returns the Content-type: header. You can provide your own
5012MIME type if you choose, otherwise it defaults to text/html. An
5013optional second parameter specifies the status code and a human-readable
5014message. For example, you can specify 204, "No response" to create a
424ec8fa 5015script that tells the browser to do nothing at all.
54310121 5016
5017The last example shows the named argument style for passing arguments
5018to the CGI methods using named parameters. Recognized parameters are
424ec8fa 5019B<-type>, B<-status>, B<-expires>, and B<-cookie>. Any other named
54310121 5020parameters will be stripped of their initial hyphens and turned into
5021header fields, allowing you to specify any HTTP header you desire.
424ec8fa
GS
5022Internal underscores will be turned into hyphens:
5023
29ddc2a4 5024 print header(-Content_length=>3002);
54310121 5025
5026Most browsers will not cache the output from CGI scripts. Every time
5027the browser reloads the page, the script is invoked anew. You can
5028change this behavior with the B<-expires> parameter. When you specify
5029an absolute or relative expiration interval with this parameter, some
5030browsers and proxy servers will cache the script's output until the
5031indicated expiration date. The following forms are all valid for the
5032-expires field:
5033
5034 +30s 30 seconds from now
5035 +10m ten minutes from now
5036 +1h one hour from now
5037 -1d yesterday (i.e. "ASAP!")
5038 now immediately
5039 +3M in three months
5040 +10y in ten years time
424ec8fa 5041 Thursday, 25-Apr-1999 00:40:33 GMT at the indicated time & date
54310121 5042
5043The B<-cookie> parameter generates a header that tells the browser to provide
5044a "magic cookie" during all subsequent transactions with your script.
5045Netscape cookies have a special format that includes interesting attributes
5046such as expiration time. Use the cookie() method to create and retrieve
5047session cookies.
5048
5049The B<-nph> parameter, if set to a true value, will issue the correct
8f3ccfa2 5050headers to work with a NPH (no-parse-header) script. This is important
3d1a2ec4
GS
5051to use with certain servers that expect all their scripts to be NPH.
5052
5053The B<-charset> parameter can be used to control the character set
5054sent to the browser. If not provided, defaults to ISO-8859-1. As a
5055side effect, this sets the charset() method as well.
54310121 5056
6b4ac661
JH
5057The B<-attachment> parameter can be used to turn the page into an
5058attachment. Instead of displaying the page, some browsers will prompt
5059the user to save it to disk. The value of the argument is the
5060suggested name for the saved file. In order for this to work, you may
5061have to set the B<-type> to "application/octet-stream".
5062
8f3ccfa2
JH
5063The B<-p3p> parameter will add a P3P tag to the outgoing header. The
5064parameter can be an arrayref or a space-delimited string of P3P tags.
5065For example:
5066
5067 print header(-p3p=>[qw(CAO DSP LAW CURa)]);
5068 print header(-p3p=>'CAO DSP LAW CURa');
5069
5070In either case, the outgoing header will be formatted as:
5071
5072 P3P: policyref="/w3c/p3p.xml" cp="CAO DSP LAW CURa"
5073
424ec8fa 5074=head2 GENERATING A REDIRECTION HEADER
54310121 5075
29ddc2a4 5076 print redirect('http://somewhere.else/in/movie/land');
54310121 5077
424ec8fa
GS
5078Sometimes you don't want to produce a document yourself, but simply
5079redirect the browser elsewhere, perhaps choosing a URL based on the
5080time of day or the identity of the user.
5081
5082The redirect() function redirects the browser to a different URL. If
5083you use redirection like this, you should B<not> print out a header as
6b4ac661 5084well.
54310121 5085
2ed511ec
RGS
5086You should always use full URLs (including the http: or ftp: part) in
5087redirection requests. Relative URLs will not work correctly.
54310121 5088
424ec8fa 5089You can also use named arguments:
54310121 5090
29ddc2a4 5091 print redirect(-uri=>'http://somewhere.else/in/movie/land',
13548fdf
RGS
5092 -nph=>1,
5093 -status=>301);
54310121 5094
5095The B<-nph> parameter, if set to a true value, will issue the correct
8f3ccfa2 5096headers to work with a NPH (no-parse-header) script. This is important
58129083 5097to use with certain servers, such as Microsoft IIS, which
54310121 5098expect all their scripts to be NPH.
5099
13548fdf
RGS
5100The B<-status> parameter will set the status of the redirect. HTTP
5101defines three different possible redirection status codes:
5102
5103 301 Moved Permanently
5104 302 Found
5105 303 See Other
5106
5107The default if not specified is 302, which means "moved temporarily."
5108You may change the status to another status code if you wish. Be
5109advised that changing the status to anything other than 301, 302 or
5110303 will probably break redirection.
5111
424ec8fa 5112=head2 CREATING THE HTML DOCUMENT HEADER
54310121 5113
29ddc2a4 5114 print start_html(-title=>'Secrets of the Pyramids',
54310121 5115 -author=>'fred@capricorn.org',
5116 -base=>'true',
5117 -target=>'_blank',
5118 -meta=>{'keywords'=>'pharaoh secret mummy',
5119 'copyright'=>'copyright 1996 King Tut'},
7d37aa8e 5120 -style=>{'src'=>'/styles/style1.css'},
54310121 5121 -BGCOLOR=>'blue');
5122
424ec8fa
GS
5123After creating the HTTP header, most CGI scripts will start writing
5124out an HTML document. The start_html() routine creates the top of the
5125page, along with a lot of optional information that controls the
5126page's appearance and behavior.
54310121 5127
3acbd4f5 5128This method returns a canned HTML header and the opening <body> tag.
424ec8fa 5129All parameters are optional. In the named parameter form, recognized
6b4ac661
JH
5130parameters are -title, -author, -base, -xbase, -dtd, -lang and -target
5131(see below for the explanation). Any additional parameters you
5132provide, such as the Netscape unofficial BGCOLOR attribute, are added
3acbd4f5 5133to the <body> tag. Additional parameters must be proceeded by a
6b4ac661 5134hyphen.
54310121 5135
3acbd4f5 5136The argument B<-xbase> allows you to provide an HREF for the <base> tag
54310121 5137different from the current location, as in
5138
5139 -xbase=>"http://home.mcom.com/"
5140
5141All relative links will be interpreted relative to this tag.
5142
5143The argument B<-target> allows you to provide a default target frame
3d1a2ec4
GS
5144for all the links and fill-out forms on the page. B<This is a
5145non-standard HTTP feature which only works with Netscape browsers!>
5146See the Netscape documentation on frames for details of how to
5147manipulate this.
54310121 5148
5149 -target=>"answer_window"
5150
5151All relative links will be interpreted relative to this tag.
5152You add arbitrary meta information to the header with the B<-meta>
5153argument. This argument expects a reference to an associative array
5154containing name/value pairs of meta information. These will be turned
3acbd4f5 5155into a series of header <meta> tags that look something like this:
54310121 5156
3acbd4f5
JH
5157 <meta name="keywords" content="pharaoh secret mummy">
5158 <meta name="description" content="copyright 1996 King Tut">
424ec8fa 5159
3acbd4f5 5160To create an HTTP-EQUIV type of <meta> tag, use B<-head>, described
6b4ac661 5161below.
424ec8fa 5162
6b4ac661
JH
5163The B<-style> argument is used to incorporate cascading stylesheets
5164into your code. See the section on CASCADING STYLESHEETS for more
5165information.
424ec8fa 5166
6b4ac661 5167The B<-lang> argument is used to incorporate a language attribute into
13548fdf 5168the <html> tag. For example:
6b4ac661 5169
ba056755 5170 print $q->start_html(-lang=>'fr-CA');
424ec8fa 5171
13548fdf
RGS
5172The default if not specified is "en-US" for US English, unless the
5173-dtd parameter specifies an HTML 2.0 or 3.2 DTD, in which case the
5174lang attribute is left off. You can force the lang attribute to left
5175off in other cases by passing an empty string (-lang=>'').
8f3ccfa2 5176
ac734d8b 5177The B<-encoding> argument can be used to specify the character set for
b2d0d414 5178XHTML. It defaults to iso-8859-1 if not specified.
ac734d8b 5179
29ddc2a4
RGS
5180The B<-declare_xml> argument, when used in conjunction with XHTML,
5181will put a <?xml> declaration at the top of the HTML header. The sole
5182purpose of this declaration is to declare the character set
5183encoding. In the absence of -declare_xml, the output HTML will contain
5184a <meta> tag that specifies the encoding, allowing the HTML to pass
5185most validators. The default for -declare_xml is false.
5186
3acbd4f5
JH
5187You can place other arbitrary HTML elements to the <head> section with the
5188B<-head> tag. For example, to place the rarely-used <link> element in the
424ec8fa
GS
5189head section, use this:
5190
3538e1d5 5191 print start_html(-head=>Link({-rel=>'next',
6b4ac661 5192 -href=>'http://www.capricorn.com/s2.html'}));
424ec8fa 5193
3acbd4f5 5194To incorporate multiple HTML elements into the <head> section, just pass an
424ec8fa
GS
5195array reference:
5196
3538e1d5
GS
5197 print start_html(-head=>[
5198 Link({-rel=>'next',
5199 -href=>'http://www.capricorn.com/s2.html'}),
5200 Link({-rel=>'previous',
5201 -href=>'http://www.capricorn.com/s1.html'})
424ec8fa
GS
5202 ]
5203 );
5204
3acbd4f5 5205And here's how to create an HTTP-EQUIV <meta> tag:
6b4ac661 5206
ba056755
JH
5207 print start_html(-head=>meta({-http_equiv => 'Content-Type',
5208 -content => 'text/html'}))
6b4ac661
JH
5209
5210
424ec8fa
GS
5211JAVASCRIPTING: The B<-script>, B<-noScript>, B<-onLoad>,
5212B<-onMouseOver>, B<-onMouseOut> and B<-onUnload> parameters are used
5213to add Netscape JavaScript calls to your pages. B<-script> should
5214point to a block of text containing JavaScript function definitions.
3acbd4f5 5215This block will be placed within a <script> block inside the HTML (not
424ec8fa
GS
5216HTTP) header. The block is placed in the header in order to give your
5217page a fighting chance of having all its JavaScript functions in place
5218even if the user presses the stop button before the page has loaded
5219completely. CGI.pm attempts to format the script in such a way that
5220JavaScript-naive browsers will not choke on the code: unfortunately
5221there are some browsers, such as Chimera for Unix, that get confused
5222by it nevertheless.
5223
5224The B<-onLoad> and B<-onUnload> parameters point to fragments of JavaScript
5225code to execute when the page is respectively opened and closed by the
5226browser. Usually these parameters are calls to functions defined in the
5227B<-script> field:
5228
5229 $query = new CGI;
29ddc2a4 5230 print header;
424ec8fa
GS
5231 $JSCRIPT=<<END;
5232 // Ask a silly question
5233 function riddle_me_this() {
5234 var r = prompt("What walks on four legs in the morning, " +
5235 "two legs in the afternoon, " +
5236 "and three legs in the evening?");
5237 response(r);
5238 }
5239 // Get a silly answer
5240 function response(answer) {
5241 if (answer == "man")
5242 alert("Right you are!");
5243 else
5244 alert("Wrong! Guess again.");
5245 }
5246 END
29ddc2a4 5247 print start_html(-title=>'The Riddle of the Sphinx',
424ec8fa
GS
5248 -script=>$JSCRIPT);
5249
5250Use the B<-noScript> parameter to pass some HTML text that will be displayed on
5251browsers that do not have JavaScript (or browsers where JavaScript is turned
5252off).
5253
8869a4b7
SP
5254The <script> tag, has several attributes including "type" and src.
5255The latter is particularly interesting, as it allows you to keep the
5256JavaScript code in a file or CGI script rather than cluttering up each
5257page with the source. To use these attributes pass a HASH reference
5258in the B<-script> parameter containing one or more of -type, -src, or
5259-code:
424ec8fa
GS
5260
5261 print $q->start_html(-title=>'The Riddle of the Sphinx',
8869a4b7 5262 -script=>{-type=>'JAVASCRIPT',
424ec8fa
GS
5263 -src=>'/javascript/sphinx.js'}
5264 );
5265
5266 print $q->(-title=>'The Riddle of the Sphinx',
8869a4b7 5267 -script=>{-type=>'PERLSCRIPT',
3538e1d5 5268 -code=>'print "hello world!\n;"'}
424ec8fa
GS
5269 );
5270
5271
3acbd4f5 5272A final feature allows you to incorporate multiple <script> sections into the
424ec8fa
GS
5273header. Just pass the list of script sections as an array reference.
5274this allows you to specify different source files for different dialects
8869a4b7 5275of JavaScript. Example:
424ec8fa 5276
3538e1d5
GS
5277 print $q->start_html(-title=>'The Riddle of the Sphinx',
5278 -script=>[
8869a4b7 5279 { -type => 'text/javascript',
3538e1d5 5280 -src => '/javascript/utilities10.js'
424ec8fa 5281 },
8869a4b7 5282 { -type => 'text/javascript',
3538e1d5 5283 -src => '/javascript/utilities11.js'
424ec8fa 5284 },
8869a4b7 5285 { -type => 'text/jscript',
3538e1d5 5286 -src => '/javascript/utilities12.js'
424ec8fa 5287 },
8869a4b7 5288 { -type => 'text/ecmascript',
3538e1d5 5289 -src => '/javascript/utilities219.js'
424ec8fa
GS
5290 }
5291 ]
5292 );
424ec8fa 5293
8869a4b7
SP
5294The option "-language" is a synonym for -type, and is supported for
5295backwad compatibility.
424ec8fa
GS
5296
5297The old-style positional parameters are as follows:
5298
5299=over 4
5300
5301=item B<Parameters:>
5302
5303=item 1.
5304
5305The title
5306
5307=item 2.
5308
3acbd4f5 5309The author's e-mail address (will create a <link rev="MADE"> tag if present
424ec8fa
GS
5310
5311=item 3.
5312
3acbd4f5 5313A 'true' flag if you want to include a <base> tag in the header. This
424ec8fa
GS
5314helps resolve relative addresses to absolute ones when the document is moved,
5315but makes the document hierarchy non-portable. Use with care!
5316
5317=item 4, 5, 6...
5318
3acbd4f5 5319Any other parameters you want to include in the <body> tag. This is a good
424ec8fa
GS
5320place to put Netscape extensions, such as colors and wallpaper patterns.
5321
5322=back
5323
5324=head2 ENDING THE HTML DOCUMENT:
5325
29ddc2a4 5326 print end_html
424ec8fa 5327
3acbd4f5 5328This ends an HTML document by printing the </body></html> tags.
424ec8fa
GS
5329
5330=head2 CREATING A SELF-REFERENCING URL THAT PRESERVES STATE INFORMATION:
5331
29ddc2a4 5332 $myself = self_url;
3acbd4f5 5333 print q(<a href="$myself">I'm talking to myself.</a>);
424ec8fa
GS
5334
5335self_url() will return a URL, that, when selected, will reinvoke
5336this script with all its state information intact. This is most
5337useful when you want to jump around within the document using
5338internal anchors but you don't want to disrupt the current contents
5339of the form(s). Something like this will do the trick.
5340
29ddc2a4 5341 $myself = self_url;
188ba755
JH
5342 print "<a href=\"$myself#table1\">See table 1</a>";
5343 print "<a href=\"$myself#table2\">See table 2</a>";
5344 print "<a href=\"$myself#yourself\">See for yourself</a>";
424ec8fa
GS
5345
5346If you want more control over what's returned, using the B<url()>
5347method instead.
5348
5349You can also retrieve the unprocessed query string with query_string():
5350
29ddc2a4 5351 $the_string = query_string;
424ec8fa
GS
5352
5353=head2 OBTAINING THE SCRIPT'S URL
5354
29ddc2a4
RGS
5355 $full_url = url();
5356 $full_url = url(-full=>1); #alternative syntax
5357 $relative_url = url(-relative=>1);
5358 $absolute_url = url(-absolute=>1);
5359 $url_with_path = url(-path_info=>1);
5360 $url_with_path_and_query = url(-path_info=>1,-query=>1);
5361 $netloc = url(-base => 1);
424ec8fa
GS
5362
5363B<url()> returns the script's URL in a variety of formats. Called
5364without any arguments, it returns the full form of the URL, including
5365host name and port number
5366
5367 http://your.host.com/path/to/script.cgi
5368
5369You can modify this format with the following named arguments:
5370
5371=over 4
5372
5373=item B<-absolute>
5374
5375If true, produce an absolute URL, e.g.
5376
5377 /path/to/script.cgi
5378
5379=item B<-relative>
5380
5381Produce a relative URL. This is useful if you want to reinvoke your
5382script with different parameters. For example:
5383
5384 script.cgi
5385
5386=item B<-full>
5387
5388Produce the full URL, exactly as if called without any arguments.
5389This overrides the -relative and -absolute arguments.
5390
5391=item B<-path> (B<-path_info>)
5392
5393Append the additional path information to the URL. This can be
5394combined with B<-full>, B<-absolute> or B<-relative>. B<-path_info>
5395is provided as a synonym.
5396
5397=item B<-query> (B<-query_string>)
5398
5399Append the query string to the URL. This can be combined with
5400B<-full>, B<-absolute> or B<-relative>. B<-query_string> is provided
5401as a synonym.
5402
03b9648d
JH
5403=item B<-base>
5404
5405Generate just the protocol and net location, as in http://www.foo.com:8000
5406
0a9bdad4
SP
5407=item B<-rewrite>
5408
5409If Apache's mod_rewrite is turned on, then the script name and path
5410info probably won't match the request that the user sent. Set
5411-rewrite=>1 (default) to return URLs that match what the user sent
5412(the original request URI). Set -rewrite->0 to return URLs that match
5413the URL after mod_rewrite's rules have run. Because the additional
5414path information only makes sense in the context of the rewritten URL,
5415-rewrite is set to false when you request path info in the URL.
5416
424ec8fa
GS
5417=back
5418
71f3e297
JH
5419=head2 MIXING POST AND URL PARAMETERS
5420
29ddc2a4 5421 $color = url_param('color');
71f3e297
JH
5422
5423It is possible for a script to receive CGI parameters in the URL as
5424well as in the fill-out form by creating a form that POSTs to a URL
5425containing a query string (a "?" mark followed by arguments). The
5426B<param()> method will always return the contents of the POSTed
5427fill-out form, ignoring the URL's query string. To retrieve URL
5428parameters, call the B<url_param()> method. Use it in the same way as
5429B<param()>. The main difference is that it allows you to read the
5430parameters, but not set them.
5431
5432
5433Under no circumstances will the contents of the URL query string
5434interfere with similarly-named CGI parameters in POSTed forms. If you
5435try to mix a URL query string with a form submitted with the GET
5436method, the results will not be what you expect.
5437
424ec8fa
GS
5438=head1 CREATING STANDARD HTML ELEMENTS:
5439
5440CGI.pm defines general HTML shortcut methods for most, if not all of
5441the HTML 3 and HTML 4 tags. HTML shortcuts are named after a single
5442HTML element and return a fragment of HTML text that you can then
5443print or manipulate as you like. Each shortcut returns a fragment of
5444HTML code that you can append to a string, save to a file, or, most
5445commonly, print out so that it displays in the browser window.
5446
5447This example shows how to use the HTML methods:
5448
424ec8fa
GS
5449 print $q->blockquote(
5450 "Many years ago on the island of",
5451 $q->a({href=>"http://crete.org/"},"Crete"),
3538e1d5 5452 "there lived a Minotaur named",
424ec8fa
GS
5453 $q->strong("Fred."),
5454 ),
5455 $q->hr;
5456
5457This results in the following HTML code (extra newlines have been
5458added for readability):
5459
5460 <blockquote>
5461 Many years ago on the island of
3acbd4f5 5462 <a href="http://crete.org/">Crete</a> there lived
424ec8fa
GS
5463 a minotaur named <strong>Fred.</strong>
5464 </blockquote>
5465 <hr>
5466
5467If you find the syntax for calling the HTML shortcuts awkward, you can
5468import them into your namespace and dispense with the object syntax
5469completely (see the next section for more details):
5470
5471 use CGI ':standard';
5472 print blockquote(
5473 "Many years ago on the island of",
5474 a({href=>"http://crete.org/"},"Crete"),
5475 "there lived a minotaur named",
5476 strong("Fred."),
5477 ),
5478 hr;
54310121 5479
424ec8fa 5480=head2 PROVIDING ARGUMENTS TO HTML SHORTCUTS
7d37aa8e 5481
424ec8fa
GS
5482The HTML methods will accept zero, one or multiple arguments. If you
5483provide no arguments, you get a single tag:
7d37aa8e 5484
3acbd4f5 5485 print hr; # <hr>
7d37aa8e 5486
424ec8fa
GS
5487If you provide one or more string arguments, they are concatenated
5488together with spaces and placed between opening and closing tags:
7d37aa8e 5489
3acbd4f5 5490 print h1("Chapter","1"); # <h1>Chapter 1</h1>"
7d37aa8e 5491
424ec8fa
GS
5492If the first argument is an associative array reference, then the keys
5493and values of the associative array become the HTML tag's attributes:
7d37aa8e 5494
424ec8fa
GS
5495 print a({-href=>'fred.html',-target=>'_new'},
5496 "Open a new frame");
7d37aa8e 5497
3acbd4f5 5498 <a href="fred.html",target="_new">Open a new frame</a>
3cb6de81 5499
424ec8fa
GS
5500You may dispense with the dashes in front of the attribute names if
5501you prefer:
54310121 5502
424ec8fa 5503 print img {src=>'fred.gif',align=>'LEFT'};
54310121 5504
3acbd4f5 5505 <img align="LEFT" src="fred.gif">
54310121 5506
424ec8fa 5507Sometimes an HTML tag attribute has no argument. For example, ordered
8f3ccfa2 5508lists can be marked as COMPACT. The syntax for this is an argument that
424ec8fa 5509that points to an undef string:
54310121 5510
424ec8fa 5511 print ol({compact=>undef},li('one'),li('two'),li('three'));
47e3cabd 5512
424ec8fa
GS
5513Prior to CGI.pm version 2.41, providing an empty ('') string as an
5514attribute argument was the same as providing undef. However, this has
8f3ccfa2 5515changed in order to accommodate those who want to create tags of the form
3acbd4f5 5516<img alt="">. The difference is shown in these two pieces of code:
3cb6de81 5517
8f3ccfa2
JH
5518 CODE RESULT
5519 img({alt=>undef}) <img alt>
5520 img({alt=>''}) <img alt="">
7d37aa8e 5521
424ec8fa 5522=head2 THE DISTRIBUTIVE PROPERTY OF HTML SHORTCUTS
7d37aa8e 5523
424ec8fa
GS
5524One of the cool features of the HTML shortcuts is that they are
5525distributive. If you give them an argument consisting of a
5526B<reference> to a list, the tag will be distributed across each
5527element of the list. For example, here's one way to make an ordered
5528list:
7d37aa8e 5529
424ec8fa 5530 print ul(
6b4ac661 5531 li({-type=>'disc'},['Sneezy','Doc','Sleepy','Happy'])
424ec8fa 5532 );
7d37aa8e 5533
424ec8fa 5534This example will result in HTML output that looks like this:
54310121 5535
3acbd4f5
JH
5536 <ul>
5537 <li type="disc">Sneezy</li>
5538 <li type="disc">Doc</li>
5539 <li type="disc">Sleepy</li>
5540 <li type="disc">Happy</li>
5541 </ul>
54310121 5542
424ec8fa 5543This is extremely useful for creating tables. For example:
54310121 5544
424ec8fa
GS
5545 print table({-border=>undef},
5546 caption('When Should You Eat Your Vegetables?'),
5547 Tr({-align=>CENTER,-valign=>TOP},
5548 [
5549 th(['Vegetable', 'Breakfast','Lunch','Dinner']),
5550 td(['Tomatoes' , 'no', 'yes', 'yes']),
5551 td(['Broccoli' , 'no', 'no', 'yes']),
5552 td(['Onions' , 'yes','yes', 'yes'])
5553 ]
5554 )
5555 );
54310121 5556
424ec8fa 5557=head2 HTML SHORTCUTS AND LIST INTERPOLATION
54310121 5558
424ec8fa 5559Consider this bit of code:
54310121 5560
424ec8fa 5561 print blockquote(em('Hi'),'mom!'));
54310121 5562
424ec8fa 5563It will ordinarily return the string that you probably expect, namely:
54310121 5564
3acbd4f5 5565 <blockquote><em>Hi</em> mom!</blockquote>
54310121 5566
424ec8fa
GS
5567Note the space between the element "Hi" and the element "mom!".
5568CGI.pm puts the extra space there using array interpolation, which is
5569controlled by the magic $" variable. Sometimes this extra space is
5570not what you want, for example, when you are trying to align a series
5571of images. In this case, you can simply change the value of $" to an
5572empty string.
54310121 5573
424ec8fa
GS
5574 {
5575 local($") = '';
5576 print blockquote(em('Hi'),'mom!'));
5577 }
54310121 5578
424ec8fa
GS
5579I suggest you put the code in a block as shown here. Otherwise the
5580change to $" will affect all subsequent code until you explicitly
5581reset it.
54310121 5582
424ec8fa 5583=head2 NON-STANDARD HTML SHORTCUTS
54310121 5584
424ec8fa
GS
5585A few HTML tags don't follow the standard pattern for various
5586reasons.
54310121 5587
424ec8fa
GS
5588B<comment()> generates an HTML comment (<!-- comment -->). Call it
5589like
54310121 5590
424ec8fa 5591 print comment('here is my comment');
54310121 5592
424ec8fa
GS
5593Because of conflicts with built-in Perl functions, the following functions
5594begin with initial caps:
54310121 5595
424ec8fa
GS
5596 Select
5597 Tr
5598 Link
5599 Delete
71f3e297
JH
5600 Accept
5601 Sub
54310121 5602
424ec8fa
GS
5603In addition, start_html(), end_html(), start_form(), end_form(),
5604start_multipart_form() and all the fill-out form tags are special.
5605See their respective sections.
5606
3d1a2ec4
GS
5607=head2 AUTOESCAPING HTML
5608
5609By default, all HTML that is emitted by the form-generating functions
5610is passed through a function called escapeHTML():
5611
5612=over 4
5613
5614=item $escaped_string = escapeHTML("unescaped string");
5615
5616Escape HTML formatting characters in a string.
5617
5618=back
5619
5620Provided that you have specified a character set of ISO-8859-1 (the
5621default), the standard HTML escaping rules will be used. The "<"
5622character becomes "&lt;", ">" becomes "&gt;", "&" becomes "&amp;", and
5623the quote character becomes "&quot;". In addition, the hexadecimal
188ba755 56240x8b and 0x9b characters, which some browsers incorrectly interpret
3d1a2ec4 5625as the left and right angle-bracket characters, are replaced by their
188ba755 5626numeric character entities ("&#8249" and "&#8250;"). If you manually change
3d1a2ec4
GS
5627the charset, either by calling the charset() method explicitly or by
5628passing a -charset argument to header(), then B<all> characters will
5629be replaced by their numeric entities, since CGI.pm has no lookup
5630table for all the possible encodings.
5631
5632The automatic escaping does not apply to other shortcuts, such as
5633h1(). You should call escapeHTML() yourself on untrusted data in
5634order to protect your pages against nasty tricks that people may enter
5635into guestbooks, etc.. To change the character set, use charset().
188ba755 5636To turn autoescaping off completely, use autoEscape(0):
3d1a2ec4
GS
5637
5638=over 4
5639
5640=item $charset = charset([$charset]);
5641
5642Get or set the current character set.
5643
5644=item $flag = autoEscape([$flag]);
5645
5646Get or set the value of the autoescape flag.
5647
5648=back
5649
71f3e297
JH
5650=head2 PRETTY-PRINTING HTML
5651
5652By default, all the HTML produced by these functions comes out as one
5653long line without carriage returns or indentation. This is yuck, but
5654it does reduce the size of the documents by 10-20%. To get
5655pretty-printed output, please use L<CGI::Pretty>, a subclass
5656contributed by Brian Paulsen.
5657
424ec8fa 5658=head1 CREATING FILL-OUT FORMS:
54310121 5659
5660I<General note> The various form-creating methods all return strings
5661to the caller, containing the tag or tags that will create the requested
5662form element. You are responsible for actually printing out these strings.
5663It's set up this way so that you can place formatting tags
5664around the form elements.
5665
5666I<Another note> The default values that you specify for the forms are only
5667used the B<first> time the script is invoked (when there is no query
5668string). On subsequent invocations of the script (when there is a query
5669string), the former values are used even if they are blank.
5670
5671If you want to change the value of a field from its previous value, you have two
5672choices:
5673
5674(1) call the param() method to set it.
5675
5676(2) use the -override (alias -force) parameter (a new feature in version 2.15).
5677This forces the default value to be used, regardless of the previous value:
5678
29ddc2a4 5679 print textfield(-name=>'field_name',
54310121 5680 -default=>'starting value',
5681 -override=>1,
5682 -size=>50,
5683 -maxlength=>80);
5684
5685I<Yet another note> By default, the text and labels of form elements are
5686escaped according to HTML rules. This means that you can safely use
5687"<CLICK ME>" as the label for a button. However, it also interferes with
5688your ability to incorporate special HTML character sequences, such as &Aacute;,
5689into your fields. If you wish to turn off automatic escaping, call the
5690autoEscape() method with a false value immediately after creating the CGI object:
5691
5692 $query = new CGI;
29ddc2a4 5693 autoEscape(undef);
3cb6de81 5694
13548fdf
RGS
5695I<A Lurking Trap!> Some of the form-element generating methods return
5696multiple tags. In a scalar context, the tags will be concatenated
5697together with spaces, or whatever is the current value of the $"
5698global. In a list context, the methods will return a list of
5699elements, allowing you to modify them if you wish. Usually you will
5700not notice this behavior, but beware of this:
5701
29ddc2a4 5702 printf("%s\n",end_form())
13548fdf
RGS
5703
5704end_form() produces several tags, and only the first of them will be
5705printed because the format only expects one value.
5706
5707<p>
5708
5709
54310121 5710=head2 CREATING AN ISINDEX TAG
5711
29ddc2a4 5712 print isindex(-action=>$action);
54310121 5713
5714 -or-
5715
29ddc2a4 5716 print isindex($action);
54310121 5717
3acbd4f5 5718Prints out an <isindex> tag. Not very exciting. The parameter
54310121 5719-action specifies the URL of the script to process the query. The
5720default is to process the query with the current script.
5721
5722=head2 STARTING AND ENDING A FORM
5723
29ddc2a4
RGS
5724 print start_form(-method=>$method,
5725 -action=>$action,
5726 -enctype=>$encoding);
54310121 5727 <... various form stuff ...>
29ddc2a4 5728 print endform;
54310121 5729
5730 -or-
5731
29ddc2a4 5732 print start_form($method,$action,$encoding);
54310121 5733 <... various form stuff ...>
29ddc2a4 5734 print endform;
54310121 5735
3acbd4f5 5736start_form() will return a <form> tag with the optional method,
54310121 5737action and form encoding that you specify. The defaults are:
3cb6de81 5738
54310121 5739 method: POST
5740 action: this script
71f3e297 5741 enctype: application/x-www-form-urlencoded
54310121 5742
3acbd4f5 5743endform() returns the closing </form> tag.
54310121 5744
3d1a2ec4 5745Start_form()'s enctype argument tells the browser how to package the various
54310121 5746fields of the form before sending the form to the server. Two
5747values are possible:
5748
3d1a2ec4
GS
5749B<Note:> This method was previously named startform(), and startform()
5750is still recognized as an alias.
5751
54310121 5752=over 4
5753
5754=item B<application/x-www-form-urlencoded>
5755
5756This is the older type of encoding used by all browsers prior to
5757Netscape 2.0. It is compatible with many CGI scripts and is
5758suitable for short fields containing text data. For your
5759convenience, CGI.pm stores the name of this encoding
6b4ac661 5760type in B<&CGI::URL_ENCODED>.
54310121 5761
5762=item B<multipart/form-data>
5763
5764This is the newer type of encoding introduced by Netscape 2.0.
5765It is suitable for forms that contain very large fields or that
5766are intended for transferring binary data. Most importantly,
5767it enables the "file upload" feature of Netscape 2.0 forms. For
5768your convenience, CGI.pm stores the name of this encoding type
424ec8fa 5769in B<&CGI::MULTIPART>
54310121 5770
5771Forms that use this type of encoding are not easily interpreted
5772by CGI scripts unless they use CGI.pm or another library designed
5773to handle them.
5774
29ddc2a4
RGS
5775If XHTML is activated (the default), then forms will be automatically
5776created using this type of encoding.
5777
54310121 5778=back
5779
3d1a2ec4 5780For compatibility, the start_form() method uses the older form of
54310121 5781encoding by default. If you want to use the newer form of encoding
5782by default, you can call B<start_multipart_form()> instead of
3d1a2ec4 5783B<start_form()>.
54310121 5784
5785JAVASCRIPTING: The B<-name> and B<-onSubmit> parameters are provided
5786for use with JavaScript. The -name parameter gives the
5787form a name so that it can be identified and manipulated by
5788JavaScript functions. -onSubmit should point to a JavaScript
5789function that will be executed just before the form is submitted to your
5790server. You can use this opportunity to check the contents of the form
5791for consistency and completeness. If you find something wrong, you
5792can put up an alert box or maybe fix things up yourself. You can
5793abort the submission by returning false from this function.
5794
3acbd4f5 5795Usually the bulk of JavaScript functions are defined in a <script>
54310121 5796block in the HTML header and -onSubmit points to one of these function
5797call. See start_html() for details.
5798
29ddc2a4
RGS
5799=head2 FORM ELEMENTS
5800
5801After starting a form, you will typically create one or more
5802textfields, popup menus, radio groups and other form elements. Each
5803of these elements takes a standard set of named arguments. Some
5804elements also have optional arguments. The standard arguments are as
5805follows:
5806
5807=over 4
5808
5809=item B<-name>
5810
5811The name of the field. After submission this name can be used to
5812retrieve the field's value using the param() method.
5813
5814=item B<-value>, B<-values>
5815
5816The initial value of the field which will be returned to the script
5817after form submission. Some form elements, such as text fields, take
5818a single scalar -value argument. Others, such as popup menus, take a
5819reference to an array of values. The two arguments are synonyms.
5820
5821=item B<-tabindex>
5822
5823A numeric value that sets the order in which the form element receives
5824focus when the user presses the tab key. Elements with lower values
5825receive focus first.
5826
5827=item B<-id>
5828
5829A string identifier that can be used to identify this element to
5830JavaScript and DHTML.
5831
5832=item B<-override>
5833
5834A boolean, which, if true, forces the element to take on the value
5835specified by B<-value>, overriding the sticky behavior described
5836earlier for the B<-no_sticky> pragma.
5837
5838=item B<-onChange>, B<-onFocus>, B<-onBlur>, B<-onMouseOver>, B<-onMouseOut>, B<-onSelect>
5839
5840These are used to assign JavaScript event handlers. See the
5841JavaScripting section for more details.
5842
5843=back
5844
5845Other common arguments are described in the next section. In addition
5846to these, all attributes described in the HTML specifications are
5847supported.
5848
54310121 5849=head2 CREATING A TEXT FIELD
5850
29ddc2a4
RGS
5851 print textfield(-name=>'field_name',
5852 -value=>'starting value',
5853 -size=>50,
5854 -maxlength=>80);
54310121 5855 -or-
5856
29ddc2a4 5857 print textfield('field_name','starting value',50,80);
54310121 5858
29ddc2a4 5859textfield() will return a text input field.
54310121 5860
5861=over 4
5862
5863=item B<Parameters>
5864
5865=item 1.
5866
29ddc2a4 5867The first parameter is the required name for the field (-name).
54310121 5868
5869=item 2.
5870
5871The optional second parameter is the default starting value for the field
29ddc2a4 5872contents (-value, formerly known as -default).
54310121 5873
5874=item 3.
5875
5876The optional third parameter is the size of the field in
5877 characters (-size).
5878
5879=item 4.
5880
5881The optional fourth parameter is the maximum number of characters the
5882 field will accept (-maxlength).
5883
5884=back
5885
5886As with all these methods, the field will be initialized with its
5887previous contents from earlier invocations of the script.
5888When the form is processed, the value of the text field can be
5889retrieved with:
5890
29ddc2a4 5891 $value = param('foo');
54310121 5892
5893If you want to reset it from its initial value after the script has been
5894called once, you can do so like this:
5895
29ddc2a4 5896 param('foo',"I'm taking over this value!");
54310121 5897
5898=head2 CREATING A BIG TEXT FIELD
5899
29ddc2a4 5900 print textarea(-name=>'foo',
54310121 5901 -default=>'starting value',
5902 -rows=>10,
5903 -columns=>50);
5904
5905 -or
5906
29ddc2a4 5907 print textarea('foo','starting value',10,50);
54310121 5908
5909textarea() is just like textfield, but it allows you to specify
5910rows and columns for a multiline text entry box. You can provide
5911a starting value for the field, which can be long and contain
5912multiple lines.
5913
54310121 5914=head2 CREATING A PASSWORD FIELD
5915
29ddc2a4 5916 print password_field(-name=>'secret',
54310121 5917 -value=>'starting value',
5918 -size=>50,
5919 -maxlength=>80);
5920 -or-
5921
29ddc2a4 5922 print password_field('secret','starting value',50,80);
54310121 5923
5924password_field() is identical to textfield(), except that its contents
5925will be starred out on the web page.
5926
54310121 5927=head2 CREATING A FILE UPLOAD FIELD
5928
29ddc2a4 5929 print filefield(-name=>'uploaded_file',
54310121 5930 -default=>'starting value',
5931 -size=>50,
5932 -maxlength=>80);
5933 -or-
5934
29ddc2a4 5935 print filefield('uploaded_file','starting value',50,80);
54310121 5936
5937filefield() will return a file upload field for Netscape 2.0 browsers.
5938In order to take full advantage of this I<you must use the new
5939multipart encoding scheme> for the form. You can do this either
6b4ac661 5940by calling B<start_form()> with an encoding type of B<&CGI::MULTIPART>,
54310121 5941or by calling the new method B<start_multipart_form()> instead of
3d1a2ec4 5942vanilla B<start_form()>.
54310121 5943
5944=over 4
5945
5946=item B<Parameters>
5947
5948=item 1.
5949
5950The first parameter is the required name for the field (-name).
5951
5952=item 2.
5953
5954The optional second parameter is the starting value for the field contents
5955to be used as the default file name (-default).
5956
71f3e297
JH
5957For security reasons, browsers don't pay any attention to this field,
5958and so the starting value will always be blank. Worse, the field
5959loses its "sticky" behavior and forgets its previous contents. The
5960starting value field is called for in the HTML specification, however,
5961and possibly some browser will eventually provide support for it.
54310121 5962
5963=item 3.
5964
5965The optional third parameter is the size of the field in
5966characters (-size).
5967
5968=item 4.
5969
5970The optional fourth parameter is the maximum number of characters the
5971field will accept (-maxlength).
5972
5973=back
5974
5975When the form is processed, you can retrieve the entered filename
3538e1d5 5976by calling param():
54310121 5977
29ddc2a4 5978 $filename = param('uploaded_file');
54310121 5979
3538e1d5
GS
5980Different browsers will return slightly different things for the
5981name. Some browsers return the filename only. Others return the full
5982path to the file, using the path conventions of the user's machine.
5983Regardless, the name returned is always the name of the file on the
5984I<user's> machine, and is unrelated to the name of the temporary file
5985that CGI.pm creates during upload spooling (see below).
54310121 5986
5987The filename returned is also a file handle. You can read the contents
5988of the file using standard Perl file reading calls:
5989
5990 # Read a text file and print it out
5991 while (<$filename>) {
5992 print;
5993 }
5994
5995 # Copy a binary file to somewhere safe
5996 open (OUTFILE,">>/usr/local/web/users/feedback");
5997 while ($bytesread=read($filename,$buffer,1024)) {
5998 print OUTFILE $buffer;
5999 }
6000
3538e1d5
GS
6001However, there are problems with the dual nature of the upload fields.
6002If you C<use strict>, then Perl will complain when you try to use a
6003string as a filehandle. You can get around this by placing the file
6004reading code in a block containing the C<no strict> pragma. More
6005seriously, it is possible for the remote user to type garbage into the
6006upload field, in which case what you get from param() is not a
6007filehandle at all, but a string.
6008
6009To be safe, use the I<upload()> function (new in version 2.47). When
6010called with the name of an upload field, I<upload()> returns a
6011filehandle, or undef if the parameter is not a valid filehandle.
6012
29ddc2a4 6013 $fh = upload('uploaded_file');
3538e1d5
GS
6014 while (<$fh>) {
6015 print;
6016 }
6017
13548fdf 6018In an list context, upload() will return an array of filehandles.
199d4a26
JH
6019This makes it possible to create forms that use the same name for
6020multiple upload fields.
6021
3538e1d5
GS
6022This is the recommended idiom.
6023
681699b9
SP
6024For robust code, consider reseting the file handle position to beginning of the
6025file. Inside of larger frameworks, other code may have already used the query
6026object and changed the filehandle postion:
6027
6028 seek($fh,0,0); # reset postion to beginning of file.
6029
54310121 6030When a file is uploaded the browser usually sends along some
6031information along with it in the format of headers. The information
6032usually includes the MIME content type. Future browsers may send
6033other information as well (such as modification date and size). To
6034retrieve this information, call uploadInfo(). It returns a reference to
6035an associative array containing all the document headers.
6036
29ddc2a4
RGS
6037 $filename = param('uploaded_file');
6038 $type = uploadInfo($filename)->{'Content-Type'};
54310121 6039 unless ($type eq 'text/html') {
6040 die "HTML FILES ONLY!";
6041 }
6042
6043If you are using a machine that recognizes "text" and "binary" data
6044modes, be sure to understand when and how to use them (see the Camel book).
3538e1d5
GS
6045Otherwise you may find that binary files are corrupted during file
6046uploads.
6047
6048There are occasionally problems involving parsing the uploaded file.
6049This usually happens when the user presses "Stop" before the upload is
6050finished. In this case, CGI.pm will return undef for the name of the
6051uploaded file and set I<cgi_error()> to the string "400 Bad request
6052(malformed multipart POST)". This error message is designed so that
6053you can incorporate it into a status code to be sent to the browser.
6054Example:
6055
29ddc2a4
RGS
6056 $file = upload('uploaded_file');
6057 if (!$file && cgi_error) {
6058 print header(-status=>cgi_error);
3538e1d5
GS
6059 exit 0;
6060 }
6061
6062You are free to create a custom HTML page to complain about the error,
6063if you wish.
54310121 6064
2ed511ec
RGS
6065You can set up a callback that will be called whenever a file upload
6066is being read during the form processing. This is much like the
6067UPLOAD_HOOK facility available in Apache::Request, with the exception
6068that the first argument to the callback is an Apache::Upload object,
6069here it's the remote filename.
6070
cb3b230c 6071 $q = CGI->new(\&hook [,$data [,$use_tempfile]]);
2ed511ec
RGS
6072
6073 sub hook
6074 {
6075 my ($filename, $buffer, $bytes_read, $data) = @_;
6076 print "Read $bytes_read bytes of $filename\n";
6077 }
6078
cb3b230c
SP
6079The $data field is optional; it lets you pass configuration
6080information (e.g. a database handle) to your hook callback.
6081
6082The $use_tempfile field is a flag that lets you turn on and off
6083CGI.pm's use of a temporary disk-based file during file upload. If you
6084set this to a FALSE value (default true) then param('uploaded_file')
6085will no longer work, and the only way to get at the uploaded data is
6086via the hook you provide.
6087
2ed511ec
RGS
6088If using the function-oriented interface, call the CGI::upload_hook()
6089method before calling param() or any other CGI functions:
6090
cb3b230c 6091 CGI::upload_hook(\&hook [,$data [,$use_tempfile]]);
2ed511ec
RGS
6092
6093This method is not exported by default. You will have to import it
6094explicitly if you wish to use it without the CGI:: prefix.
6095
199d4a26
JH
6096If you are using CGI.pm on a Windows platform and find that binary
6097files get slightly larger when uploaded but that text files remain the
6098same, then you have forgotten to activate binary mode on the output
6099filehandle. Be sure to call binmode() on any handle that you create
6100to write the uploaded file to disk.
6101
424ec8fa
GS
6102JAVASCRIPTING: The B<-onChange>, B<-onFocus>, B<-onBlur>,
6103B<-onMouseOver>, B<-onMouseOut> and B<-onSelect> parameters are
6104recognized. See textfield() for details.
54310121 6105
6106=head2 CREATING A POPUP MENU
6107
29ddc2a4 6108 print popup_menu('menu_name',
54310121 6109 ['eenie','meenie','minie'],
6110 'meenie');
6111
6112 -or-
6113
6114 %labels = ('eenie'=>'your first choice',
6115 'meenie'=>'your second choice',
6116 'minie'=>'your third choice');
188ba755 6117 %attributes = ('eenie'=>{'class'=>'class of first choice'});
29ddc2a4 6118 print popup_menu('menu_name',
54310121 6119 ['eenie','meenie','minie'],
188ba755 6120 'meenie',\%labels,\%attributes);
54310121 6121
6122 -or (named parameter style)-
6123
29ddc2a4 6124 print popup_menu(-name=>'menu_name',
54310121 6125 -values=>['eenie','meenie','minie'],
6126 -default=>'meenie',
188ba755
JH
6127 -labels=>\%labels,
6128 -attributes=>\%attributes);
54310121 6129
6130popup_menu() creates a menu.
6131
6132=over 4
6133
6134=item 1.
6135
6136The required first argument is the menu's name (-name).
6137
6138=item 2.
6139
6140The required second argument (-values) is an array B<reference>
6141containing the list of menu items in the menu. You can pass the
6142method an anonymous array, as shown in the example, or a reference to
6143a named array, such as "\@foo".
6144
6145=item 3.
6146
6147The optional third parameter (-default) is the name of the default
6148menu choice. If not specified, the first item will be the default.
6149The values of the previous choice will be maintained across queries.
6150
6151=item 4.
6152
6153The optional fourth parameter (-labels) is provided for people who
6154want to use different values for the user-visible label inside the
188ba755 6155popup menu and the value returned to your script. It's a pointer to an
54310121 6156associative array relating menu values to user-visible labels. If you
6157leave this parameter blank, the menu values will be displayed by
6158default. (You can also leave a label undefined if you want to).
6159
188ba755
JH
6160=item 5.
6161
6162The optional fifth parameter (-attributes) is provided to assign
6163any of the common HTML attributes to an individual menu item. It's
6164a pointer to an associative array relating menu values to another
6165associative array with the attribute's name as the key and the
6166attribute's value as the value.
6167
54310121 6168=back
6169
6170When the form is processed, the selected value of the popup menu can
6171be retrieved using:
6172
29ddc2a4 6173 $popup_menu_value = param('menu_name');
54310121 6174
188ba755
JH
6175=head2 CREATING AN OPTION GROUP
6176
6177Named parameter style
6178
29ddc2a4 6179 print popup_menu(-name=>'menu_name',
188ba755 6180 -values=>[qw/eenie meenie minie/,
29ddc2a4
RGS
6181 optgroup(-name=>'optgroup_name',
6182 -values => ['moe','catch'],
6183 -attributes=>{'catch'=>{'class'=>'red'}})],
188ba755
JH
6184 -labels=>{'eenie'=>'one',
6185 'meenie'=>'two',
6186 'minie'=>'three'},
6187 -default=>'meenie');
6188
6189 Old style
29ddc2a4 6190 print popup_menu('menu_name',
188ba755 6191 ['eenie','meenie','minie',
29ddc2a4
RGS
6192 optgroup('optgroup_name', ['moe', 'catch'],
6193 {'catch'=>{'class'=>'red'}})],'meenie',
188ba755
JH
6194 {'eenie'=>'one','meenie'=>'two','minie'=>'three'});
6195
29ddc2a4 6196optgroup() creates an option group within a popup menu.
188ba755
JH
6197
6198=over 4
6199
6200=item 1.
6201
6202The required first argument (B<-name>) is the label attribute of the
6203optgroup and is B<not> inserted in the parameter list of the query.
6204
6205=item 2.
6206
6207The required second argument (B<-values>) is an array reference
6208containing the list of menu items in the menu. You can pass the
6209method an anonymous array, as shown in the example, or a reference
6210to a named array, such as \@foo. If you pass a HASH reference,
6211the keys will be used for the menu values, and the values will be
6212used for the menu labels (see -labels below).
6213
6214=item 3.
6215
6216The optional third parameter (B<-labels>) allows you to pass a reference
6217to an associative array containing user-visible labels for one or more
6218of the menu items. You can use this when you want the user to see one
6219menu string, but have the browser return your program a different one.
6220If you don't specify this, the value string will be used instead
6221("eenie", "meenie" and "minie" in this example). This is equivalent
6222to using a hash reference for the -values parameter.
6223
6224=item 4.
6225
6226An optional fourth parameter (B<-labeled>) can be set to a true value
6227and indicates that the values should be used as the label attribute
6228for each option element within the optgroup.
6229
6230=item 5.
6231
6232An optional fifth parameter (-novals) can be set to a true value and
3c4b39be 6233indicates to suppress the val attribute in each option element within
188ba755
JH
6234the optgroup.
6235
6236See the discussion on optgroup at W3C
6237(http://www.w3.org/TR/REC-html40/interact/forms.html#edef-OPTGROUP)
6238for details.
6239
6240=item 6.
6241
6242An optional sixth parameter (-attributes) is provided to assign
6243any of the common HTML attributes to an individual menu item. It's
6244a pointer to an associative array relating menu values to another
6245associative array with the attribute's name as the key and the
6246attribute's value as the value.
6247
cff99809
JH
6248=back
6249
54310121 6250=head2 CREATING A SCROLLING LIST
6251
29ddc2a4 6252 print scrolling_list('list_name',
54310121 6253 ['eenie','meenie','minie','moe'],
188ba755 6254 ['eenie','moe'],5,'true',{'moe'=>{'class'=>'red'}});
54310121 6255 -or-
6256
29ddc2a4 6257 print scrolling_list('list_name',
54310121 6258 ['eenie','meenie','minie','moe'],
6259 ['eenie','moe'],5,'true',
188ba755 6260 \%labels,%attributes);
54310121 6261
6262 -or-
6263
29ddc2a4 6264 print scrolling_list(-name=>'list_name',
54310121 6265 -values=>['eenie','meenie','minie','moe'],
6266 -default=>['eenie','moe'],
6267 -size=>5,
6268 -multiple=>'true',
188ba755
JH
6269 -labels=>\%labels,
6270 -attributes=>\%attributes);
54310121 6271
6272scrolling_list() creates a scrolling list.
6273
6274=over 4
6275
6276=item B<Parameters:>
6277
6278=item 1.
6279
6280The first and second arguments are the list name (-name) and values
6281(-values). As in the popup menu, the second argument should be an
6282array reference.
6283
6284=item 2.
6285
6286The optional third argument (-default) can be either a reference to a
6287list containing the values to be selected by default, or can be a
6288single value to select. If this argument is missing or undefined,
6289then nothing is selected when the list first appears. In the named
6290parameter version, you can use the synonym "-defaults" for this
6291parameter.
6292
6293=item 3.
6294
6295The optional fourth argument is the size of the list (-size).
6296
6297=item 4.
6298
6299The optional fifth argument can be set to true to allow multiple
6300simultaneous selections (-multiple). Otherwise only one selection
6301will be allowed at a time.
6302
6303=item 5.
6304
6305The optional sixth argument is a pointer to an associative array
6306containing long user-visible labels for the list items (-labels).
6307If not provided, the values will be displayed.
6308
188ba755
JH
6309=item 6.
6310
6311The optional sixth parameter (-attributes) is provided to assign
6312any of the common HTML attributes to an individual menu item. It's
6313a pointer to an associative array relating menu values to another
6314associative array with the attribute's name as the key and the
6315attribute's value as the value.
6316
54310121 6317When this form is processed, all selected list items will be returned as
6318a list under the parameter name 'list_name'. The values of the
6319selected items can be retrieved with:
6320
29ddc2a4 6321 @selected = param('list_name');
54310121 6322
6323=back
6324
54310121 6325=head2 CREATING A GROUP OF RELATED CHECKBOXES
6326
29ddc2a4 6327 print checkbox_group(-name=>'group_name',
54310121 6328 -values=>['eenie','meenie','minie','moe'],
6329 -default=>['eenie','moe'],
6330 -linebreak=>'true',
8869a4b7 6331 -disabled => ['moe'],
188ba755
JH
6332 -labels=>\%labels,
6333 -attributes=>\%attributes);
54310121 6334
29ddc2a4 6335 print checkbox_group('group_name',
54310121 6336 ['eenie','meenie','minie','moe'],
188ba755
JH
6337 ['eenie','moe'],'true',\%labels,
6338 {'moe'=>{'class'=>'red'}});
54310121 6339
6340 HTML3-COMPATIBLE BROWSERS ONLY:
6341
29ddc2a4 6342 print checkbox_group(-name=>'group_name',
54310121 6343 -values=>['eenie','meenie','minie','moe'],
6344 -rows=2,-columns=>2);
3cb6de81 6345
54310121 6346
6347checkbox_group() creates a list of checkboxes that are related
6348by the same name.
6349
6350=over 4
6351
6352=item B<Parameters:>
6353
6354=item 1.
6355
6356The first and second arguments are the checkbox name and values,
6357respectively (-name and -values). As in the popup menu, the second
6358argument should be an array reference. These values are used for the
6359user-readable labels printed next to the checkboxes as well as for the
6360values passed to your script in the query string.
6361
6362=item 2.
6363
6364The optional third argument (-default) can be either a reference to a
6365list containing the values to be checked by default, or can be a
6366single value to checked. If this argument is missing or undefined,
6367then nothing is selected when the list first appears.
6368
6369=item 3.
6370
6371The optional fourth argument (-linebreak) can be set to true to place
6372line breaks between the checkboxes so that they appear as a vertical
6373list. Otherwise, they will be strung together on a horizontal line.
6374
29ddc2a4 6375=back
54310121 6376
54310121 6377
29ddc2a4
RGS
6378The optional b<-labels> argument is a pointer to an associative array
6379relating the checkbox values to the user-visible labels that will be
6380printed next to them. If not provided, the values will be used as the
6381default.
54310121 6382
54310121 6383
8869a4b7
SP
6384The optional parameters B<-rows>, and B<-columns> cause
6385checkbox_group() to return an HTML3 compatible table containing the
6386checkbox group formatted with the specified number of rows and
6387columns. You can provide just the -columns parameter if you wish;
6388checkbox_group will calculate the correct number of rows for you.
188ba755 6389
8869a4b7
SP
6390The option b<-disabled> takes an array of checkbox values and disables
6391them by greying them out (this may not be supported by all browsers).
188ba755 6392
29ddc2a4
RGS
6393The optional B<-attributes> argument is provided to assign any of the
6394common HTML attributes to an individual menu item. It's a pointer to
6395an associative array relating menu values to another associative array
6396with the attribute's name as the key and the attribute's value as the
6397value.
54310121 6398
29ddc2a4
RGS
6399The optional B<-tabindex> argument can be used to control the order in which
6400radio buttons receive focus when the user presses the tab button. If
6401passed a scalar numeric value, the first element in the group will
6402receive this tab index and subsequent elements will be incremented by
6403one. If given a reference to an array of radio button values, then
6404the indexes will be jiggered so that the order specified in the array
6405will correspond to the tab order. You can also pass a reference to a
6406hash in which the hash keys are the radio button values and the values
6407are the tab indexes of each button. Examples:
6408
6409 -tabindex => 100 # this group starts at index 100 and counts up
6410 -tabindex => ['moe','minie','eenie','meenie'] # tab in this order
6411 -tabindex => {meenie=>100,moe=>101,minie=>102,eenie=>200} # tab in this order
54310121 6412
bb8b3399
SP
6413The optional B<-labelattributes> argument will contain attributes
6414attached to the <label> element that surrounds each button.
6415
54310121 6416When the form is processed, all checked boxes will be returned as
6417a list under the parameter name 'group_name'. The values of the
6418"on" checkboxes can be retrieved with:
6419
29ddc2a4 6420 @turned_on = param('group_name');
54310121 6421
6422The value returned by checkbox_group() is actually an array of button
6423elements. You can capture them and use them within tables, lists,
6424or in other creative ways:
6425
29ddc2a4 6426 @h = checkbox_group(-name=>'group_name',-values=>\@values);
54310121 6427 &use_in_creative_way(@h);
6428
54310121 6429=head2 CREATING A STANDALONE CHECKBOX
6430
29ddc2a4 6431 print checkbox(-name=>'checkbox_name',
ac734d8b 6432 -checked=>1,
54310121 6433 -value=>'ON',
6434 -label=>'CLICK ME');
6435
6436 -or-
6437
29ddc2a4 6438 print checkbox('checkbox_name','checked','ON','CLICK ME');
54310121 6439
6440checkbox() is used to create an isolated checkbox that isn't logically
6441related to any others.
6442
6443=over 4
6444
6445=item B<Parameters:>
6446
6447=item 1.
6448
6449The first parameter is the required name for the checkbox (-name). It
6450will also be used for the user-readable label printed next to the
6451checkbox.
6452
6453=item 2.
6454
6455The optional second parameter (-checked) specifies that the checkbox
6456is turned on by default. Synonyms are -selected and -on.
6457
6458=item 3.
6459
6460The optional third parameter (-value) specifies the value of the
6461checkbox when it is checked. If not provided, the word "on" is
6462assumed.
6463
6464=item 4.
6465
6466The optional fourth parameter (-label) is the user-readable label to
6467be attached to the checkbox. If not provided, the checkbox name is
6468used.
6469
6470=back
6471
6472The value of the checkbox can be retrieved using:
6473
29ddc2a4 6474 $turned_on = param('checkbox_name');
54310121 6475
6476=head2 CREATING A RADIO BUTTON GROUP
6477
29ddc2a4 6478 print radio_group(-name=>'group_name',
54310121 6479 -values=>['eenie','meenie','minie'],
6480 -default=>'meenie',
6481 -linebreak=>'true',
188ba755
JH
6482 -labels=>\%labels,
6483 -attributes=>\%attributes);
54310121 6484
6485 -or-
6486
29ddc2a4 6487 print radio_group('group_name',['eenie','meenie','minie'],
188ba755 6488 'meenie','true',\%labels,\%attributes);
54310121 6489
6490
6491 HTML3-COMPATIBLE BROWSERS ONLY:
6492
29ddc2a4 6493 print radio_group(-name=>'group_name',
54310121 6494 -values=>['eenie','meenie','minie','moe'],
6495 -rows=2,-columns=>2);
6496
6497radio_group() creates a set of logically-related radio buttons
6498(turning one member of the group on turns the others off)
6499
6500=over 4
6501
6502=item B<Parameters:>
6503
6504=item 1.
6505
6506The first argument is the name of the group and is required (-name).
6507
6508=item 2.
6509
6510The second argument (-values) is the list of values for the radio
6511buttons. The values and the labels that appear on the page are
6512identical. Pass an array I<reference> in the second argument, either
6513using an anonymous array, as shown, or by referencing a named array as
6514in "\@foo".
6515
6516=item 3.
6517
6518The optional third parameter (-default) is the name of the default
6519button to turn on. If not specified, the first item will be the
6520default. You can provide a nonexistent button name, such as "-" to
6521start up with no buttons selected.
6522
6523=item 4.
6524
6525The optional fourth parameter (-linebreak) can be set to 'true' to put
6526line breaks between the buttons, creating a vertical list.
6527
6528=item 5.
6529
6530The optional fifth parameter (-labels) is a pointer to an associative
6531array relating the radio button values to user-visible labels to be
6532used in the display. If not provided, the values themselves are
6533displayed.
6534
29ddc2a4 6535=back
54310121 6536
188ba755 6537
29ddc2a4
RGS
6538All modern browsers can take advantage of the optional parameters
6539B<-rows>, and B<-columns>. These parameters cause radio_group() to
6540return an HTML3 compatible table containing the radio group formatted
6541with the specified number of rows and columns. You can provide just
6542the -columns parameter if you wish; radio_group will calculate the
6543correct number of rows for you.
188ba755 6544
54310121 6545To include row and column headings in the returned table, you
8869a4b7 6546can use the B<-rowheaders> and B<-colheaders> parameters. Both
54310121 6547of these accept a pointer to an array of headings to use.
6548The headings are just decorative. They don't reorganize the
f610777f 6549interpretation of the radio buttons -- they're still a single named
54310121 6550unit.
6551
29ddc2a4
RGS
6552The optional B<-tabindex> argument can be used to control the order in which
6553radio buttons receive focus when the user presses the tab button. If
6554passed a scalar numeric value, the first element in the group will
6555receive this tab index and subsequent elements will be incremented by
6556one. If given a reference to an array of radio button values, then
6557the indexes will be jiggered so that the order specified in the array
6558will correspond to the tab order. You can also pass a reference to a
6559hash in which the hash keys are the radio button values and the values
6560are the tab indexes of each button. Examples:
6561
6562 -tabindex => 100 # this group starts at index 100 and counts up
6563 -tabindex => ['moe','minie','eenie','meenie'] # tab in this order
6564 -tabindex => {meenie=>100,moe=>101,minie=>102,eenie=>200} # tab in this order
6565
6566
6567The optional B<-attributes> argument is provided to assign any of the
6568common HTML attributes to an individual menu item. It's a pointer to
6569an associative array relating menu values to another associative array
6570with the attribute's name as the key and the attribute's value as the
6571value.
54310121 6572
bb8b3399
SP
6573The optional B<-labelattributes> argument will contain attributes
6574attached to the <label> element that surrounds each button.
6575
54310121 6576When the form is processed, the selected radio button can
6577be retrieved using:
6578
29ddc2a4 6579 $which_radio_button = param('group_name');
54310121 6580
6581The value returned by radio_group() is actually an array of button
6582elements. You can capture them and use them within tables, lists,
6583or in other creative ways:
6584
29ddc2a4 6585 @h = radio_group(-name=>'group_name',-values=>\@values);
54310121 6586 &use_in_creative_way(@h);
6587
6588=head2 CREATING A SUBMIT BUTTON
6589
29ddc2a4 6590 print submit(-name=>'button_name',
54310121 6591 -value=>'value');
6592
6593 -or-
6594
29ddc2a4 6595 print submit('button_name','value');
54310121 6596
6597submit() will create the query submission button. Every form
6598should have one of these.
6599
6600=over 4
6601
6602=item B<Parameters:>
6603
6604=item 1.
6605
6606The first argument (-name) is optional. You can give the button a
6607name if you have several submission buttons in your form and you want
13548fdf 6608to distinguish between them.
54310121 6609
6610=item 2.
6611
6612The second argument (-value) is also optional. This gives the button
13548fdf
RGS
6613a value that will be passed to your script in the query string. The
6614name will also be used as the user-visible label.
6615
6616=item 3.
6617
6618You can use -label as an alias for -value. I always get confused
6619about which of -name and -value changes the user-visible label on the
6620button.
54310121 6621
6622=back
6623
6624You can figure out which button was pressed by using different
6625values for each one:
6626
29ddc2a4 6627 $which_one = param('button_name');
54310121 6628
6629=head2 CREATING A RESET BUTTON
6630
29ddc2a4 6631 print reset
54310121 6632
6633reset() creates the "reset" button. Note that it restores the
6634form to its value from the last time the script was called,
6635NOT necessarily to the defaults.
6636
71f3e297
JH
6637Note that this conflicts with the Perl reset() built-in. Use
6638CORE::reset() to get the original reset function.
6639
54310121 6640=head2 CREATING A DEFAULT BUTTON
6641
29ddc2a4 6642 print defaults('button_label')
54310121 6643
6644defaults() creates a button that, when invoked, will cause the
6645form to be completely reset to its defaults, wiping out all the
6646changes the user ever made.
6647
6648=head2 CREATING A HIDDEN FIELD
6649
29ddc2a4 6650 print hidden(-name=>'hidden_name',
54310121 6651 -default=>['value1','value2'...]);
6652
6653 -or-
6654
29ddc2a4 6655 print hidden('hidden_name','value1','value2'...);
54310121 6656
6657hidden() produces a text field that can't be seen by the user. It
6658is useful for passing state variable information from one invocation
6659of the script to the next.
6660
6661=over 4
6662
6663=item B<Parameters:>
6664
6665=item 1.
6666
6667The first argument is required and specifies the name of this
6668field (-name).
6669
6670=item 2.
6671
6672The second argument is also required and specifies its value
6673(-default). In the named parameter style of calling, you can provide
6674a single value here or a reference to a whole list
6675
6676=back
6677
6678Fetch the value of a hidden field this way:
6679
29ddc2a4 6680 $hidden_value = param('hidden_name');
54310121 6681
6682Note, that just like all the other form elements, the value of a
6683hidden field is "sticky". If you want to replace a hidden field with
6684some other values after the script has been called once you'll have to
6685do it manually:
6686
29ddc2a4 6687 param('hidden_name','new','values','here');
54310121 6688
6689=head2 CREATING A CLICKABLE IMAGE BUTTON
6690
29ddc2a4 6691 print image_button(-name=>'button_name',
54310121 6692 -src=>'/source/URL',
6693 -align=>'MIDDLE');
6694
6695 -or-
6696
29ddc2a4 6697 print image_button('button_name','/source/URL','MIDDLE');
54310121 6698
6699image_button() produces a clickable image. When it's clicked on the
6700position of the click is returned to your script as "button_name.x"
6701and "button_name.y", where "button_name" is the name you've assigned
6702to it.
6703
54310121 6704=over 4
6705
6706=item B<Parameters:>
6707
6708=item 1.
6709
6710The first argument (-name) is required and specifies the name of this
6711field.
6712
6713=item 2.
6714
6715The second argument (-src) is also required and specifies the URL
6716
6717=item 3.
6718The third option (-align, optional) is an alignment type, and may be
6719TOP, BOTTOM or MIDDLE
6720
6721=back
6722
6723Fetch the value of the button this way:
29ddc2a4
RGS
6724 $x = param('button_name.x');
6725 $y = param('button_name.y');
54310121 6726
6727=head2 CREATING A JAVASCRIPT ACTION BUTTON
6728
29ddc2a4 6729 print button(-name=>'button_name',
54310121 6730 -value=>'user visible label',
6731 -onClick=>"do_something()");
6732
6733 -or-
6734
29ddc2a4 6735 print button('button_name',"do_something()");
54310121 6736
6737button() produces a button that is compatible with Netscape 2.0's
6738JavaScript. When it's pressed the fragment of JavaScript code
6739pointed to by the B<-onClick> parameter will be executed. On
6740non-Netscape browsers this form element will probably not even
6741display.
6742
71f3e297 6743=head1 HTTP COOKIES
54310121 6744
71f3e297
JH
6745Netscape browsers versions 1.1 and higher, and all versions of
6746Internet Explorer, support a so-called "cookie" designed to help
6747maintain state within a browser session. CGI.pm has several methods
6748that support cookies.
54310121 6749
6750A cookie is a name=value pair much like the named parameters in a CGI
6751query string. CGI scripts create one or more cookies and send
6752them to the browser in the HTTP header. The browser maintains a list
6753of cookies that belong to a particular Web server, and returns them
6754to the CGI script during subsequent interactions.
6755
6756In addition to the required name=value pair, each cookie has several
6757optional attributes:
6758
6759=over 4
6760
6761=item 1. an expiration time
6762
6763This is a time/date string (in a special GMT format) that indicates
6764when a cookie expires. The cookie will be saved and returned to your
6765script until this expiration date is reached if the user exits
71f3e297
JH
6766the browser and restarts it. If an expiration date isn't specified, the cookie
6767will remain active until the user quits the browser.
54310121 6768
6769=item 2. a domain
6770
6771This is a partial or complete domain name for which the cookie is
6772valid. The browser will return the cookie to any host that matches
6773the partial domain name. For example, if you specify a domain name
71f3e297 6774of ".capricorn.com", then the browser will return the cookie to
54310121 6775Web servers running on any of the machines "www.capricorn.com",
6776"www2.capricorn.com", "feckless.capricorn.com", etc. Domain names
6777must contain at least two periods to prevent attempts to match
6778on top level domains like ".edu". If no domain is specified, then
6779the browser will only return the cookie to servers on the host the
6780cookie originated from.
6781
6782=item 3. a path
6783
6784If you provide a cookie path attribute, the browser will check it
6785against your script's URL before returning the cookie. For example,
6786if you specify the path "/cgi-bin", then the cookie will be returned
6787to each of the scripts "/cgi-bin/tally.pl", "/cgi-bin/order.pl",
6788and "/cgi-bin/customer_service/complain.pl", but not to the script
6789"/cgi-private/site_admin.pl". By default, path is set to "/", which
6790causes the cookie to be sent to any CGI script on your site.
6791
6792=item 4. a "secure" flag
6793
6794If the "secure" attribute is set, the cookie will only be sent to your
6795script if the CGI request is occurring on a secure channel, such as SSL.
6796
6797=back
6798
71f3e297 6799The interface to HTTP cookies is the B<cookie()> method:
54310121 6800
29ddc2a4 6801 $cookie = cookie(-name=>'sessionID',
54310121 6802 -value=>'xyzzy',
6803 -expires=>'+1h',
6804 -path=>'/cgi-bin/database',
6805 -domain=>'.capricorn.org',
6806 -secure=>1);
29ddc2a4 6807 print header(-cookie=>$cookie);
54310121 6808
6809B<cookie()> creates a new cookie. Its parameters include:
6810
6811=over 4
6812
6813=item B<-name>
6814
6815The name of the cookie (required). This can be any string at all.
71f3e297 6816Although browsers limit their cookie names to non-whitespace
54310121 6817alphanumeric characters, CGI.pm removes this restriction by escaping
6818and unescaping cookies behind the scenes.
6819
6820=item B<-value>
6821
6822The value of the cookie. This can be any scalar value,
6823array reference, or even associative array reference. For example,
6824you can store an entire associative array into a cookie this way:
6825
29ddc2a4 6826 $cookie=cookie(-name=>'family information',
54310121 6827 -value=>\%childrens_ages);
6828
6829=item B<-path>
6830
6831The optional partial path for which this cookie will be valid, as described
6832above.
6833
6834=item B<-domain>
6835
6836The optional partial domain for which this cookie will be valid, as described
6837above.
6838
6839=item B<-expires>
6840
6841The optional expiration date for this cookie. The format is as described
6842in the section on the B<header()> method:
6843
6844 "+1h" one hour from now
6845
6846=item B<-secure>
6847
6848If set to true, this cookie will only be used within a secure
6849SSL session.
6850
6851=back
6852
6853The cookie created by cookie() must be incorporated into the HTTP
6854header within the string returned by the header() method:
6855
0664a57d 6856 use CGI ':standard';
29ddc2a4 6857 print header(-cookie=>$my_cookie);
54310121 6858
6859To create multiple cookies, give header() an array reference:
6860
29ddc2a4 6861 $cookie1 = cookie(-name=>'riddle_name',
54310121 6862 -value=>"The Sphynx's Question");
29ddc2a4 6863 $cookie2 = cookie(-name=>'answers',
54310121 6864 -value=>\%answers);
29ddc2a4 6865 print header(-cookie=>[$cookie1,$cookie2]);
54310121 6866
03b9648d 6867To retrieve a cookie, request it by name by calling cookie() method
0664a57d
SP
6868without the B<-value> parameter. This example uses the object-oriented
6869form:
54310121 6870
6871 use CGI;
6872 $query = new CGI;
0664a57d
SP
6873 $riddle = $query->cookie('riddle_name');
6874 %answers = $query->cookie('answers');
03b9648d
JH
6875
6876Cookies created with a single scalar value, such as the "riddle_name"
6877cookie, will be returned in that form. Cookies with array and hash
6878values can also be retrieved.
54310121 6879
6880The cookie and CGI namespaces are separate. If you have a parameter
6881named 'answers' and a cookie named 'answers', the values retrieved by
6882param() and cookie() are independent of each other. However, it's
6883simple to turn a CGI parameter into a cookie, and vice-versa:
6884
6885 # turn a CGI parameter into a cookie
29ddc2a4 6886 $c=cookie(-name=>'answers',-value=>[param('answers')]);
54310121 6887 # vice-versa
29ddc2a4 6888 param(-name=>'answers',-value=>[cookie('answers')]);
54310121 6889
55b5d700
SP
6890If you call cookie() without any parameters, it will return a list of
6891the names of all cookies passed to your script:
6892
6893 @cookies = cookie();
6894
54310121 6895See the B<cookie.cgi> example script for some ideas on how to use
6896cookies effectively.
6897
71f3e297 6898=head1 WORKING WITH FRAMES
54310121 6899
71f3e297
JH
6900It's possible for CGI.pm scripts to write into several browser panels
6901and windows using the HTML 4 frame mechanism. There are three
6902techniques for defining new frames programmatically:
54310121 6903
6904=over 4
6905
6906=item 1. Create a <Frameset> document
6907
6908After writing out the HTTP header, instead of creating a standard
3acbd4f5 6909HTML document using the start_html() call, create a <frameset>
54310121 6910document that defines the frames on the page. Specify your script(s)
6911(with appropriate parameters) as the SRC for each of the frames.
6912
3acbd4f5 6913There is no specific support for creating <frameset> sections
54310121 6914in CGI.pm, but the HTML is very simple to write. See the frame
6915documentation in Netscape's home pages for details
6916
0664a57d 6917 http://wp.netscape.com/assist/net_sites/frames.html
54310121 6918
6919=item 2. Specify the destination for the document in the HTTP header
6920
6921You may provide a B<-target> parameter to the header() method:
3cb6de81 6922
29ddc2a4 6923 print header(-target=>'ResultsWindow');
54310121 6924
71f3e297
JH
6925This will tell the browser to load the output of your script into the
6926frame named "ResultsWindow". If a frame of that name doesn't already
6927exist, the browser will pop up a new window and load your script's
6928document into that. There are a number of magic names that you can
6929use for targets. See the frame documents on Netscape's home pages for
6930details.
54310121 6931
3acbd4f5 6932=item 3. Specify the destination for the document in the <form> tag
54310121 6933
6934You can specify the frame to load in the FORM tag itself. With
6935CGI.pm it looks like this:
6936
29ddc2a4 6937 print start_form(-target=>'ResultsWindow');
54310121 6938
6939When your script is reinvoked by the form, its output will be loaded
6940into the frame named "ResultsWindow". If one doesn't already exist
6941a new window will be created.
6942
6943=back
6944
6945The script "frameset.cgi" in the examples directory shows one way to
6946create pages in which the fill-out form and the response live in
6947side-by-side frames.
6948
29ddc2a4
RGS
6949=head1 SUPPORT FOR JAVASCRIPT
6950
6951Netscape versions 2.0 and higher incorporate an interpreted language
6952called JavaScript. Internet Explorer, 3.0 and higher, supports a
6953closely-related dialect called JScript. JavaScript isn't the same as
6954Java, and certainly isn't at all the same as Perl, which is a great
3c4b39be 6955pity. JavaScript allows you to programmatically change the contents of
29ddc2a4
RGS
6956fill-out forms, create new windows, and pop up dialog box from within
6957Netscape itself. From the point of view of CGI scripting, JavaScript
6958is quite useful for validating fill-out forms prior to submitting
6959them.
6960
6961You'll need to know JavaScript in order to use it. There are many good
6962sources in bookstores and on the web.
6963
6964The usual way to use JavaScript is to define a set of functions in a
6965<SCRIPT> block inside the HTML header and then to register event
6966handlers in the various elements of the page. Events include such
6967things as the mouse passing over a form element, a button being
6968clicked, the contents of a text field changing, or a form being
6969submitted. When an event occurs that involves an element that has
6970registered an event handler, its associated JavaScript code gets
6971called.
6972
6973The elements that can register event handlers include the <BODY> of an
6974HTML document, hypertext links, all the various elements of a fill-out
6975form, and the form itself. There are a large number of events, and
6976each applies only to the elements for which it is relevant. Here is a
6977partial list:
6978
6979=over 4
6980
6981=item B<onLoad>
6982
6983The browser is loading the current document. Valid in:
6984
6985 + The HTML <BODY> section only.
6986
6987=item B<onUnload>
6988
6989The browser is closing the current page or frame. Valid for:
6990
6991 + The HTML <BODY> section only.
6992
6993=item B<onSubmit>
6994
6995The user has pressed the submit button of a form. This event happens
6996just before the form is submitted, and your function can return a
6997value of false in order to abort the submission. Valid for:
6998
6999 + Forms only.
7000
7001=item B<onClick>
7002
7003The mouse has clicked on an item in a fill-out form. Valid for:
7004
7005 + Buttons (including submit, reset, and image buttons)
7006 + Checkboxes
7007 + Radio buttons
7008
7009=item B<onChange>
7010
7011The user has changed the contents of a field. Valid for:
7012
7013 + Text fields
7014 + Text areas
7015 + Password fields
7016 + File fields
7017 + Popup Menus
7018 + Scrolling lists
7019
7020=item B<onFocus>
7021
7022The user has selected a field to work with. Valid for:
7023
7024 + Text fields
7025 + Text areas
7026 + Password fields
7027 + File fields
7028 + Popup Menus
7029 + Scrolling lists
7030
7031=item B<onBlur>
7032
7033The user has deselected a field (gone to work somewhere else). Valid
7034for:
7035
7036 + Text fields
7037 + Text areas
7038 + Password fields
7039 + File fields
7040 + Popup Menus
7041 + Scrolling lists
7042
7043=item B<onSelect>
7044
7045The user has changed the part of a text field that is selected. Valid
7046for:
7047
7048 + Text fields
7049 + Text areas
7050 + Password fields
7051 + File fields
7052
7053=item B<onMouseOver>
7054
7055The mouse has moved over an element.
7056
7057 + Text fields
7058 + Text areas
7059 + Password fields
7060 + File fields
7061 + Popup Menus
7062 + Scrolling lists
7063
7064=item B<onMouseOut>
7065
7066The mouse has moved off an element.
7067
7068 + Text fields
7069 + Text areas
7070 + Password fields
7071 + File fields
7072 + Popup Menus
7073 + Scrolling lists
7074
7075=back
7076
7077In order to register a JavaScript event handler with an HTML element,
7078just use the event name as a parameter when you call the corresponding
7079CGI method. For example, to have your validateAge() JavaScript code
7080executed every time the textfield named "age" changes, generate the
7081field like this:
7082
7083 print textfield(-name=>'age',-onChange=>"validateAge(this)");
7084
7085This example assumes that you've already declared the validateAge()
7086function by incorporating it into a <SCRIPT> block. The CGI.pm
7087start_html() method provides a convenient way to create this section.
7088
7089Similarly, you can create a form that checks itself over for
7090consistency and alerts the user if some essential value is missing by
7091creating it this way:
7092 print startform(-onSubmit=>"validateMe(this)");
7093
7094See the javascript.cgi script for a demonstration of how this all
7095works.
7096
7097
7d37aa8e
LS
7098=head1 LIMITED SUPPORT FOR CASCADING STYLE SHEETS
7099
7100CGI.pm has limited support for HTML3's cascading style sheets (css).
7101To incorporate a stylesheet into your document, pass the
7102start_html() method a B<-style> parameter. The value of this
2ed511ec
RGS
7103parameter may be a scalar, in which case it is treated as the source
7104URL for the stylesheet, or it may be a hash reference. In the latter
7d37aa8e
LS
7105case you should provide the hash with one or more of B<-src> or
7106B<-code>. B<-src> points to a URL where an externally-defined
7107stylesheet can be found. B<-code> points to a scalar value to be
3acbd4f5 7108incorporated into a <style> section. Style definitions in B<-code>
7d37aa8e
LS
7109override similarly-named ones in B<-src>, hence the name "cascading."
7110
424ec8fa
GS
7111You may also specify the type of the stylesheet by adding the optional
7112B<-type> parameter to the hash pointed to by B<-style>. If not
7113specified, the style defaults to 'text/css'.
7114
7d37aa8e
LS
7115To refer to a style within the body of your document, add the
7116B<-class> parameter to any HTML element:
7117
7118 print h1({-class=>'Fancy'},'Welcome to the Party');
7119
7120Or define styles on the fly with the B<-style> parameter:
7121
7122 print h1({-style=>'Color: red;'},'Welcome to Hell');
7123
7124You may also use the new B<span()> element to apply a style to a
7125section of text:
7126
7127 print span({-style=>'Color: red;'},
7128 h1('Welcome to Hell'),
7129 "Where did that handbasket get to?"
7130 );
7131
7132Note that you must import the ":html3" definitions to have the
7133B<span()> method available. Here's a quick and dirty example of using
7134CSS's. See the CSS specification at
7135http://www.w3.org/pub/WWW/TR/Wd-css-1.html for more information.
7136
7137 use CGI qw/:standard :html3/;
7138
7139 #here's a stylesheet incorporated directly into the page
7140 $newStyle=<<END;
7141 <!--
7142 P.Tip {
7143 margin-right: 50pt;
7144 margin-left: 50pt;
7145 color: red;
7146 }
7147 P.Alert {
7148 font-size: 30pt;
7149 font-family: sans-serif;
7150 color: red;
7151 }
7152 -->
7153 END
7154 print header();
7155 print start_html( -title=>'CGI with Style',
7156 -style=>{-src=>'http://www.capricorn.com/style/st1.css',
7157 -code=>$newStyle}
7158 );
7159 print h1('CGI with Style'),
7160 p({-class=>'Tip'},
7161 "Better read the cascading style sheet spec before playing with this!"),
7162 span({-style=>'color: magenta'},
7163 "Look Mom, no hands!",
7164 p(),
7165 "Whooo wee!"
7166 );
7167 print end_html;
7168
13548fdf
RGS
7169Pass an array reference to B<-code> or B<-src> in order to incorporate
7170multiple stylesheets into your document.
6b4ac661 7171
8f3ccfa2
JH
7172Should you wish to incorporate a verbatim stylesheet that includes
7173arbitrary formatting in the header, you may pass a -verbatim tag to
7174the -style hash, as follows:
7175
8869a4b7
SP
7176print start_html (-style => {-verbatim => '@import url("/server-common/css/'.$cssFile.'");',
7177 -src => '/server-common/css/core.css'});
8f3ccfa2
JH
7178
7179
7180This will generate an HTML header that contains this:
7181
7182 <link rel="stylesheet" type="text/css" href="/server-common/css/core.css">
7183 <style type="text/css">
7184 @import url("/server-common/css/main.css");
7185 </style>
7186
1c87da1d
JH
7187Any additional arguments passed in the -style value will be
7188incorporated into the <link> tag. For example:
7189
7190 start_html(-style=>{-src=>['/styles/print.css','/styles/layout.css'],
7191 -media => 'all'});
7192
7193This will give:
7194
7195 <link rel="stylesheet" type="text/css" href="/styles/print.css" media="all"/>
7196 <link rel="stylesheet" type="text/css" href="/styles/layout.css" media="all"/>
7197
7198<p>
7199
7200To make more complicated <link> tags, use the Link() function
7201and pass it to start_html() in the -head argument, as in:
7202
7203 @h = (Link({-rel=>'stylesheet',-type=>'text/css',-src=>'/ss/ss.css',-media=>'all'}),
7204 Link({-rel=>'stylesheet',-type=>'text/css',-src=>'/ss/fred.css',-media=>'paper'}));
7205 print start_html({-head=>\@h})
7206
0664a57d
SP
7207To create primary and "alternate" stylesheet, use the B<-alternate> option:
7208
7209 start_html(-style=>{-src=>[
7210 {-src=>'/styles/print.css'},
7211 {-src=>'/styles/alt.css',-alternate=>1}
7212 ]
7213 });
7214
54310121 7215=head1 DEBUGGING
7216
3d1a2ec4
GS
7217If you are running the script from the command line or in the perl
7218debugger, you can pass the script a list of keywords or
7219parameter=value pairs on the command line or from standard input (you
7220don't have to worry about tricking your script into reading from
7221environment variables). You can pass keywords like this:
54310121 7222
7223 your_script.pl keyword1 keyword2 keyword3
7224
7225or this:
7226
7227 your_script.pl keyword1+keyword2+keyword3
7228
7229or this:
7230
7231 your_script.pl name1=value1 name2=value2
7232
7233or this:
7234
7235 your_script.pl name1=value1&name2=value2
7236
3d1a2ec4
GS
7237To turn off this feature, use the -no_debug pragma.
7238
7239To test the POST method, you may enable full debugging with the -debug
7240pragma. This will allow you to feed newline-delimited name=value
7241pairs to the script on standard input.
54310121 7242
7243When debugging, you can use quotes and backslashes to escape
7244characters in the familiar shell manner, letting you place
7245spaces and other funny characters in your parameter=value
7246pairs:
7247
7248 your_script.pl "name1='I am a long value'" "name2=two\ words"
7249
2ed511ec
RGS
7250Finally, you can set the path info for the script by prefixing the first
7251name/value parameter with the path followed by a question mark (?):
7252
7253 your_script.pl /your/path/here?name1=value1&name2=value2
7254
54310121 7255=head2 DUMPING OUT ALL THE NAME/VALUE PAIRS
7256
3d1a2ec4 7257The Dump() method produces a string consisting of all the query's
54310121 7258name/value pairs formatted nicely as a nested list. This is useful
7259for debugging purposes:
7260
29ddc2a4 7261 print Dump
3cb6de81 7262
54310121 7263
7264Produces something that looks like:
7265
3acbd4f5
JH
7266 <ul>
7267 <li>name1
7268 <ul>
7269 <li>value1
7270 <li>value2
7271 </ul>
7272 <li>name2
7273 <ul>
7274 <li>value1
7275 </ul>
7276 </ul>
54310121 7277
71f3e297
JH
7278As a shortcut, you can interpolate the entire CGI object into a string
7279and it will be replaced with the a nice HTML dump shown above:
54310121 7280
7281 $query=new CGI;
3acbd4f5 7282 print "<h2>Current Values</h2> $query\n";
54310121 7283
7284=head1 FETCHING ENVIRONMENT VARIABLES
7285
7286Some of the more useful environment variables can be fetched
7287through this interface. The methods are as follows:
7288
7289=over 4
7290
71f3e297
JH
7291=item B<Accept()>
7292
7293Return a list of MIME types that the remote browser accepts. If you
7294give this method a single argument corresponding to a MIME type, as in
29ddc2a4 7295Accept('text/html'), it will return a floating point value
71f3e297
JH
7296corresponding to the browser's preference for this type from 0.0
7297(don't want) to 1.0. Glob types (e.g. text/*) in the browser's accept
7298list are handled correctly.
54310121 7299
71f3e297
JH
7300Note that the capitalization changed between version 2.43 and 2.44 in
7301order to avoid conflict with Perl's accept() function.
54310121 7302
7303=item B<raw_cookie()>
7304
424ec8fa 7305Returns the HTTP_COOKIE variable, an HTTP extension implemented by
71f3e297
JH
7306Netscape browsers version 1.1 and higher, and all versions of Internet
7307Explorer. Cookies have a special format, and this method call just
7308returns the raw form (?cookie dough). See cookie() for ways of
7309setting and retrieving cooked cookies.
424ec8fa
GS
7310
7311Called with no parameters, raw_cookie() returns the packed cookie
7312structure. You can separate it into individual cookies by splitting
7313on the character sequence "; ". Called with the name of a cookie,
7314retrieves the B<unescaped> form of the cookie. You can use the
7315regular cookie() method to get the names, or use the raw_fetch()
7316method from the CGI::Cookie module.
54310121 7317
7318=item B<user_agent()>
7319
7320Returns the HTTP_USER_AGENT variable. If you give
7321this method a single argument, it will attempt to
7322pattern match on it, allowing you to do something
29ddc2a4 7323like user_agent(netscape);
54310121 7324
7325=item B<path_info()>
7326
7327Returns additional path information from the script URL.
6b4ac661 7328E.G. fetching /cgi-bin/your_script/additional/stuff will result in
29ddc2a4 7329path_info() returning "/additional/stuff".
54310121 7330
7331NOTE: The Microsoft Internet Information Server
7332is broken with respect to additional path information. If
7333you use the Perl DLL library, the IIS server will attempt to
7334execute the additional path information as a Perl script.
7335If you use the ordinary file associations mapping, the
7336path information will be present in the environment,
7337but incorrect. The best thing to do is to avoid using additional
7338path information in CGI scripts destined for use with IIS.
7339
7340=item B<path_translated()>
7341
7342As per path_info() but returns the additional
7343path information translated into a physical path, e.g.
7344"/usr/local/etc/httpd/htdocs/additional/stuff".
7345
7346The Microsoft IIS is broken with respect to the translated
7347path as well.
7348
7349=item B<remote_host()>
7350
7351Returns either the remote host name or IP address.
7352if the former is unavailable.
7353
7354=item B<script_name()>
7355Return the script name as a partial URL, for self-refering
7356scripts.
7357
7358=item B<referer()>
7359
7360Return the URL of the page the browser was viewing
7361prior to fetching your script. Not available for all
7362browsers.
7363
7364=item B<auth_type ()>
7365
7366Return the authorization/verification method in use for this
7367script, if any.
7368
7369=item B<server_name ()>
7370
7371Returns the name of the server, usually the machine's host
7372name.
7373
7374=item B<virtual_host ()>
7375
7376When using virtual hosts, returns the name of the host that
7377the browser attempted to contact
7378
03b9648d
JH
7379=item B<server_port ()>
7380
7381Return the port that the server is listening on.
7382
2ed511ec
RGS
7383=item B<virtual_port ()>
7384
7385Like server_port() except that it takes virtual hosts into account.
7386Use this when running with virtual hosts.
7387
54310121 7388=item B<server_software ()>
7389
7390Returns the server software and version number.
7391
7392=item B<remote_user ()>
7393
7394Return the authorization/verification name used for user
7395verification, if this script is protected.
7396
7397=item B<user_name ()>
7398
71f3e297
JH
7399Attempt to obtain the remote user's name, using a variety of different
7400techniques. This only works with older browsers such as Mosaic.
7401Newer browsers do not report the user name for privacy reasons!
54310121 7402
7403=item B<request_method()>
7404
7405Returns the method used to access your script, usually
7406one of 'POST', 'GET' or 'HEAD'.
7407
3538e1d5
GS
7408=item B<content_type()>
7409
7410Returns the content_type of data submitted in a POST, generally
7411multipart/form-data or application/x-www-form-urlencoded
7412
7413=item B<http()>
7414
7415Called with no arguments returns the list of HTTP environment
7416variables, including such things as HTTP_USER_AGENT,
7417HTTP_ACCEPT_LANGUAGE, and HTTP_ACCEPT_CHARSET, corresponding to the
7418like-named HTTP header fields in the request. Called with the name of
7419an HTTP header field, returns its value. Capitalization and the use
7420of hyphens versus underscores are not significant.
7421
7422For example, all three of these examples are equivalent:
7423
29ddc2a4
RGS
7424 $requested_language = http('Accept-language');
7425 $requested_language = http('Accept_language');
7426 $requested_language = http('HTTP_ACCEPT_LANGUAGE');
3538e1d5
GS
7427
7428=item B<https()>
7429
7430The same as I<http()>, but operates on the HTTPS environment variables
7431present when the SSL protocol is in effect. Can be used to determine
7432whether SSL is turned on.
7433
54310121 7434=back
7435
424ec8fa 7436=head1 USING NPH SCRIPTS
54310121 7437
424ec8fa
GS
7438NPH, or "no-parsed-header", scripts bypass the server completely by
7439sending the complete HTTP header directly to the browser. This has
7440slight performance benefits, but is of most use for taking advantage
7441of HTTP extensions that are not directly supported by your server,
7442such as server push and PICS headers.
54310121 7443
424ec8fa
GS
7444Servers use a variety of conventions for designating CGI scripts as
7445NPH. Many Unix servers look at the beginning of the script's name for
7446the prefix "nph-". The Macintosh WebSTAR server and Microsoft's
7447Internet Information Server, in contrast, try to decide whether a
7448program is an NPH script by examining the first line of script output.
54310121 7449
54310121 7450
424ec8fa
GS
7451CGI.pm supports NPH scripts with a special NPH mode. When in this
7452mode, CGI.pm will output the necessary extra header information when
7453the header() and redirect() methods are
7454called.
54310121 7455
69c89ae7
JH
7456The Microsoft Internet Information Server requires NPH mode. As of
7457version 2.30, CGI.pm will automatically detect when the script is
7458running under IIS and put itself into this mode. You do not need to
7459do this manually, although it won't hurt anything if you do. However,
7460note that if you have applied Service Pack 6, much of the
7461functionality of NPH scripts, including the ability to redirect while
7462setting a cookie, b<do not work at all> on IIS without a special patch
7463from Microsoft. See
7464http://support.microsoft.com/support/kb/articles/Q280/3/41.ASP:
7465Non-Parsed Headers Stripped From CGI Applications That Have nph-
7466Prefix in Name.
54310121 7467
424ec8fa 7468=over 4
54310121 7469
424ec8fa 7470=item In the B<use> statement
54310121 7471
424ec8fa
GS
7472Simply add the "-nph" pragmato the list of symbols to be imported into
7473your script:
54310121 7474
424ec8fa 7475 use CGI qw(:standard -nph)
54310121 7476
424ec8fa 7477=item By calling the B<nph()> method:
54310121 7478
424ec8fa 7479Call B<nph()> with a non-zero parameter at any point after using CGI.pm in your program.
54310121 7480
424ec8fa 7481 CGI->nph(1)
54310121 7482
551e1d92
RB
7483=item By using B<-nph> parameters
7484
7485in the B<header()> and B<redirect()> statements:
54310121 7486
29ddc2a4 7487 print header(-nph=>1);
54310121 7488
424ec8fa 7489=back
54310121 7490
424ec8fa
GS
7491=head1 Server Push
7492
ba056755 7493CGI.pm provides four simple functions for producing multipart
424ec8fa
GS
7494documents of the type needed to implement server push. These
7495functions were graciously provided by Ed Jordan <ed@fidalgo.net>. To
7496import these into your namespace, you must import the ":push" set.
7497You are also advised to put the script into NPH mode and to set $| to
74981 to avoid buffering problems.
7499
7500Here is a simple script that demonstrates server push:
7501
7502 #!/usr/local/bin/perl
7503 use CGI qw/:push -nph/;
7504 $| = 1;
ba056755
JH
7505 print multipart_init(-boundary=>'----here we go!');
7506 foreach (0 .. 4) {
424ec8fa 7507 print multipart_start(-type=>'text/plain'),
ba056755
JH
7508 "The current time is ",scalar(localtime),"\n";
7509 if ($_ < 4) {
7510 print multipart_end;
7511 } else {
7512 print multipart_final;
7513 }
424ec8fa
GS
7514 sleep 1;
7515 }
54310121 7516
424ec8fa 7517This script initializes server push by calling B<multipart_init()>.
ba056755
JH
7518It then enters a loop in which it begins a new multipart section by
7519calling B<multipart_start()>, prints the current local time,
424ec8fa 7520and ends a multipart section with B<multipart_end()>. It then sleeps
ba056755
JH
7521a second, and begins again. On the final iteration, it ends the
7522multipart section with B<multipart_final()> rather than with
7523B<multipart_end()>.
54310121 7524
424ec8fa 7525=over 4
54310121 7526
424ec8fa 7527=item multipart_init()
3cb6de81 7528
424ec8fa 7529 multipart_init(-boundary=>$boundary);
54310121 7530
424ec8fa
GS
7531Initialize the multipart system. The -boundary argument specifies
7532what MIME boundary string to use to separate parts of the document.
7533If not provided, CGI.pm chooses a reasonable boundary for you.
54310121 7534
424ec8fa 7535=item multipart_start()
54310121 7536
424ec8fa 7537 multipart_start(-type=>$type)
54310121 7538
424ec8fa
GS
7539Start a new part of the multipart document using the specified MIME
7540type. If not specified, text/html is assumed.
54310121 7541
424ec8fa 7542=item multipart_end()
54310121 7543
424ec8fa 7544 multipart_end()
54310121 7545
424ec8fa 7546End a part. You must remember to call multipart_end() once for each
ba056755
JH
7547multipart_start(), except at the end of the last part of the multipart
7548document when multipart_final() should be called instead of multipart_end().
7549
7550=item multipart_final()
7551
7552 multipart_final()
7553
7554End all parts. You should call multipart_final() rather than
7555multipart_end() at the end of the last part of the multipart document.
54310121 7556
424ec8fa 7557=back
54310121 7558
424ec8fa
GS
7559Users interested in server push applications should also have a look
7560at the CGI::Push module.
54310121 7561
ba056755
JH
7562Only Netscape Navigator supports server push. Internet Explorer
7563browsers do not.
7564
424ec8fa 7565=head1 Avoiding Denial of Service Attacks
54310121 7566
424ec8fa
GS
7567A potential problem with CGI.pm is that, by default, it attempts to
7568process form POSTings no matter how large they are. A wily hacker
7569could attack your site by sending a CGI script a huge POST of many
7570megabytes. CGI.pm will attempt to read the entire POST into a
7571variable, growing hugely in size until it runs out of memory. While
7572the script attempts to allocate the memory the system may slow down
7573dramatically. This is a form of denial of service attack.
54310121 7574
424ec8fa
GS
7575Another possible attack is for the remote user to force CGI.pm to
7576accept a huge file upload. CGI.pm will accept the upload and store it
7577in a temporary directory even if your script doesn't expect to receive
7578an uploaded file. CGI.pm will delete the file automatically when it
7579terminates, but in the meantime the remote user may have filled up the
7580server's disk space, causing problems for other programs.
54310121 7581
424ec8fa
GS
7582The best way to avoid denial of service attacks is to limit the amount
7583of memory, CPU time and disk space that CGI scripts can use. Some Web
7584servers come with built-in facilities to accomplish this. In other
7585cases, you can use the shell I<limit> or I<ulimit>
7586commands to put ceilings on CGI resource usage.
54310121 7587
54310121 7588
424ec8fa
GS
7589CGI.pm also has some simple built-in protections against denial of
7590service attacks, but you must activate them before you can use them.
7591These take the form of two global variables in the CGI name space:
54310121 7592
424ec8fa 7593=over 4
54310121 7594
424ec8fa 7595=item B<$CGI::POST_MAX>
54310121 7596
424ec8fa
GS
7597If set to a non-negative integer, this variable puts a ceiling
7598on the size of POSTings, in bytes. If CGI.pm detects a POST
7599that is greater than the ceiling, it will immediately exit with an error
7600message. This value will affect both ordinary POSTs and
7601multipart POSTs, meaning that it limits the maximum size of file
7602uploads as well. You should set this to a reasonably high
7603value, such as 1 megabyte.
54310121 7604
424ec8fa 7605=item B<$CGI::DISABLE_UPLOADS>
54310121 7606
424ec8fa
GS
7607If set to a non-zero value, this will disable file uploads
7608completely. Other fill-out form values will work as usual.
54310121 7609
7610=back
7611
424ec8fa 7612You can use these variables in either of two ways.
54310121 7613
424ec8fa 7614=over 4
54310121 7615
424ec8fa 7616=item B<1. On a script-by-script basis>
54310121 7617
424ec8fa 7618Set the variable at the top of the script, right after the "use" statement:
54310121 7619
424ec8fa
GS
7620 use CGI qw/:standard/;
7621 use CGI::Carp 'fatalsToBrowser';
7622 $CGI::POST_MAX=1024 * 100; # max 100K posts
7623 $CGI::DISABLE_UPLOADS = 1; # no uploads
54310121 7624
424ec8fa 7625=item B<2. Globally for all scripts>
54310121 7626
424ec8fa
GS
7627Open up CGI.pm, find the definitions for $POST_MAX and
7628$DISABLE_UPLOADS, and set them to the desired values. You'll
7629find them towards the top of the file in a subroutine named
7630initialize_globals().
54310121 7631
424ec8fa 7632=back
54310121 7633
3538e1d5
GS
7634An attempt to send a POST larger than $POST_MAX bytes will cause
7635I<param()> to return an empty CGI parameter list. You can test for
7636this event by checking I<cgi_error()>, either after you create the CGI
7637object or, if you are using the function-oriented interface, call
7638<param()> for the first time. If the POST was intercepted, then
7639cgi_error() will return the message "413 POST too large".
7640
7641This error message is actually defined by the HTTP protocol, and is
7642designed to be returned to the browser as the CGI script's status
7643 code. For example:
7644
7645 $uploaded_file = param('upload');
7646 if (!$uploaded_file && cgi_error()) {
7647 print header(-status=>cgi_error());
7648 exit 0;
7649 }
7650
7651However it isn't clear that any browser currently knows what to do
7652with this status code. It might be better just to create an
7653HTML page that warns the user of the problem.
54310121 7654
424ec8fa 7655=head1 COMPATIBILITY WITH CGI-LIB.PL
54310121 7656
3538e1d5
GS
7657To make it easier to port existing programs that use cgi-lib.pl the
7658compatibility routine "ReadParse" is provided. Porting is simple:
54310121 7659
424ec8fa
GS
7660OLD VERSION
7661 require "cgi-lib.pl";
7662 &ReadParse;
7663 print "The value of the antique is $in{antique}.\n";
54310121 7664
424ec8fa
GS
7665NEW VERSION
7666 use CGI;
5158e96b 7667 CGI::ReadParse();
424ec8fa 7668 print "The value of the antique is $in{antique}.\n";
54310121 7669
424ec8fa
GS
7670CGI.pm's ReadParse() routine creates a tied variable named %in,
7671which can be accessed to obtain the query variables. Like
7672ReadParse, you can also provide your own variable. Infrequently
7673used features of ReadParse, such as the creation of @in and $in
7674variables, are not supported.
54310121 7675
424ec8fa
GS
7676Once you use ReadParse, you can retrieve the query object itself
7677this way:
54310121 7678
424ec8fa 7679 $q = $in{CGI};
29ddc2a4 7680 print textfield(-name=>'wow',
424ec8fa 7681 -value=>'does this really work?');
54310121 7682
424ec8fa
GS
7683This allows you to start using the more interesting features
7684of CGI.pm without rewriting your old scripts from scratch.
54310121 7685
7686=head1 AUTHOR INFORMATION
7687
71f3e297
JH
7688Copyright 1995-1998, Lincoln D. Stein. All rights reserved.
7689
7690This library is free software; you can redistribute it and/or modify
7691it under the same terms as Perl itself.
54310121 7692
71f3e297
JH
7693Address bug reports and comments to: lstein@cshl.org. When sending
7694bug reports, please provide the version of CGI.pm, the version of
7695Perl, the name and version of your Web server, and the name and
7696version of the operating system you are using. If the problem is even
7697remotely browser dependent, please provide information about the
7698affected browers as well.
54310121 7699
7700=head1 CREDITS
7701
7702Thanks very much to:
7703
7704=over 4
7705
7706=item Matt Heffron (heffron@falstaff.css.beckman.com)
7707
7708=item James Taylor (james.taylor@srs.gov)
7709
7710=item Scott Anguish <sanguish@digifix.com>
7711
7712=item Mike Jewell (mlj3u@virginia.edu)
7713
7714=item Timothy Shimmin (tes@kbs.citri.edu.au)
7715
7716=item Joergen Haegg (jh@axis.se)
7717
71f3e297 7718=item Laurent Delfosse (delfosse@delfosse.com)
54310121 7719
7720=item Richard Resnick (applepi1@aol.com)
7721
7722=item Craig Bishop (csb@barwonwater.vic.gov.au)
7723
7724=item Tony Curtis (tc@vcpc.univie.ac.at)
7725
7726=item Tim Bunce (Tim.Bunce@ig.co.uk)
7727
7728=item Tom Christiansen (tchrist@convex.com)
7729
7730=item Andreas Koenig (k@franz.ww.TU-Berlin.DE)
7731
7732=item Tim MacKenzie (Tim.MacKenzie@fulcrum.com.au)
7733
7734=item Kevin B. Hendricks (kbhend@dogwood.tyler.wm.edu)
7735
7736=item Stephen Dahmen (joyfire@inxpress.net)
7737
7738=item Ed Jordan (ed@fidalgo.net)
7739
7740=item David Alan Pisoni (david@cnation.com)
7741
424ec8fa
GS
7742=item Doug MacEachern (dougm@opengroup.org)
7743
7744=item Robin Houston (robin@oneworld.org)
7745
54310121 7746=item ...and many many more...
7747
7748for suggestions and bug fixes.
7749
7750=back
7751
7752=head1 A COMPLETE EXAMPLE OF A SIMPLE FORM-BASED SCRIPT
7753
7754
7755 #!/usr/local/bin/perl
3cb6de81 7756
29ddc2a4 7757 use CGI ':standard';
3cb6de81 7758
29ddc2a4
RGS
7759 print header;
7760 print start_html("Example CGI.pm Form");
3acbd4f5 7761 print "<h1> Example CGI.pm Form</h1>\n";
29ddc2a4
RGS
7762 print_prompt();
7763 do_work();
7764 print_tail();
7765 print end_html;
3cb6de81 7766
54310121 7767 sub print_prompt {
29ddc2a4 7768 print start_form;
3acbd4f5 7769 print "<em>What's your name?</em><br>";
29ddc2a4
RGS
7770 print textfield('name');
7771 print checkbox('Not my real name');
3cb6de81 7772
3acbd4f5 7773 print "<p><em>Where can you find English Sparrows?</em><br>";
29ddc2a4 7774 print checkbox_group(
54310121 7775 -name=>'Sparrow locations',
7776 -values=>[England,France,Spain,Asia,Hoboken],
7777 -linebreak=>'yes',
7778 -defaults=>[England,Asia]);
3cb6de81 7779
3acbd4f5 7780 print "<p><em>How far can they fly?</em><br>",
29ddc2a4 7781 radio_group(
54310121 7782 -name=>'how far',
7783 -values=>['10 ft','1 mile','10 miles','real far'],
7784 -default=>'1 mile');
3cb6de81 7785
3acbd4f5 7786 print "<p><em>What's your favorite color?</em> ";
29ddc2a4 7787 print popup_menu(-name=>'Color',
54310121 7788 -values=>['black','brown','red','yellow'],
7789 -default=>'red');
3cb6de81 7790
29ddc2a4 7791 print hidden('Reference','Monty Python and the Holy Grail');
3cb6de81 7792
3acbd4f5 7793 print "<p><em>What have you got there?</em><br>";
29ddc2a4 7794 print scrolling_list(
54310121 7795 -name=>'possessions',
7796 -values=>['A Coconut','A Grail','An Icon',
7797 'A Sword','A Ticket'],
7798 -size=>5,
7799 -multiple=>'true');
3cb6de81 7800
3acbd4f5 7801 print "<p><em>Any parting comments?</em><br>";
29ddc2a4 7802 print textarea(-name=>'Comments',
54310121 7803 -rows=>10,
7804 -columns=>50);
3cb6de81 7805
29ddc2a4
RGS
7806 print "<p>",reset;
7807 print submit('Action','Shout');
7808 print submit('Action','Scream');
7809 print endform;
3acbd4f5 7810 print "<hr>\n";
54310121 7811 }
3cb6de81 7812
54310121 7813 sub do_work {
54310121 7814 my(@values,$key);
7815
3acbd4f5 7816 print "<h2>Here are the current settings in this form</h2>";
54310121 7817
29ddc2a4 7818 foreach $key (param) {
3acbd4f5 7819 print "<strong>$key</strong> -> ";
29ddc2a4 7820 @values = param($key);
3acbd4f5 7821 print join(", ",@values),"<br>\n";
54310121 7822 }
7823 }
3cb6de81 7824
54310121 7825 sub print_tail {
7826 print <<END;
3acbd4f5
JH
7827 <hr>
7828 <address>Lincoln D. Stein</address><br>
7829 <a href="/">Home Page</a>
54310121 7830 END
7831 }
7832
7833=head1 BUGS
7834
188ba755 7835Please report them.
54310121 7836
7837=head1 SEE ALSO
7838
b2d0d414 7839L<CGI::Carp>, L<CGI::Fast>, L<CGI::Pretty>
54310121 7840
7841=cut
7842