In an attempt to detect clients closing their side of the SSE connection I use selectRead(fds) on the specific handle. When the connection is alive the result is 0, i.e. can't be read. When the client closes the connection the result is 1. I have a hard time reasoning about this. Lack of knowledge. Is this a sound method for the purpose?
Then when I try to close the half open connection to the client on the server I get the error: Exception message: Operation performed on a socket which has not been registered with the dispatcher yet. and have no idea what that means.
import asynchttpserver, asyncdispatch, asyncnet, nativesockets, net
import times, strformat, random
proc main {.async.} =
var server = newAsyncHttpServer()
proc cb(req: Request) {.async.} =
let fd = int(req.client.getFd)
let headers = {
"Content-type": "text/plain; charset=utf-8",
"Cache-Control": "no-cache",
"Content-type": "text/event-stream; charset=utf-8",
"Connection": "keep-alive",
"Content-Length": ""
}
await req.respond(Http200, "", headers.newHttpHeaders())
while true:
var fds = @[req.client.getFd]
let delay = rand(2000)
let data = "event: test\ndata: next delay is {delay/1000} s\n\n".fmt
await req.respond(Http200, data)
var closed = selectRead(fds)
echo "fd : ", fd, " closed : ", closed
#if closed == 1:
# req.client.close() #error not registered dispatcher
await sleep_async(delay)
server.listen Port(8088)
while true:
if server.shouldAcceptRequest():
await server.acceptRequest(cb)
else:
poll()
asyncCheck main()
runForever()
simple python client;
import urllib.request
req = urllib.request.Request(
'http://192.168.1.4:8088/sse/',
headers={
"Accept": "text/event-stream",
"User-Agent":"TeSt"
},
method='GET'
)
#url = 'http://192.168.1.4:8088/sse/'
with urllib.request.urlopen(req) as response:
print (response.url)
print (response.headers)
print (response.status)
for line in response:
print(line)