1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
package CGI::Maypole;
use base 'Maypole';
use strict;
use warnings;
use CGI::Simple;
use Maypole::Headers;
our $VERSION = '2.09';
sub run {
my $self = shift;
return $self->handler();
}
sub get_request {
shift->{cgi} = CGI::Simple->new();
}
sub parse_location {
my $self = shift;
my $cgi = $self->{cgi};
# Reconstruct the request headers (as far as this is possible)
$self->headers_in(Maypole::Headers->new);
for my $http_header ($cgi->http) {
(my $field_name = $http_header) =~ s/^HTTPS?_//;
$self->headers_in->set($field_name => $cgi->http($http_header));
}
$self->{path} = $cgi->url( -absolute => 1, -path_info => 1 );
my $loc = $cgi->url( -absolute => 1 );
no warnings 'uninitialized';
$self->{path} .= '/' if $self->{path} eq $loc;
$self->{path} =~ s/^($loc)?\///;
$self->parse_path;
$self->parse_args;
}
sub parse_args {
my $self = shift;
my (%vars) = $self->{cgi}->Vars;
while ( my ( $key, $value ) = each %vars ) {
my @values = split "\0", $value;
$vars{$key} = @values <= 1 ? $values[0] : \@values;
}
$self->{params} = {%vars};
$self->{query} = {%vars};
}
sub send_output {
my $r = shift;
# Collect HTTP headers
my %headers = (
-type => $r->{content_type},
-charset => $r->{document_encoding},
-content_length => do { use bytes; length $r->{output} },
);
foreach ($r->headers_out->field_names) {
next if /^Content-(Type|Length)/;
$headers{"-$_"} = $r->headers_out->get($_);
}
print $r->{cgi}->header(%headers), $r->{output};
}
sub get_template_root {
my $r = shift;
$r->{cgi}->document_root . "/" . $r->{cgi}->url( -relative => 1 );
}
1;
=head1 NAME
CGI::Maypole - CGI-based front-end to Maypole
=head1 SYNOPSIS
package BeerDB;
use base 'CGI::Maypole';
BeerDB->setup("dbi:mysql:beerdb");
BeerDB->config->uri_base("http://your.site/cgi-bin/beer.cgi/");
BeerDB->config->display_tables([qw[beer brewery pub style]]);
BeerDB->config->template_root("/var/www/beerdb/");
# Now set up your database:
# has-a relationships
# untaint columns
1;
## example beer.cgi:
#!/usr/bin/perl -w
use strict;
use BeerDB;
BeerDB->run();
Now to access the beer database, type this URL into your browser:
http://your.site/cgi-bin/beer.cgi/frontpage
=head1 DESCRIPTION
This is a CGI platform driver for Maypole. Your application can inherit from
CGI::Maypole directly, but it is recommended that you use
L<Maypole::Application>.
=head1 METHODS
=over
=item run
Call this from your CGI script to start the Maypole application.
=back
=head1 Implementation
This class overrides a set of methods in the base Maypole class to provide it's
functionality. See L<Maypole> for these:
=over
=item get_request
=item get_template_root
=item parse_args
=item parse_location
=item send_output
=back
=head1 AUTHORS
Dave Ranney C<dave@sialia.com>
Simon Cozens C<simon@cpan.org>
=cut
|