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{&}{&}gso; 2190 $toencode =~ s{<}{<}gso; 2191 $toencode =~ s{>}{>}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{"}{"}gso; 2197 } 2198 else { 2199 $toencode =~ s{"}{"}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{'}{'}gso; 2205 $toencode =~ s{\x8b}{‹}gso; 2206 $toencode =~ s{\x9b}{›}gso; 2207 if (defined $newlinestoo && $newlinestoo) { 2208 $toencode =~ s{\012}{ }gso; 2209 $toencode =~ s{\015}{ }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 "<", ">" becomes ">", "&" becomes "&", and 5624the quote character becomes """. 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 ("‹" and "›"). 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 Á, 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