174 lines
3.3 KiB
Go
174 lines
3.3 KiB
Go
package stomp
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
)
|
|
|
|
var (
|
|
crlf = []byte{'\r', '\n'}
|
|
newline = []byte{'\n'}
|
|
separator = []byte{':'}
|
|
terminator = []byte{0}
|
|
)
|
|
|
|
func writeTo(w io.Writer, m *Message) {
|
|
w.Write(m.Method)
|
|
w.Write(newline)
|
|
|
|
switch {
|
|
case bytes.Equal(m.Method, MethodStomp):
|
|
// version
|
|
w.Write(HeaderAccept)
|
|
w.Write(separator)
|
|
w.Write(m.Proto)
|
|
w.Write(newline)
|
|
// login
|
|
if len(m.User) != 0 {
|
|
w.Write(HeaderLogin)
|
|
w.Write(separator)
|
|
w.Write(m.User)
|
|
w.Write(newline)
|
|
}
|
|
// passcode
|
|
if len(m.Pass) != 0 {
|
|
w.Write(HeaderPass)
|
|
w.Write(separator)
|
|
w.Write(m.Pass)
|
|
w.Write(newline)
|
|
}
|
|
case bytes.Equal(m.Method, MethodConnected):
|
|
// version
|
|
w.Write(HeaderVersion)
|
|
w.Write(separator)
|
|
w.Write(m.Proto)
|
|
w.Write(newline)
|
|
case bytes.Equal(m.Method, MethodSend):
|
|
// dest
|
|
w.Write(HeaderDest)
|
|
w.Write(separator)
|
|
w.Write(m.Dest)
|
|
w.Write(newline)
|
|
if len(m.Expires) != 0 {
|
|
w.Write(HeaderExpires)
|
|
w.Write(separator)
|
|
w.Write(m.Expires)
|
|
w.Write(newline)
|
|
}
|
|
if len(m.Retain) != 0 {
|
|
w.Write(HeaderRetain)
|
|
w.Write(separator)
|
|
w.Write(m.Retain)
|
|
w.Write(newline)
|
|
}
|
|
if len(m.Persist) != 0 {
|
|
w.Write(HeaderPersist)
|
|
w.Write(separator)
|
|
w.Write(m.Persist)
|
|
w.Write(newline)
|
|
}
|
|
case bytes.Equal(m.Method, MethodSubscribe):
|
|
// id
|
|
w.Write(HeaderID)
|
|
w.Write(separator)
|
|
w.Write(m.ID)
|
|
w.Write(newline)
|
|
// destination
|
|
w.Write(HeaderDest)
|
|
w.Write(separator)
|
|
w.Write(m.Dest)
|
|
w.Write(newline)
|
|
// selector
|
|
if len(m.Selector) != 0 {
|
|
w.Write(HeaderSelector)
|
|
w.Write(separator)
|
|
w.Write(m.Selector)
|
|
w.Write(newline)
|
|
}
|
|
// prefetch
|
|
if len(m.Prefetch) != 0 {
|
|
w.Write(HeaderPrefetch)
|
|
w.Write(separator)
|
|
w.Write(m.Prefetch)
|
|
w.Write(newline)
|
|
}
|
|
if len(m.Ack) != 0 {
|
|
w.Write(HeaderAck)
|
|
w.Write(separator)
|
|
w.Write(m.Ack)
|
|
w.Write(newline)
|
|
}
|
|
case bytes.Equal(m.Method, MethodUnsubscribe):
|
|
// id
|
|
w.Write(HeaderID)
|
|
w.Write(separator)
|
|
w.Write(m.ID)
|
|
w.Write(newline)
|
|
case bytes.Equal(m.Method, MethodAck):
|
|
// id
|
|
w.Write(HeaderID)
|
|
w.Write(separator)
|
|
w.Write(m.ID)
|
|
w.Write(newline)
|
|
case bytes.Equal(m.Method, MethodNack):
|
|
// id
|
|
w.Write(HeaderID)
|
|
w.Write(separator)
|
|
w.Write(m.ID)
|
|
w.Write(newline)
|
|
case bytes.Equal(m.Method, MethodMessage):
|
|
// message-id
|
|
w.Write(HeaderMessageID)
|
|
w.Write(separator)
|
|
w.Write(m.ID)
|
|
w.Write(newline)
|
|
// destination
|
|
w.Write(HeaderDest)
|
|
w.Write(separator)
|
|
w.Write(m.Dest)
|
|
w.Write(newline)
|
|
// subscription
|
|
w.Write(HeaderSubscription)
|
|
w.Write(separator)
|
|
w.Write(m.Subs)
|
|
w.Write(newline)
|
|
// ack
|
|
if len(m.Ack) != 0 {
|
|
w.Write(HeaderAck)
|
|
w.Write(separator)
|
|
w.Write(m.Ack)
|
|
w.Write(newline)
|
|
}
|
|
case bytes.Equal(m.Method, MethodRecipet):
|
|
// receipt-id
|
|
w.Write(HeaderReceiptID)
|
|
w.Write(separator)
|
|
w.Write(m.Receipt)
|
|
w.Write(newline)
|
|
}
|
|
|
|
// receipt header
|
|
if includeReceiptHeader(m) {
|
|
w.Write(HeaderReceipt)
|
|
w.Write(separator)
|
|
w.Write(m.Receipt)
|
|
w.Write(newline)
|
|
}
|
|
|
|
for i, item := range m.Header.items {
|
|
if m.Header.itemc == i {
|
|
break
|
|
}
|
|
w.Write(item.name)
|
|
w.Write(separator)
|
|
w.Write(item.data)
|
|
w.Write(newline)
|
|
}
|
|
w.Write(newline)
|
|
w.Write(m.Body)
|
|
}
|
|
|
|
func includeReceiptHeader(m *Message) bool {
|
|
return len(m.Receipt) != 0 && !bytes.Equal(m.Method, MethodRecipet)
|
|
}
|