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