in reply to Mason Interp Perl string

This has to be possible. I'm so close. Please help!

:) That is kinda like asking for help getting string eval to work as you want, without showing minimal code

What you want to do is give HTML::Mason::Interp a copy of the session

Or re-use the existing interp instead of creating a new one

Replies are listed 'Best First'.
Re^2: Mason Interp Perl string
by SleepyJay (Beadle) on Feb 09, 2012 at 21:34 UTC

    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.

      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.