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;
}