better handling of tag+verb messages without a source; handle some invalid extraneous space events from servers like unreal; additional (basic) event tests

This commit is contained in:
Liam Stanley 2019-07-31 23:44:43 -04:00
parent 05b8be7a4b
commit 812b7950e0
3 changed files with 78 additions and 6 deletions

View File

@ -82,11 +82,11 @@ func ParseTags(raw string) (t Tags) {
}
// Check if tag key or decoded value are invalid.
if !validTag(parts[i][:hasValue]) || !validTagValue(tagDecoder.Replace(parts[i][hasValue+1:])) {
continue
}
// if !validTag(parts[i][:hasValue]) || !validTagValue(tagDecoder.Replace(parts[i][hasValue+1:])) {
// continue
// }
t[parts[i][:hasValue]] = parts[i][hasValue+1:]
t[parts[i][:hasValue]] = tagDecoder.Replace(parts[i][hasValue+1:])
}
return t

View File

@ -49,6 +49,7 @@ func ParseEvent(raw string) (e *Event) {
}
}
raw = raw[i+1:]
i = 0
}
if raw[0] == messagePrefix {
@ -91,7 +92,7 @@ func ParseEvent(raw string) (e *Event) {
if trailerIndex == -1 {
// No trailing argument found, assume the rest is just params.
e.Params = strings.Split(raw[j:], string(eventSpace))
e.Params = strings.Fields(raw[j:])
return e
}
@ -114,7 +115,7 @@ func ParseEvent(raw string) (e *Event) {
// Check if we need to parse arguments. If so, take everything after the
// command, and right before the trailing prefix, and cut it up.
if i > j {
e.Params = strings.Split(raw[j:i-1], string(eventSpace))
e.Params = strings.Fields(raw[j : i-1])
}
e.Params = append(e.Params, raw[i+1:])

View File

@ -252,3 +252,74 @@ func TestEventSourceTagEquals(t *testing.T) {
}
}
}
func TestEventIRCDocsParseTests(t *testing.T) {
// Some of these are pulled from https://github.com/ircdocs/parser-tests.
// TODO: do result checks in an automated form from parser-tests.
cases := []string{
"foo bar baz asdf",
"foo bar baz :asdf",
":src AWAY",
":src AWAY :",
":coolguy foo bar baz asdf",
":coolguy foo bar baz :asdf",
"foo bar baz :asdf quux",
"foo bar baz :",
"foo bar baz ::asdf",
":coolguy foo bar baz :asdf quux",
":coolguy foo bar baz : asdf quux ",
":coolguy PRIVMSG bar :lol :) ",
":coolguy foo bar baz :",
":coolguy foo bar baz : ",
":coolguy foo b\tar baz",
":coolguy foo b\tar :baz",
"@asd :coolguy foo bar baz : ",
"@a=b\\\\and\\nk;d=gh\\:764 foo",
"@d=gh\\:764;a=b\\\\and\\nk foo",
"@a=b\\\\and\\nk;d=gh\\:764 foo par1 par2",
"@a=b\\\\and\\nk;d=gh\\:764 foo par1 :par2",
"@d=gh\\:764;a=b\\\\and\\nk foo par1 par2",
"@d=gh\\:764;a=b\\\\and\\nk foo par1 :par2",
"@foo=\\\\\\\\\\:\\\\s\\s\\r\\n COMMAND",
"foo bar baz asdf",
":coolguy foo bar baz asdf",
"foo bar baz :asdf quux",
"foo bar baz :",
"foo bar baz ::asdf",
":coolguy foo bar baz :asdf quux",
":coolguy foo bar baz : asdf quux ",
":coolguy PRIVMSG bar :lol :) ",
":coolguy foo bar baz :",
":coolguy foo bar baz : ",
"@a=b;c=32;k;rt=ql7 foo",
"@a=b\\\\and\\nk;c=72\\s45;d=gh\\:764 foo",
"@c;h=;a=b :quux ab cd",
":src JOIN #chan",
":src JOIN :#chan",
":src AWAY",
":src AWAY ",
":cool\tguy foo bar baz",
":coolguy!ag@net\x035w\x03ork.admin PRIVMSG foo :bar baz",
":coolguy!~ag@n\x02et\x0305w\x0fork.admin PRIVMSG foo :bar baz",
"@tag1=value1;tag2;vendor1/tag3=value2;vendor2/tag4= :irc.example.com COMMAND param1 param2 :param3 param3",
":irc.example.com COMMAND param1 param2 :param3 param3",
"@tag1=value1;tag2;vendor1/tag3=value2;vendor2/tag4 COMMAND param1 param2 :param3 param3",
"COMMAND",
"@foo=\\\\\\\\\\:\\\\s\\s\\r\\n COMMAND",
":gravel.mozilla.org 432 #momo :Erroneous Nickname: Illegal characters",
":gravel.mozilla.org MODE #tckk +n ",
":services.esper.net MODE #foo-bar +o foobar ",
"@tag1=value\\\\ntest COMMAND",
"@tag1=value\\1 COMMAND",
"@tag1=value1\\ COMMAND",
"@tag1=1;tag2=3;tag3=4;tag1=5 COMMAND",
"@tag1=1;tag2=3;tag3=4;tag1=5;vendor/tag2=8 COMMAND",
":SomeOp MODE #channel :+i",
":SomeOp MODE #channel +oo SomeUser :AnotherUser",
}
for _, tt := range cases {
// Basic test to just verify it doesn't panic.
_ = ParseEvent(tt)
}
}