1docs::api::Apache2::FilUtseerr(3C)ontributed Perl Documednotcast:i:oanpi::Apache2::Filter(3)
2
3
4
6 Apache2::Filter - Perl API for Apache 2.0 Filtering
7
9 use Apache2::Filter ();
10
11 # filter attributes
12 my $c = $f->c;
13 my $r = $f->r;
14 my $frec = $f->frec();
15 my $next_f = $f->next;
16
17 my $ctx = $f->ctx;
18 $f->ctx($ctx);
19
20 # bucket brigade filtering API
21 $rc = $f->next->get_brigade($bb, $mode, $block, $readbytes);
22 $rc = $f->next->pass_brigade($bb);
23 $rc = $f->fflush($bb);
24
25 # streaming filtering API
26 while ($filter->read(my $buffer, $wanted)) {
27 # transform $buffer here
28 $filter->print($buffer);
29 }
30 if ($f->seen_eos) {
31 $filter->print("filter signature");
32 }
33
34 # filter manipulations
35 $r->add_input_filter(\&callback);
36 $c->add_input_filter(\&callback);
37 $r->add_output_filter(\&callback);
38 $c->add_output_filter(\&callback);
39 $f->remove;
40
42 "Apache2::Filter" provides Perl API for Apache 2.0 filtering framework.
43
44 Make sure to read "the Filtering
45 tutorial|docs::2.0::user::handlers::filters".
46
48 The following methods can be called from any filter handler:
49
50 "c"
51 Get the current connection object from a connection or a request
52 filter:
53
54 $c = $f->c;
55
56 obj: $f ( "Apache2::Filter object" )
57 ret: $c ( "Apache2::Connection object" )
58 since: 2.0.00
59
60 "ctx"
61 Get/set the filter context data.
62
63 $ctx = $f->ctx;
64 $f->ctx($ctx);
65
66 obj: $f ( "Apache2::Filter object" )
67 opt arg2: $ctx ( SCALAR )
68 next context
69
70 ret: $ctx ( SCALAR )
71 current context
72
73 since: 2.0.00
74
75 A filter context is created before the filter is called for the first
76 time and it's destroyed at the end of the request. The context is
77 preserved between filter invocations of the same request. So if a
78 filter needs to store some data between invocations it should use the
79 filter context for that. The filter context is initialized with the
80 "undef" value.
81
82 The "ctx" method accepts a single SCALAR argument. Therefore if you
83 want to store any other perl datastructure you should use a reference
84 to it.
85
86 For example you can store a hash reference:
87
88 $f->ctx({ foo => 'bar' });
89
90 and then access it:
91
92 $foo = $f->ctx->{foo};
93
94 if you access the context more than once it's more efficient to copy
95 it's value before using it:
96
97 my $ctx = $f->ctx;
98 $foo = $ctx->{foo};
99
100 to avoid redundant method calls. As of this writing $ctx is not a tied
101 variable, so if you modify it need to store it at the end:
102
103 $f->ctx($ctx);
104
105 META: later we might make it a TIEd-variable interface, so it'll be
106 stored automatically.
107
108 Besides its primary purpose of storing context data across multiple
109 filter invocations, this method is also useful when used as a flag. For
110 example here is how to ensure that something happens only once during
111 the filter's life:
112
113 unless ($f->ctx) {
114 do_something_once();
115 $f->ctx(1);
116 }
117
118 "frec"
119 Get/set the "Apache2::FilterRec" (filter record) object.
120
121 $frec = $f->frec();
122
123 obj: $f ( "Apache2::Filter object" )
124 ret: $frec ( "Apache2::FilterRec object" )
125 since: 2.0.00
126
127 For example you can call "$frec->name" to get filter's name.
128
129 "next"
130 Return the "Apache2::Filter" object of the next filter in chain.
131
132 $next_f = $f->next;
133
134 obj: $f ( "Apache2::Filter object" )
135 The current filter object
136
137 ret: $next_f ( "Apache2::Filter object" )
138 The next filter object in chain
139
140 since: 2.0.00
141
142 Since Apache inserts several core filters at the end of each chain,
143 normally this method always returns an object. However if it's not a
144 mod_perl filter handler, you can call only the following methods on it:
145 "get_brigade", "pass_brigade", "c", "r", "frec" and "next". If you call
146 other methods the behavior is undefined.
147
148 The next filter can be a mod_perl one or not, it's easy to tell which
149 one is that by calling "$f->frec->name".
150
151 "r"
152 Inside an HTTP request filter retrieve the current request object:
153
154 $r = $f->r;
155
156 obj: $f ( "Apache2::Filter object" )
157 ret: $r ( "Apache2::RequestRec object" )
158 since: 2.0.00
159
160 If a sub-request adds filters, then that sub-request object is
161 associated with the filter.
162
163 "remove"
164 Remove the current filter from the filter chain (for the current
165 request or connection).
166
167 $f->remove;
168
169 obj: $f ( "Apache2::Filter object" )
170 ret: no return value
171 since: 2.0.00
172
173 Notice that you should either complete the current filter invocation
174 normally (by calling "get_brigade" or "pass_brigade" depending on the
175 filter kind) or if nothing was done, return "Apache2::Const::DECLINED"
176 and mod_perl will take care of passing the current bucket brigade
177 through unmodified to the next filter in chain.
178
179 Note: calling remove() on the very top connection filter doesn't affect
180 the filter chain due to a bug in Apache 2.0 (which may be fixed in
181 2.1). So don't use it with connection filters, till it gets fixed in
182 Apache and then make sure to require the minimum Apache version if you
183 rely on.
184
185 Remember that if the connection is "$c->keepalive" ) and the connection
186 filter is removed, it won't be added until the connection is closed.
187 Which may happen after many HTTP requests. You may want to keep the
188 filter in place and pass the data through unmodified, by returning
189 "Apache2::Const::DECLINED". If you need to reset the whole or parts of
190 the filter context between requests, use the technique based on
191 "$c->keepalives" counting.
192
193 This method works for native Apache (non-mod_perl) filters too.
194
196 The following methods can be called from any filter, directly
197 manipulating bucket brigades:
198
199 "fflush"
200 Flush a bucket brigade down the filter stack.
201
202 $rc = $f->fflush($bb);
203
204 obj: $f ( "Apache2::Filter object" )
205 The current filter
206
207 arg1: $bb ( "Apache2::Brigade object" )
208 The brigade to flush
209
210 ret: $rc ( "APR::Const status constant" )
211 Refer to the "pass_brigade()" entry.
212
213 excpt: "APR::Error"
214 Exceptions are thrown only when this function is called in the VOID
215 context. Refer to the "get_brigade()" entry for details.
216
217 since: 2.0.00
218
219 "fflush" is a shortcut method. So instead of doing:
220
221 my $b = APR::Bucket::flush_create($f->c->bucket_alloc);
222 $bb->insert_tail($b);
223 $f->pass_brigade($bb);
224
225 one can just write:
226
227 $f->fflush($bb);
228
229 "get_brigade"
230 This is a method to use in bucket brigade input filters. It acquires a
231 bucket brigade from the upstream input filter.
232
233 $rc = $next_f->get_brigade($bb, $mode, $block, $readbytes);
234 $rc = $next_f->get_brigade($bb, $mode, $block);
235 $rc = $next_f->get_brigade($bb, $mode)
236 $rc = $next_f->get_brigade($bb);
237
238 obj: $next_f ( "Apache2::Filter object" )
239 The next filter in the filter chain.
240
241 Inside filter handlers it's usually "$f->next". Inside protocol
242 handlers: "$c->input_filters".
243
244 arg1: $bb ( "APR::Brigade object" )
245 The original bucket brigade passed to "get_brigade()", which must
246 be empty.
247
248 Inside input filter handlers it's usually the second argument to
249 the filter handler.
250
251 Otherwise it should be created:
252
253 my $bb = APR::Brigade->new($c->pool, $c->bucket_alloc);
254
255 On return it gets populated with the next bucket brigade. That
256 brigade may contain nothing if there was no more data to read. The
257 return status tells the outcome.
258
259 opt arg2: $mode ( "Apache2::Const :input_mode constant" )
260 The filter mode in which the data should be read.
261
262 If inside the filter handler, you should normally pass the same
263 mode that was passed to the filter handler (the third argument).
264
265 At the end of this section the available modes are presented.
266
267 If the argument $mode is not passed,
268 "Apache2::Const::MODE_READBYTES" is used as a default value.
269
270 opt arg3: $block ( "APR::Const :read_type constant" )
271 You may ask the reading operation to be blocking:
272 "APR::Const::BLOCK_READ", or nonblocking:
273 "APR::Const::NONBLOCK_READ".
274
275 If inside the filter handler, you should normally pass the same
276 blocking mode argument that was passed to the filter handler (the
277 forth argument).
278
279 If the argument $block is not passed, "APR::Const::BLOCK_READ" is
280 used as a default value.
281
282 opt arg4: $readbytes ( integer )
283 How many bytes to read from the next filter.
284
285 If inside the filter handler, you may want the same number of
286 bytes, as the upstream filter, i.e. the argument that was passed to
287 the filter handler (the fifth argument).
288
289 If the argument $block is not passed, 8192 is used as a default
290 value.
291
292 ret: $rc ( "APR::Const status constant" )
293 On success, "APR::Const::SUCCESS" is returned and $bb is populated
294 (see the $bb entry).
295
296 In case of a failure -- a failure code is returned, in which case
297 normally it should be returned to the caller.
298
299 If the bottom-most filter doesn't read from the network, then
300 "Apache2::NOBODY_READ" is returned (META: need to add this
301 constant).
302
303 Inside protocol handlers the return code can also be
304 "APR::Const::EOF", which is success as well.
305
306 excpt: "APR::Error"
307 You don't have to ask for the return value. If this function is
308 called in the VOID context, e.g.:
309
310 $f->next->get_brigade($bb, $mode, $block, $readbytes);
311
312 mod_perl will do the error checking on your behalf, and if the
313 return code is not "APR::Const::SUCCESS", an "APR::Error exception"
314 will be thrown. The only time you want to do the error checking
315 yourself, is when return codes besides "APR::Const::SUCCESS" are
316 considered as successful and you want to manage them by yourself.
317
318 since: 2.0.00
319
320 Available input filter modes (the optional second argument $mode) are:
321
322 • "Apache2::Const::MODE_READBYTES"
323
324 The filter should return at most readbytes data
325
326 • "Apache2::Const::MODE_GETLINE"
327
328 The filter should return at most one line of CRLF data. (If a
329 potential line is too long or no CRLF is found, the filter may
330 return partial data).
331
332 • "Apache2::Const::MODE_EATCRLF"
333
334 The filter should implicitly eat any CRLF pairs that it sees.
335
336 • "Apache2::Const::MODE_SPECULATIVE"
337
338 The filter read should be treated as speculative and any returned
339 data should be stored for later retrieval in another mode.
340
341 • "Apache2::Const::MODE_EXHAUSTIVE"
342
343 The filter read should be exhaustive and read until it can not read
344 any more. Use this mode with extreme caution.
345
346 • "Apache2::Const::MODE_INIT"
347
348 The filter should initialize the connection if needed, NNTP or FTP
349 over SSL for example.
350
351 Either compile all these constants with:
352
353 use Apache2::Const -compile => qw(:input_mode);
354
355 But it's a bit more efficient to compile only those constants that you
356 need.
357
358 Example:
359
360 Here is a fragment of a filter handler, that receives a bucket brigade
361 from the upstream filter:
362
363 use Apache2::Filter ();
364 use APR::Const -compile => qw(SUCCESS);
365 use Apache2::Const -compile => qw(OK);
366 sub filter {
367 my ($f, $bb, $mode, $block, $readbytes) = @_;
368
369 my $rc = $f->next->get_brigade($bb, $mode, $block, $readbytes);
370 return $rc unless $rc == APR::Const::SUCCESS;
371
372 # ... process $bb
373
374 return Apache2::Const::OK;
375 }
376
377 Usually arguments $mode, $block, $readbytes are the same as passed to
378 the filter itself.
379
380 You can see that in case of a failure, the handler returns immediately
381 with that failure code, which gets propagated to the downstream filter.
382
383 If you decide not check the return code, you can write it as:
384
385 sub filter {
386 my ($f, $bb, $mode, $block, $readbytes) = @_;
387
388 $f->next->get_brigade($bb, $mode, $block, $readbytes);
389
390 # ... process $bb
391
392 return Apache2::Const::OK;
393 }
394
395 and the error checking will be done on your behalf.
396
397 You will find many more examples in "the filter
398 handlers|docs::2.0::user::handlers::filters" and "the protocol
399 handlers|docs::2.0::user::handlers::protocols" tutorials.
400
401 "pass_brigade"
402 This is a method to use in bucket brigade output filters. It passes
403 the current bucket brigade to the downstream output filter.
404
405 $rc = $next_f->pass_brigade($bb);
406
407 obj: $next_f ( "Apache2::Filter object" )
408 The next filter in the filter chain.
409
410 Inside output filter handlers it's usually "$f->next". Inside
411 protocol handlers: "$c->output_filters".
412
413 arg1: $bb ( "APR::Brigade object" )
414 The bucket brigade to pass.
415
416 Inside output filter handlers it's usually the second argument to
417 the filter handler (after potential manipulations).
418
419 ret: $rc ( "APR::Const status constant" )
420 On success, "APR::Const::SUCCESS" is returned.
421
422 In case of a failure -- a failure code is returned, in which case
423 normally it should be returned to the caller.
424
425 If the bottom-most filter doesn't write to the network, then
426 "Apache2::NOBODY_WROTE" is returned (META: need to add this
427 constant).
428
429 Also refer to the "get_brigade()" entry to see how to avoid
430 checking the errors explicitly.
431
432 excpt: "APR::Error"
433 Exceptions are thrown only when this function is called in the VOID
434 context. Refer to the "get_brigade()" entry for details.
435
436 since: 2.0.00
437
438 The caller relinquishes ownership of the brigade (i.e. it may get
439 destroyed/overwritten/etc. by the callee).
440
441 Example:
442
443 Here is a fragment of a filter handler, that passes a bucket brigade to
444 the downstream filter (after some potential processing of the buckets
445 in the bucket brigade):
446
447 use Apache2::Filter ();
448 use APR::Const -compile => qw(SUCCESS);
449 use Apache2::Const -compile => qw(OK);
450 sub filter {
451 my ($f, $bb) = @_;
452
453 # ... process $bb
454
455 my $rc = $f->next->pass_brigade($bb);
456 return $rc unless $rc == APR::Const::SUCCESS;
457
458 return Apache2::Const::OK;
459 }
460
462 The following methods can be called from any filter, which uses the
463 simplified streaming functionality:
464
465 "print"
466 Send the contents of $buffer to the next filter in chain (via internal
467 buffer).
468
469 $sent = $f->print($buffer);
470
471 obj: $f ( "Apache2::Filter object" )
472 arg1: $buffer ( string )
473 The data to send.
474
475 ret: $sent ( integer )
476 How many characters were sent. There is no need to check, since all
477 should go through and if something goes work an exception will be
478 thrown.
479
480 excpt: "APR::Error"
481 since: 2.0.00
482
483 This method should be used only in streaming filters.
484
485 "read"
486 Read data from the filter
487
488 $read = $f->read($buffer, $wanted);
489
490 obj: $f ( "Apache2::Filter object" )
491 arg1: $buffer ( SCALAR )
492 The buffer to fill. All previous data will be lost.
493
494 opt arg2: $wanted ( integer )
495 How many bytes to attempt to read.
496
497 If this optional argument is not specified -- the default 8192 will
498 be used.
499
500 ret: $read ( integer )
501 How many bytes were actually read.
502
503 $buffer gets populated with the string that is read. It will
504 contain an empty string if there was nothing to read.
505
506 excpt: "APR::Error"
507 since: 2.0.00
508
509 Reads at most $wanted characters into $buffer. The returned value $read
510 tells exactly how many were read, making it easy to use it in a while
511 loop:
512
513 while ($filter->read(my $buffer, $wanted)) {
514 # transform $buffer here
515 $filter->print($buffer);
516 }
517
518 This is a streaming filter method, which acquires a single bucket
519 brigade behind the scenes and reads data from all its buckets.
520 Therefore it can only read from one bucket brigade per filter
521 invocation.
522
523 If the EOS bucket is read, the "seen_eos" method will return a true
524 value.
525
526 "seen_eos"
527 This methods returns a true value when the EOS bucket is seen by the
528 "read" method.
529
530 $ok = $f->seen_eos;
531
532 obj: $f ( "Apache2::Filter object" )
533 The filter to remove
534
535 ret: $ok ( boolean )
536 a true value if EOS has been seen, otherwise a false value
537
538 since: 2.0.00
539
540 This method only works in streaming filters which exhaustively
541 "$f->read" all the incoming data in a while loop, like so:
542
543 while ($f->read(my $buffer, $wanted)) {
544 # do something with $buffer
545 }
546 if ($f->seen_eos) {
547 # do something
548 }
549
550 The technique in this example is useful when a streaming filter wants
551 to append something to the very end of data, or do something at the end
552 of the last filter invocation. After the EOS bucket is read, the filter
553 should expect not to be invoked again.
554
555 If an input streaming filter doesn't consume all data in the bucket
556 brigade (or even in several bucket brigades), it has to generate the
557 EOS event by itself. So when the filter is done it has to set the EOS
558 flag:
559
560 $f->seen_eos(1);
561
562 when the filter handler returns, internally mod_perl will take care of
563 creating and sending the EOS bucket to the upstream input filter.
564
565 A similar logic may apply for output filters.
566
567 In most other cases you shouldn't set this flag. When this flag is
568 prematurely set (before the real EOS bucket has arrived) in the current
569 filter invocation, instead of invoking the filter again, mod_perl will
570 create and send the EOS bucket to the next filter, ignoring any other
571 bucket brigades that may have left to consume. As mentioned earlier
572 this special behavior is useful in writing special tests that test
573 abnormal situations.
574
576 Other methods which affect filters, but called on non-"Apache2::Filter"
577 objects:
578
579 "add_input_filter"
580 Add &callback filter handler to input request filter chain.
581
582 $r->add_input_filter(\&callback);
583
584 Add &callback filter handler to input connection filter chain.
585
586 $c->add_input_filter(\&callback);
587
588 obj: $c ( "Apache2::Connection object" ) or $r ( "Apache2::RequestRec
589 object" )
590 arg1: &callback (CODE ref)
591 ret: no return value
592 since: 2.0.00
593
594 [META: It seems that you can't add a filter when another filter is
595 called. I've tried to add an output connection filter from the input
596 connection filter when it was called for the first time. It didn't have
597 any affect for the first request (over keepalive connection). The only
598 way I succeeded to do that is from that input connection filter's
599 filter_init handler. In fact it does work if there is any filter
600 additional filter of the same kind configured from httpd.conf or via
601 filter_init. It looks like there is a bug in httpd, where it doesn't
602 prepare the chain of 3rd party filter if none were inserted before the
603 first filter was called.]
604
605 "add_output_filter"
606 Add &callback filter handler to output request filter chain.
607
608 $r->add_output_filter(\&callback);
609
610 Add &callback filter handler to output connection filter chain.
611
612 $c->add_output_filter(\&callback);
613
614 obj: $c ( "Apache2::Connection object" ) or $r ( "Apache2::RequestRec
615 object" )
616 arg1: &callback (CODE ref)
617 ret: no return value
618 since: 2.0.00
619
621 Packages using filter attributes have to subclass "Apache2::Filter":
622
623 package MyApache2::FilterCool;
624 use base qw(Apache2::Filter);
625
626 Attributes are parsed during the code compilation, by the function
627 "MODIFY_CODE_ATTRIBUTES", inherited from the "Apache2::Filter" package.
628
629 "FilterRequestHandler"
630 The "FilterRequestHandler" attribute tells mod_perl to insert the
631 filter into an HTTP request filter chain.
632
633 For example, to configure an output request filter handler, use the
634 "FilterRequestHandler" attribute in the handler subroutine's
635 declaration:
636
637 package MyApache2::FilterOutputReq;
638 sub handler : FilterRequestHandler { ... }
639
640 and add the configuration entry:
641
642 PerlOutputFilterHandler MyApache2::FilterOutputReq
643
644 This is the default mode. So if you are writing an HTTP request filter,
645 you don't have to specify this attribute.
646
647 The section HTTP Request vs. Connection Filters delves into more
648 details.
649
650 "FilterConnectionHandler"
651 The "FilterConnectionHandler" attribute tells mod_perl to insert this
652 filter into a connection filter chain.
653
654 For example, to configure an output connection filter handler, use the
655 "FilterConnectionHandler" attribute in the handler subroutine's
656 declaration:
657
658 package MyApache2::FilterOutputCon;
659 sub handler : FilterConnectionHandler { ... }
660
661 and add the configuration entry:
662
663 PerlOutputFilterHandler MyApache2::FilterOutputCon
664
665 The section HTTP Request vs. Connection Filters delves into more
666 details.
667
668 "FilterInitHandler"
669 The attribute "FilterInitHandler" marks the function suitable to be
670 used as a filter initialization callback, which is called immediately
671 after a filter is inserted to the filter chain and before it's actually
672 called.
673
674 sub init : FilterInitHandler {
675 my $f = shift;
676 #...
677 return Apache2::Const::OK;
678 }
679
680 In order to hook this filter callback, the real filter has to assign
681 this callback using the "FilterHasInitHandler" which accepts a
682 reference to the callback function.
683
684 For further discussion and examples refer to the Filter Initialization
685 Phase tutorial section.
686
687 "FilterHasInitHandler"
688 If a filter wants to run an initialization callback it can register
689 such using the "FilterHasInitHandler" attribute. Similar to
690 "push_handlers" the callback reference is expected, rather than a
691 callback name. The used callback function has to have the
692 "FilterInitHandler" attribute. For example:
693
694 package MyApache2::FilterBar;
695 use base qw(Apache2::Filter);
696 sub init : FilterInitHandler { ... }
697 sub filter : FilterRequestHandler FilterHasInitHandler(\&init) {
698 my ($f, $bb) = @_;
699 # ...
700 return Apache2::Const::OK;
701 }
702
703 For further discussion and examples refer to the Filter Initialization
704 Phase tutorial section.
705
707 mod_perl 2.0 filters configuration is explained in the filter handlers
708 tutorial.
709
710 "PerlInputFilterHandler"
711 See "PerlInputFilterHandler".
712
713 "PerlOutputFilterHandler"
714 See "PerlOutputFilterHandler".
715
716 "PerlSetInputFilter"
717 See "PerlSetInputFilter".
718
719 "PerlSetOutputFilter"
720 See "PerlSetInputFilter".
721
723 "Apache2::Filter" also implements a tied interface, so you can work
724 with the $f object as a hash reference.
725
726 The TIE interface is mostly unimplemented and might be implemented post
727 2.0 release.
728
729 "TIEHANDLE"
730 $ret = TIEHANDLE($stashsv, $sv);
731
732 obj: $stashsv ( SCALAR )
733 arg1: $sv ( SCALAR )
734 ret: $ret ( SCALAR )
735 since: subject to change
736
737 "PRINT"
738 $ret = PRINT(...);
739
740 obj: "..." (XXX)
741 ret: $ret ( integer )
742 since: subject to change
743
745 mod_perl 2.0 documentation.
746
748 mod_perl 2.0 and its core modules are copyrighted under The Apache
749 Software License, Version 2.0.
750
752 The mod_perl development team and numerous contributors.
753
754
755
756perl v5.32.1 2021-01-26 docs::api::Apache2::Filter(3)