@@ -228,12 +228,12 @@ static apr_status_t redirectionio_filter_header_filtering(ap_filter_t *f, apr_bu
228228}
229229
230230static 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