static int input_body_filter_handler()

in c-modules/input_body_filter/mod_input_body_filter.c [83:138]


static int input_body_filter_handler(ap_filter_t *f, apr_bucket_brigade *bb, 
                                     ap_input_mode_t mode, 
                                     apr_read_type_e block,
                                     apr_off_t readbytes)
{
    request_rec *r = f->r;
    conn_rec *c = r->connection;
    apr_status_t rv;
    input_body_ctx_t *ctx = f->ctx;

    if (!ctx) {
        f->ctx = ctx = apr_pcalloc(r->pool, sizeof(*ctx));
        ctx->b = apr_brigade_create(r->pool, c->bucket_alloc);
    }

    if (APR_BRIGADE_EMPTY(ctx->b))
    {
        if ((rv = ap_get_brigade(f->next, ctx->b, mode, block,
                                 readbytes)) != APR_SUCCESS) {
            return rv;
        }
    }

    while (!APR_BRIGADE_EMPTY(ctx->b)) {
        const char *data;
        apr_size_t len;
        apr_bucket *bucket;

        bucket = APR_BRIGADE_FIRST(ctx->b);

        if (APR_BUCKET_IS_EOS(bucket)) {
            APR_BUCKET_REMOVE(bucket);
            APR_BRIGADE_INSERT_TAIL(bb, bucket);
            break;
        }

        rv = apr_bucket_read(bucket, &data, &len, block);

        if (rv != APR_SUCCESS) {
            return rv;
        }

        APR_BUCKET_REMOVE(bucket);

        if (len) {
            char *reversed = apr_pstrndup(r->pool, data, len);
            reverse_string(reversed, len);
            bucket = apr_bucket_pool_create(reversed, len, r->pool,
                                            c->bucket_alloc);
        }

        APR_BRIGADE_INSERT_TAIL(bb, bucket);
    }

    return OK;
}