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 
            }
        }

   }