> -----Original Message----- > From: Graham Leggett [mailto:[email protected]] > Sent: Mittwoch, 22. Mai 2013 16:17 > To: [email protected] > Subject: Re: svn commit: r1484852 - in /httpd/httpd/trunk: CHANGES > modules/http/http_filters.c > > On 22 May 2013, at 3:57 PM, Plüm, Rüdiger, Vodafone Group > <[email protected]> wrote: > > > I guess you missed a special case: > > > > If the reverse proxy backend sends a response without a Content-Length > header and without a Transfer-Encoding, > > which is IMHO valid for HTTP 1.0 responses if the connection is closed > after the response. > > The following patch would fix this: > > > > Index: modules/http/http_filters.c > > =================================================================== > > --- modules/http/http_filters.c (revision 1485192) > > +++ modules/http/http_filters.c (working copy) > > @@ -394,8 +394,15 @@ > > case BODY_LENGTH: > > case BODY_CHUNK_DATA: { > > > > - /* Ensure that the caller can not go over our boundary > point. */ > > - if (ctx->remaining < readbytes) { > > + /* > > + * Ensure that the caller can not go over our boundary > point, > > + * BUT only if this is not a response by reverse proxy > backend > > + * that sent no Content-Length header and has no transfer > encoding > > + * which is valid for a non keep-alive HTTP 1.0 response. > > + */ > > + if ((ctx->remaining < readbytes) && !((ctx->remaining == > 0) && > > + (ctx->state == BODY_NONE) && > > + (f->r->proxyreq == PROXYREQ_RESPONSE))) { > > readbytes = ctx->remaining; > > } > > if (readbytes > 0) { > > > > Should I commit it? > > Hmmm. the check for f->r->proxyreq == PROXYREQ_RESPONSE shouldn't be > necessary at this point, as we already check for this case here: > > /* If we don't have a request entity indicated by the headers, > EOS. > * (BODY_NONE is a valid intermediate state due to trailers, > * but it isn't a valid starting state.) > * > * RFC 2616 Section 4.4 note 5 states that connection-close > * is invalid for a request entity - request bodies must be > * denoted by C-L or T-E: chunked. > * > * Note that since the proxy uses this filter to handle the > * proxied *response*, proxy responses MUST be exempt. > */ > if (ctx->state == BODY_NONE && f->r->proxyreq != > PROXYREQ_RESPONSE) { > e = apr_bucket_eos_create(f->c->bucket_alloc); > APR_BRIGADE_INSERT_TAIL(b, e); > ctx->eos_sent = 1; > return APR_SUCCESS; > } > > The BODY_NONE case however shouldn't be constrained as you've said, > something like this? > > Index: modules/http/http_filters.c > =================================================================== > --- modules/http/http_filters.c (revision 1484926) > +++ modules/http/http_filters.c (working copy) > @@ -395,7 +395,7 @@ > case BODY_CHUNK_DATA: { > > /* Ensure that the caller can not go over our boundary > point. */ > - if (ctx->remaining < readbytes) { > + if (ctx->state != BODY_NONE && ctx->remaining < readbytes) > { > readbytes = ctx->remaining; > } > if (readbytes > 0) { >
Yeah. You are correct. Looks sufficient. Regards Rüdiger
