]> git.decadent.org.uk Git - maypole.git/blobdiff - lib/Apache/MVC.pm
fixed bug 16869 - forced inheritance of model
[maypole.git] / lib / Apache / MVC.pm
index 4623b9f607dbaf3c6fb2d0f47876166ed7b9d111..ddd742b2065be219de5330e959e27d8e150a5f53 100644 (file)
@@ -1,6 +1,6 @@
 package Apache::MVC;
 
-our $VERSION = '2.10';
+our $VERSION = '2.11';
 
 use strict;
 use warnings;
@@ -11,23 +11,30 @@ use Maypole::Constants;
 
 __PACKAGE__->mk_accessors( qw( ar ) );
 
+our $MODPERL2;
+our $modperl_version;
+
 BEGIN {
-    my $version;
-    eval 'use mod_perl2; $version = $mod_perl2::VERSION; ';
+    eval 'use Apache;';
     if ($@) {
-       use mod_perl;
-       $version = 0;
+         eval 'use mod_perl2; $modperl_version = $mod_perl2::VERSION; ';
+         if ($@) {
+          $modperl_version = $Apache2::RequestRec::VERSION;
+         }
+        require Apache2::RequestIO;
+        require Apache2::RequestRec;
+        require Apache2::RequestUtil;
+        require APR::URI;
+        require HTTP::Body;
+        $MODPERL2 = 1;
+    } else {
+       eval ' use mod_perl; ';
        require Apache;
        require Apache::Request;
-    } else {
-       require Apache2::RequestIO;
-       require Apache2::RequestRec;
-       require Apache2::RequestUtil;
-       require APR::URI;
-       require Apache2::Request;
+       $MODPERL2 = 0;
+       $modperl_version = 1;
     }
 
-    use constant APACHE2 => $version;
 }
 
 =head1 NAME
@@ -82,7 +89,7 @@ functionality. See L<Maypole> for these:
 
 sub get_request {
     my ($self, $r) = @_;
-    my $ar = (APACHE2) ? Apache2::Request->new($r) : Apache::Request->instance($r);
+    my $ar = ($MODPERL2) ? $r : Apache::Request->instance($r);
     $self->ar($ar);
 }
 
@@ -96,7 +103,7 @@ sub parse_location {
     # Reconstruct the request headers
     $self->headers_in(Maypole::Headers->new);
     my %headers;
-    if (APACHE2) { %headers = %{$self->ar->headers_in};
+    if ($MODPERL2) { %headers = %{$self->ar->headers_in};
     } else { %headers = $self->ar->headers_in; }
     for (keys %headers) {
         $self->headers_in->set($_, $headers{$_});
@@ -182,7 +189,7 @@ sub send_output {
         $r->ar->headers_out->set($_ => $r->headers_out->get($_));
     }
 
-    APACHE2 || $r->ar->send_http_header;
+    $MODPERL2 || $r->ar->send_http_header;
     $r->ar->print( $r->output );
 }
 
@@ -195,23 +202,56 @@ sub get_template_root {
     $r->ar->document_root . "/" . $r->ar->location;
 }
 
+=back
+
+=cut
+
+#########################################################
+# private / internal methods and subs
+
+
 sub _mod_perl_args {
     my ( $self, $apr ) = @_;
     my %args;
-    foreach my $key ( $apr->param ) {
+    if ($apr->isa('Apache::Request')) {
+      foreach my $key ( $apr->param ) {
         my @values = $apr->param($key);
         $args{$key} = @values == 1 ? $values[0] : \@values;
+      }
+    } else {
+      my $body = $self->_prepare_body($apr);
+      %args = %{$body->param};
     }
     return %args;
 }
 
-1;
+sub _prepare_body {
+    my ( $self, $r ) = @_;
+
+    unless ($self->{__http_body}) {
+        my $content_type   = $r->headers_in->get('Content-Type');
+        my $content_length = $r->headers_in->get('Content-Length');
+        my $body   = HTTP::Body->new( $content_type, $content_length );
+        my $length = $content_length;
+        while ( $length ) {
+            $r->read( my $buffer, ( $length < 8192 ) ? $length : 8192 );
+            $length -= length($buffer);
+            $body->add($buffer);
+        }
+       $self->{__http_body} = $body;
+    }
+    return $self->{__http_body};
+}
+
 
-=back
 
 =head1 AUTHOR
 
 Simon Cozens, C<simon@cpan.org>
+
+=head1 CREDITS
+
+Aaron Trevena
 Marcus Ramberg, C<marcus@thefeed.no>
 Sebastian Riedel, C<sri@oook.de>
 
@@ -220,3 +260,5 @@ Sebastian Riedel, C<sri@oook.de>
 You may distribute this code under the same terms as Perl itself.
 
 =cut
+
+1;