Posted to tcl by mjanssen at Thu Dec 20 16:13:34 GMT 2007view raw
- 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
- }
- }
- }