projects
/
8sync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
websocket: Also concatenate last fragmented frame.
[8sync.git]
/
8sync
/
systems
/
websocket
/
server.scm
diff --git
a/8sync/systems/websocket/server.scm
b/8sync/systems/websocket/server.scm
index 97645bb8ef3490a0b5b6f0e06c4b235b1e252925..af0fe1fb5b88af205c7c53d825f6e65e91e42679 100644
(file)
--- 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 <davet@gnu.org>
;;; 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.
;;;
;;;
;;; 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.
(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.
(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)))
(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))
((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)))))))
((data-frame? frame) ; unfragmented data frame
(handle-data-frame (frame-type frame) (frame-data frame))
(loop '() #f)))))))