For 3) I unfortunately get: [error] Can't locate object method "log" via package "Apache2::ServerRec" at /etc/httpd/SocketPolicy.pm line 39.\n
when I try: sub handler { my $c = shift; my $sock = $c->client_socket; # set the socket to the blocking mode $sock->opt_set(APR::Const::SO_NONBLOCK => 0); $sock->send(POLICY); my $slog = $c->base_server()->log(); $slog->info('served socket policy to: ', $c->remote_ip()); Apache2::Const::OK; } Regards Alex On Thu, Oct 21, 2010 at 2:35 PM, Alexander Farber <alexander.far...@gmail.com> wrote: > 1) How do you specify the path to your custom module, > so that Apache 2 can load it at the startup? > > I'm using mod_perl-2.0.4-6.el5 with CentOS Linux 5.5 and > have the following lines in /etc/httpd/conf.d/perl.conf: > > LoadModule perl_module modules/mod_perl.so > ....... > Listen 843 > <VirtualHost _default_:843> > PerlModule SocketPolicy > PerlProcessConnectionHandler SocketPolicy > </VirtualHost> > > but this works only if I put my SocketPolicy.pm > under /etc/httpd. Otherwise it isn't found in @INC. > > 2) The "perldoc APR:Socket" suggests an example: > > # read from/write to the socket (w/o handling possible failures) > my $wanted = 1024; > while ($sock->recv(my $buffer, $wanted)) { > $sock->send($buffer); > } > > and later it also says the mod_perl will handle errors for you. > > Shouldn't return values from send() be checked in > a loop for the cases, that it wasn't able to write the > complete buffer in 1 pass? Or does send($buffer) > alsways write the complete $buffer to the blocking socket? > > And what does it mean "mod_perl will handle errors for you"? > Does it catch exception coming from send()/recv() > and print it to error_log or is is something else? > > 3) And the 3rd question is optional (because I'll probably find > this in the docs soon), but maybe someone can tell me, how > to log the IP of the socket peer in my module to access_log? > > Thank you and below is my module > Alex > > # cat /etc/httpd/SocketPolicy.pm > package SocketPolicy; > > # Run: semanage port -a -t http_port_t -p tcp 843 > # And add following lines to the httpd.conf > # Listen 843 > # <VirtualHost _default_:843> > # PerlModule SocketPolicy > # PerlProcessConnectionHandler SocketPolicy > # </VirtualHost> > > use strict; > use warnings FATAL => 'all'; > > use Apache2::Connection(); > use APR::Socket(); > > use Apache2::Const(-compile => 'OK'); > use APR::Const(-compile => 'SO_NONBLOCK'); > > use constant POLICY => > qq{<?xml version="1.0"?> > <!DOCTYPE cross-domain-policy SYSTEM > "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> > > <cross-domain-policy> > <allow-access-from domain="*" to-ports="8080"/> > </cross-domain-policy> > \0}; > > sub handler { > my $c = shift; > my $sock = $c->client_socket; > > # set the socket to the blocking mode > $sock->opt_set(APR::Const::SO_NONBLOCK => 0); > > $sock->send(POLICY); > > Apache2::Const::OK; > } > > 1; >