httpd-modules-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mike <dykci...@gmail.com>
Subject reading from bucket issues
Date Mon, 21 May 2007 18:51:23 GMT
Hi.

I have problem with flattening brigades. I don't really know why
Solution 1 works and Solution 2 gives segfaults/empty page in browsers.
Could anyone explain that step by step what is wrong with solution 2?
I actually couldn't find any info about it.

Sorry, code formating is awful.
Here they are:

Solution 1:

// not all variables are mentioned in code...
static apr_status_t my_filter(ap_filter_t *f, apr_bucket_brigade
		*bb) {
ctx->b = apr_brigade_create(r->pool, r->connection->bucket_alloc);

for (b = APR_BRIGADE_FIRST(bb);
b != APR_BRIGADE_SENTINEL(bb);
b = APR_BUCKET_NEXT(b)) {

if(APR_BUCKET_IS_FLUSH(b)) {
continue;
}
if(APR_BUCKET_IS_EOS(b)) {
ap_fputs(f->next, ctx->b, ctx->output);
APR_BUCKET_REMOVE(b);
APR_BRIGADE_INSERT_TAIL(ctx->b, b);
return ap_pass_brigade(f->next, ctx->b);
}

apr_bucket_read(b, &buffer, &length, APR_BLOCK_READ);
ctx->input = apr_psprintf(r->pool,"%s%.*s", ctx->input, length, buffer);
}

apr_brigade_destroy(bb);
return APR_SUCCESS;
}

Solution 2:
static apr_status_t my_filter(ap_filter_t *f, apr_bucket_brigade
		*bb) {
        char *c;
	apr_size_t s;
	apr_brigade_pflatten(bb, &c, &s, f->r->pool);
	apr_brigade_cleanup(bb);
	ap_fputs(f->next, bb, c);
        apr_bucket *b = apr_bucket_eos_create(f->c->bucket_alloc);
	APR_BRIGADE_INSERT_TAIL(bb, b);
	return ap_pass_brigade(f->next, bb);
}

Thanks in advance.
Kind regards.

Mime
View raw message