hi all...

over the past few months several people have asked about a port of
Apache::Template for mod_perl 2.0 - mostly on the mod_perl list, but a few
cornered me at ApacheCon as well.  I told each of them that even though
Apache::compat was going to be no help for this particular module (since it
uses directive handlers) the port shouldn't be so bad.  it turns out it
wasn't all that difficult.

a patch against the current version (0.08) is attached, but I've put a
complete tarball here as well:

http://www.modperlcookbook.org/~geoff/modules/experimental/Apache-Template-2.00_01.tar.gz

keep in mind that all I did was minimally alter the code to allow it to run
under mod_perl 2.0.  specifically, since I'm not an Apache::Template user, I
did very little in the way of checking whether functionality was maintained.

so, no warranty, etc.

I did, however, add a few Apache-Test based tests to make sure that it was
minimally working - if these were added to and expanded within the current
mp1 Apache::Template by actual users it would be much easier to verify mp2
functionality.

anyway, for what it's worth.  enjoy.

--Geoff
diff -ruN Changes Changes
--- Changes     2003-08-21 10:21:09.000000000 -0400
+++ Changes     2003-12-03 13:41:18.000000000 -0500
@@ -14,6 +14,12 @@
 #========================================================================
 
 #------------------------------------------------------------------------
+# Version 2.00_01 - 
+#------------------------------------------------------------------------
+
+* Preliminary port to mod_perl 2.0 by Geoffrey Young
+
+#------------------------------------------------------------------------
 # Version 0.08 - 21st August 2003
 #------------------------------------------------------------------------
 
diff -ruN lib/Apache/Template.pm lib/Apache/Template.pm
--- lib/Apache/Template.pm      2003-08-21 10:20:17.000000000 -0400
+++ lib/Apache/Template.pm      2003-12-03 14:36:05.000000000 -0500
@@ -25,23 +25,202 @@
 use strict;
 use vars qw( $VERSION $DEBUG $ERROR $SERVICE );
 
-use DynaLoader ();
-use Apache::ModuleConfig ();
-use Apache::Constants qw( :common );
+use mod_perl 1.99_11;     # sanity check for a recent version
+
+use Apache::RequestRec ();
+use Apache::Module ();
+use Apache::Log ();
+use Apache::RequestIO ();
+use Apache::Const -compile => qw(OK SERVER_ERROR TAKE1 TAKE12 FLAG
+                                 ITERATE TAKE2 RSRC_CONF ACCESS_CONF);
+
 use Template::Service::Apache;
 use Template::Config;
 
-$VERSION = '0.08';
+$VERSION = '2.00_01';
 $ERROR   = '';
 $DEBUG   = 0 unless defined $DEBUG;
 $Template::Config::SERVICE = 'Template::Service::Apache';
 
-if ($ENV{ MOD_PERL }) {
-    no strict;
-    @ISA = qw( DynaLoader );
-    __PACKAGE__->bootstrap($VERSION);
-}
-
+our @APACHE_MODULE_COMMANDS = (
+    #-- parsing/style options --
+    {   name         => 'TT2Tags',
+        errmsg       => 'tag style or start and end tags for template directives',
+        args_how     => Apache::TAKE12,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2PreChomp',
+        errmsg       => 'flag to remove newline and whitespace before directives',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2PostChomp',
+        errmsg       => 'flag to remove newline and whitespace after directives',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Trim',
+        errmsg       => 'flag to trim whitespace surrounding template output',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2AnyCase',
+        errmsg       => 'flag to allow directive keywords in any case',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Interpolate',
+        errmsg       => 'flag to interpolate embedded variable references',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+
+    #-- file/directory options --
+    {   name         => 'TT2IncludePath',
+        errmsg       => 'local path(s) containing templates',
+        args_how     => Apache::ITERATE,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Absolute',
+        errmsg       => 'flag to enable absolute filenames',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Relative',
+        errmsg       => 'flag to enable relative filenames',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Delimiter',
+        errmsg       => 'alternative directory delimiter',
+        args_how     => Apache::TAKE1,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+
+    #-- service template options --
+    {   name         => 'TT2PreProcess',
+        errmsg       => 'template(s) to process before each main template',
+        args_how     => Apache::ITERATE,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2PostProcess',
+        errmsg       => 'template(s) to process after each main template',
+        args_how     => Apache::ITERATE,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Process',
+        errmsg       => 'template(s) to process instead of each main template',
+        args_how     => Apache::ITERATE,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Wrapper',
+        errmsg       => 'template(s) to wrap around each main template',
+        args_how     => Apache::ITERATE,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Default',
+        errmsg       => 'default template to process when another template is not 
found',
+        args_how     => Apache::TAKE1,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Error',
+        errmsg       => 'template to process when an uncaught error occurs',
+        args_how     => Apache::TAKE1,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Tolerant',
+        errmsg       => 'flag to set error tolerance for providers',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+
+    #-- variable options --
+    {   name         => 'TT2Variable',
+        errmsg       => 'define a template variable',
+        args_how     => Apache::TAKE2,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Constant',
+        errmsg       => 'define a constant variable',
+        args_how     => Apache::TAKE2,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2ConstantsNamespace',
+        errmsg       => 'define variable namespace for constants',
+        args_how     => Apache::TAKE1,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+
+    #-- runtime template processing options --
+    {   name         => 'TT2EvalPerl',
+        errmsg       => 'flag to allow PERL blocks to be evaluated',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2LoadPerl',
+        errmsg       => 'flag to allow regular Perl modules to be loaded as plugins',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Recursion',
+        errmsg       => 'flag to enable recursion into templates',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+
+    #-- plugin and filter options --
+    {   name         => 'TT2PluginBase',
+        errmsg       => 'packages in which to locate for plugins',
+        args_how     => Apache::ITERATE,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+
+    #-- caching options --
+    {   name         => 'TT2AutoReset',
+        errmsg       => 'flag to reset (clear) any BLOCK definitions before 
processing',
+        args_how     => Apache::TAKE1,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2CacheSize',
+        errmsg       => 'integer limit to the number of compiled templates to cache 
in memory',
+        args_how     => Apache::TAKE1,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2CompileExt',
+        errmsg       => 'filename extension for caching compiled templates back to 
disk',
+        args_how     => Apache::TAKE1,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2CompileDir',
+        errmsg       => 'path to directory for caching compiled templates back to 
disk',
+        args_how     => Apache::TAKE1,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+
+    #-- misc options --
+    {   name         => 'TT2Debug',
+        errmsg       => 'flag to enable debugging',
+        args_how     => Apache::FLAG,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+
+    # -- service options --
+    {   name         => 'TT2Headers',
+        errmsg       => 'list of keywords indicating HTTP headers to add',
+        args_how     => Apache::ITERATE,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2Params',
+        errmsg       => 'list of keywords indicating parameters to add as template 
variables',
+        args_how     => Apache::ITERATE,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+    {   name         => 'TT2ServiceModule',
+        errmsg       => 'name of class which implements template service module',
+        args_how     => Apache::TAKE1,
+        req_override => Apache::RSRC_CONF | Apache::ACCESS_CONF,
+    },
+);
 
 #------------------------------------------------------------------------
 # handler($request)
@@ -66,12 +245,14 @@
 
     # create and cache a service for each hostname
     my $service = $SERVICE->{ $r->hostname() } ||= do {
-        my $cfg = Apache::ModuleConfig->get($r) || { };
-#        warn "setup service for hostname: ", $r->hostname, "  ($cfg):\n", 
-#             dump_hash($cfg), "\n";
+        my $cfg = Apache::Module->get_config(__PACKAGE__, 
+                                             $r->server,
+                                             $r->per_dir_config) || { };
+        warn "setup service for hostname: ", $r->hostname, "  ($cfg):\n", 
+             dump_hash($cfg), "\n" if $DEBUG;
         Template::Config->service($cfg) || do {
-            $r->log_reason(Template::Config->error(), $r->filename());
-            return SERVER_ERROR;
+            $r->log_error(Template::Config->error(), ' ', $r->filename());
+            return Apache::SERVER_ERROR;
         };
     };
 
@@ -83,15 +264,15 @@
 
     my $content = $service->process($template, $params);
     unless (defined $content) {
-        $r->log_reason($service->error(), $r->filename());
-        return SERVER_ERROR;
+        $r->log_error($service->error(), ' ', $r->filename());
+        return Apache::SERVER_ERROR;
     }
 
     $service->headers($r, $template, \$content);
 
     $r->print($content);
 
-    return OK;
+    return Apache::OK;
 }
 
 
@@ -1112,7 +1292,7 @@
 
 =head1 VERSION
 
-This is version 0.08 of the Apache::Template module.
+This is version 2.00_01 of the Apache::Template module.
 
 =head1 COPYRIGHT
 
diff -ruN lib/Template/Service/Apache.pm lib/Template/Service/Apache.pm
--- lib/Template/Service/Apache.pm      2003-08-21 05:46:45.000000000 -0400
+++ lib/Template/Service/Apache.pm      2003-12-03 13:19:50.000000000 -0500
@@ -38,9 +38,11 @@
 $VERSION = sprintf("%d.%02d", q$Revision: 1.3 $ =~ /(\d+)\.(\d+)/);
 $DEBUG   = 0 unless defined $DEBUG;
 
-use Apache::Util qw( escape_uri ht_time );
-use Apache::Constants qw( :common );
-use Apache::Request;
+use Apache::Util qw( escape_path format_time );
+use Apache::Const -compile => qw( DECLINED SERVER_ERROR);
+use Apache::Log ();
+use Apache::RequestRec ();
+use Apache::Request 2.02;
 
 #========================================================================
 #                     -----  PUBLIC METHODS -----
@@ -59,12 +61,12 @@
     my ($self, $r) = @_;
     my $filename = $r->filename();
     
-    return DECLINED unless -f $filename;
+    return Apache::DECLINED unless -f $filename;
     $self->{ TEMPLATE_ERROR } = undef;
 
     my ($template, $error) = $self->{ ROOT_PROVIDER }->fetch($filename);
     if ($error && $error == &Template::Constants::STATUS_DECLINED) {
-        return DECLINED;
+        return Apache::DECLINED;
     }
     elsif ($error) {
         # save error as exception for params() to add to template vars
@@ -81,13 +83,13 @@
         if ($template = $self->{ ERROR }) {
             eval { $template = $self->{ CONTEXT }->template($template) };
             if ($@) {
-                $r->log_reason($self->{ TEMPLATE_ERROR } . " / $@", $filename);
-                return SERVER_ERROR;
+                $r->log_error($self->{ TEMPLATE_ERROR } . " / $@", ' ', $filename);
+                return Apache::SERVER_ERROR;
             }
         }
         else {
-            $r->log_reason($template, $filename);
-            return SERVER_ERROR;
+            $r->log_error($template, ' ', $filename);
+            return Apache::SERVER_ERROR;
         }
     }
     
@@ -133,7 +135,7 @@
     }
 
     $params->{ cookies } = { 
-        map { $1 => escape_uri($2) if (/([^=]+)=(.*)/) }
+        map { $1 => escape_path($2, $request->pool) if (/([^=]+)=(.*)/) }
         grep(!/^$/, split(/;\s*/, $request->header_in('cookie'))),
     } if $all or $plist->{ cookies };
     
@@ -156,13 +158,19 @@
     my $all = $headers->{ all };
 
     $r->content_type('text/html');
-    $r->headers_out->add('Last-Modified'  => ht_time($template->modtime()))
-        if $all or $headers->{ modified } and $template;
     $r->headers_out->add('Content-Length' => length $$content)
         if $all or $headers->{ length };
     $r->headers_out->add('E-tag' => sprintf q{"%s"}, md5_hex($$content))
         if $all or $headers->{ etag };
-    $r->send_http_header;
+
+    if ($all or $headers->{ modified } and $template) {
+        my $fmt = '%a, %d %b %Y %H:%M:%S %Z';
+
+        my $ht_time = Apache::Util::format_time($template->modtime(),
+                                                $fmt, 1, $r->pool);
+
+        $r->headers_out->add('Last-Modified'  => $ht_time)
+    }
 }
 
 
diff -ruN Makefile.PL Makefile.PL
--- Makefile.PL 2003-08-21 09:21:52.000000000 -0400
+++ Makefile.PL 2003-12-03 11:35:41.000000000 -0500
@@ -1,205 +1,24 @@
-package Apache::Template;
+#!perl
 
-use ExtUtils::MakeMaker;
-use lib qw( lib );
-use Apache::Template;
-use Apache::ExtUtils qw( command_table );
-use Apache::src ();
+use 5.008;
 
+use Apache2 ();
+use ModPerl::MM ();
+use Apache::Test;
+use Apache::TestMM qw(test clean);
+use Apache::TestRunPerl ();
+Apache::TestMM::filter_args();
+Apache::TestRunPerl->generate_script();
 
-my @directives = (
-    #-- parsing/style options --
-    {   name         => 'TT2Tags',
-        errmsg       => 'tag style or start and end tags for template directives',
-        args_how     => 'TAKE12',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2PreChomp',
-        errmsg       => 'flag to remove newline and whitespace before directives',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2PostChomp',
-        errmsg       => 'flag to remove newline and whitespace after directives',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Trim',
-        errmsg       => 'flag to trim whitespace surrounding template output',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2AnyCase',
-        errmsg       => 'flag to allow directive keywords in any case',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Interpolate',
-        errmsg       => 'flag to interpolate embedded variable references',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-
-    #-- file/directory options --
-    {   name         => 'TT2IncludePath',
-        errmsg       => 'local path(s) containing templates',
-        args_how     => 'ITERATE',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Absolute',
-        errmsg       => 'flag to enable absolute filenames',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Relative',  
-        errmsg       => 'flag to enable relative filenames',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Delimiter',
-        errmsg       => 'alternative directory delimiter',
-        args_how     => 'TAKE1',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-
-    #-- service template options --
-    {   name         => 'TT2PreProcess',
-        errmsg       => 'template(s) to process before each main template',
-        args_how     => 'ITERATE',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2PostProcess',
-        errmsg       => 'template(s) to process after each main template',
-        args_how     => 'ITERATE',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Process',
-        errmsg       => 'template(s) to process instead of each main template',
-        args_how     => 'ITERATE',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Wrapper',
-        errmsg       => 'template(s) to wrap around each main template',
-        args_how     => 'ITERATE',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Default',
-        errmsg       => 'default template to process when another template is not 
found',
-        args_how     => 'TAKE1',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Error',
-        errmsg       => 'template to process when an uncaught error occurs',
-        args_how     => 'TAKE1',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Tolerant',
-        errmsg       => 'flag to set error tolerance for providers',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-
-    #-- variable options --
-    {   name         => 'TT2Variable',
-        errmsg       => 'define a template variable',
-        args_how     => 'TAKE2',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Constant',
-        errmsg       => 'define a constant variable',
-        args_how     => 'TAKE2',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2ConstantsNamespace',
-        errmsg       => 'define variable namespace for constants',
-        args_how     => 'TAKE1',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-
-    #-- runtime template processing options --
-    {   name         => 'TT2EvalPerl',
-        errmsg       => 'flag to allow PERL blocks to be evaluated',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2LoadPerl',
-        errmsg       => 'flag to allow regular Perl modules to be loaded as plugins',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Recursion',
-        errmsg       => 'flag to enable recursion into templates',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-
-    #-- plugin and filter options --
-    {   name         => 'TT2PluginBase',
-        errmsg       => 'packages in which to locate for plugins',
-        args_how     => 'ITERATE',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-
-    #-- caching options --
-    {   name         => 'TT2AutoReset',
-        errmsg       => 'flag to reset (clear) any BLOCK definitions before 
processing',
-        args_how     => 'TAKE1',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2CacheSize',
-        errmsg       => 'integer limit to the number of compiled templates to cache 
in memory',
-        args_how     => 'TAKE1',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2CompileExt',
-        errmsg       => 'filename extension for caching compiled templates back to 
disk',
-        args_how     => 'TAKE1',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2CompileDir',
-        errmsg       => 'path to directory for caching compiled templates back to 
disk',
-        args_how     => 'TAKE1',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-
-    #-- misc options --
-    {   name         => 'TT2Debug',
-        errmsg       => 'flag to enable debugging',
-        args_how     => 'FLAG',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-
-    # -- service options --
-    {   name         => 'TT2Headers',
-        errmsg       => 'list of keywords indicating HTTP headers to add',
-        args_how     => 'ITERATE',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2Params',
-        errmsg       => 'list of keywords indicating parameters to add as template 
variables',
-        args_how     => 'ITERATE',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-    {   name         => 'TT2ServiceModule',
-        errmsg       => 'name of class which implements template service module',
-        args_how     => 'TAKE1',
-        req_override => 'RSRC_CONF | ACCESS_CONF',
-    },
-);
-
-command_table([EMAIL PROTECTED]);
-    
-WriteMakefile(
+ModPerl::MM::WriteMakefile(
     'NAME'         => 'Apache::Template',
     'VERSION_FROM' => 'lib/Apache/Template.pm',
     'PMLIBDIRS'    => [ 'lib' ],
-    'INC'          => Apache::src->new->inc,
-    'PREREQ_PM'    => { 
+    'PREREQ_PM'    => {
         Template             => 2.10,
         Digest::MD5          => 2.09,
-        Apache::Request      => 0,
-        Apache::ModuleConfig => 0 
+        Apache::Request      => 2.02,
+        mod_perl             => 1.99_11,
     },
 );
 
-
diff -ruN MANIFEST MANIFEST
--- MANIFEST    2001-06-12 13:38:23.000000000 -0400
+++ MANIFEST    2003-12-03 14:36:12.000000000 -0500
@@ -1,8 +1,9 @@
 Changes
+lib/Apache/Template.pm
+lib/Template/Service/Apache.pm
 Makefile.PL
 MANIFEST
 README
-Template.xs
-test.pl
-lib/Apache/Template.pm
-lib/Template/Service/Apache.pm
+t/01include.t
+t/02perl.t
+t/conf/extra.last.conf.in
diff -ruN README README
--- README      2003-08-21 10:25:29.000000000 -0400
+++ README      2003-12-03 13:42:36.000000000 -0500
@@ -541,7 +541,7 @@
     integration into the Apache::Template module.
 
 VERSION
-    This is version 0.08 of the Apache::Template module.
+    This is version 2.00_01 of the Apache::Template module.
 
 COPYRIGHT
         Copyright (C) 1996-2003 Andy Wardley.  All Rights Reserved.
diff -ruN t/01include.t t/01include.t
--- t/01include.t       1969-12-31 19:00:00.000000000 -0500
+++ t/01include.t       2003-12-03 13:06:11.000000000 -0500
@@ -0,0 +1,30 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Test;
+use Apache::TestRequest;
+use Apache::TestUtil qw(t_cmp t_write_file);
+use Apache::Const -compile => qw(HTTP_OK);
+
+use File::Spec::Functions qw(catfile);
+
+plan tests => 2, have_module('mod_perl.c', 'mod_apreq');
+
+t_write_file(catfile(qw(htdocs include.txt)), <DATA>);
+t_write_file(catfile(qw(templates plain)), <DATA>);
+
+my $url = '/tt2/include.txt';
+
+my $response = GET $url;
+ok t_cmp(Apache::HTTP_OK, $response->code, "$url status");
+
+chomp(my $received = $response->content);
+chomp(my $expected = <<EOF);
+plain
+EOF
+
+ok t_cmp($expected, $received, "$url content");
+
+__END__
+[% INSERT plain %]
+plain
diff -ruN t/02perl.t t/02perl.t
--- t/02perl.t  1969-12-31 19:00:00.000000000 -0500
+++ t/02perl.t  2003-12-03 12:27:44.000000000 -0500
@@ -0,0 +1,28 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Test;
+use Apache::TestRequest;
+use Apache::TestUtil qw(t_cmp t_write_file);
+use Apache::Const -compile => qw(HTTP_OK);
+
+use File::Spec::Functions qw(catfile);
+
+plan tests => 2, have_module('mod_perl.c', 'mod_apreq');
+
+t_write_file(catfile(qw(htdocs perl.txt)), <DATA>);
+
+my $url = '/tt2/perl.txt';
+
+my $response = GET $url;
+ok t_cmp(Apache::HTTP_OK, $response->code, "$url status");
+
+chomp(my $received = $response->content);
+chomp(my $expected = <<EOF);
+perl
+EOF
+
+ok t_cmp($expected, $received, "$url content");
+
+__END__
+[% PERL %] print 'perl'; [% END %]
diff -ruN t/conf/extra.last.conf.in t/conf/extra.last.conf.in
--- t/conf/extra.last.conf.in   1969-12-31 19:00:00.000000000 -0500
+++ t/conf/extra.last.conf.in   2003-12-03 13:34:40.000000000 -0500
@@ -0,0 +1,18 @@
+<IfModule mod_perl.c>
+  <IfModule mod_apreq.c>
+
+    PerlLoadModule Apache::Template
+
+    TT2Trim             On
+    TT2EvalPerl         On
+    TT2IncludePath      @ServerRoot@/templates
+    TT2Debug            On
+
+    Alias /tt2 @DocumentRoot@
+    <Location /tt2>
+        SetHandler              perl-script
+        PerlResponseHandler     Apache::Template
+    </Location>
+
+  </IfModule>
+</IfModule>
Only in t/logs: cgisock
diff -ruN t/TEST t/TEST
--- t/TEST      1969-12-31 19:00:00.000000000 -0500
+++ t/TEST      2003-12-03 13:42:04.000000000 -0500
@@ -0,0 +1,18 @@
+#!/perl/perl-5.8.2/bin/perl
+# WARNING: this file is generated, do not edit
+# 01: 
/perl/perl-5.8.2/lib/site_perl/5.8.2/i686-linux-thread-multi/Apache/TestConfig.pm:746
+# 02: 
/perl/perl-5.8.2/lib/site_perl/5.8.2/i686-linux-thread-multi/Apache/TestConfig.pm:831
+# 03: 
/perl/perl-5.8.2/lib/site_perl/5.8.2/i686-linux-thread-multi/Apache/TestRun.pm:1018
+# 04: Makefile.PL:11
+
+BEGIN { eval { require blib; } }
+use Apache2;
+
+use strict;
+use warnings FATAL => 'all';
+
+use lib qw(
+);
+
+
+use Apache::TestRunPerl ();Apache::TestRunPerl->new->run(@ARGV);
\ No newline at end of file
diff -ruN Template.xs Template.xs
--- Template.xs 2003-08-21 10:25:40.000000000 -0400
+++ Template.xs 1969-12-31 19:00:00.000000000 -0500
@@ -1,319 +0,0 @@
-#include "modules/perl/mod_perl.h"
-
-static mod_perl_perl_dir_config *newPerlConfig(pool *p)
-{
-    mod_perl_perl_dir_config *cld =
-       (mod_perl_perl_dir_config *)
-           palloc(p, sizeof (mod_perl_perl_dir_config));
-    cld->obj = Nullsv;
-    cld->pclass = "Apache::Template";
-    register_cleanup(p, cld, perl_perl_cmd_cleanup, null_cleanup);
-    return cld;
-}
-
-static void *create_dir_config_sv (pool *p, char *dirname)
-{
-    return newPerlConfig(p);
-}
-
-static void *create_srv_config_sv (pool *p, server_rec *s)
-{
-    return newPerlConfig(p);
-}
-
-static void stash_mod_pointer (char *class, void *ptr)
-{
-    SV *sv = newSV(0);
-    sv_setref_pv(sv, NULL, (void*)ptr);
-    hv_store(perl_get_hv("Apache::XS_ModuleConfig",TRUE), 
-            class, strlen(class), sv, FALSE);
-}
-
-static mod_perl_cmd_info cmd_info_TT2Tags = { 
-"Apache::Template::TT2Tags", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2PreChomp = { 
-"Apache::Template::TT2PreChomp", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2PostChomp = { 
-"Apache::Template::TT2PostChomp", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Trim = { 
-"Apache::Template::TT2Trim", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2AnyCase = { 
-"Apache::Template::TT2AnyCase", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Interpolate = { 
-"Apache::Template::TT2Interpolate", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2IncludePath = { 
-"Apache::Template::TT2IncludePath", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Absolute = { 
-"Apache::Template::TT2Absolute", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Relative = { 
-"Apache::Template::TT2Relative", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Delimiter = { 
-"Apache::Template::TT2Delimiter", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2PreProcess = { 
-"Apache::Template::TT2PreProcess", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2PostProcess = { 
-"Apache::Template::TT2PostProcess", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Process = { 
-"Apache::Template::TT2Process", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Wrapper = { 
-"Apache::Template::TT2Wrapper", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Default = { 
-"Apache::Template::TT2Default", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Error = { 
-"Apache::Template::TT2Error", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Tolerant = { 
-"Apache::Template::TT2Tolerant", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Variable = { 
-"Apache::Template::TT2Variable", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Constant = { 
-"Apache::Template::TT2Constant", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2ConstantsNamespace = { 
-"Apache::Template::TT2ConstantsNamespace", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2EvalPerl = { 
-"Apache::Template::TT2EvalPerl", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2LoadPerl = { 
-"Apache::Template::TT2LoadPerl", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Recursion = { 
-"Apache::Template::TT2Recursion", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2PluginBase = { 
-"Apache::Template::TT2PluginBase", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2AutoReset = { 
-"Apache::Template::TT2AutoReset", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2CacheSize = { 
-"Apache::Template::TT2CacheSize", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2CompileExt = { 
-"Apache::Template::TT2CompileExt", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2CompileDir = { 
-"Apache::Template::TT2CompileDir", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Debug = { 
-"Apache::Template::TT2Debug", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Headers = { 
-"Apache::Template::TT2Headers", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2Params = { 
-"Apache::Template::TT2Params", "", 
-};
-static mod_perl_cmd_info cmd_info_TT2ServiceModule = { 
-"Apache::Template::TT2ServiceModule", "", 
-};
-
-
-static command_rec mod_cmds[] = {
-    
-    { "TT2Tags", perl_cmd_perl_TAKE12,
-      (void*)&cmd_info_TT2Tags,
-      RSRC_CONF | ACCESS_CONF, TAKE12, "tag style or start and end tags for template 
directives" },
-
-    { "TT2PreChomp", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2PreChomp,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to remove newline and whitespace before 
directives" },
-
-    { "TT2PostChomp", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2PostChomp,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to remove newline and whitespace after 
directives" },
-
-    { "TT2Trim", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2Trim,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to trim whitespace surrounding template 
output" },
-
-    { "TT2AnyCase", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2AnyCase,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to allow directive keywords in any case" },
-
-    { "TT2Interpolate", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2Interpolate,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to interpolate embedded variable 
references" },
-
-    { "TT2IncludePath", perl_cmd_perl_ITERATE,
-      (void*)&cmd_info_TT2IncludePath,
-      RSRC_CONF | ACCESS_CONF, ITERATE, "local path(s) containing templates" },
-
-    { "TT2Absolute", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2Absolute,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to enable absolute filenames" },
-
-    { "TT2Relative", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2Relative,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to enable relative filenames" },
-
-    { "TT2Delimiter", perl_cmd_perl_TAKE1,
-      (void*)&cmd_info_TT2Delimiter,
-      RSRC_CONF | ACCESS_CONF, TAKE1, "alternative directory delimiter" },
-
-    { "TT2PreProcess", perl_cmd_perl_ITERATE,
-      (void*)&cmd_info_TT2PreProcess,
-      RSRC_CONF | ACCESS_CONF, ITERATE, "template(s) to process before each main 
template" },
-
-    { "TT2PostProcess", perl_cmd_perl_ITERATE,
-      (void*)&cmd_info_TT2PostProcess,
-      RSRC_CONF | ACCESS_CONF, ITERATE, "template(s) to process after each main 
template" },
-
-    { "TT2Process", perl_cmd_perl_ITERATE,
-      (void*)&cmd_info_TT2Process,
-      RSRC_CONF | ACCESS_CONF, ITERATE, "template(s) to process instead of each main 
template" },
-
-    { "TT2Wrapper", perl_cmd_perl_ITERATE,
-      (void*)&cmd_info_TT2Wrapper,
-      RSRC_CONF | ACCESS_CONF, ITERATE, "template(s) to wrap around each main 
template" },
-
-    { "TT2Default", perl_cmd_perl_TAKE1,
-      (void*)&cmd_info_TT2Default,
-      RSRC_CONF | ACCESS_CONF, TAKE1, "default template to process when another 
template is not found" },
-
-    { "TT2Error", perl_cmd_perl_TAKE1,
-      (void*)&cmd_info_TT2Error,
-      RSRC_CONF | ACCESS_CONF, TAKE1, "template to process when an uncaught error 
occurs" },
-
-    { "TT2Tolerant", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2Tolerant,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to set error tolerance for providers" },
-
-    { "TT2Variable", perl_cmd_perl_TAKE2,
-      (void*)&cmd_info_TT2Variable,
-      RSRC_CONF | ACCESS_CONF, TAKE2, "define a template variable" },
-
-    { "TT2Constant", perl_cmd_perl_TAKE2,
-      (void*)&cmd_info_TT2Constant,
-      RSRC_CONF | ACCESS_CONF, TAKE2, "define a constant variable" },
-
-    { "TT2ConstantsNamespace", perl_cmd_perl_TAKE1,
-      (void*)&cmd_info_TT2ConstantsNamespace,
-      RSRC_CONF | ACCESS_CONF, TAKE1, "define variable namespace for constants" },
-
-    { "TT2EvalPerl", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2EvalPerl,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to allow PERL blocks to be evaluated" },
-
-    { "TT2LoadPerl", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2LoadPerl,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to allow regular Perl modules to be loaded 
as plugins" },
-
-    { "TT2Recursion", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2Recursion,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to enable recursion into templates" },
-
-    { "TT2PluginBase", perl_cmd_perl_ITERATE,
-      (void*)&cmd_info_TT2PluginBase,
-      RSRC_CONF | ACCESS_CONF, ITERATE, "packages in which to locate for plugins" },
-
-    { "TT2AutoReset", perl_cmd_perl_TAKE1,
-      (void*)&cmd_info_TT2AutoReset,
-      RSRC_CONF | ACCESS_CONF, TAKE1, "flag to reset (clear) any BLOCK definitions 
before processing" },
-
-    { "TT2CacheSize", perl_cmd_perl_TAKE1,
-      (void*)&cmd_info_TT2CacheSize,
-      RSRC_CONF | ACCESS_CONF, TAKE1, "integer limit to the number of compiled 
templates to cache in memory" },
-
-    { "TT2CompileExt", perl_cmd_perl_TAKE1,
-      (void*)&cmd_info_TT2CompileExt,
-      RSRC_CONF | ACCESS_CONF, TAKE1, "filename extension for caching compiled 
templates back to disk" },
-
-    { "TT2CompileDir", perl_cmd_perl_TAKE1,
-      (void*)&cmd_info_TT2CompileDir,
-      RSRC_CONF | ACCESS_CONF, TAKE1, "path to directory for caching compiled 
templates back to disk" },
-
-    { "TT2Debug", perl_cmd_perl_FLAG,
-      (void*)&cmd_info_TT2Debug,
-      RSRC_CONF | ACCESS_CONF, FLAG, "flag to enable debugging" },
-
-    { "TT2Headers", perl_cmd_perl_ITERATE,
-      (void*)&cmd_info_TT2Headers,
-      RSRC_CONF | ACCESS_CONF, ITERATE, "list of keywords indicating HTTP headers to 
add" },
-
-    { "TT2Params", perl_cmd_perl_ITERATE,
-      (void*)&cmd_info_TT2Params,
-      RSRC_CONF | ACCESS_CONF, ITERATE, "list of keywords indicating parameters to 
add as template variables" },
-
-    { "TT2ServiceModule", perl_cmd_perl_TAKE1,
-      (void*)&cmd_info_TT2ServiceModule,
-      RSRC_CONF | ACCESS_CONF, TAKE1, "name of class which implements template 
service module" },
-
-    { NULL }
-};
-
-module MODULE_VAR_EXPORT XS_Apache__Template = {
-    STANDARD_MODULE_STUFF,
-    NULL,               /* module initializer */
-    create_dir_config_sv,  /* per-directory config creator */
-    perl_perl_merge_dir_config,   /* dir config merger */
-    create_srv_config_sv,       /* server config creator */
-    perl_perl_merge_srv_config,        /* server config merger */
-    mod_cmds,               /* command table */
-    NULL,           /* [7] list of handlers */
-    NULL,  /* [2] filename-to-URI translation */
-    NULL,      /* [5] check/validate user_id */
-    NULL,       /* [6] check user_id is valid *here* */
-    NULL,     /* [4] check access by host address */
-    NULL,       /* [7] MIME type checker/setter */
-    NULL,        /* [8] fixups */
-    NULL,             /* [10] logger */
-    NULL,      /* [3] header parser */
-    NULL,         /* process initializer */
-    NULL,         /* process exit/cleanup */
-    NULL,   /* [1] post read_request handling */
-};
-
-#define this_module "Apache/Template.pm"
-
-static void remove_module_cleanup(void *data)
-{
-    if (find_linked_module("Apache::Template")) {
-        /* need to remove the module so module index is reset */
-        remove_module(&XS_Apache__Template);
-    }
-    if (data) {
-        /* make sure BOOT section is re-run on restarts */
-        (void)hv_delete(GvHV(incgv), this_module,
-                        strlen(this_module), G_DISCARD);
-         if (dowarn) {
-             /* avoid subroutine redefined warnings */
-             perl_clear_symtab(gv_stashpv("Apache::Template", FALSE));
-         }
-    }
-}
-
-MODULE = Apache::Template              PACKAGE = Apache::Template
-
-PROTOTYPES: DISABLE
-
-BOOT:
-    XS_Apache__Template.name = "Apache::Template";
-    add_module(&XS_Apache__Template);
-    stash_mod_pointer("Apache::Template", &XS_Apache__Template);
-    register_cleanup(perl_get_startup_pool(), (void *)1,
-                     remove_module_cleanup, null_cleanup);
-
-void
-END()
-
-    CODE:
-    remove_module_cleanup(NULL);
diff -ruN test.pl test.pl
--- test.pl     2001-06-12 13:38:23.000000000 -0400
+++ test.pl     1969-12-31 19:00:00.000000000 -0500
@@ -1,7 +0,0 @@
-BEGIN { $| = 1; print "1..1\n"; }
-END   { print "not ok 1\n" unless $loaded; }
-use Apache::Template;
-$loaded = 1;
-print "ok 1\n";
-
-

-- 
Reporting bugs: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html

Reply via email to