|
|
|
@ -1,3 +1,4 @@
|
|
|
|
|
;; -*- lexical-binding: t -*-
|
|
|
|
|
;; stomp.el, interpret STOMP messages.
|
|
|
|
|
|
|
|
|
|
(require 'map)
|
|
|
|
@ -22,7 +23,7 @@
|
|
|
|
|
(goto-char (point-max))
|
|
|
|
|
(insert string)
|
|
|
|
|
(let ((message (stomp-shift-message (current-buffer))))
|
|
|
|
|
(if message (callback message))))))
|
|
|
|
|
(if message (funcall callback message))))))
|
|
|
|
|
|
|
|
|
|
(defun stomp-shift-message (buffer)
|
|
|
|
|
"Read a message from a buffer. After reading a message, it will
|
|
|
|
@ -32,16 +33,10 @@
|
|
|
|
|
(message (stomp-delete-message buffer) message)
|
|
|
|
|
(t nil))))
|
|
|
|
|
|
|
|
|
|
;; TODO: use `stomp-find-messsage-end-point`
|
|
|
|
|
(defun stomp-delete-message (buffer)
|
|
|
|
|
"Delete the top-most messsage in a buffer"
|
|
|
|
|
(with-current-buffer buffer
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(while (not (or
|
|
|
|
|
(string-equal (thing-at-point 'line) "\u0000\n")
|
|
|
|
|
(string-equal (thing-at-point 'line) "\u0000\r\n")))
|
|
|
|
|
(forward-line))
|
|
|
|
|
(delete-region (point-min) (+ (line-end-position) 1))))
|
|
|
|
|
(delete-region (point-min) (+ 2x (stomp-find-message-end-point buffer)))))
|
|
|
|
|
|
|
|
|
|
(defun stomp-read-message (buffer)
|
|
|
|
|
"Attempt to read a single message from a buffer.
|
|
|
|
@ -52,14 +47,16 @@
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(while (search-forward "\r" nil t)
|
|
|
|
|
(replace-match ""))
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(let ((message ()) (headers ()) (content))
|
|
|
|
|
(let ((message ()) (headers ()) (content)
|
|
|
|
|
(headers-end-point (stomp-find-headers-end-point buffer)))
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(map-put message 'command (current-word))
|
|
|
|
|
(setq headers (stomp-read-headers buffer))
|
|
|
|
|
|
|
|
|
|
(setq headers (stomp-read-headers buffer headers-end-point))
|
|
|
|
|
|
|
|
|
|
;; TODO: take content-length header into account
|
|
|
|
|
(setq content (buffer-substring
|
|
|
|
|
(stomp-find-headers-end-point buffer)
|
|
|
|
|
(+ 1 headers-end-point)
|
|
|
|
|
(stomp-find-message-end-point buffer)))
|
|
|
|
|
(cond
|
|
|
|
|
(content
|
|
|
|
@ -67,16 +64,19 @@
|
|
|
|
|
(map-put message 'content content))
|
|
|
|
|
(t nil)))))
|
|
|
|
|
|
|
|
|
|
(defun stomp-read-headers (buffer &optional headers)
|
|
|
|
|
(defun stomp-read-headers (buffer end-point &optional headers)
|
|
|
|
|
"Attempt to read the headers of a stomp message in *buffer*"
|
|
|
|
|
(with-current-buffer buffer
|
|
|
|
|
(unless headers (goto-char (point-min)))
|
|
|
|
|
(forward-line)
|
|
|
|
|
(let ((header (split-string (thing-at-point 'line) ":")))
|
|
|
|
|
(cond
|
|
|
|
|
((= (line-end-position) end-point) headers)
|
|
|
|
|
((> (length header) 2) (throw 'invalid-header nil))
|
|
|
|
|
((= (length header) 1) headers)
|
|
|
|
|
(t (stomp-read-headers buffer (push headers header)))))))
|
|
|
|
|
(t (stomp-read-headers buffer end-point
|
|
|
|
|
(map-put headers
|
|
|
|
|
(car header)
|
|
|
|
|
(replace-regexp-in-string "\n$" "" (car (last header))))))))))
|
|
|
|
|
|
|
|
|
|
(defun stomp-find-message-end-point (buffer)
|
|
|
|
|
"Find the null byte at the end of a STOMP message"
|
|
|
|
|