File tree Expand file tree Collapse file tree 2 files changed +54
-8
lines changed Expand file tree Collapse file tree 2 files changed +54
-8
lines changed Original file line number Diff line number Diff line change @@ -2,8 +2,9 @@ package rfc3164
2
2
3
3
import (
4
4
"bytes"
5
- "github.com/Xiol/syslogparser"
6
5
"time"
6
+
7
+ "github.com/Xiol/syslogparser"
7
8
)
8
9
9
10
type Parser struct {
@@ -15,6 +16,7 @@ type Parser struct {
15
16
header header
16
17
message rfc3164message
17
18
location * time.Location
19
+ skipTag bool
18
20
}
19
21
20
22
type header struct {
@@ -46,13 +48,21 @@ func (p *Parser) Parse() error {
46
48
return err
47
49
}
48
50
51
+ tcursor := p .cursor
49
52
hdr , err := p .parseHeader ()
50
- if err != nil {
53
+ if err == syslogparser .ErrTimestampUnknownFormat {
54
+ // RFC3164 sec 4.3.2.
55
+ hdr .timestamp = time .Now ().Round (time .Second )
56
+ // No tag processing should be done
57
+ p .skipTag = true
58
+ // Reset cursor for content read
59
+ p .cursor = tcursor
60
+ } else if err != nil {
51
61
return err
62
+ } else {
63
+ p .cursor ++
52
64
}
53
65
54
- p .cursor ++
55
-
56
66
msg , err := p .parsemessage ()
57
67
if err != syslogparser .ErrEOL {
58
68
return err
@@ -106,17 +116,19 @@ func (p *Parser) parsemessage() (rfc3164message, error) {
106
116
msg := rfc3164message {}
107
117
var err error
108
118
109
- tag , err := p .parseTag ()
110
- if err != nil {
111
- return msg , err
119
+ if ! p .skipTag {
120
+ tag , err := p .parseTag ()
121
+ if err != nil {
122
+ return msg , err
123
+ }
124
+ msg .tag = tag
112
125
}
113
126
114
127
content , err := p .parseContent ()
115
128
if err != syslogparser .ErrEOL {
116
129
return msg , err
117
130
}
118
131
119
- msg .tag = tag
120
132
msg .content = content
121
133
122
134
return msg , err
Original file line number Diff line number Diff line change @@ -87,6 +87,40 @@ func (s *Rfc3164TestSuite) TestParser_ValidNoTag(c *C) {
87
87
c .Assert (obtained , DeepEquals , expected )
88
88
}
89
89
90
+ // RFC 3164 section 4.3.2
91
+ func (s * Rfc3164TestSuite ) TestParser_NoTimestamp (c * C ) {
92
+ buff := []byte ("<14>INFO leaving (1) step postscripts" )
93
+
94
+ p := NewParser (buff )
95
+ expectedP := & Parser {
96
+ buff : buff ,
97
+ cursor : 0 ,
98
+ l : len (buff ),
99
+ location : time .UTC ,
100
+ }
101
+
102
+ c .Assert (p , DeepEquals , expectedP )
103
+
104
+ err := p .Parse ()
105
+ c .Assert (err , IsNil )
106
+
107
+ now := time .Now ()
108
+
109
+ obtained := p .Dump ()
110
+ obtained ["timestamp" ] = now // XXX: Need to mock out time to test this fully
111
+ expected := syslogparser.LogParts {
112
+ "timestamp" : now ,
113
+ "hostname" : "" ,
114
+ "tag" : "" ,
115
+ "content" : "INFO leaving (1) step postscripts" ,
116
+ "priority" : 14 ,
117
+ "facility" : 1 ,
118
+ "severity" : 6 ,
119
+ }
120
+
121
+ c .Assert (obtained , DeepEquals , expected )
122
+ }
123
+
90
124
func (s * Rfc3164TestSuite ) TestParseHeader_Valid (c * C ) {
91
125
buff := []byte ("Oct 11 22:14:15 mymachine " )
92
126
now := time .Now ()
You can’t perform that action at this time.
0 commit comments