On Wed, Dec 20, 2023 at 5:20 PM Yann Ylavic <[email protected]> wrote:
>
> On Wed, Dec 20, 2023 at 4:56 PM <[email protected]> wrote:
> >
> > Author: jorton
> > Date: Wed Dec 20 15:56:15 2023
> > New Revision: 1914804
> >
> > URL: http://svn.apache.org/viewvc?rev=1914804&view=rev
> > Log:
> > * modules/http/chunk_filter.c (ap_http_chunk_filter): For a brigade
> > containing [FLUSH EOS], insert the last-chunk terminator before the
> > FLUSH rather than between the FLUSH and the EOS.
> >
> > Github: closes #400
>
> It seems that we should set the last-chunk before the FLUSH only if
> the latter precedes an EOS?
>
> So below:
>
> > --- httpd/httpd/trunk/modules/http/chunk_filter.c (original)
> > +++ httpd/httpd/trunk/modules/http/chunk_filter.c Wed Dec 20 15:56:15 2023
> > @@ -64,7 +64,7 @@ apr_status_t ap_http_chunk_filter(ap_fil
> >
> > for (more = tmp = NULL; b; b = more, more = NULL) {
> > apr_off_t bytes = 0;
> > - apr_bucket *eos = NULL;
> > + apr_bucket *eos = NULL; /* EOS bucket, or FLUSH preceding EOS */
> > apr_bucket *flush = NULL;
> > /* XXX: chunk_hdr must remain at this scope since it is used in a
> > * transient bucket.
> > @@ -99,8 +99,20 @@ apr_status_t ap_http_chunk_filter(ap_fil
> > }
> > if (APR_BUCKET_IS_FLUSH(e)) {
> > flush = e;
>
> Don't set "flush" above.
>
> > +
> > + /* Special case to catch common brigade ending of
> > + * [FLUSH] [EOS] - insert the last_chunk before
> > + * the FLUSH rather than between the FLUSH and the
> > + * EOS. */
> > if (e != APR_BRIGADE_LAST(b)) {
> > - more = apr_brigade_split_ex(b, APR_BUCKET_NEXT(e),
> > tmp);
> > + if (APR_BUCKET_IS_EOS(APR_BUCKET_NEXT(e))) {
>
> But here only?
>
> > + eos = e;
> > + /* anything after EOS is dropped, no need
> > + * to split. */
> > + }
> > + else {
> > + more = apr_brigade_split_ex(b,
> > APR_BUCKET_NEXT(e), tmp);
> > + }
> > }
> > break;
> > }
> > @@ -173,12 +185,12 @@ apr_status_t ap_http_chunk_filter(ap_fil
> > * FLUSH bucket, or appended to the brigade
> > */
> > e = apr_bucket_immortal_create(CRLF_ASCII, 2, c->bucket_alloc);
> > - if (eos != NULL) {
> > - APR_BUCKET_INSERT_BEFORE(eos, e);
> > - }
> > - else if (flush != NULL) {
> > + if (flush != NULL) {
> > APR_BUCKET_INSERT_BEFORE(flush, e);
> > }
> > + else if (eos != NULL) {
> > + APR_BUCKET_INSERT_BEFORE(eos, e);
> > + }
> > else {
> > APR_BRIGADE_INSERT_TAIL(b, e);
> > }
Ah no, this is for every chunk so we are good here.
For the last-chunk, I think we need:
Index: modules/http/chunk_filter.c
===================================================================
--- modules/http/chunk_filter.c (revision 1914804)
+++ modules/http/chunk_filter.c (working copy)
@@ -217,7 +217,7 @@ apr_status_t ap_http_chunk_filter(ap_filter_t *f,
* now.
*/
if (eos && !ctx->bad_gateway_seen) {
- ap_h1_add_end_chunk(b, eos, f->r, ctx->trailers);
+ ap_h1_add_end_chunk(b, flush ? flush : eos, f->r, ctx->trailers);
}
/* pass the brigade to the next filter. */
--
?