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