On 01/28/2017 06:59 PM, Daniel Ruggeri wrote:
> Ruediger Pluem wrote:
>> + /* try to read a header's worth of data */
>> + while (!ctx->done) {
>> + if (APR_BRIGADE_EMPTY(ctx->bb)) {
>> + ret = ap_get_brigade(f->next, ctx->bb, ctx->mode, block,
>> + ctx->need - ctx->rcvd);
>> + if (ret != APR_SUCCESS) {
>> + return ret;
>> + }
>> + }
>> + if (APR_BRIGADE_EMPTY(ctx->bb)) {
> What about the case of an non blocking read where the upstream filter
> returns an empty brigade
> and APR_SUCCESS. This is equal to returning EAGAIN.
>
>> + return APR_EOF;
>> + }
>
> Coming back to this one after correcting the setaside stuff... Is this
> what you have in mind or should we actually return APR_EAGAIN?
>
> return block == APR_NONBLOCK_READ ? APR_SUCCESS : APR_EOF;
>
IMHO you will hit the APR_BRIGADE_EMPTY(ctx->bb) with APR_SUCCESS returned case
only
in the non blocking case. So it would be sufficient to replace
return APR_EOF
with
return APR_SUCCESS.
You proposal is a little bit more fail safe and hence probably a good idea.
Furthermore I think you could move the second check for an empty brigade inside
the block checking it firstly (at the end).
Regards
Rüdiger