vyvanse/vendor/github.com/drone/mq/stomp/reader.go

140 lines
2.4 KiB
Go

package stomp
import (
"bytes"
"fmt"
)
func read(input []byte, m *Message) (err error) {
var (
pos int
off int
tot = len(input)
)
// parse the stomp message
for ; ; off++ {
if off == tot {
return fmt.Errorf("stomp: invalid method")
}
if input[off] == '\n' {
m.Method = input[pos:off]
off++
pos = off
break
}
}
// parse the stomp headers
for {
if off == tot {
return fmt.Errorf("stomp: unexpected eof")
}
if input[off] == '\n' {
off++
pos = off
break
}
var (
name []byte
value []byte
)
loop:
// parse each individual header
for ; ; off++ {
if off >= tot {
return fmt.Errorf("stomp: unexpected eof")
}
switch input[off] {
case '\n':
value = input[pos:off]
off++
pos = off
break loop
case ':':
name = input[pos:off]
off++
pos = off
}
}
switch {
case bytes.Equal(name, HeaderAccept):
m.Proto = value
case bytes.Equal(name, HeaderAck):
m.Ack = value
case bytes.Equal(name, HeaderDest):
m.Dest = value
case bytes.Equal(name, HeaderExpires):
m.Expires = value
case bytes.Equal(name, HeaderLogin):
m.User = value
case bytes.Equal(name, HeaderPass):
m.Pass = value
case bytes.Equal(name, HeaderID):
m.ID = value
case bytes.Equal(name, HeaderMessageID):
m.ID = value
case bytes.Equal(name, HeaderPersist):
m.Persist = value
case bytes.Equal(name, HeaderPrefetch):
m.Prefetch = value
case bytes.Equal(name, HeaderReceipt):
m.Receipt = value
case bytes.Equal(name, HeaderReceiptID):
m.Receipt = value
case bytes.Equal(name, HeaderRetain):
m.Retain = value
case bytes.Equal(name, HeaderSelector):
m.Selector = value
case bytes.Equal(name, HeaderSubscription):
m.Subs = value
case bytes.Equal(name, HeaderVersion):
m.Proto = value
default:
m.Header.Add(name, value)
}
}
if tot > pos {
m.Body = input[pos:]
}
return
}
const (
asciiZero = 48
asciiNine = 57
)
// ParseInt returns the ascii integer value.
func ParseInt(d []byte) (n int) {
if len(d) == 0 {
return 0
}
for _, dec := range d {
if dec < asciiZero || dec > asciiNine {
return 0
}
n = n*10 + (int(dec) - asciiZero)
}
return n
}
// ParseInt64 returns the ascii integer value.
func ParseInt64(d []byte) (n int64) {
if len(d) == 0 {
return 0
}
for _, dec := range d {
if dec < asciiZero || dec > asciiNine {
return 0
}
n = n*10 + (int64(dec) - asciiZero)
}
return n
}