Posted to tcl by mjanssen at Thu Dec 20 16:13:34 GMT 2007view pretty
fileevent $sock readable [namespace code [list read_length {stage 0} $sock]] proc read_request {sock info data} { append data [read $sock] if {[dict get $info stage] == 0} { # have to read length of request set colonIdx [string first : $data] if {$colonIdx == -1} { # length not there yet fileevent $sock readable [namespace code [list read_request $sock $info $data]] return } else { dict set info length [string range $data 0 $colonIdx-1] set data [string range $data $colonIdx+1 end] dict incr info stage } } if {[dict get $info stage] == 1} { set length [dict get $info length] if {[string length $data] < $length} { fileevent $sock readable [namespace code [list read_request $sock $info $data]] return } else { set headers [string range $data 0 $length-1] set headers [lrange [split $headers \0] 0 end-1] dict set info headers $headers dict set info content_length [dict get $headers CONTENT_LENGTH] set data [string range $data $length+1 end] dict incr info stage } } if {[dict get $info stage] == 2} { set content_length [dict get $info content_length] if {[string length $data] < $content_length} { fileevent $sock readable [namespace code [list read_request $sock $info $data]] return } else { set body [string range $data 0 $content_length-1] handle_request $sock [dict get $info headers] $body return } } }