Всем привет,
Имеется прототип асинхронного, на уровне сокетов и файловых операций, http сервера. Функция GetData
является колбеком на событие получение данных выхлопа внешней программы которая генерирует картинку. Нужно получить количество записанных в сокет данных и передать их в хедер Content-Length
который определяется уровнем выше. Как можно такое реализовать? Не хотелось бы перемещать формирование хедера в GetData
.
socket -server handle_client 8080
proc handle_client {chan addr port} {
puts $chan "HTTP/1.1 200 OK\nContent-type: image/jpeg\nConnection: close\n"
set fd [open "|cat test.jpg" r]
fconfigure $fd -translation binary -encoding binary -blocking 0 -buffering none
fconfigure $chan -translation binary -blocking 0
fileevent $fd readable [list GetData $fd $chan]
}
proc GetData {fd chan} {
if {[eof $fd] && ![fblocked $fd]} {
fileevent $fd readable {}
close $fd
close $chan
} else {
set data [read $fd]
puts -nonewline $chan $data
# puts [string length $data]
if {[string length $data]} {
incr bytes_sent [string length $data]
}
}
}
vwait forever