On Tue, Dec 9, 2014 at 11:03 PM, Yann Ylavic <ylavic....@gmail.com> wrote:
> On Tue, Dec 9, 2014 at 10:56 PM, Yann Ylavic <ylavic....@gmail.com> wrote:
>> +static apr_status_t crypto_in_filter(ap_filter_t *f, apr_bucket_brigade *bb,
>> +        ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes)
>> +{
> []
>> +    /* if our buffer is empty, read off the network until the buffer is 
>> full */
>> +    if (APR_BRIGADE_EMPTY(ctx->bb)) {
> []
>> +        while (!ctx->seen_eos && ctx->remaining > 0) {
>> +            const char *data;
>> +            apr_size_t size = 0;
>> +
>
> Also I think we should :
>             apr_brigade_cleanup(ctx->tmp);
> here.

Hmm, no, this one seems not necessary.
>
>> +            rv = ap_get_brigade(f->next, ctx->tmp, mode, block,
>> ctx->remaining);
>> +

But if you want to keep the following apr_bucket_read() nonblocking,
you could do :

if (APR_BRIGADE_EMPTY(ctx->tmp) {
    rv = ap_get_brigade(f->next, ctx->tmp, mode, block, ctx->remaining);
}

and then below :

rv = apr_bucket_read(e, &data, &size, block);
if (APR_STATUS_IS_EAGAIN(rv)) {
    if (APR_BRIGADE_EMPTY(ctx->bb) {
        return rv;
    }
    break:
}
if (APR_SUCCESS != rv) {
    return rv;
}
do_crypto(f, (unsigned char *) data, size, 0);
...

Reply via email to