Posted to tcl by mjanssen at Thu Dec 20 16:13:34 GMT 2007view raw

  1. fileevent $sock readable [namespace code [list read_length {stage 0} $sock]]
  2.  
  3.  
  4. proc read_request {sock info data} {
  5. append data [read $sock]
  6. if {[dict get $info stage] == 0} {
  7. # have to read length of request
  8. set colonIdx [string first : $data]
  9. if {$colonIdx == -1} {
  10. # length not there yet
  11. fileevent $sock readable [namespace code [list read_request $sock $info $data]]
  12. return
  13. } else {
  14. dict set info length [string range $data 0 $colonIdx-1]
  15. set data [string range $data $colonIdx+1 end]
  16. dict incr info stage
  17. }
  18. }
  19. if {[dict get $info stage] == 1} {
  20. set length [dict get $info length]
  21. if {[string length $data] < $length} {
  22. fileevent $sock readable [namespace code [list read_request $sock $info $data]]
  23. return
  24. } else {
  25. set headers [string range $data 0 $length-1]
  26. set headers [lrange [split $headers \0] 0 end-1]
  27. dict set info headers $headers
  28. dict set info content_length [dict get $headers CONTENT_LENGTH]
  29. set data [string range $data $length+1 end]
  30. dict incr info stage
  31. }
  32. }
  33. if {[dict get $info stage] == 2} {
  34. set content_length [dict get $info content_length]
  35. if {[string length $data] < $content_length} {
  36. fileevent $sock readable [namespace code [list read_request $sock $info $data]]
  37. return
  38. } else {
  39. set body [string range $data 0 $content_length-1]
  40. handle_request $sock [dict get $info headers] $body
  41. return
  42. }
  43. }
  44.  
  45. }