diff --git a/rfc3164/rfc3164.go b/rfc3164/rfc3164.go index 2563351..b371d63 100644 --- a/rfc3164/rfc3164.go +++ b/rfc3164/rfc3164.go @@ -4,6 +4,7 @@ import ( "bytes" "github.com/jeromer/syslogparser" "time" + "fmt" ) type Parser struct { @@ -113,9 +114,9 @@ func (p *Parser) parsemessage() (rfc3164message, error) { msg := rfc3164message{} var err error - tag, err := p.parseTag() + tag, cursor, err := p.parseTag() if err != nil { - return msg, err + p.cursor = cursor } content, err := p.parseContent() @@ -189,7 +190,7 @@ func (p *Parser) parseHostname() (string, error) { } // http://tools.ietf.org/html/rfc3164#section-4.1.3 -func (p *Parser) parseTag() (string, error) { +func (p *Parser) parseTag() (string, int, error) { var b byte var endOfTag bool var bracketOpen bool @@ -200,6 +201,11 @@ func (p *Parser) parseTag() (string, error) { from := p.cursor for { + if p.l <= p.cursor { + err = fmt.Errorf("No tag") + tag = []byte("") + break + } b = p.buff[p.cursor] bracketOpen = (b == '[') endOfTag = (b == ':' || b == ' ') @@ -227,7 +233,7 @@ func (p *Parser) parseTag() (string, error) { p.cursor++ } - return string(tag), err + return string(tag), from, err } func (p *Parser) parseContent() (string, error) { diff --git a/rfc3164/rfc3164_test.go b/rfc3164/rfc3164_test.go index bb1ceff..bff846f 100644 --- a/rfc3164/rfc3164_test.go +++ b/rfc3164/rfc3164_test.go @@ -216,7 +216,7 @@ func (s *Rfc3164TestSuite) BenchmarkParseTag(c *C) { p := NewParser(buff) for i := 0; i < c.N; i++ { - _, err := p.parseTag() + _, _, err := p.parseTag() if err != nil { panic(err) } @@ -265,7 +265,7 @@ func (s *Rfc3164TestSuite) assertTimestamp(c *C, ts time.Time, b []byte, expC in func (s *Rfc3164TestSuite) assertTag(c *C, t string, b []byte, expC int, e error) { p := NewParser(b) - obtained, err := p.parseTag() + obtained, _, err := p.parseTag() c.Assert(obtained, Equals, t) c.Assert(p.cursor, Equals, expC) c.Assert(err, Equals, e) @@ -286,3 +286,28 @@ func (s *Rfc3164TestSuite) assertRfc3164message(c *C, msg rfc3164message, b []by c.Assert(obtained, Equals, msg) c.Assert(p.cursor, Equals, expC) } + +func (s *Rfc3164TestSuite) TestParseWithout_Tag(c *C) { + buff := []byte("<30>Jun 23 13:17:42 127.0.0.1 java.lang.NullPointerException") + + p := NewParser(buff) + + err := p.Parse() + c.Assert(err, IsNil) + + now := time.Now() + + obtained := p.Dump() + expected := syslogparser.LogParts{ + "timestamp": time.Date(now.Year(), time.June, 23, 13, 17, 42, 0, time.UTC), + "hostname": "127.0.0.1", + "tag": "", + "content": "java.lang.NullPointerException", + "priority": 30, + "facility": 3, + "severity": 6, + } + + c.Assert(obtained, DeepEquals, expected) + +}