110 lines
2.0 KiB
Go
110 lines
2.0 KiB
Go
package stomp
|
|
|
|
import (
|
|
"bytes"
|
|
"strconv"
|
|
)
|
|
|
|
const defaultHeaderLen = 5
|
|
|
|
type item struct {
|
|
name []byte
|
|
data []byte
|
|
}
|
|
|
|
// Header represents the header section of the STOMP message.
|
|
type Header struct {
|
|
items []item
|
|
itemc int
|
|
}
|
|
|
|
func newHeader() *Header {
|
|
return &Header{
|
|
items: make([]item, defaultHeaderLen),
|
|
}
|
|
}
|
|
|
|
// Get returns the named header value.
|
|
func (h *Header) Get(name []byte) (b []byte) {
|
|
for i := 0; i < h.itemc; i++ {
|
|
if v := h.items[i]; bytes.Equal(v.name, name) {
|
|
return v.data
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// GetString returns the named header value.
|
|
func (h *Header) GetString(name string) string {
|
|
k := []byte(name)
|
|
v := h.Get(k)
|
|
return string(v)
|
|
}
|
|
|
|
// GetBool returns the named header value.
|
|
func (h *Header) GetBool(name string) bool {
|
|
s := h.GetString(name)
|
|
b, _ := strconv.ParseBool(s)
|
|
return b
|
|
}
|
|
|
|
// GetInt returns the named header value.
|
|
func (h *Header) GetInt(name string) int {
|
|
s := h.GetString(name)
|
|
i, _ := strconv.Atoi(s)
|
|
return i
|
|
}
|
|
|
|
// GetInt64 returns the named header value.
|
|
func (h *Header) GetInt64(name string) int64 {
|
|
s := h.GetString(name)
|
|
i, _ := strconv.ParseInt(s, 10, 64)
|
|
return i
|
|
}
|
|
|
|
// Field returns the named header value in string format. This is used to
|
|
// provide compatibility with the SQL expression evaluation package.
|
|
func (h *Header) Field(name []byte) []byte {
|
|
return h.Get(name)
|
|
}
|
|
|
|
// Add appens the key value pair to the header.
|
|
func (h *Header) Add(name, data []byte) {
|
|
h.grow()
|
|
h.items[h.itemc].name = name
|
|
h.items[h.itemc].data = data
|
|
h.itemc++
|
|
}
|
|
|
|
// Index returns the keypair at index i.
|
|
func (h *Header) Index(i int) (k, v []byte) {
|
|
if i > h.itemc {
|
|
return
|
|
}
|
|
k = h.items[i].name
|
|
v = h.items[i].data
|
|
return
|
|
}
|
|
|
|
// Len returns the header length.
|
|
func (h *Header) Len() int {
|
|
return h.itemc
|
|
}
|
|
|
|
func (h *Header) grow() {
|
|
if h.itemc > defaultHeaderLen-1 {
|
|
h.items = append(h.items, item{})
|
|
}
|
|
}
|
|
|
|
func (h *Header) reset() {
|
|
h.itemc = 0
|
|
h.items = h.items[:defaultHeaderLen]
|
|
for i := range h.items {
|
|
h.items[i].name = zeroBytes
|
|
h.items[i].data = zeroBytes
|
|
}
|
|
}
|
|
|
|
var zeroBytes []byte
|