66676690147f3deb95485175134a1e87df8a3cab
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / Apache.pm
1 package Catalyst::Engine::Apache;
2
3 use strict;
4 use base 'Catalyst::Engine';
5
6 use URI;
7 use URI::http;
8
9 __PACKAGE__->mk_accessors(qw/apache/);
10
11 =head1 NAME
12
13 Catalyst::Engine::Apache - Catalyst Apache Engine
14
15 =head1 SYNOPSIS
16
17 See L<Catalyst>.
18
19 =head1 DESCRIPTION
20
21 This is a base class engine specialized for Apache (i.e. for mod_perl).
22
23 =head1 METHODS
24
25 =over 4
26
27 =item $c->apache
28
29 Returns an C<Apache::Request> object.
30
31 =back
32
33 =head1 OVERLOADED METHODS
34
35 This class overloads some methods from C<Catalyst::Engine>.
36
37 =over 4
38
39 =item $c->finalize_body
40
41 =cut
42
43 sub finalize_body {
44     my $c = shift;
45     $c->apache->print( $c->response->body );
46 }
47
48 =item $c->prepare_body
49
50 =cut
51
52 sub prepare_body {
53     my $c = shift;
54
55     my $length = $c->request->content_length;
56     my ( $buffer, $content );
57
58     while ($length) {
59
60         $c->apache->read( $buffer, ( $length < 8192 ) ? $length : 8192 );
61
62         $length  -= length($buffer);
63         $content .= $buffer;
64     }
65     
66     $c->request->body($content);
67 }
68
69 =item $c->prepare_connection
70
71 =cut
72
73 sub prepare_connection {
74     my $c = shift;
75     $c->request->hostname( $c->apache->connection->remote_host );
76     $c->request->address( $c->apache->connection->remote_ip );
77 }
78
79 =item $c->prepare_headers
80
81 =cut
82
83 sub prepare_headers {
84     my $c = shift;
85     $c->request->method( $c->apache->method );
86     $c->request->header( %{ $c->apache->headers_in } );
87 }
88
89 =item $c->prepare_parameters
90
91 =cut
92
93 sub prepare_parameters {
94     my $c = shift;
95
96     my @params;
97     
98     $c->apache->param->do( sub {
99         my ( $field, $value ) = @_;
100         push( @params, $field, $value );
101         return 1;    
102     });
103     
104     $c->request->param(\@params);
105 }
106
107 =item $c->prepare_path
108
109 =cut
110
111 # XXX needs fixing, only work with <Location> directive,
112 # not <Directory> directive
113 sub prepare_path {
114     my $c = shift;
115     $c->request->path( $c->apache->uri );
116     my $loc = $c->apache->location;
117     no warnings 'uninitialized';
118     $c->req->{path} =~ s/^($loc)?\///;
119     my $base = URI->new;
120     $base->scheme( $ENV{HTTPS} ? 'https' : 'http' );
121     $base->host( $c->apache->hostname );
122     $base->port( $c->apache->get_server_port );
123     my $path = $c->apache->location;
124     $base->path( $path =~ /\/$/ ? $path : "$path/" );
125     $c->request->base( $base->as_string );
126 }
127
128 =item $c->run
129
130 =cut
131
132 sub run { }
133
134 =back
135
136 =head1 SEE ALSO
137
138 L<Catalyst>.
139
140 =head1 AUTHOR
141
142 Sebastian Riedel, C<sri@cpan.org>
143 Christian Hansen C<ch@ngmedia.com>
144
145 =head1 COPYRIGHT
146
147 This program is free software, you can redistribute it and/or modify it under
148 the same terms as Perl itself.
149
150 =cut
151
152 1;