Yeah we too have been working on this once again. Basically take an array created by load_response and invoke procs to validate, sanitize, etc. The procs generate errors like if any of a specified list of fields that are supposed to be integer, aren’t, and Tcl 8.6’s try…trap is handy for wrapping them all together into one try body, handling any error with the trap arm. Also they can be used unguarded, let the error trace back to Rivet, and have the Rivet error handler recognize the errorCode and do something appropriate.
I’ve pasted a chunk of that stuff below, but we are instead going to make something similar that validates, copies, sanitizes stuff from the response array into a second array that’ll be used by the code to do whatever. # # response_security_error - issue an error with errorCode # set appropriate -- we expect the rivet error handler # to catch this and do the right thing # proc response_security_error {type message} { error $message "" [list RIVET SECURITY $type $message] } # # require_response_vars - error if any of the specified are not in the response # proc require_response_vars {_response args} { upvar $_response response foreach var $args { if {![info exists response($var)]} { response_security_error MISSING_VAR "var $var not present in $_response" } } } # # force_response_integers - error if any of named vars in response doesn't exist # or isn't an integer # proc force_response_integers {_response args} { upvar $_response response require_response_vars response {*}$args foreach var $args { if {![regexp {[0-9-]*} response($var)]} { response_security_error NOT_INTEGER "illegal content in $var" } if {![scan $response($var) %d response($var)]} { response_security_error NOT_INTEGER "illegal content in $var" } } } # # force_response_integer_in_range - error if var in response isn't an integer # or if it isn't in range # proc force_response_integer_in_range {_response var lowest highest} { upvar $_response response force_response_integers response $var if {$response($var) < $lowest || $response($var) > $highest} { response_security_error "OUT_OF_RANGE" "$var out of range" } } # # force_quote_response_strings - sanitize and pg_quote all the specified strings in the array # proc force_quote_response_strings {_response args} { upvar $_response response force_sanitize_response_strings response {*}$args foreach var $args { set response($var) [pg_quote $response($var)] } } # # force_quote_response_unfilteredstrings - rewrite named response # elements pg_quoted # proc force_quote_response_unfilteredstrings {_response args} { upvar $_response response require_response_vars response {*}$args foreach var $args { set response($var) [pg_quote $response($var)] } } On 9/23/16, 11:20 AM, "Massimo Manghi" <mxman...@apache.org> wrote: Years ago Karl proposed to develop a form data validator he called 'response broker'. (The message is at [1]) Damon answered quite rightly "haven't we all written something like this at some point?" I'm now working on a refactoring of an application and I'm striving to redesign it in a way to have an emphasis on object collaboration rather than long and complicated methods. (I want to convince someone to adopt it by enticing him into working with a set of easy to read and understand classes) Form data validation became soon one of the sore points: I can't imagine a method for validation that can match safety and completeness without being cumbersome, repetitive or, in a word, boring to work with Much more exciting would be working on a real validator that solves to some extent the general problem. Has anyone worked on Karl's idea? Am I inexorably about to set out to reinvent the wheel? -- Massimo [1] http://mail-archives.apache.org/mod_mbox/tcl-rivet-dev/201301.mbox/%3CDA2C5384-232C-4377-B35C-A91E8FA348C6%40gmail.com%3E --------------------------------------------------------------------- To unsubscribe, e-mail: rivet-dev-unsubscr...@tcl.apache.org For additional commands, e-mail: rivet-dev-h...@tcl.apache.org