Skip to content

Commit 9bcb2a6

Browse files
committed
Use byte array instead of string for body filtering
1 parent a0be16a commit 9bcb2a6

File tree

1 file changed

+16
-34
lines changed

1 file changed

+16
-34
lines changed

Diff for: src/mod_redirectionio.c

+16-34
Original file line numberDiff line numberDiff line change
@@ -228,12 +228,12 @@ static apr_status_t redirectionio_filter_header_filtering(ap_filter_t *f, apr_bu
228228
}
229229

230230
static apr_status_t redirectionio_filter_body_filtering(ap_filter_t *f, apr_bucket_brigade *bb) {
231-
redirectionio_context *ctx = (redirectionio_context *)f->ctx;
232-
apr_bucket *b, *b_new;
233-
apr_bucket_brigade *bb_new;
234-
const char *input, *output, *input_str;
235-
int64_t input_size, output_size;
236-
apr_status_t rv;
231+
redirectionio_context *ctx = (redirectionio_context *)f->ctx;
232+
apr_bucket *b, *b_new;
233+
apr_bucket_brigade *bb_new;
234+
const char *input_bucket;
235+
struct REDIRECTIONIO_Buffer input, output;
236+
apr_status_t rv;
237237

238238
if (ctx == NULL) {
239239
return ap_pass_brigade(f->next, bb);
@@ -266,7 +266,7 @@ static apr_status_t redirectionio_filter_body_filtering(ap_filter_t *f, apr_buck
266266
// filter brigade
267267
while (b != APR_BRIGADE_SENTINEL(bb)) {
268268
// Read bucket
269-
rv = apr_bucket_read(b, &input, (apr_size_t *)&input_size, APR_BLOCK_READ);
269+
rv = apr_bucket_read(b, &input_bucket, (apr_size_t *)&input.len, APR_BLOCK_READ);
270270

271271
if (rv != APR_SUCCESS) {
272272
redirectionio_action_body_filter_drop(ctx->body_filter);
@@ -276,26 +276,16 @@ static apr_status_t redirectionio_filter_body_filtering(ap_filter_t *f, apr_buck
276276
return ap_pass_brigade(f->next, bb);
277277
}
278278

279-
// Send bucket
280-
if (input_size > 0) {
281-
input_str = strndup(input, input_size);
282-
output = redirectionio_action_body_filter_filter(ctx->body_filter, input_str);
283-
284-
if (output != input_str) {
285-
free((char *)input_str);
286-
}
279+
input.data = malloc(input.len);
280+
memcpy(input.data, input_bucket, input.len);
287281

288-
if (output == NULL) {
289-
ap_remove_output_filter(f);
290-
291-
return ap_pass_brigade(f->next, bb);
292-
}
293-
294-
output_size = strlen(output);
282+
// Send bucket
283+
if (input.len > 0) {
284+
output = redirectionio_action_body_filter_filter(ctx->body_filter, input);
295285

296286
// Create a new one
297-
if (output_size > 0) {
298-
b_new = apr_bucket_transient_create(output, output_size, f->r->connection->bucket_alloc);
287+
if (output.len > 0) {
288+
b_new = apr_bucket_transient_create((const char *)output.data, output.len, f->r->connection->bucket_alloc);
299289

300290
if (b_new == NULL) {
301291
ap_remove_output_filter(f);
@@ -311,17 +301,9 @@ static apr_status_t redirectionio_filter_body_filtering(ap_filter_t *f, apr_buck
311301
if (APR_BUCKET_IS_EOS(b)) {
312302
output = redirectionio_action_body_filter_close(ctx->body_filter);
313303

314-
if (output == NULL) {
315-
ap_remove_output_filter(f);
316-
317-
return ap_pass_brigade(f->next, bb);
318-
}
319-
320-
output_size = strlen(output);
321-
322-
if (output_size > 0) {
304+
if (output.len > 0) {
323305
// Create a new one
324-
b_new = apr_bucket_transient_create(output, output_size, f->r->connection->bucket_alloc);
306+
b_new = apr_bucket_transient_create((const char *)output.data, output.len, f->r->connection->bucket_alloc);
325307

326308
if (b_new == NULL) {
327309
ap_remove_output_filter(f);

0 commit comments

Comments
 (0)