check if the client is still there before sending a message (fix unhandled ValueError)

This commit is contained in:
Christian Ulrich 2020-10-16 00:18:11 +02:00
parent 91b7d14958
commit 2b938f9278
No known key found for this signature in database
GPG Key ID: 8241BE099775A097
1 changed files with 10 additions and 5 deletions

View File

@ -52,6 +52,12 @@ const PunchdSocket = "/tmp/punchd.socket"
proc handleSigint() {.noconv.} = proc handleSigint() {.noconv.} =
raise newException(Sigint, "received SIGINT") raise newException(Sigint, "received SIGINT")
proc sendToClient(unixSock: AsyncSocket, msg: string,
cmsgs: seq[ControlMessage] = @[]) {.async.} =
if not unixSock.isClosed():
let unixFd = unixSock.getFd.AsyncFD
await unixFd.asyncSendMsg(msg, cmsgs)
proc handleRequest(punchd: Punchd, line: string, proc handleRequest(punchd: Punchd, line: string,
unixSock: AsyncSocket) {.async.} = unixSock: AsyncSocket) {.async.} =
var id: string var id: string
@ -68,7 +74,7 @@ proc handleRequest(punchd: Punchd, line: string,
let content = @["tcp-syni-accept", $req.srcIp, req.srcPorts.join(","), let content = @["tcp-syni-accept", $req.srcIp, req.srcPorts.join(","),
$req.dstIp, req.dstPorts.join(","), $req.dstIp, req.dstPorts.join(","),
seqNumbers.join(",")].join("|") seqNumbers.join(",")].join("|")
await unixSock.send(&"progress|{id}|{content}\n") await sendToClient(unixSock, &"progress|{id}|{content}\n")
sock = await punchd.tcpSyniCP.connect(req.srcPorts[0], req.dstIp, sock = await punchd.tcpSyniCP.connect(req.srcPorts[0], req.dstIp,
req.dstPorts, progress) req.dstPorts, progress)
@ -83,7 +89,7 @@ proc handleRequest(punchd: Punchd, line: string,
echo "progress!" echo "progress!"
let content = @["tcp-nutss-respond", $req.srcIp, req.srcPorts.join(","), let content = @["tcp-nutss-respond", $req.srcIp, req.srcPorts.join(","),
$req.dstIp, req.dstPorts.join(",")].join("|") $req.dstIp, req.dstPorts.join(",")].join("|")
await unixSock.send(&"progress|{id}|{content}\n") await sendToClient(unixSock, &"progress|{id}|{content}\n")
sock = await punchd.tcpNutssInitiator.initiate(req.srcPorts[0], req.dstIp, sock = await punchd.tcpNutssInitiator.initiate(req.srcPorts[0], req.dstIp,
req.dstPorts, progress) req.dstPorts, progress)
@ -95,12 +101,11 @@ proc handleRequest(punchd: Punchd, line: string,
else: else:
raise newException(ValueError, "invalid request") raise newException(ValueError, "invalid request")
let unixFd = unixSock.getFd.AsyncFD await sendToClient(unixSock, &"ok|{id}\n", @[fromFd(sock.getFd.AsyncFD)])
await unixFd.asyncSendMsg(&"ok|{id}\n", @[fromFd(sock.getFd.AsyncFD)])
sock.close() sock.close()
except PunchHoleError as e: except PunchHoleError as e:
await unixSock.send(&"error|{id}|{e.msg}\n") await sendToClient(unixSock, &"error|{id}|{e.msg}\n")
except ValueError: except ValueError:
unixSock.close unixSock.close