File Coverage

blib/lib/Gantry/Engine/CGI.pm
Criterion Covered Total %
statement 48 326 14.7
branch 7 106 6.6
condition 7 71 9.8
subroutine 10 59 16.9
pod 53 53 100.0
total 125 615 20.3


line stmt bran cond sub pod time code
1             package Gantry::Engine::CGI;
2             require Exporter;
3              
4 2     2   2334 use strict;
  2         3  
  2         70  
5 2     2   9 use Carp qw( croak );
  2         4  
  2         95  
6 2     2   9 use CGI::Simple;
  2         3  
  2         17  
7 2     2   37 use File::Basename;
  2         4  
  2         135  
8 2     2   973 use Gantry::Utils::DBConnHelper::Script;
  2         5  
  2         16  
9              
10 2     2   9 use vars qw( @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS );
  2         66  
  2         14644  
11              
12             ############################################################
13             # Variables #
14             ############################################################
15             @ISA = qw( Exporter );
16             @EXPORT = qw(
17             apache_param_hash
18             apache_uf_param_hash
19             apache_request
20             base_server
21             cgi_obj
22             config
23             cast_custom_error
24             consume_post_body
25             declined_response
26             dispatch_location
27             engine
28             engine_init
29             err_header_out
30             fish_location
31             fish_method
32             fish_path_info
33             fish_uri
34             fish_user
35             fish_config
36             get_auth_dbh
37             get_cached_config
38             get_config
39             get_dbh
40             get_post_body
41             locations
42             log_error
43             get_arg_hash
44             header_in
45             header_out
46             hostname
47             is_connection_secure
48             is_status_declined
49             port
50             print_output
51             redirect_response
52             remote_ip
53             send_http_header
54             set_cached_config
55             set_content_type
56             set_no_cache
57             set_req_params
58             status_const
59             send_error_output
60             success_code
61             server_root
62             file_upload
63             );
64              
65             @EXPORT_OK = qw( );
66            
67             ############################################################
68             # Functions #
69             ############################################################
70              
71             #--------------------------------------------------
72             # $self->new( { locations => {..}, config => {..} } );
73             #--------------------------------------------------
74             sub new {
75 1   50 1 1 46 my( $class, $self ) = ( shift, shift || {} );
76              
77 1         3 bless $self, $class;
78              
79 1         9 my $config = $self->{config};
80              
81 1 50       4 if ( $self->{config}{ GantryConfInstance } ) {
82             $config = $self->get_config(
83             $self->{config}{ GantryConfInstance },
84             $self->{config}{ GantryConfFile },
85 0         0 );
86             }
87              
88             Gantry::Utils::DBConnHelper::Script->set_conn_info(
89             {
90 1         15 dbconn => $config->{dbconn},
91             dbuser => $config->{dbuser},
92             dbpass => $config->{dbpass},
93             }
94             );
95              
96 1         8 Gantry::Utils::DBConnHelper::Script->set_auth_conn_info(
97             {
98             auth_dbconn => $config->{auth_dbconn},
99             auth_dbuser => $config->{auth_dbuser},
100             auth_dbpass => $config->{auth_dbpass},
101             }
102             );
103              
104 1   50     8 $CGI::Simple::DISABLE_UPLOADS = $config->{disable_uploads} || 0;
105 1   50     7 $CGI::Simple::POST_MAX = $config->{post_max} ||'20000000000';
106            
107 1         3 return $self;
108            
109             } # end new
110              
111             #--------------------------------------------------
112             # $self->add_config( key, value );
113             #--------------------------------------------------
114             sub add_config {
115 0     0 1 0 my( $self, $key, $val ) = @_;
116 0         0 $self->{cgi_obj}{config}->{$key} = $val;
117              
118             } # end add_config
119              
120             #--------------------------------------------------
121             # $self->add_location( key, value )
122             #--------------------------------------------------
123             sub add_location {
124 0     0 1 0 my( $self, $key, $val ) = @_;
125              
126 0         0 $self->{locations}->{$key} = $val;
127              
128             } # end add_location
129              
130             #--------------------------------------------------
131             # $self->consume_post_body();
132             #--------------------------------------------------
133             sub consume_post_body {
134 0     0 1 0 my $self = shift;
135 0         0 my $cgi = shift;
136              
137 0         0 my $content_length = $ENV{ CONTENT_LENGTH };
138              
139 0 0       0 return unless $content_length; # nothing to consume
140              
141 0 0       0 $content_length = 1e6 if $content_length > 1e6; # limit to ~ 1Meg
142              
143             # just read STDIN
144 0         0 my $content;
145             my $buffer;
146 0         0 while ( read( STDIN, $buffer, $content_length ) ) {
147 0         0 $content .= $buffer;
148              
149 0         0 $content_length -= length $buffer;
150             }
151              
152 0         0 $self->{__POST_BODY__} = $content;
153             }
154              
155             #--------------------------------------------------
156             # $self->get_post_body();
157             #--------------------------------------------------
158             sub get_post_body {
159 0     0 1 0 my $self = shift;
160              
161 0   0     0 return $self->{__POST_BODY__} || $self->{ cgi_obj }->{__POST_BODY__};
162             # the value is in the cgi_obj during testing
163             }
164              
165             #--------------------------------------------------
166             # $self->dispatch();
167             #--------------------------------------------------
168             sub dispatch {
169 0     0 1 0 my( $self ) = @_;
170              
171 0   0     0 my @path = ( split( m|/|, $ENV{PATH_INFO}||'' ) );
172              
173             LOOP:
174 0         0 while ( @path ) {
175              
176 0         0 $self->{config}->{location} = join( '/', @path );
177              
178 0 0       0 if ( defined $self->{locations}->{ $self->{config}->{location} } ) {
179 0         0 my $mod = $self->{locations}->{ $self->{config}->{location} };
180            
181 0 0       0 die "module not defined for location $self->{config}->{location}"
182             unless $mod;
183            
184 0         0 eval "use $mod";
185 0 0       0 if ( $@ ) { die $@; }
  0         0  
186              
187 0         0 return $mod->handler( $self );
188              
189             }
190              
191 0         0 pop( @path );
192            
193             } # end while path
194            
195 0         0 $self->{config}->{location} = '/';
196 0         0 my $mod = $self->{locations}->{ '/' };
197              
198 0 0       0 eval "use $mod" if $mod;
199 0 0       0 if ( $@ ) { die $@; }
  0         0  
200              
201 0         0 return $mod->handler( $self );
202              
203             } # end dispatch
204              
205             #-------------------------------------------------
206             # Exported methods
207             #-------------------------------------------------
208              
209             #-------------------------------------------------
210             # $self->file_upload( param_name )
211             #-------------------------------------------------
212             sub file_upload {
213 0     0 1 0 my( $self, $param ) = @_;
214              
215 0 0       0 die "file param required" if ! $param;
216            
217 0         0 my $q = $self->cgi();
218 0         0 my $filename = $q->param( $param );
219 0         0 $filename =~ s/\\/\//g;
220            
221 0         0 my( $name, $path, $suffix ) = fileparse(
222             $filename,
223             qr/\.(tar\.gz$|[^.]*)/
224             );
225            
226             return( {
227 0   0     0 unique_key => time . rand( 6 ),
228             fullname => ( $name . $suffix ),
229             name => $name,
230             suffix => $suffix,
231             size => ( $q->upload_info( $filename, 'size' ) || 0 ),
232             mime => $q->upload_info( $filename, 'mime' ),
233             filehandle => $q->upload( $filename ),
234             } );
235              
236             }
237              
238             #-------------------------------------------------
239             # $self->cast_custom_error( error )
240             #-------------------------------------------------
241             sub cast_custom_error {
242 0     0 1 0 my( $self, $error_page, $die_msg ) = @_;
243            
244 0 0       0 my $status = $self->status() ? $self->status() : '400 Bad Request';
245            
246 0         0 eval {
247 0         0 print $self->cgi->header(
248             -type => 'text/html',
249             -status => $status,
250             );
251             };
252 0 0       0 if ( $@ ) {
253 0         0 die "Error encountered in cast_custom_error: $@\n"
254             . "I was trying to say $error_page\n";
255             }
256              
257 0         0 $self->print_output( $error_page );
258              
259 0         0 return $status;
260              
261             }
262              
263             #-------------------------------------------------
264             # $self->apache_param_hash( $req )
265             #-------------------------------------------------
266             sub apache_param_hash {
267 0     0 1 0 my( $self ) = @_;
268              
269             #my %hash_ref = $self->cgi->Vars;
270             #return( \%hash_ref );
271 0         0 return( $self->cgi_obj->{params} );
272              
273             } # end: apache_param_hash
274              
275             #-------------------------------------------------
276             # $self->apache_uf_param_hash( $req )
277             #-------------------------------------------------
278             sub apache_uf_param_hash {
279 0     0 1 0 my( $self ) = @_;
280              
281 0         0 return( $self->cgi_obj->{uf_params} );
282              
283             } # end: apache_uf_param_hash
284              
285             #-------------------------------------------------
286             # $self->apache_request( )
287             #-------------------------------------------------
288             sub apache_request {
289 0     0 1 0 my( $self, $r ) = @_;
290            
291             } # end: apache_request
292              
293             #-------------------------------------------------
294             # $self->base_server( $r )
295             #-------------------------------------------------
296             sub base_server {
297 0     0 1 0 my( $self ) = ( shift );
298              
299 0   0     0 return( $ENV{HTTP_SERVER} || $ENV{HTTP_HOST} );
300            
301             } # end base_server
302              
303             #-------------------------------------------------
304             # $self->hostname( )
305             #-------------------------------------------------
306             sub hostname {
307 0     0 1 0 my( $self ) = ( shift );
308              
309 0   0     0 return( $ENV{HTTP_SERVER} || $ENV{HTTP_HOST} );
310            
311             } # end hostname
312              
313             #--------------------------------------------------
314             # $self->cgi_obj( $hash_ref )
315             #--------------------------------------------------
316             sub cgi_obj {
317 1     1 1 7 my( $self, $hash_ref ) = @_;
318              
319 1 50       4 if ( defined $hash_ref ) {
320 1         2 $self->{cgi_obj} = $hash_ref;
321             }
322              
323 1         3 return $self->{cgi_obj};
324             } # end cgi_obj
325              
326             #--------------------------------------------------
327             # $self->config( $hash_ref )
328             #--------------------------------------------------
329             sub config {
330 0     0 1 0 my( $self, $hash_ref ) = @_;
331              
332 0 0       0 if ( defined $hash_ref ) {
333 0         0 $self->{cgi_obj}{config} = $hash_ref;
334             }
335              
336 0         0 return $self->{cgi_obj}{config};
337             } # end config
338              
339             #-------------------------------------------------
340             # $self->declined_response( )
341             #-------------------------------------------------
342             sub declined_response {
343 0     0 1 0 my( $self, $action ) = @_;
344            
345 0         0 print $self->cgi->header(
346             -type => 'text/html',
347             -status => '404 Not Found',
348             );
349              
350 0         0 my $current_location = $self->config->{ location };
351              
352 0   0     0 print( $self->custom_error(
353             "Declined - undefined method
"
354             . ""
355             . "Method: $action
"
356             . "Location: " . $current_location . "
"
357             . "Module: " . (
358             $self->locations->{ $current_location }
359             || 'No module defined for this location' )
360             . ""
361             )
362             );
363            
364 0         0 return '404 Not Found';
365            
366             } # END declined_response
367              
368             #-------------------------------------------------
369             # $self->dispatch_location( )
370             #-------------------------------------------------
371             sub dispatch_location {
372 0     0 1 0 my $self = shift;
373              
374 0         0 return( $ENV{ PATH_INFO }, $self->config->{location} );
375             } # END dispatch_location
376              
377             #--------------------------------------------------
378             # $self->engine
379             #--------------------------------------------------
380             sub engine {
381 0     0 1 0 return __PACKAGE__;
382             } # engine
383              
384             #-------------------------------------------------
385             # $self->engine_init( $cgi_obj )
386             #-------------------------------------------------
387             sub engine_init {
388 0     0 1 0 my $self = shift;
389 0         0 my $cgi_obj = shift;
390 0         0 my $c = new CGI::Simple();
391              
392 0 0       0 $c->parse_query_string() if $ENV{ REQUEST_METHOD } eq 'POST';
393 0         0 $self->cgi( $c );
394              
395             # check for CGI::Simple errors
396 0 0       0 if ( $c->{'.cgi_error'} ) {
397 0         0 my $error = $c->{'.cgi_error'};
398 0         0 my ( $status ) = ( $error =~ s/^(\d+)\s+// );
399 0   0     0 $self->status( $status || 400 );
400 0         0 die( "$error\n" );
401             }
402              
403             # fix up params so the multiselects are arraays
404 0         0 my $params = {};
405 0         0 my $uf_params = {};
406              
407 0         0 foreach my $field ( $c->param ) {
408 0         0 my @values = $c->param( $field );
409              
410 0 0       0 if ( scalar @values > 1 ) {
411 0         0 $uf_params->{$field} = [ @values ];
412              
413             # Replace angle brackets and quotes with named-entity equivalents.
414 0         0 $_ =~ s/
415 0         0 $_ =~ s/>/>/g foreach @values;
416 0         0 $_ =~ s/"/"/g foreach @values;
417 0         0 $_ =~ s/'/'/g foreach @values;
418              
419             # Trim leading / trailing whitespace.
420 0         0 $_ =~ s/^\s+//o foreach @values;
421 0         0 $_ =~ s/\s+$//o foreach @values;
422              
423 0         0 $params->{$field} = [ @values ];
424             }
425              
426             else {
427 0         0 $params->{$field} = $c->param( $field );
428 0         0 $uf_params->{$field} = $params->{$field};
429              
430             # Replace angle brackets and quotes with named-entity equivalents.
431 0         0 $params->{$field} =~ s/
432 0         0 $params->{$field} =~ s/>/>/g;
433 0         0 $params->{$field} =~ s/"/"/g;
434 0         0 $params->{$field} =~ s/'/'/g;
435            
436             # Trim leading / trailing whitespace.
437 0         0 $params->{$field} =~ s/^\s+//o;
438 0         0 $params->{$field} =~ s/\s+$//o;
439             }
440             }
441              
442             # add in the fieldnames
443 0         0 $params->{'.fieldnames'} = [ $c->param ];
444 0         0 $uf_params->{'.fieldnames'} = [ $c->param ];
445              
446             # If the application has specified that it wants the unfiltered params
447             # by default, then make it happen.
448 0 0 0     0 if ($self->fish_config( 'unfiltered_params' ) && $self->fish_config( 'unfiltered_params' ) =~ /(1|on)/i) {
449 0         0 $cgi_obj->{params} = $uf_params;
450             }
451              
452             # Else, the application gets the request parameters filtered by default.
453             # NOTE: It's got access to the unfiltered hash, in case it needs a
454             # request/field to have the parameters in such a way.
455             else {
456 0         0 $cgi_obj->{params} = $params;
457 0         0 $cgi_obj->{uf_params} = $uf_params;
458             }
459              
460 0         0 $self->cgi_obj( $cgi_obj );
461              
462             } # END engine_init
463              
464             #-------------------------------------------------
465             # $self->err_header_out( $header_key, $header_value )
466             #-------------------------------------------------
467 0     0 1 0 sub err_header_out {
468             # Gantry.pm calls this for mod_perl's benefit.
469             } # end err_header_out
470              
471             #-------------------------------------------------
472             # $self->fish_location( )
473             #-------------------------------------------------
474             sub fish_location {
475 0     0 1 0 my $self = shift;
476              
477 0   0     0 my $app_rootp = $self->fish_config( 'app_rootp' ) || '';
478 0   0     0 my $location = $self->fish_config( 'location' ) || '';
479              
480 0         0 return( $app_rootp . $location );
481             } # END fish_location
482              
483             #-------------------------------------------------
484             # $self->fish_method( )
485             #-------------------------------------------------
486             sub fish_method {
487 0     0 1 0 my $self = shift;
488              
489 0         0 return $ENV{ REQUEST_METHOD };
490             } # END fish_method
491              
492             #-------------------------------------------------
493             # $self->fish_path_info( )
494             #-------------------------------------------------
495             sub fish_path_info {
496 0     0 1 0 my $self = shift;
497              
498 0         0 return $ENV{ PATH_INFO };
499             } # END fish_path_info
500              
501             #-------------------------------------------------
502             # $self->fish_uri( )
503             #-------------------------------------------------
504             sub fish_uri {
505 0     0 1 0 my $self = shift;
506              
507 0   0     0 my $sn = $ENV{SCRIPT_NAME} || '';
508 0   0     0 my $pi = $ENV{PATH_INFO} || '';
509            
510 0         0 return( "${sn}${pi}" );
511             } # END fish_uri
512              
513             #-------------------------------------------------
514             # $self->fish_user( )
515             #-------------------------------------------------
516             sub fish_user {
517 0     0 1 0 my $self = shift;
518              
519 0   0     0 return $self->user() || $self->{cgi_obj}{config}{user} || '';
520             } # END fish_user
521              
522             #--------------------------------------------------
523             # $self->fish_config( $param )
524             #--------------------------------------------------
525             sub fish_config {
526 5     5 1 960 my $self = shift;
527 5         8 my $param = shift;
528              
529             # see if there is Gantry::Conf data
530 5         14 my $conf = $self->get_config();
531              
532 5 50 33     15 return $$conf{ $param } if ( defined $conf and defined $$conf{ $param } );
533              
534             # otherwise, look in the cgi engine object
535             # ... starting at the location levels
536 5 50       15 if ( $self->{ cgi_obj }{ config }{ GantryLocation } ) {
537 5         9 my $glocs = $self->{ cgi_obj }{ config }{ GantryLocation };
538 5         15 my $loc = $self->location;
539 5         17 my @path = split( '/', $loc );
540              
541 5         16 while( @path ) {
542              
543 4         9 my $path = join( '/', @path );
544              
545 4 100 66     25 if ( defined $glocs->{ $path }
546             and
547             defined $glocs->{ $path }{ $param }
548             ) {
549 3         13 return $glocs->{ $path }{ $param };
550             }
551              
552 1         39 pop @path;
553             }
554             }
555              
556             # ... then defaulting to the top level
557 2         7 return $self->{cgi_obj}{config}{ $param };
558              
559             }
560              
561             #--------------------------------------------------
562             # $self->get_config
563             #--------------------------------------------------
564             sub get_config {
565 5     5 1 4 my $self = shift;
566 5   33     24 my $instance = shift || $self->{cgi_obj}{config}{ GantryConfInstance };
567              
568 5 50       15 return unless defined $instance;
569              
570 0   0       my $file = shift || $self->{cgi_obj}{config}{ GantryConfFile };
571              
572 0           my $conf;
573 0           my $cached = 0;
574 0           my $location = '';
575              
576              
577 0           eval {
578 0           $location = $self->location;
579             };
580              
581 0           $conf = $self->get_cached_config( $instance, $location );
582 0 0         if ( defined $conf ) {
583 0           return $conf;
584             }
585            
586 0           my $gantry_cache = 0;
587 0           my $gantry_cache_key = '';
588 0           my $gantry_cache_hit = 0;
589 0           eval {
590 0 0         ++$gantry_cache if $self->cache_inited();
591             };
592            
593             # are we using gantry cache ?
594 0 0         if ( $gantry_cache ) {
595              
596 0           $self->cache_namespace('gantry');
597            
598             # blow the gantry conf cache when server starts
599 0 0         if ( $self->engine_cycle() == 1 ) {
600            
601 0           eval {
602 0           foreach my $key ( @{ $self->cache_keys() } ) {
  0            
603 0           my @a = split( ':', $key );
604 0 0         if ( $a[0] eq 'gantryconf' ) {
605 0           $self->cache_del( $key );
606             }
607             }
608             };
609             }
610            
611             # build cache key
612 0   0       $gantry_cache_key = join( ':',
613             "gantryconf",
614             ( $self->namespace() || '' ),
615             $instance,
616             $location
617             );
618              
619 0           $conf = $self->cache_get( $gantry_cache_key );
620            
621 0 0         ++$gantry_cache_hit if defined $conf;
622             }
623            
624             # There will be an error if this method was called during construction
625             # that is before their is a Gantry descended object as the invocant.
626             # In that case, we don't care about the location anyway.
627 0           require Gantry::Conf;
628              
629 0   0       $conf ||= Gantry::Conf->retrieve(
630             {
631             instance => $instance,
632             config_file => $file,
633             location => $location
634             }
635             );
636            
637 0 0         if ( defined $conf ) {
638 0           $self->set_cached_config( $instance, $location, $conf );
639            
640 0 0 0       if ( $gantry_cache && ! $gantry_cache_hit ) {
641 0           $self->cache_set( $gantry_cache_key, $conf );
642             }
643             }
644              
645 0           return $conf;
646              
647             } # END get_config
648              
649             my %conf_cache;
650              
651             sub get_cached_config {
652 0     0 1   my $self = shift;
653 0           my $instance = shift;
654 0           my $location = shift;
655            
656 0   0       return $conf_cache{ $instance . $location } || undef;
657             }
658              
659             sub set_cached_config {
660 0     0 1   my $self = shift;
661 0           my $instance = shift;
662 0           my $location = shift; # not using location, this cache good for one page
663 0           my $conf = shift;
664              
665 0           $conf_cache{ $instance . $location } = $conf;
666             }
667              
668             #-------------------------------------------------
669             # $self->get_arg_hash
670             #-------------------------------------------------
671             sub get_arg_hash {
672 0     0 1   my( $self ) = @_;
673              
674             #my %hash_ref = $self->cgi->Vars;
675            
676 0 0         return wantarray ? %{ $self->cgi_obj->{params} }
  0            
677             : $self->cgi_obj->{params};
678            
679             } # end get_arg_hash
680              
681             #-------------------------------------------------
682             # $self->get_auth_dbh( )
683             #-------------------------------------------------
684             sub get_auth_dbh {
685 0     0 1   Gantry::Utils::DBConnHelper::Script->get_auth_dbh;
686             }
687              
688             #-------------------------------------------------
689             # $self->get_dbh( )
690             #-------------------------------------------------
691             sub get_dbh {
692 0     0 1   Gantry::Utils::DBConnHelper::Script->get_dbh;
693             }
694              
695             #-------------------------------------------------
696             # $self->header_in( )
697             #-------------------------------------------------
698             sub header_in {
699 0     0 1   my( $self, $key ) = @_;
700              
701 0   0       return $ENV{uc $key} || $ENV{$key} || '';
702             } # end header_in
703              
704             #-------------------------------------------------
705             # $self->header_out( $header_key, $header_value )
706             #-------------------------------------------------
707             sub header_out {
708 0     0 1   my( $self, $k, $v ) = @_;
709            
710             # $self->{__HEADERS_OUT__}->{$k} = $v if defined $k;
711             # return( $self->{__HEADERS_OUT__} );
712              
713 0           return $self->response_headers( $k, $v );
714              
715             } # end header_out
716              
717             #--------------------------------------------------
718             # $self->locations( $hash_ref )
719             #--------------------------------------------------
720             sub locations {
721 0     0 1   my( $self, $hash_ref ) = @_;
722              
723 0 0         if ( defined $hash_ref ) {
724 0           $self->{cgi_obj}{locations} = $hash_ref;
725             }
726              
727 0           return $self->{cgi_obj}{locations};
728             } # end locations
729              
730             #--------------------------------------------------
731             # $self->log_error( $text )
732             #--------------------------------------------------
733             sub log_error {
734 0     0 1   my ( $self, $text ) = @_;
735              
736 0           warn "$text\n";
737             }
738              
739             #-------------------------------------------------
740             # $self->redirect_response( )
741             #-------------------------------------------------
742             sub redirect_response {
743 0     0 1   my $self = shift;
744              
745 0           my $cookies = '';
746 0           foreach my $cookie ( @{ $self->cookie_stash() } ) {
  0            
747 0           print "Set-Cookie: $cookie\n";
748             }
749            
750 0           my $p = {};
751 0           $p->{uri} = $self->response_headers->{location};
752              
753 0           print $self->cgi->redirect( $p );
754            
755 0           return 302;
756             } # END redirect_response
757              
758             #-------------------------------------------------
759             # $self->remote_ip( $r )
760             #-------------------------------------------------
761             sub remote_ip {
762 0     0 1   my( $self ) = ( shift, shift );
763            
764 0           return( $ENV{REMOTE_ADDR} );
765              
766             } # end remote_ip
767              
768             #-------------------------------------------------
769             # $self->print_output( $response_page )
770             #-------------------------------------------------
771             sub print_output {
772 0     0 1   my $self = shift;
773 0           my $response_page = shift;
774              
775 0           print $response_page;
776              
777             } # print_output
778              
779             #-------------------------------------------------
780             # $self->port( $r )
781             #-------------------------------------------------
782             sub port {
783 0     0 1   my( $self ) = ( shift );
784            
785 0           return( $ENV{SERVER_PORT} );
786              
787             } # end port
788              
789             #-------------------------------------------------
790             # $self->server_root( $r )
791             #-------------------------------------------------
792             sub server_root {
793 0     0 1   my( $self ) = ( shift );
794            
795 0           return( $ENV{HTTP_SERVER} );
796              
797             } # end server_root
798              
799             #-------------------------------------------------
800             # $self->status_const( 'OK | DECLINED | REDIRECT' )
801             #-------------------------------------------------
802             sub status_const {
803 0     0 1   my( $self, $status ) = @_;
804              
805 0 0         return '404' if uc $status eq 'DECLINED';
806 0 0         return '200' if uc $status eq 'OK';
807 0 0         return '301' if uc $status eq 'MOVED_PERMANENTLY';
808 0 0         return '302' if uc $status eq 'REDIRECT';
809 0 0         return '403' if uc $status eq 'FORBIDDEN';
810 0 0         return '401' if uc $status eq 'AUTH_REQUIRED';
811 0 0         return '401' if uc $status eq 'HTTP_UNAUTHORIZED';
812 0 0         return '400' if uc $status eq 'BAD_REQUEST';
813 0 0         return '500' if uc $status eq 'SERVER_ERROR';
814              
815 0           die( "Undefined constant $status" );
816            
817              
818             } # end status_const
819              
820             #-------------------------------------------------
821             # $self->is_connection_secure()
822             #-------------------------------------------------
823             sub is_connection_secure {
824 0     0 1   my $self = shift;
825              
826 0 0         return $ENV{'SSL_PROTOCOL'} ? 1 : 0;
827             } # END is_connection_secure
828              
829             #-------------------------------------------------
830             # $self->is_status_declined( $status )
831             #-------------------------------------------------
832             sub is_status_declined {
833 0     0 1   my $self = shift;
834              
835 0   0       my $status = $self->status || '';
836              
837 0 0         return 1 if ( $status eq 'DECLINED' );
838             } # END is_status_declined
839              
840             #-------------------------------------------------
841             # $self->send_error_output( $@ )
842             #-------------------------------------------------
843             sub send_error_output {
844 0     0 1   my $self = shift;
845              
846 0           print $self->cgi->header(
847             -type => 'text/html',
848             -status => '500 Server Error',
849             );
850              
851 0           $self->do_error( $@ );
852 0           print( $self->custom_error( $@ ) );
853              
854             } # END send_error_output
855              
856             #-------------------------------------------------
857             # $self->send_http_header( )
858             #-------------------------------------------------
859             sub send_http_header {
860 0     0 1   my $self = shift;
861              
862 0           my $cookies = '';
863 0           foreach my $cookie ( @{ $self->cookie_stash() } ) {
  0            
864 0           print "Set-Cookie: $cookie\n";
865             }
866              
867 0           my $header_for = $self->response_headers();
868            
869 0           foreach my $variable ( keys %{ $header_for } ) {
  0            
870 0           print "$variable: $header_for->{ $variable }\n";
871             }
872              
873 0 0         print $self->cgi->header(
    0          
874             -type => ( $self->content_type ? $self->content_type : 'text/html' ),
875             -status => ( $self->status() ? $self->status() : '200 OK' ),
876             );
877            
878             } # send_http_header
879              
880             #-------------------------------------------------
881             # $self->set_content_type( )
882             #-------------------------------------------------
883 0     0 1   sub set_content_type {
884              
885              
886             # This method is for mod_perl engines. They need to transfer
887             # the content_type from the site object to the apache request object.
888             # We don't need to do that.
889              
890             } # set_content_type
891              
892             #-------------------------------------------------
893             # $self->set_no_cache( )
894             #-------------------------------------------------
895             sub set_no_cache {
896 0     0 1   my $self = shift;
897              
898 0 0         $self->cgi->no_cache( 1 ) if $self->no_cache;
899             } # set_no_cache
900              
901             #-------------------------------------------------
902             # $self->set_req_params( )
903             #-------------------------------------------------
904             sub set_req_params {
905 0     0 1   my $self = shift;
906              
907 0           $self->params( $self->cgi_obj->{params} );
908 0           $self->uf_params( $self->cgi_obj->{uf_params} );
909              
910             } # END set_req_params
911              
912             #-------------------------------------------------
913             # $self->success_code( )
914             #-------------------------------------------------
915             sub success_code {
916              
917 0     0 1   return '200';
918             # This is for mod_perl engines. They need to tell apache that
919             # things went well.
920              
921             } # END success_code
922              
923             sub parse_env {
924 0     0 1   my $data;
925 0           my $hash = {};
926              
927 0           my $ParamSeparator = '&';
928              
929 0 0 0       if ( defined $ENV{REQUEST_METHOD}
    0 0        
    0          
930             && $ENV{REQUEST_METHOD} eq "POST" ) {
931              
932 0           read STDIN , $data , $ENV{CONTENT_LENGTH} ,0;
933              
934 0 0         if ( $ENV{QUERY_STRING} ) {
935 0           $data .= $ParamSeparator . $ENV{QUERY_STRING};
936             }
937              
938             }
939             elsif ( defined $ENV{REQUEST_METHOD}
940             && $ENV{REQUEST_METHOD} eq "GET" ) {
941            
942 0           $data = $ENV{QUERY_STRING};
943             }
944             elsif ( defined $ENV{REQUEST_METHOD} ) {
945 0           print "Status: 405 Method Not Allowed\r\n\r\n";
946 0           exit;
947             }
948              
949 0 0 0       return {} unless (defined $data and $data ne '');
950              
951              
952 0           $data =~ s/\?$//;
953 0           my $i=0;
954              
955 0           my @items = grep {!/^$/} (split /$ParamSeparator/o, $data);
  0            
956 0           my $thing;
957              
958 0           foreach $thing (@items) {
959              
960 0           my @res = $thing=~/^(.*?)=(.*)$/;
961 0           my ( $name, $value, @value );
962              
963 0 0         if ( $#res <= 0 ) {
964 0           $name = $i++;
965 0           $value = $thing;
966             }
967             else {
968 0           ( $name, $value ) = @res;
969             }
970            
971 0           $name =~ tr/+/ /;
972 0           $name =~ s/%(\w\w)/chr(hex $1)/ge;
  0            
973              
974 0           $value =~ tr/+/ /;
975 0           $value =~ s/%(\w\w)/chr(hex $1)/ge;
  0            
976              
977 0 0         if ( $hash->{$name} ) {
978 0 0         if ( ref $hash->{$name} ) {
979 0           push( @{$hash->{$name}}, $value );
  0            
980             }
981             else {
982 0           $hash->{$name} = [ $hash->{$name}, $value];
983             }
984             }
985             else {
986 0           $hash->{$name} = $value;
987             }
988             }
989            
990 0           return( $hash );
991             }
992              
993             #-------------------------------------------------
994             # $self->url_encode( )
995             #-------------------------------------------------
996             sub url_encode {
997 0     0 1   my $self = shift;
998 0           my $value = shift;
999            
1000 0           return CGI::Simple::Util::escape( $value );
1001             } # END url_encode
1002              
1003             #-------------------------------------------------
1004             # $self->url_decode( )
1005             #-------------------------------------------------
1006             sub url_decode {
1007 0     0 1   my $self = shift;
1008 0           my $value = shift;
1009            
1010 0           return CGI::Simple::Util::unescape( $value );
1011             } # END url_decode
1012              
1013             # EOF
1014             1;
1015              
1016             __END__