You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Bill Rini <wi...@hotmail.com> on 2003/08/20 22:06:53 UTC

Strange mod_perl2/Apache2 behavior -- I think

Here's a little snippet from a sample script:

package MyApache::MyPackage;

use strict;
use warnings;

use Apache::RequestRec ();
use Apache::RequestIO ();
use Apache::DBI;
use APR::Table;
use Apache::Const qw(OK REDIRECT DECLINED);
use Apache::RequestUtil ();

sub handler {

my $r = shift;
my $current_uri = $r->uri;
my $content_type = $r->content_type;
my @fields = split(/\//, $current_uri);


# Let's see if the file exists first

return Apache::DECLINED unless !-e $r->filename;


# other stuff happens past this point but this is enough to document the 
problem.
}

Here's my the relevant settings in my config file:

  <Location /b>
        PerlSendHeader On
        SetHandler perl-script
        PerlHandler MyApache::MyPackage
  </Location>

OK, so this is set up as a PerlResponseHandler on a virtual server. When the 
handler is invoked, it loads the page (a php page) but doesn't parse it in 
PHP before displaying to the browser. I just get back the raw php code. 
Actually, this is somewhat misleading. On Opera it displays the code. In IE 
it asks me whether or not I want to download it or open it. When I remove 
the handler config in the conf files Apache handles it just as it should (it 
parses the php correctly) but with the handler in there when I go to 
http://localhost/b/b.php I get.

<?php

print "Hello World";

?>

instead of the actual printing out of "Hello World".  Here's the results 
from a telnet session:

GET /b/b.php HTTP/1.1
Host: localhost

HTTP/1.1 200 OK
Date: Wed, 20 Aug 2003 19:54:02 GMT
Server: Apache/2.0.47 (Unix) mod_perl/1.99_09 Perl/v5.8.0 mod_ssl/2.0.47 
OpenSSL/0.9.7a DAV/2 PHP/4.3.2
Last-Modified: Wed, 20 Aug 2003 10:45:31 GMT
ETag: "21c229-3f-ef2ea8c0"
Accept-Ranges: bytes
Content-Length: 63
Content-Type: application/x-httpd-php

<?php

print "Hello World";

?>
Connection closed by foreign host.

When I've telneted into the the machine and called the file directly it 
seems that the proper content type is being set but in the browser (as 
mentioned above) IE reports the content-type as blank (there's a null value 
in the popup box for content-type when it asks me to download or open the 
file). No errors appear in the log files.

Now, I know it's executing because it actually processes the code below that 
line which ends in a redirect.  But if I try to exit the handler because 
it's not the correct type of request it seems to mess up the proper handling 
of php and html files.  Image files seem to appear correctly but that may be 
the browser compensating or reading the encoding type.

Of course, if anybody has an easier suggestion on what I'm trying to do:

I want the document root directory to be handled by the PerlResponseHandler 
(i.e. Location /). For specific types of requests I would like the above 
handler to look up some information in the database and return the info 
dynamically. The only time I don't want that to happen is if the file 
already exists OR it's pointing to a directory that exists that has a 
default document type in it (ie index.html or index.php). Everything else I 
want the handler to do something special with.

So, for instance, if I have the following files:

/index.html
/somefile.html
/somedir/index.html
/somedir/somefile2.html

Any request to:

http://localhost/
http://localhost/index.html
http://localhost/somefile.html
http://localhost/somedir/
http://localhost/somedir/index.html
http://localhost/somedir/somefile2.html

Should all just be handled normally. But if I get a request for:

http://localhost/abc/def/
or
http://localhost/somedir/abcdef

I want the above perl handler to parse the uri and do
something different (directories /abc/def and /abcdef/ would not
actually exist).

TIA for any help on this.

Bill



````````````````````````````````````````
DISCLAIMER:  The views expressed by the author of this email may or may not 
be his/her views, the views of any company s/he represents, or the views of 
any persons living, dead, or undead.    This email message, including any 
attachments, is for the sole use of the intended recipient(s).  If you have 
received this e-mail in error do not open it.  Any errors in facts, 
spelling, or tact are transmission errors caused by your email client.

http://www.windowsix.com

_________________________________________________________________
<b>Get MSN 8</b> and help protect your children with advanced parental 
controls.  http://join.msn.com/?page=features/parental



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


Re: Strange mod_perl2/Apache2 behavior -- I think

Posted by Stas Bekman <st...@stason.org>.
[...]
>  <Location /b>
>        PerlSendHeader On
>        SetHandler perl-script
>        PerlHandler MyApache::MyPackage
>  </Location>
[...]
> I want the document root directory to be handled by the 
> PerlResponseHandler (i.e. Location /). For specific types of requests I 
> would like the above handler to look up some information in the database 
> and return the info dynamically. The only time I don't want that to 
> happen is if the file already exists OR it's pointing to a directory 
> that exists that has a default document type in it (ie index.html or 
> index.php). Everything else I want the handler to do something special 
> with.

You probably want to write a PerlTransHandler, not a response handler if you 
are after dispatching. There are plenty examples in the books, perl.apache.org.

If you meant something else, please give us some more meat, your example lacks 
the logic that you may have the problem with.

__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com



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


Re: Strange mod_perl2/Apache2 behavior -- I think

Posted by Bruce Tennant <bl...@yahoo.com>.
I think you need to wrap it in a files block.  The location block is
sending all files to the perl handler.

I had this problem, except it was trying to execute all of my non-perl
files.

Inside location, put something like 

<Location /b>
<FilesMatch "\.(pl|pm|cgi)$">
... your mod_perl configs here ....
</FilesMatch>
</Location>


--- Bill Rini <wi...@hotmail.com> wrote:
> Here's a little snippet from a sample script:
> 
> package MyApache::MyPackage;
> 
> use strict;
> use warnings;
> 
> use Apache::RequestRec ();
> use Apache::RequestIO ();
> use Apache::DBI;
> use APR::Table;
> use Apache::Const qw(OK REDIRECT DECLINED);
> use Apache::RequestUtil ();
> 
> sub handler {
> 
> my $r = shift;
> my $current_uri = $r->uri;
> my $content_type = $r->content_type;
> my @fields = split(/\//, $current_uri);
> 
> 
> # Let's see if the file exists first
> 
> return Apache::DECLINED unless !-e $r->filename;
> 
> 
> # other stuff happens past this point but this is enough to document
> the 
> problem.
> }
> 
> Here's my the relevant settings in my config file:
> 
>   <Location /b>
>         PerlSendHeader On
>         SetHandler perl-script
>         PerlHandler MyApache::MyPackage
>   </Location>
> 
> OK, so this is set up as a PerlResponseHandler on a virtual server.
> When the 
> handler is invoked, it loads the page (a php page) but doesn't parse
> it in 
> PHP before displaying to the browser. I just get back the raw php
> code. 
> Actually, this is somewhat misleading. On Opera it displays the code.
> In IE 
> it asks me whether or not I want to download it or open it. When I
> remove 
> the handler config in the conf files Apache handles it just as it
> should (it 
> parses the php correctly) but with the handler in there when I go to 
> http://localhost/b/b.php I get.
> 
> <?php
> 
> print "Hello World";
> 
> ?>
> 
> instead of the actual printing out of "Hello World".  Here's the
> results 
> from a telnet session:
> 
> GET /b/b.php HTTP/1.1
> Host: localhost
> 
> HTTP/1.1 200 OK
> Date: Wed, 20 Aug 2003 19:54:02 GMT
> Server: Apache/2.0.47 (Unix) mod_perl/1.99_09 Perl/v5.8.0
> mod_ssl/2.0.47 
> OpenSSL/0.9.7a DAV/2 PHP/4.3.2
> Last-Modified: Wed, 20 Aug 2003 10:45:31 GMT
> ETag: "21c229-3f-ef2ea8c0"
> Accept-Ranges: bytes
> Content-Length: 63
> Content-Type: application/x-httpd-php
> 
> <?php
> 
> print "Hello World";
> 
> ?>
> Connection closed by foreign host.
> 
> When I've telneted into the the machine and called the file directly
> it 
> seems that the proper content type is being set but in the browser
> (as 
> mentioned above) IE reports the content-type as blank (there's a null
> value 
> in the popup box for content-type when it asks me to download or open
> the 
> file). No errors appear in the log files.
> 
> Now, I know it's executing because it actually processes the code
> below that 
> line which ends in a redirect.  But if I try to exit the handler
> because 
> it's not the correct type of request it seems to mess up the proper
> handling 
> of php and html files.  Image files seem to appear correctly but that
> may be 
> the browser compensating or reading the encoding type.
> 
> Of course, if anybody has an easier suggestion on what I'm trying to
> do:
> 
> I want the document root directory to be handled by the
> PerlResponseHandler 
> (i.e. Location /). For specific types of requests I would like the
> above 
> handler to look up some information in the database and return the
> info 
> dynamically. The only time I don't want that to happen is if the file
> 
> already exists OR it's pointing to a directory that exists that has a
> 
> default document type in it (ie index.html or index.php). Everything
> else I 
> want the handler to do something special with.
> 
> So, for instance, if I have the following files:
> 
> /index.html
> /somefile.html
> /somedir/index.html
> /somedir/somefile2.html
> 
> Any request to:
> 
> http://localhost/
> http://localhost/index.html
> http://localhost/somefile.html
> http://localhost/somedir/
> http://localhost/somedir/index.html
> http://localhost/somedir/somefile2.html
> 
> Should all just be handled normally. But if I get a request for:
> 
> http://localhost/abc/def/
> or
> http://localhost/somedir/abcdef
> 
> I want the above perl handler to parse the uri and do
> something different (directories /abc/def and /abcdef/ would not
> actually exist).
> 
> TIA for any help on this.
> 
> Bill
> 
> 
> 
> ````````````````````````````````````````
> DISCLAIMER:  The views expressed by the author of this email may or
> may not 
> be his/her views, the views of any company s/he represents, or the
> views of 
> any persons living, dead, or undead.    This email message, including
> any 
> attachments, is for the sole use of the intended recipient(s).  If
> you have 
> received this e-mail in error do not open it.  Any errors in facts, 
> spelling, or tact are transmission errors caused by your email
> client.
> 
> http://www.windowsix.com
> 
> _________________________________________________________________
> <b>Get MSN 8</b> and help protect your children with advanced
> parental 
> controls.  http://join.msn.com/?page=features/parental
> 
> 
> 
> -- 
> Reporting bugs: http://perl.apache.org/bugs/
> Mail list info: http://perl.apache.org/maillist/modperl.html
> 


=====
www.bluewolverine.com

__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com


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