Hi,
I have a log handler that is supposed to log whether certain HTTP-authenticated customers were able to completely download their digital deliveries. The mod_perl 1.x version works just fine.
Now under SuSE Linux 9.2/Apache 2.0.53/mod_perl 2.0 RC4, $r->bytes_sent seems to always contain the full size of the file resource, not the bytes really sent to the client on an interrupted download. Unless it's a byte range request, in which case it contains the full size of the range. Does anybody know whether this is perhaps expected behaviour under Apache2, maybe a result of its fancy filter architecture? Could it be a mod_perl bug, or is mod_perl only a thin wrapper around the C structures in this case, and therefore most likely innocent?
If I add mod_ssl to the mix, $r->status acts wonky, too. When it should be 200 (and $r->status_line contains the correct "200 OK"), it's the apparently nonsensical 104. When it should be 206 for a byte range request (and $r->status_line contains the correct "206 Partial Content"), it's 200. Other people with the same user agent managed to produce other combinations, though. Any ideas?
Somewhat simplified code (for mod_perl 2.0 RC4):
package MyClient::AuthLog2; use strict; use Apache::Const -compile => qw(OK); use Apache::Util (); use APR::Finfo ();
sub handler { my $r = shift();
my $user = $r->user; if ($user) { my $date = Apache::Util::ht_time( $r->pool, $r->request_time, "%Y-%m-%d %H:%M", 0); my $remote = $r->connection->get_remote_host(); my $uri = $r->uri; my $status = $r->status; my $status_line = $r->status_line; my $bytes_file = $r->finfo->size; my $bytes_sent = $r->bytes_sent; my $result = "";
if ($status == 200 && $bytes_sent == $bytes_file) { $result = 'complete' } elsif ($status == 200 && $bytes_sent != $bytes_file) { $result = 'incomplete' } elsif ($status == 206) { $result = 'partial' }
open LOG, ">>/var/log/apache2/auth_log" or warn "Can't open auth log"; print LOG "$date|$remote|$user|$uri|", "$status|$status_line|$bytes_file|$bytes_sent|$result\n"; close LOG; }
return Apache::OK; }