websocket: Oops, avoid looping.
[8sync.git] / 8sync / systems / websocket / server.scm
index 0865d675d41b6421ab92fe56b31b09ec4411cf83..c29ce51e44c40c545219f258daad01dee5207631 100644 (file)
@@ -1,6 +1,7 @@
 ;;; guile-websocket --- WebSocket client/server
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
 ;;; Copyright © 2017 Christopher Allan Webber <cwebber@dustycloud.org>
+;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of guile-websocket.
 ;;;
@@ -134,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.
@@ -155,7 +158,8 @@ called for each complete message that is received."
          ((first-fragment-frame? frame) ; begin accumulating fragments
           (loop (list frame) (frame-type frame)))
          ((final-fragment-frame? frame) ; concatenate all fragments
-          (handle-data-frame type (frame-concatenate (reverse fragments)))
+          (handle-data-frame type (frame-concatenate
+                                   (reverse (cons frame fragments))))
           (loop '() #f))
          ((fragment-frame? frame) ; add a fragment
           (loop (cons frame fragments) type))