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;
}

Reply via email to