Re: Apache 2.4, mod_perl 2.0.9, APR::SockAddr->port() missing ?
"A. Warnier" <[email protected]>
| Newsgroups | gmane.comp.apache.mod-perl |
|---|---|
| Message-ID | <[email protected]> |
On 30.10.2016 01:56, Randolf Richardson wrote:
> Do the following work for you?
>
> $r->connection->remote_addr->port
> $r->connection->local_addr->port
>
I'll check again, but $c->remote_addr is supposed to not exist anymore in httpd 2.4, as
far as I know.
Indeed :
When I modify the code as follows :
#my $client_addr = $r->connection->client_addr;
1184: my $client_addr = $r->connection->remote_addr;
$remote_port = $client_addr->port;
$remote_ip = $r->connection->client_ip;
Can't locate object method "remote_addr" via package "Apache2::Connection" at
/home/mira/EFS/lib/AUTH/SLC.pm line 1184.\n
>> Hi.
>>
>> Apologies to Steve and Torsten for posting this previously to them directly.
>> It somehow slipped my mind that this would have been a better place.
>> Anyway thus :
>>
>> I am in the process of converting some mod_perl AAA code from Apache 2.2 to 2.4, and I
>> encounter the following problem :
>>
>> Apache error log :
>>
>> Can't locate object method "port" via package "APR::SockAddr" at
>> /home/mira/EFS/lib/AUTH/SLC.pm line 1184.\
>>
>> which corresponds to :
>>
>> 1183: my $client_addr = $r->connection->client_addr;
>> 1184: $remote_port = $client_addr->port;
>>
>> In the Apache 2.2 version, this was :
>>
>> $remote_port = $r->connection->remote_addr->port;
>>
>> and worked fine.
>>
>> Environment :
>>
>> Linux d1s008 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2+deb8u3 (2016-07-02) x86_64
>> GNU/Linux (Debian "Jessie" as far as I know)
>>
>> Apache/2.4.10 (Debian) mod_apreq2-20090110/2.8.0 mod_perl/2.0.9dev Perl/v5.20.2 configured
>> -- resuming normal operations
>> (apache2 and mod_perl are the standard Debian Jessie apt-get packages)
>>
>>
>> I have tried to find clues on the WWW, CPAN etc.. but I do not find anything about
>> APR::SockAddr::port(), except this snippet (quite old..) :
>>
>> CPAN :
>> mod_perl 2.10 Changes :
>> ...
>> 1.99_14 - May 21, 2004
>>
>> APR::SockAddr::port() accessor is now read-only [Stas]
>>
>> Also on the host, the APR::SockAddr module source :
>>
>> /usr/lib/x86_64-linux-gnu/perl5/5.20/APR/SockAddr.pm :
>>
>> quote
>> =item obj: C<$sock_addr>
>> ( C<L<APR::SockAddr object|docs::2.0::api::APR::SockAddr>> )
>>
>> =item ret: C<$port> ( integer )
>>
>> =item since: 2.0.00
>> unquote
>>
>> .. seems to imply that this should work.
>> (And so do
>> https://metacpan.org/pod/APR::SockAddr#port
>> http://perl.apache.org/docs/2.0/api/APR/SockAddr.html#C_port_
>> )
>>
>> Am I doing something wrong ?
>>
>> More importantly to me right now : how can I get the client's connection port number,
>> possibly using a workaround ? I am in control of the Apache httpd configuration.
>>
>> I do not really care if this is the real client port, or a port of some intermediate
>> proxy, as long as it remains consistent across severall KeepAlive calls of the same client
>> workstation.
>> I need this port number to forward to another module (of which I do not have the source),
>> which uses this (and the remote IP), as a kind of persistent identifier for the client
>> connection (for Windows WIA authentication).
>>
>> The only way I can think of right now, would be to add a request header at the httpd level
>> with the remote client IP:port, and then retrieve and decode that same header in my AAA
>> module. But that seems a bit convoluted and heavy-handed.
>> Is there a way in a PerlAuthenHandler to retrieve an "Apache environment variable"
>> directly, which would have been set like so ?
>>
>> RewriteRule .* - [E=INFO_REMOTE_ADDR:"%{REMOTE_ADDR}\:%{REMOTE_PORT}",NE]
>>
>>
>> Thanks in advance
>> André Warnier
>
>
> Randolf Richardson - [email protected]
> Inter-Corporate Computer & Network Services, Inc.
> Beautiful British Columbia, Canada
> http://www.inter-corporate.com/
>
>