From 86824713c6b5eb4a3586b056c95acc63654321b8 Mon Sep 17 00:00:00 2001 From: Waldemar Quevedo Date: Tue, 2 Feb 2016 21:38:57 -0800 Subject: [PATCH] Add UNSUB_SPC parser state --- server/parser.go | 8 ++++++++ server/parser_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/server/parser.go b/server/parser.go index 81e4b7a3..0dcc520f 100644 --- a/server/parser.go +++ b/server/parser.go @@ -66,6 +66,7 @@ const ( OP_UNS OP_UNSU OP_UNSUB + OP_UNSUB_SPC UNSUB_ARG OP_M OP_MS @@ -304,6 +305,13 @@ func (c *client) parse(buf []byte) error { goto parseErr } case OP_UNSUB: + switch b { + case ' ', '\t': + c.state = OP_UNSUB_SPC + default: + goto parseErr + } + case OP_UNSUB_SPC: switch b { case ' ', '\t': continue diff --git a/server/parser_test.go b/server/parser_test.go index f3f0a666..06696b8e 100644 --- a/server/parser_test.go +++ b/server/parser_test.go @@ -380,6 +380,34 @@ func TestShouldFail(t *testing.T) { if err := c.parse([]byte("PUB foo 2\r\nok\r \n")); err == nil { t.Fatal("Should have received a parse error") } + c.state = OP_START + if err := c.parse([]byte("UNSUBUNSUB 1\r\n")); err == nil { + t.Fatal("Should have received a parse error") + } + c.state = OP_START + if err := c.parse([]byte("UNSUB_2\r\n")); err == nil { + t.Fatal("Should have received a parse error") + } + c.state = OP_START + if err := c.parse([]byte("UNSUB_UNSUB_UNSUB 2\r\n")); err == nil { + t.Fatal("Should have received a parse error") + } + c.state = OP_START + if err := c.parse([]byte("UNSUB_\t2\r\n")); err == nil { + t.Fatal("Should have received a parse error") + } + c.state = OP_START + if err := c.parse([]byte("UNSUB\r\n")); err == nil { + t.Fatal("Should have received a parse error") + } + c.state = OP_START + if err := c.parse([]byte("UNSUB \r\n")); err == nil { + t.Fatal("Should have received a parse error") + } + c.state = OP_START + if err := c.parse([]byte("UNSUB \t \r\n")); err == nil { + t.Fatal("Should have received a parse error") + } } func TestProtoSnippet(t *testing.T) {