# a little server to inspect local variable state over httpd # # usage: # - source this script in some app # - do "hpeek::start 8056" to activate it # - do "vwait forever" if the app would exit otherwise # - point your browser to URL http://localhost:8056/ # # inspired by Harold Kaplan's "DustMote" namespace eval hpeek { set about {a little server to inspect local variable state over httpd} set cvs {$Id: 9154,v 1.5 2005-04-01 06:00:42 jcw Exp $} namespace export start # start must be called to set up a server socket proc start {port} { if {$port} { variable fd [socket -server hpeek::accept $port] } } # accept a new incoming tcp/ip connection proc accept {sock h p} { fconfigure $sock -blocking 0 fileevent $sock readable [list hpeek::request $sock] } # process a single request proc request {sock} { catch { set line [gets $sock] if {[fblocked $sock]} return fileevent $sock readable "" fconfigure $sock -translation binary -buffering full set p / regexp {/[^ ]*} $line p regsub -all / $p :: p set r "HTTP/1.0 200 OK\n\n" if {[catch {display $p r} err]} { set r "HTTP/1.0 404 Not found\n\n<h3>No such URL</h3>\ <pre>$::errorInfo</pre>" } puts $sock $r } catch {close $sock} } # make a string suitable for viewing as HTML proc htmlize {s} { regsub -all {&} $s {\&} s regsub -all {<} $s {\<} s regsub -all {>} $s {\>} s return $s } # htmlize, show in fixed font if text contains newlines proc showtext {s} { set s [htmlize $s] if {[string first "\n" $s] >= 0} { set s "<pre>$s</pre>" } return $s } # generate a page with the requested information proc display {x result} { upvar $result r append r "<html><body><table cellspacing=0 cellpadding=0>" set a "<tr><td align=right valign=top>" set b " </td><td>" if {[namespace tail $x] == ""} { set c [namespace children $x] if {[llength $c] > 0} { append r $a "<b>Namespaces:</b>" $b foreach y [lsort -dictionary $c] { set z [namespace tail $y] append r "<a href=\"$z/\">$z</a> " } append r "</td></tr>" } foreach k [lsort -dictionary [info vars $x*]] { append r $a [htmlize [namespace tail $k]] $b if {[array exists $k]} { set n [array size $k] append r "<a href=\"[namespace tail $k]\">$n entries</a>" } elseif {[info exists $k]} { set v [set $k] append r [showtext $v] } else { append r "<b>?</b>" } append r "</td></tr>" } } else { foreach k [lsort -dictionary [array names $x]] { append r $a [htmlize [namespace tail $k]] $b set v [set ${x}($k)] append r [showtext $v] "</td></tr>" } } append r "</table></body></html>" } }
Luciano ES - Does this script require some arcane package, by any chance? I just tried to run it and the entity tells me that the 'module' command (called by the 'hpeek' proc) does not exist.Fixed -jcw