rp_call_filters conn kindWhat it does:
Invokes filters in the rp_filters arrays. $kind must be one of preauth, postauth, and trace.Defined in: /web/philip/packages/acs-core/request-processor-procs.tcl
Source code:
# Loop through all filters in order of priority (they're stored in sorted order
# in the NSV).
foreach filter_info [nsv_get rp_filters "[ns_conn method],$kind" ] {
set path [lindex $filter_info 3]
if { [string match $path [ad_conn url]] } {
# We found a match with the path - apply the filter, catching any
# errors that might occur.
set errno [catch {
set proc [lindex $filter_info 4]
set args [lindex $filter_info 5]
set debug [lindex $filter_info 6]
set critical [lindex $filter_info 7]
# Use [info args $proc] to obtain a list of the names of all
# arguments to the procedure $proc. Place the number of arguments
# into $proc_argcount.
set proc_args [info args $proc]
set proc_argcount [llength $proc_args]
# Perform some magic to figure out how to invoke the procedure
# (differs based on the number of elements).
if { [string equal [lindex $proc_args [expr { [llength $proc_args] - 2 }]] "args"] } {
# The second-to-last argument name can be "args", in which case
# all the arguments are supposed to be wrapped in a list and placed
# there. So wrap the arguments in a list.
set args [list $args]
}
set actual_argcount [llength $args]
if { [string equal $debug "t"] } {
ns_log "Notice" "Executing filter $proc for [ns_conn method] [ad_conn url]..."
}
if { $actual_argcount >= 3 || $proc_argcount - $actual_argcount == 2 } {
# Procedure has conn and kind.
set result [eval $proc [concat [list $conn] $args [list $kind]]]
} elseif { $proc_argcount - $actual_argcount == 1 } {
# Procedure has kind.
set result [eval $proc [concat $args [list $kind]]]
} else {
# Procedure has neither conn nor kind.
set result [eval $proc $args]
}
if { [string equal $debug "t"] } {
ns_log "Notice" "Done executing filter $proc."
}
if { [string equal $result "filter_break"] } {
# Halt invocations of filters.
set return "filter_break"
} elseif { [string equal $result "filter_return"] } {
# We're outta here!
set return "filter_return"
} elseif { ![string equal $result "filter_ok"] } {
ns_log "Filter" "Invalid result \"$result\" from filter $proc: should be filter_ok, filter_break, or filter_return"
if { [string equal $critical "t"] } {
error "Critical filter $proc failed."
}
}
} errmsg]
if { $errno } {
# Uh-oh - an error occurred. Dump a stack trace to the log.
# Eventually we'll be really nice and write a server error
# message containing the stack trace (a la ClientDebug) if
# the user is an administrator.
global errorInfo
ns_log "Error" "Filter $proc returned error: $errorInfo"
if { $critical == "t" } {
error "Critical filter $proc failed."
}
}
}
if { [info exists return] } {
# If the return variable was set, we want to return that value
# (e.g., filter_break or filter_return).
return $return
}
}
# No problems!
return "filter_ok"