On 02/06/2007 06:26 PM, Jim Jagielski wrote: > I don't know what's happening with my emails, but they > appear to be getting dropped left and right. > > I had responded to Joe's email, saying that I must be > misunderstanding his concern, but I haven't seen that > make it's way through yet. > > If I'm understanding it correctly, what we should be > doing is honoring the EAGAIN (if any) at line 295 and > returning that (w/o the state change). But it seems > that Joe doesn't think that'll work... I'm confused. > The previous patch wasn't correct, that's for sure. >
>From my understanding the following needs to be done: Index: http_filters.c =================================================================== --- http_filters.c (Revision 504183) +++ http_filters.c (Arbeitskopie) @@ -294,6 +294,12 @@ if (ctx->state == BODY_CHUNK) { rv = ap_get_brigade(f->next, bb, AP_MODE_GETLINE, block, 0); + if (block == APR_NONBLOCK_READ && + (((rv == APR_SUCCESS) && (APR_BRIGADE_EMPTY(bb))) || + (APR_STATUS_IS_EAGAIN(rv)))) { + apr_brigade_cleanup(bb); + return APR_EAGAIN; + } apr_brigade_cleanup(bb); } else { rv = APR_SUCCESS; This is slightly different than your patch Jim, as it also checks for an empty brigade with a APR_SUCESSS return code as we do a few lines later. Put possibly this could be also wrong here if the *successfull* read of an empty line in AP_MODE_GET_LINE returns an empty brigade. In this case the patch you sent to Joe and me should be correct: Index: modules/http/http_filters.c =================================================================== --- modules/http/http_filters.c (revision 504222) +++ modules/http/http_filters.c (working copy) @@ -295,6 +295,10 @@ rv = ap_get_brigade(f->next, bb, AP_MODE_GETLINE, block, 0); apr_brigade_cleanup(bb); + if (block == APR_NONBLOCK_READ && + (APR_STATUS_IS_EAGAIN(rv))) { + return APR_EAGAIN; + } } else { rv = APR_SUCCESS; } Regards RĂ¼diger