From 438d87675d9ef18695475685ff36ff75a5506466 Mon Sep 17 00:00:00 2001 From: Matthew Wolff Date: Wed, 8 May 2024 19:38:02 -0500 Subject: Distinguish close frames from timeouts. --- web/socket/client.scm | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) (limited to 'web/socket/client.scm') diff --git a/web/socket/client.scm b/web/socket/client.scm index 4510493..966e3f7 100644 --- a/web/socket/client.scm +++ b/web/socket/client.scm @@ -211,18 +211,24 @@ connected to." (define* (websocket-receive ws #:key timeout) "Read data from the server that WS is connected to. Returns a string -if text data was received, a bytevector if binary data was received, -or #f if the WebSocket connection was closed or TIMEOUT seconds -elapsed without receiving a data frame." - (let* ((socket (websocket-socket ws)) - (frame (read-data-frame socket #:timeout timeout))) - (cond ((not frame) - (when (port-closed? socket) - ;; EOF - clean up the websocket. - (close-port (websocket-entropy-port ws)) - (set-websocket-state! ws 'closed)) - #f) - ((binary-frame? frame) - (frame-data frame)) - (else - (text-frame->string frame))))) +if text data was received, a bytevector if binary data was received, a +pair of (code . reason) if the WebSocket was closed, or #f if TIMEOUT +seconds elapsed without receiving a data frame." + (let ((socket (websocket-socket ws))) + ;; For server initiated disconnects and timeouts. + (define (maybe-close) + (when (port-closed? socket) + ;; EOF - clean up the websocket. + (close-port (websocket-entropy-port ws)) + (set-websocket-state! ws 'closed))) + (match (read-data-frame socket #:timeout timeout) + (#f ; timeout + (maybe-close) + #f) + ((? close-frame? frame) + (maybe-close) + (close-frame->status frame)) + ((? binary-frame? frame) + (frame-data frame)) + ((? text-frame? frame) + (text-frame->string frame))))) -- cgit v1.2.3