Loading ...
Sorry, an error occurred while loading the content.

60098Re: mod_perl2, HEAD request and Content-Length

Expand Messages
  • Boris Zentner
    Aug 1, 2004
    • 0 Attachment
      Hi,

      Am Samstag 31 Juli 2004 10:20 schrieb Stas Bekman:
      > Geoffrey Young wrote:
      > > Boris Zentner wrote:
      > >>Hi,
      > >>
      > >>I have a handler, that serve dynamic pages or static ones. If the handler
      > >> gets a HEAD request, it answers with
      >
      > [...]
      >
      > > it is desired - you no longer need to set the Content-Length header for
      > > requests in Apache 2.0.
      >
      > It's somewhat documented:
      > http://perl.apache.org/docs/2.0/user/handlers/http.html#Handling_HEAD_Reque
      >sts
      >

      I just read it, thanks for the pointer. I think the text should make clear,
      that even if it is not needed to return early with 'return OK if
      $r->header_only;' with apache2, it is recommended, since it is ( or can be )
      a big waste of time to construct the body, that is removed in the next pass.

      From reading the comments in modules/http/http_protocol.c
      ( ap_http_header_filter ), I get the impression, that apache2 recommend
      generating and throwing away the content. Here is the comment in question:

      /* This is a hack, but I can't find anyway around it. The idea is that
      * we don't want to send out 0 Content-Lengths if it is a head request.
      * This happens when modules try to outsmart the server, and return
      * if they see a HEAD request. Apache 1.3 handlers were supposed to
      * just return in that situation, and the core handled the HEAD. In
      * 2.0, if a handler returns, then the core sends an EOS bucket down
      * the filter stack, and the content-length filter computes a C-L of
      * zero and that gets put in the headers, and we end up sending a
      * zero C-L to the client. We can't just remove the C-L filter,
      * because well behaved 2.0 handlers will send their data down the stack,
      * and we will compute a real C-L for the head request. RBB
      */

      also The comment implies, that I get a Content-Length header for a HEAD
      request, if I waste my time and generate the body of the message. I tried it
      and got _no_ Content-Length header!

      $apr->content_type($media_type) unless $apr->main;
      if ( $apr->header_only ) {
      $apr->print( ' ' x $size ); # just to see if I got a content-length header
      return DONE;
      }

      The only way to get the Content-Length header for a HEAD request is

      $apr->headers_out->{'Content-Length'} = $size ;
      $apr->content_type($media_type) unless $apr->main;
      if ( $apr->header_only ) {
      $apr->rflush;
      return DONE;
      }

      But I fail to see why this works, I thought the data walks the same filter
      chain only in more buckets.

      I used

      Server: Apache/2.0.49 (Unix) mod_perl/1.99_14 Perl/v5.8.3 mod_ssl/2.0.49
      OpenSSL/0.9.7d DAV/2 SVN/1.0.2

      > > basically, any C-L header you set in the content-generation phase of the
      > > request has the potential to be incorrect, since any filter can come
      > > along and alter the content. so, what apache does is it runs the new
      > > content-length filter, which will decide whether a C-L header is required
      > > and take appropriate steps. for instance, apache will abandon the C-L
      > > header if it decides it can use a chunked transfer encoding instead.
      >
      > Geoff, feel free to improve that section to be more complete. Thanks.
      >

      --
      Boris

      --
      Report problems: http://perl.apache.org/bugs/
      Mail list info: http://perl.apache.org/maillist/modperl.html
      List etiquette: http://perl.apache.org/maillist/email-etiquette.html
    • Show all 25 messages in this topic