X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=8sync%2Fsystems%2Fwebsocket%2Fserver.scm;h=af0fe1fb5b88af205c7c53d825f6e65e91e42679;hb=e6d0f43cb80edc0ce864c7f54ec41bee6fd2f3c8;hp=97645bb8ef3490a0b5b6f0e06c4b235b1e252925;hpb=c7a6683e7ba2377909f37bc6dc11d49f43369191;p=8sync.git diff --git a/8sync/systems/websocket/server.scm b/8sync/systems/websocket/server.scm index 97645bb..af0fe1f 100644 --- a/8sync/systems/websocket/server.scm +++ b/8sync/systems/websocket/server.scm @@ -1,5 +1,7 @@ ;;; guile-websocket --- WebSocket client/server ;;; Copyright © 2015 David Thompson +;;; Copyright © 2017 Christopher Allan Webber +;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen ;;; ;;; This file is part of guile-websocket. ;;; @@ -133,7 +135,9 @@ called for each complete message that is received." (let ((frame (read-frame-maybe))) (cond ;; EOF - port is closed. - ((not frame) + ;; @@: Sometimes the eof object appears here as opposed to + ;; at lookahead, but I'm not sure why + ((or (not frame) (eof-object? frame)) (close-down)) ;; Per section 5.4, control frames may appear interspersed ;; along with a fragmented message. @@ -153,11 +157,11 @@ called for each complete message that is received." (loop fragments type)) ((first-fragment-frame? frame) ; begin accumulating fragments (loop (list frame) (frame-type frame))) + ((fragment-frame? frame) ; add a fragment + (loop (cons frame fragments) type)) ((final-fragment-frame? frame) ; concatenate all fragments (handle-data-frame type (frame-concatenate (reverse fragments))) (loop '() #f)) - ((fragment-frame? frame) ; add a fragment - (loop (cons frame fragments) type)) ((data-frame? frame) ; unfragmented data frame (handle-data-frame (frame-type frame) (frame-data frame)) (loop '() #f)))))))