You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by je...@apache.org on 2007/11/14 22:32:36 UTC
svn commit: r595070 - /httpd/sandbox/amsterdam/d/modules/proxy/mod_serf.c
Author: jerenkrantz
Date: Wed Nov 14 13:32:35 2007
New Revision: 595070
URL: http://svn.apache.org/viewvc?rev=595070&view=rev
Log:
Amsterdam sandbox: Fix up ap_save_brigade semantics and correct read()
semantics per rpluem's comment.
Modified:
httpd/sandbox/amsterdam/d/modules/proxy/mod_serf.c
Modified: httpd/sandbox/amsterdam/d/modules/proxy/mod_serf.c
URL: http://svn.apache.org/viewvc/httpd/sandbox/amsterdam/d/modules/proxy/mod_serf.c?rev=595070&r1=595069&r2=595070&view=diff
==============================================================================
--- httpd/sandbox/amsterdam/d/modules/proxy/mod_serf.c (original)
+++ httpd/sandbox/amsterdam/d/modules/proxy/mod_serf.c Wed Nov 14 13:32:35 2007
@@ -388,6 +388,7 @@
serf_core_ctx_t *core_ctx;
apr_bucket_brigade *bb;
apr_bucket_brigade *tmp_bb;
+ apr_size_t last_read;
} brigade_bucket_ctx_t;
/* Forward-declare */
@@ -403,9 +404,10 @@
ctx->allocator = core_ctx->serf_bkt_alloc;
ctx->pool = serf_bucket_allocator_get_pool(ctx->allocator);
ctx->core_ctx = core_ctx;
+ ctx->last_read = 0;
/* Replace witha more optimized mechanism for converting */
- ap_save_brigade(f, &ctx->bb, bb, f->c->pool);
+ ap_save_brigade(f, &ctx->bb, &bb, f->c->pool);
ctx->tmp_bb = apr_brigade_create(f->c->pool, f->c->bucket_alloc);
return serf_bucket_create(&serf_bucket_type_brigade, ctx->allocator, ctx);
@@ -417,20 +419,26 @@
{
brigade_bucket_ctx_t *ctx = bucket->data;
apr_status_t status;
- apr_bucket *b, *end, *f;
- b = APR_BRIGADE_FIRST(ctx->bb);
- status = apr_bucket_read(b, data, len, APR_BLOCK_READ);
+ if (ctx->last_read) {
+ apr_bucket *end, *f;
+ status = apr_brigade_partition(ctx->bb, ctx->last_read, &end);
+ f = APR_BRIGADE_FIRST(ctx->bb);
+ while (f != end && f != APR_BRIGADE_SENTINEL(ctx->bb)) {
+ apr_bucket_delete(f);
+ f = APR_BRIGADE_FIRST(ctx->bb);
+ }
+ ctx->last_read = 0;
+ }
+
+ status = apr_bucket_read(APR_BRIGADE_FIRST(ctx->bb), data, len,
+ APR_BLOCK_READ);
if (requested < *len) {
*len = requested;
}
- status = apr_brigade_partition(ctx->bb, *len, &end);
- f = APR_BRIGADE_FIRST(ctx->bb);
- while (f != end && f != APR_BRIGADE_SENTINEL(ctx->bb)) {
- apr_bucket_delete(f);
- f = APR_BRIGADE_FIRST(ctx->bb);
- }
+ ctx->last_read = *len;
+
return status;
}