aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2022-05-23 21:57:04 -0400
committerKevin O'Connor <kevin@koconnor.net>2022-07-06 09:54:44 -0400
commit7b9583391ed135190c463552f1754c8faae51250 (patch)
tree6aa902c39237f03cdb39d0af95f56dd261ad2b7a
parent02dd0742c4dfea6f969ec45d25936d4dca327104 (diff)
downloadkutter-7b9583391ed135190c463552f1754c8faae51250.tar.gz
kutter-7b9583391ed135190c463552f1754c8faae51250.tar.xz
kutter-7b9583391ed135190c463552f1754c8faae51250.zip
webhooks: Use reactor to watch for writable fds
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--klippy/webhooks.py49
1 files changed, 22 insertions, 27 deletions
diff --git a/klippy/webhooks.py b/klippy/webhooks.py
index 6f6f8820..63342dd7 100644
--- a/klippy/webhooks.py
+++ b/klippy/webhooks.py
@@ -171,9 +171,9 @@ class ClientConnection:
self.uid = id(self)
self.sock = sock
self.fd_handle = self.reactor.register_fd(
- self.sock.fileno(), self.process_received)
+ self.sock.fileno(), self.process_received, self._do_send)
self.partial_data = self.send_buffer = b""
- self.is_sending_data = False
+ self.is_blocking = False
self.set_client_info("?", "New connection")
self.request_log = collections.deque([], REQUEST_LOG_SIZE)
@@ -259,33 +259,28 @@ class ClientConnection:
def send(self, data):
jmsg = json.dumps(data, separators=(',', ':'))
self.send_buffer += jmsg.encode() + b"\x03"
- if not self.is_sending_data:
- self.is_sending_data = True
- self.reactor.register_callback(self._do_send)
+ if not self.is_blocking:
+ self._do_send()
- def _do_send(self, eventtime):
- retries = 10
- while self.send_buffer:
- try:
- sent = self.sock.send(self.send_buffer)
- except socket.error as e:
- if e.errno == errno.EBADF or e.errno == errno.EPIPE \
- or not retries:
- sent = 0
- else:
- retries -= 1
- waketime = self.reactor.monotonic() + .001
- self.reactor.pause(waketime)
- continue
- retries = 10
- if sent > 0:
- self.send_buffer = self.send_buffer[sent:]
- else:
- logging.info(
- "webhooks: Error sending server data, closing socket")
+ def _do_send(self, eventtime=None):
+ if self.fd_handle is None:
+ return
+ try:
+ sent = self.sock.send(self.send_buffer)
+ except socket.error as e:
+ if e.errno not in [errno.EAGAIN, errno.EWOULDBLOCK]:
+ logging.info("webhooks: socket write error %d" % (self.uid,))
self.close()
- break
- self.is_sending_data = False
+ return
+ sent = 0
+ if sent < len(self.send_buffer):
+ if not self.is_blocking:
+ self.reactor.set_fd_wake(self.fd_handle, False, True)
+ self.is_blocking = True
+ elif self.is_blocking:
+ self.reactor.set_fd_wake(self.fd_handle, True, False)
+ self.is_blocking = False
+ self.send_buffer = self.send_buffer[sent:]
class WebHooks:
def __init__(self, printer):