You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by st...@apache.org on 2004/03/02 07:08:01 UTC

cvs commit: modperl-2.0/t/filter/TestFilter in_bbs_inject_header.pm

stas        2004/03/01 22:08:01

  Modified:    t/filter/TestFilter in_bbs_inject_header.pm
  Log:
  use a much simpler solution to tell one request from another, by using
  $c->keepalives counting
  
  Revision  Changes    Path
  1.6       +33 -56    modperl-2.0/t/filter/TestFilter/in_bbs_inject_header.pm
  
  Index: in_bbs_inject_header.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_inject_header.pm,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -u -r1.5 -r1.6
  --- in_bbs_inject_header.pm	27 Feb 2004 01:53:26 -0000	1.5
  +++ in_bbs_inject_header.pm	2 Mar 2004 06:08:00 -0000	1.6
  @@ -10,10 +10,11 @@
   # future invocation, so not to slow things.
   #
   # it becomes much trickier with keepalive connection, since Apache
  -# provides no API to tell you whether a new request is coming in. The
  -# only way to work around that is to install a connection output
  -# filter and make it snoop on EOS bucket (when the response is
  -# completed an EOS bucket is sent, regardless of the connection type).
  +# provides no API to tell you whether a new request is coming in. We
  +# use $c->keepalives to figure out when a new request is coming in, by
  +# comparing the previously stored keepalives count, which gets
  +# incremented by Apache when the HTTP response headers are generated.
  +#
   #
   # the second task is a bit trickier, as the headers_in core httpd
   # filter is picky and it wants each header to arrive in a separate
  @@ -31,7 +32,6 @@
   use Apache::RequestRec ();
   use Apache::RequestIO ();
   use Apache::Connection ();
  -use Apache::Server ();
   use APR::Brigade ();
   use APR::Bucket ();
   use APR::Table ();
  @@ -80,73 +80,50 @@
       return 1;
   }
   
  -sub flag_request_reset : FilterConnectionHandler {
  -    my($filter, $bb) = @_;
  -
  -    # we need this filter only when the connection is keepalive
  -    unless ($filter->c->keepalive == Apache::CONN_KEEPALIVE) {
  -        $filter->remove;
  -        return Apache::DECLINED;
  -    }
  -
  -    debug join '', "-" x 20 , " output filter called ", "-" x 20;
  -
  -    #ModPerl::TestFilterDebug::bb_dump("connection", "output", $bb);
  -
  -    for (my $b = $bb->first; $b; $b = $bb->next($b)) {
  -        next unless $b->is_eos;
  -        # end of request, the input filter may get a new request now,
  -        # so it should be ready to parse headers again
  -        debug "flagging the end of response";
  -        $filter->c->notes->set(reset_request => 1);
  -    }
  -
  -    return $filter->next->pass_brigade($bb);
  -}
  -
  -# instead of using FilterInitHandler, you could register the output
  -# filter explicitly in the configuration file. that will be more
  -# efficient for a production site, as one will need to do it only if
  -# they support KeepAlive configurations
  -sub push_output_filter : FilterInitHandler {
  +sub context {
       my $filter = shift;
   
  -    # at this point we don't know whether the connection is going to
  -    # be keepalive or not, since the relevant input headers weren't
  -    # parsed yet. we know only after ap_http_header_filter was called.
  -    # therefore we have no choice but to add the flagging output filter
  -    # unless we know that the server is configured not to allow
  -    # keep_alive connections
  -    my $s = $filter->c->base_server;
  -    if ($s->keep_alive && $s->keep_alive_timeout > 0) {
  -        $filter->c->add_output_filter(\&flag_request_reset);
  -    }
  -
  -    return Apache::OK;
  -}
  -
  -sub handler : FilterConnectionHandler
  -              FilterHasInitHandler(\&push_output_filter) {
  -    my($filter, $bb, $mode, $block, $readbytes) = @_;
  -
  -    debug join '', "-" x 20 , " input filter called -", "-" x 20;
  -
  -    my $c = $filter->c;
  -
       my $ctx = $filter->ctx;
  +    my $c   = $filter->c;
       unless ($ctx) {
           debug "filter context init";
           $ctx = {
               buckets             => [],
               done_with_headers   => 0,
               seen_body_separator => 0,
  +            keepalives          => $c->keepalives,
           };
   
           # since we are going to manipulate the reference stored in
           # ctx, it's enough to store it only once, we will get the same
           # reference in the following invocations of that filter
           $filter->ctx($ctx);
  +        return $ctx;
       }
  +
  +    if ($c->keepalive == Apache::CONN_KEEPALIVE &&
  +        $ctx->{done_with_headers} &&
  +        $c->keepalives > $ctx->{keepalives}) {
  +
  +        debug "a new request resetting the input filter state";
  +
  +        $ctx->{buckets}             = [];
  +        $ctx->{done_with_headers}   = 0;
  +        $ctx->{seen_body_separator} = 0;
  +        $ctx->{keepalives} = $c->keepalives;
  +    }
  +
  +    return $ctx;
  +
  +}
  +
  +sub handler : FilterConnectionHandler {
  +    my($filter, $bb, $mode, $block, $readbytes) = @_;
  +
  +    debug join '', "-" x 20 , " input filter called -", "-" x 20;
  +
  +    my $ctx = context($filter);
  +    my $c = $filter->c;
   
       # reset the filter state, we start a new request
       if ($c->keepalive == Apache::CONN_KEEPALIVE &&