45 lines
1.2 KiB
Go
45 lines
1.2 KiB
Go
package frame
|
|
|
|
import (
|
|
"math"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
// Regexp for heart-beat header value
|
|
heartBeatRegexp = regexp.MustCompile("^[0-9]+,[0-9]+$")
|
|
)
|
|
|
|
const (
|
|
// Maximum number of milliseconds that can be represented
|
|
// in a time.Duration.
|
|
maxMilliseconds = math.MaxInt64 / int64(time.Millisecond)
|
|
)
|
|
|
|
// ParseHeartBeat parses the value of a STOMP heart-beat entry and
|
|
// returns two time durations. Returns an error if the heart-beat
|
|
// value is not in the correct format, or if the time durations are
|
|
// too big to be represented by the time.Duration type.
|
|
func ParseHeartBeat(heartBeat string) (time.Duration, time.Duration, error) {
|
|
if !heartBeatRegexp.MatchString(heartBeat) {
|
|
return 0, 0, ErrInvalidHeartBeat
|
|
}
|
|
slice := strings.Split(heartBeat, ",")
|
|
value1, err := strconv.ParseInt(slice[0], 10, 64)
|
|
if err != nil {
|
|
return 0, 0, ErrInvalidHeartBeat
|
|
}
|
|
value2, err := strconv.ParseInt(slice[1], 10, 64)
|
|
if err != nil {
|
|
return 0, 0, ErrInvalidHeartBeat
|
|
}
|
|
if value1 > maxMilliseconds || value2 > maxMilliseconds {
|
|
return 0, 0, ErrInvalidHeartBeat
|
|
}
|
|
return time.Duration(value1) * time.Millisecond,
|
|
time.Duration(value2) * time.Millisecond, nil
|
|
}
|