mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2024-12-08 06:32:22 +01:00
46 lines
943 B
Go
46 lines
943 B
Go
|
package format
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"bytes"
|
||
|
"strconv"
|
||
|
|
||
|
"gopkg.in/mcuadros/go-syslog.v2/internal/syslogparser/rfc5424"
|
||
|
)
|
||
|
|
||
|
type RFC6587 struct{}
|
||
|
|
||
|
func (f *RFC6587) GetParser(line []byte) LogParser {
|
||
|
return &parserWrapper{rfc5424.NewParser(line)}
|
||
|
}
|
||
|
|
||
|
func (f *RFC6587) GetSplitFunc() bufio.SplitFunc {
|
||
|
return rfc6587ScannerSplit
|
||
|
}
|
||
|
|
||
|
func rfc6587ScannerSplit(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
||
|
if atEOF && len(data) == 0 {
|
||
|
return 0, nil, nil
|
||
|
}
|
||
|
|
||
|
if i := bytes.IndexByte(data, ' '); i > 0 {
|
||
|
pLength := data[0:i]
|
||
|
length, err := strconv.Atoi(string(pLength))
|
||
|
if err != nil {
|
||
|
if string(data[0:1]) == "<" {
|
||
|
// Assume this frame uses non-transparent-framing
|
||
|
return len(data), data, nil
|
||
|
}
|
||
|
return 0, nil, err
|
||
|
}
|
||
|
end := length + i + 1
|
||
|
if len(data) >= end {
|
||
|
// Return the frame with the length removed
|
||
|
return end, data[i+1 : end], nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Request more data
|
||
|
return 0, nil, nil
|
||
|
}
|