/** A list of output filters to be used for this connection
* @defvar ap_filter_t *filters */
struct ap_filter_t *output_filters;
- /** Location to store data about to be written to the client.
- * @defvar ap_bucket_brigade *client_data */
- struct ap_bucket_brigade *client_data;
/** bytes left to read in the current request body */
long remaining;
};
* is to send the headers if they haven't already been sent, and then send
* the actual data.
*/
+typedef struct CORE_OUTPUT_FILTER_CTX {
+ ap_bucket_brigade *b;
+} core_output_filter_ctx_t;
#define MAX_IOVEC_TO_WRITE 16
static int core_output_filter(ap_filter_t *f, ap_bucket_brigade *b)
{
apr_ssize_t bytes_sent = 0, nbytes;
ap_bucket *e;
conn_rec *c = f->c;
+ core_output_filter_ctx_t *ctx = f->ctx;
apr_ssize_t nvec = 0;
apr_ssize_t nvec_trailers= 0;
apr_ssize_t flen = 0;
apr_off_t foffset = 0;
+ if (ctx == NULL) {
+ f->ctx = ctx = apr_pcalloc(c->pool, sizeof(core_output_filter_ctx_t));
+ }
/* If we have a saved brigade, concatenate the new brigade to it */
- if (c->client_data) {
- AP_BRIGADE_CONCAT(c->client_data, b);
- b = c->client_data;
- c->client_data = NULL;
+ if (ctx->b) {
+ AP_BRIGADE_CONCAT(ctx->b, b);
+ b = ctx->b;
+ ctx->b = NULL;
}
/* Hijack any bytes in BUFF and prepend it to the brigade. */
* buffer the brigade or send the brigade out on the network
*/
if (!fd && (!more) && (nbytes < MIN_SIZE_TO_WRITE) && (e->type != AP_BUCKET_EOS)) {
- ap_save_brigade(f, &c->client_data, &b);
+ ap_save_brigade(f, &ctx->b, &b);
return APR_SUCCESS;
}
if (fd) {