Skip to content

Commit 3431f9d

Browse files
committed
Merge pull request #11 from heroku/rfc6587
Add support for RFC6587
2 parents 67a2b03 + 12dc082 commit 3431f9d

File tree

2 files changed

+101
-3
lines changed

2 files changed

+101
-3
lines changed

rfc6587_test.go

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package syslog
2+
3+
import (
4+
"bufio"
5+
"bytes"
6+
"fmt"
7+
"strings"
8+
"testing"
9+
)
10+
11+
func TestSingleSplit(t *testing.T) {
12+
find := "I am test."
13+
buf := strings.NewReader("10 " + find)
14+
scanner := bufio.NewScanner(buf)
15+
scanner.Split(rfc6587ScannerSplit)
16+
if r := scanner.Scan(); !r {
17+
t.Error("Expected Scan() to return true, but didn't")
18+
}
19+
if found := scanner.Text(); found != find {
20+
t.Errorf("Expected the right ('%s') token, but got: '%s'\n", find, found)
21+
}
22+
}
23+
24+
func TestMultiSplit(t *testing.T) {
25+
find := []string{
26+
"I am test.",
27+
"I am test 2.",
28+
"hahahahah",
29+
}
30+
buf := new(bytes.Buffer)
31+
for _, i := range find {
32+
fmt.Fprintf(buf, "%d %s", len(i), i)
33+
}
34+
scanner := bufio.NewScanner(buf)
35+
scanner.Split(rfc6587ScannerSplit)
36+
37+
i := 0
38+
for scanner.Scan() {
39+
i++
40+
}
41+
42+
if i != len(find) {
43+
t.Errorf("Expected to find %d items, but found: %d\n", len(find), i)
44+
}
45+
}
46+
47+
func TestBadSplit(t *testing.T) {
48+
find := "I am test.2 ab"
49+
buf := strings.NewReader("9 " + find)
50+
scanner := bufio.NewScanner(buf)
51+
scanner.Split(rfc6587ScannerSplit)
52+
if r := scanner.Scan(); !r {
53+
t.Error("Expected Scan() to return true, but didn't")
54+
}
55+
if found := scanner.Text(); found != find[0:9] {
56+
t.Errorf("Expected to find %s, but found %s.", find[0:9], found)
57+
}
58+
if r := scanner.Scan(); r {
59+
t.Error("Expected Scan() to return false, but didn't")
60+
}
61+
if err := scanner.Err(); err == nil {
62+
t.Error("Expected an error, but didn't get one")
63+
} else {
64+
t.Log("Error: ", err)
65+
}
66+
67+
}

server.go

+34-3
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,25 @@ package syslog
22

33
import (
44
"bufio"
5+
"bytes"
56
"errors"
67
"net"
8+
"strconv"
79
"sync"
810

11+
"time"
12+
913
"github.com/jeromer/syslogparser"
1014
"github.com/jeromer/syslogparser/rfc3164"
1115
"github.com/jeromer/syslogparser/rfc5424"
12-
"time"
1316
)
1417

1518
type Format int
1619

1720
const (
1821
RFC3164 Format = 1 + iota // RFC3164: http://www.ietf.org/rfc/rfc3164.txt
1922
RFC5424 // RFC5424: http://www.ietf.org/rfc/rfc5424.txt
23+
RFC6587 // RFC6587: http://www.ietf.org/rfc/rfc6587.txt
2024
)
2125

2226
type Server struct {
@@ -37,7 +41,7 @@ func NewServer() *Server {
3741
return server
3842
}
3943

40-
//Sets the syslog format (RFC3164 or RFC5424)
44+
//Sets the syslog format (RFC3164 or RFC5424 or RFC6587)
4145
func (self *Server) SetFormat(format Format) {
4246
self.format = format
4347
}
@@ -154,8 +158,33 @@ type ScanCloser struct {
154158
closer TimeoutCloser
155159
}
156160

161+
func rfc6587ScannerSplit(data []byte, atEOF bool) (advance int, token []byte, err error) {
162+
if atEOF && len(data) == 0 {
163+
return 0, nil, nil
164+
}
165+
166+
if i := bytes.IndexByte(data, ' '); i > 0 {
167+
pLength := data[0:i]
168+
length, err := strconv.Atoi(string(pLength))
169+
if err != nil {
170+
return 0, nil, err
171+
}
172+
if len(data) >= length+i+1 {
173+
//Return the frame with the length removed
174+
return length + i + 1, data[i+1 : length+i+1], nil
175+
}
176+
}
177+
178+
// Request more data
179+
return 0, nil, nil
180+
}
181+
157182
func (self *Server) goScanConnection(connection net.Conn, needClose bool) {
158183
scanner := bufio.NewScanner(connection)
184+
switch self.format {
185+
case RFC6587:
186+
scanner.Split(rfc6587ScannerSplit)
187+
}
159188

160189
var scanCloser *ScanCloser
161190
if needClose {
@@ -170,10 +199,12 @@ func (self *Server) goScanConnection(connection net.Conn, needClose bool) {
170199

171200
func (self *Server) scan(scanCloser *ScanCloser) {
172201
if scanCloser.closer == nil {
202+
// UDP
173203
for scanCloser.Scan() {
174204
self.parser([]byte(scanCloser.Text()))
175205
}
176206
} else {
207+
// TCP
177208
loop:
178209
for {
179210
select {
@@ -202,7 +233,7 @@ func (self *Server) parser(line []byte) {
202233
switch self.format {
203234
case RFC3164:
204235
parser = self.getParserRFC3164(line)
205-
case RFC5424:
236+
case RFC5424, RFC6587:
206237
parser = self.getParserRFC5424(line)
207238
}
208239

0 commit comments

Comments
 (0)