|
|
|
@ -42,13 +42,19 @@
|
|
|
|
|
be deleted from the buffer."
|
|
|
|
|
(let ((frame (stomp-read-frame buffer)))
|
|
|
|
|
(cond
|
|
|
|
|
(frame (stomp-delete-frame buffer) frame)
|
|
|
|
|
(frame (stomp-delete-frame buffer frame) frame)
|
|
|
|
|
(t nil))))
|
|
|
|
|
|
|
|
|
|
(defun stomp-delete-frame (buffer)
|
|
|
|
|
(defun stomp-delete-frame (buffer frame)
|
|
|
|
|
"Delete the top-most messsage in a buffer"
|
|
|
|
|
(with-current-buffer buffer
|
|
|
|
|
(delete-region (point-min) (+ 2 (stomp-find-frame-end-point buffer)))))
|
|
|
|
|
(delete-region (point-min) (+ 2 (stomp-find-frame-end-point buffer frame)))))
|
|
|
|
|
|
|
|
|
|
(defun stomp-frame-header (header frame)
|
|
|
|
|
"Shortcut to access frame headers"
|
|
|
|
|
(assoc-default
|
|
|
|
|
"content-length"
|
|
|
|
|
(alist-get 'headers frame nil) 'string-equal nil))
|
|
|
|
|
|
|
|
|
|
(defun stomp-read-frame (buffer)
|
|
|
|
|
"Attempt to read a single frame from a buffer.
|
|
|
|
@ -57,16 +63,16 @@
|
|
|
|
|
frames in the buffer, nil will be returned."
|
|
|
|
|
(with-current-buffer buffer
|
|
|
|
|
(let ((frame ())
|
|
|
|
|
(headers-end-point (stomp-find-headers-end-point buffer))
|
|
|
|
|
(frame-end-point (stomp-find-frame-end-point buffer)))
|
|
|
|
|
(headers-end-point (stomp-find-headers-end-point buffer)))
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(cond
|
|
|
|
|
((and frame-end-point headers-end-point)
|
|
|
|
|
((and headers-end-point)
|
|
|
|
|
(map-put frame 'command (current-word))
|
|
|
|
|
(map-put frame 'headers (stomp-read-headers buffer headers-end-point))
|
|
|
|
|
;; TODO: take content-length header into account
|
|
|
|
|
;; This is might be hard to do if the content contains carriage returns.
|
|
|
|
|
(map-put frame 'content (buffer-substring (+ 1 headers-end-point) frame-end-point)))
|
|
|
|
|
(map-put frame 'content
|
|
|
|
|
(buffer-substring
|
|
|
|
|
(+ 1 headers-end-point)
|
|
|
|
|
(stomp-find-frame-end-point buffer frame headers-end-point))))
|
|
|
|
|
(t nil)))))
|
|
|
|
|
|
|
|
|
|
(defun stomp-read-headers (buffer end-point &optional headers)
|
|
|
|
@ -78,17 +84,28 @@
|
|
|
|
|
(cond
|
|
|
|
|
((= (line-end-position) end-point) headers)
|
|
|
|
|
((> (length header) 2) (throw 'invalid-header nil))
|
|
|
|
|
(t (stomp-read-headers buffer end-point
|
|
|
|
|
(map-put headers
|
|
|
|
|
(car header)
|
|
|
|
|
(replace-regexp-in-string "\\(\n\\|\r\n\\)$" "" (car (last header))))))))))
|
|
|
|
|
(t (stomp-read-headers
|
|
|
|
|
buffer
|
|
|
|
|
end-point
|
|
|
|
|
(map-put headers
|
|
|
|
|
(car header)
|
|
|
|
|
(replace-regexp-in-string "\\(\n\\|\r\n\\)$" "" (car (last header))))))))))
|
|
|
|
|
|
|
|
|
|
(defun stomp-find-frame-end-point (buffer)
|
|
|
|
|
"Find the null byte at the end of a STOMP frame"
|
|
|
|
|
(defun stomp-find-frame-end-point (buffer frame &optional headers-end-point)
|
|
|
|
|
"Find the end point of a STOMP frame at the top of a buffer,
|
|
|
|
|
either by using the content-length header or by searching for
|
|
|
|
|
the null octet."
|
|
|
|
|
(with-current-buffer buffer
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(search-forward-regexp "\u0000\\|\u0000\r")
|
|
|
|
|
(- (point) 1)))
|
|
|
|
|
(let ((content-length (stomp-frame-header "content-length" frame))
|
|
|
|
|
(headers-end-point(if headers-end-point
|
|
|
|
|
headers-end-point
|
|
|
|
|
(stomp-find-headers-end-point buffer))))
|
|
|
|
|
(if content-length
|
|
|
|
|
(+ headers-end-point 1 (string-to-number content-length))
|
|
|
|
|
(progn
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(search-forward-regexp "\u0000\\|\u0000\r")
|
|
|
|
|
(- (point) 1))))))
|
|
|
|
|
|
|
|
|
|
(defun stomp-find-headers-end-point (buffer)
|
|
|
|
|
"Find the end of the header part of a STOMP frame."
|
|
|
|
|