proc cgi.init {} { global httpFormMapHex httpFormMapChars set alphanumeric a-zA-Z0-9 for {set i 1} {$i <= 256} {incr i} { set c [format %c $i] if {![string match \[$alphanumeric\] $c]} { set httpFormMapHex(%[format %.2x $i]) $c set httpFormMapHex(%[string toupper [format %.2x $i]]) $c set httpFormMapChars($c) %[format %.2x $i] } } # These are handled specially array set httpFormMapHex { + " " %0d%0a \n } array set httpFormMapChars { " " + \n %0d%0a } } proc cgi:stringtocgi {string} { global httpFormMapChars set alphanumeric a-zA-Z0-9 regsub -all \[^$alphanumeric\] $string {$httpFormMapChars(&)} string regsub -all \n $string {\\n} string regsub -all \t $string {\\t} string regsub -all {[][{})\\]\)} $string {\\&} string return [subst $string] } proc cgi:stringfromcgi {string} { global httpFormMapHex regsub -all {%[0-9A-Fa-f][0-9A-Fa-f]} $string {$httpFormMapHex(&)} string regsub -all \n $string {\\n} string regsub -all \t $string {\\t} string regsub -all {[][{})\\]\)} $string {\\&} string return [subst $string] } proc cgi:cgi2array {string arrayvar} { upvar $arrayvar storearray foreach var [split $string &] { set var [split $var =] if ![info exists storearray([lindex $var 0])] { set storearray([lindex $var 0]) [cgi:stringfromcgi [lindex $var 1]] } { lappend storearray([lindex $var 0]) [cgi:stringfromcgi [lindex $var 1]] } } } cgi.init