in reply to Re: Mason Interp Perl string
in thread Mason Interp Perl string

I sort of think your two options would be great, if I knew how to do either (they might just be my question).

I'm not sure what minimal code I can give you. Hows about:

package Mason::MyDynHandler; sub handler { my($r) = @_; my $output = "%print STDERR $m->session\n alert("foo");"; my $mi = HTML::Mason::Interp->new( #request_class => 'MasonX::Request::WithApacheSession' ); my $c = $mi->make_component(comp_source => $output); $realOutput = $mi->exec($c); print $realOutput; return OK; }

In the above example, I have a $r which is an Apache request. If I include the line "request_class => ...", I will be missing an 'ah' (which I assume is some ApacheHandler class, possibly HTML::Mason::ApacheHandler). If I make an HTML::Mason::ApacheHandler and try to prepare_request, it looks for the path in the request '/somepath/foo.dynjs', which doesn't exist. I would love to know how to use the "existing" interp in this context.

I don't necessarily want to do it this way, I'm just not sure how else to do it (and this doesn't work anyway).

I am configured something like:

<FilesMatch "\.dynjs$"> PerlSetVar Filter On SetHandler perl-script PerlHandler Mason::MyDynHandler PerlSetVar MasonRequestClass MasonX::Request::With +ApacheSession PerlSetVar MasonSessionClass Apache::Session::File </FilesMatch>

I don't know if this clarified anything in my question.

Replies are listed 'Best First'.
Re^3: Mason Interp Perl string
by Anonymous Monk on Feb 09, 2012 at 21:46 UTC
    Try making your handler a HTML::Mason::ApacheHandler subclass, as in
    use parent qw/ HTML::Mason::ApacheHandler /;

      Good idea...I like it...

      But, I'm not familiar with "use parent", and apparently neither is my server (this server is on Perl 5.8.8). I also tried "use base" and a plain old ISA on it, but they didn't work either--although they errored in a different way. :)

      package Mason::MyDynHandler; our @ISA = qw(HTML::Mason::ApacheHandler); use HTML::Mason::ApacheHandler; sub handler { my($r) = @_; my $output = '% print STDERR "$m->session\n"; \n alert("foo");'; my $ah = HTML::Mason::ApacheHandler->handler($r); my $mi = $ah->interp; my $c = $mi->make_component(comp_source => $output); my $realOutput = $mi->exec($c); print $realOutput; return OK; }

      With errors:

      [Thu Feb 9 17:28:39 2012] [error] [Mason] File does not exist: /somep +ath/foo.dynjs [Thu Feb 9 17:28:39 2012] [error] Can't call method "interp" without +a package or object reference at ../Mason/MyDynHandler.pm line 43.\n

      the file does not exist is because foo.dynjs is still a virtual file. And line 43 is "my $mi = $ah->interp;". I can move the problem by replacing $mi with $ah, but it isn't set up correctly, clearly.