Skip to content

Commit

Permalink
Merge pull request #27 from gopistolet/ddos
Browse files Browse the repository at this point in the history
Use ReadUntill to protect against ddos.
  • Loading branch information
DenBeke committed Oct 27, 2015
2 parents 6d89c2e + f293d2e commit b91aa46
Show file tree
Hide file tree
Showing 6 changed files with 273 additions and 138 deletions.
29 changes: 23 additions & 6 deletions mta/mta.go
Expand Up @@ -205,15 +205,32 @@ func (s *Mta) HandleClient(proto smtp.Protocol) {
})

var c *smtp.Cmd
var ok bool
var err error

quit := false
cmdC := make(chan bool)

nextCmd := func() bool {
go func() {
c, ok = proto.GetCmd()
cmdC <- true
for {
c, err = proto.GetCmd()

if err != nil {
if err == smtp.ErrLtl {
proto.Send(smtp.Answer{
Status: smtp.SyntaxError,
Message: "Line too long.",
})
} else {
// Not a line too long error. What to do?
cmdC <- true
return
}
} else {
break
}
}
cmdC <- false
}()

select {
Expand All @@ -225,8 +242,8 @@ func (s *Mta) HandleClient(proto smtp.Protocol) {
})
return true
}
case _ = <-cmdC:
return false
case q := <-cmdC:
return q

}

Expand All @@ -235,7 +252,7 @@ func (s *Mta) HandleClient(proto smtp.Protocol) {

quit = nextCmd()

for ok == true && quit == false {
for quit == false {

//log.Printf("Received cmd: %#v", *c)

Expand Down
16 changes: 9 additions & 7 deletions mta/mta_test.go
@@ -1,7 +1,9 @@
package mta

import (
"bufio"
"bytes"
"io"
"testing"

"github.com/gopistolet/gopistolet/smtp"
Expand Down Expand Up @@ -47,18 +49,18 @@ func (p *testProtocol) Send(cmd smtp.Cmd) {
}
}

func (p *testProtocol) GetCmd() (*smtp.Cmd, bool) {
func (p *testProtocol) GetCmd() (*smtp.Cmd, error) {
p.ctx.So(len(p.cmds), c.ShouldBeGreaterThan, 0)

cmd := p.cmds[0]
p.cmds = p.cmds[1:]

if cmd == nil {
return nil, false
return nil, io.EOF
}

//c.Printf("SENDING: %#v\n", cmd)
return &cmd, true
return &cmd, nil
}

func (p *testProtocol) Close() {
Expand Down Expand Up @@ -219,7 +221,7 @@ func TestMailAnswersCorrectSequence(t *testing.T) {
To: getMailWithoutError("guy2@somewhere.test"),
},
smtp.DataCmd{
R: *smtp.NewDataReader(bytes.NewReader([]byte("Some test email\n.\n"))),
R: *smtp.NewDataReader(bufio.NewReader(bytes.NewReader([]byte("Some test email\n.\n")))),
},
smtp.QuitCmd{},
},
Expand Down Expand Up @@ -450,7 +452,7 @@ func TestReset(t *testing.T) {
To: getMailWithoutError("guy1@somewhere.test"),
},
smtp.DataCmd{
R: *smtp.NewDataReader(bytes.NewReader([]byte("Some email content\n.\n"))),
R: *smtp.NewDataReader(bufio.NewReader(bytes.NewReader([]byte("Some email content\n.\n")))),
},
smtp.RcptCmd{
To: getMailWithoutError("someguy@somewhere.test"),
Expand Down Expand Up @@ -517,7 +519,7 @@ func TestReset(t *testing.T) {
To: getMailWithoutError("guy1@somewhere.test"),
},
smtp.DataCmd{
R: *smtp.NewDataReader(bytes.NewReader([]byte("Some email\n.\n"))),
R: *smtp.NewDataReader(bufio.NewReader(bytes.NewReader([]byte("Some email\n.\n")))),
},
smtp.QuitCmd{},
},
Expand Down Expand Up @@ -592,7 +594,7 @@ func TestReset(t *testing.T) {
To: getMailWithoutError("guy1@somewhere.test"),
},
smtp.DataCmd{
R: *smtp.NewDataReader(bytes.NewReader([]byte("Some email\n.\n"))),
R: *smtp.NewDataReader(bufio.NewReader(bytes.NewReader([]byte("Some email\n.\n")))),
},
smtp.QuitCmd{},
},
Expand Down
86 changes: 86 additions & 0 deletions smtp/datareader_test.go
@@ -0,0 +1,86 @@
package smtp

import (
"bufio"
"bytes"
"io/ioutil"
"testing"
)

func compare(t *testing.T, data []byte, expected []byte) {
br := bufio.NewReader(bytes.NewReader(data))

dataReader := NewDataReader(br)
output, err := ioutil.ReadAll(dataReader)
if bytes.Compare(output, expected) != 0 {
t.Errorf("Expected %v\ngot %v\n", expected, output)
}
if err != nil {
t.Errorf("Did not expect error: %v", err)
}

}

func expectError(t *testing.T, data []byte, expected error) {
br := bufio.NewReader(bytes.NewReader(data))
dataReader := NewDataReader(br)
_, err := ioutil.ReadAll(dataReader)
if err != expected {
t.Errorf("Expected error: %v, got: %v", expected, err)
}

}

func TestDataReaderValid(t *testing.T) {
data := []byte("Some test mail\nblablabla\n.\n")
expected := []byte("Some test mail\nblablabla\n")
compare(t, data, expected)

data = []byte("Some test mail\nblablabla\n.\nshould not read this")
expected = []byte("Some test mail\nblablabla\n")
compare(t, data, expected)

data = []byte("Some test mail\n..blablabla\n.\n")
expected = []byte("Some test mail\n.blablabla\n")
compare(t, data, expected)

data = []byte("Some test mail\n.blablabla\n.\n")
expected = []byte("Some test mail\nblablabla\n")
compare(t, data, expected)

// first line is 1000 chars
data = []byte("aafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddd\n.\n")
expected = []byte("aafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddd\n")
compare(t, data, expected)

// first line is 1001 chars but starts with a dot, so server should see it as 1000
data = []byte(".aafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsdddddd\n.\n")
expected = []byte("aafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsdddddd\n")
compare(t, data, expected)

// first line is 1000 chars, second 10, third 1000
data = []byte("aafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddd\naj ge je a t\naafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddd\n.\n")
expected = []byte("aafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddd\naj ge je a t\naafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddd\n")
compare(t, data, expected)
}

func TestDataReaderInvalid(t *testing.T) {
data := []byte("Some test mail\nblablabla\nno ending dot")
expectError(t, data, ErrIncomplete)

data = []byte("Some test mail\r\nDot on invalid place\n.test")
expectError(t, data, ErrIncomplete)

data = []byte("")
expectError(t, data, ErrIncomplete)
}

func TestDataReaderTooLong(t *testing.T) {
// length === 1001
data := []byte("aafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddd3\n")
expectError(t, data, ErrLtl)

// first line is small, second is 1003
data = []byte("Some text :)\naafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddddddddfsdaafsddddddd321\n")
expectError(t, data, ErrLtl)
}
36 changes: 18 additions & 18 deletions smtp/parser.go
@@ -1,6 +1,9 @@
package smtp

import "bufio"
import (
"bufio"
"log"
)

import "strings"
import "errors"
Expand All @@ -21,20 +24,9 @@ func (p *parser) ParseCommand(br *bufio.Reader) (command Cmd, err error) {
servers (see Section 4).
*/

line, err := br.ReadString('\n')
if err != nil {
return nil, err
}

for line == "" {
line, err = br.ReadString('\n')
if err != nil {
return nil, err
}
}

var address *MailAddress
verb, args, err := parseLine(line)
verb, args, err := parseLine(br)
log.Printf("Verb: %s. args: %v", verb, args)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -156,7 +148,8 @@ func (p *parser) ParseCommand(br *bufio.Reader) (command Cmd, err error) {

default:
{
command = UnknownCmd{Cmd: verb, Line: strings.TrimSuffix(line, "\n")}
// TODO: CLEAN THIS UP
command = UnknownCmd{Cmd: verb, Line: strings.TrimSuffix(verb, "\n")}
}

}
Expand All @@ -165,7 +158,7 @@ func (p *parser) ParseCommand(br *bufio.Reader) (command Cmd, err error) {
}

// parseLine returns the verb of the line and a list of all comma separated arguments
func parseLine(line string) (verb string, args []string, err error) {
func parseLine(br *bufio.Reader) (verb string, args []string, err error) {

/*
RFC 5321
Expand All @@ -175,9 +168,16 @@ func parseLine(line string) (verb string, args []string, err error) {
and the <CRLF> is 512 octets. SMTP extensions may be used to
increase this limit.
*/
if len(line) > 512 {
return "", []string{}, errors.New("Line too long")
buffer, err := ReadUntill('\n', MAX_CMD_LINE, br)
if err != nil {
if err == ErrLtl {
SkipTillNewline(br)
return string(buffer), []string{}, err
}

return string(buffer), []string{}, err
}
line := string(buffer)

// Strip \n and \r
line = strings.TrimSuffix(line, "\n")
Expand Down
24 changes: 8 additions & 16 deletions smtp/parser_test.go
Expand Up @@ -48,7 +48,6 @@ func TestParser(t *testing.T) {
}

for _, expectedCommand := range expectedCommands {
Print(expectedCommand)
command, err := p.ParseCommand(br)
So(err, ShouldEqual, nil)
So(command, ShouldResemble, expectedCommand)
Expand All @@ -59,8 +58,6 @@ func TestParser(t *testing.T) {
Convey("Testing parser DATA cmd", t, func() {
commands := ""
commands += "DATA\r\n"
commands += "Some usefull data.\r\n"
commands += ".\r\n"
commands += "quit\r\n"

br := bufio.NewReader(strings.NewReader(commands))
Expand All @@ -69,13 +66,6 @@ func TestParser(t *testing.T) {
command, err := p.ParseCommand(br)
So(err, ShouldEqual, nil)
So(command, ShouldHaveSameTypeAs, DataCmd{})
dataCommand, ok := command.(DataCmd)
So(ok, ShouldEqual, true)
br2 := bufio.NewReader(dataCommand.R.r)
line, _ := br2.ReadString('\n')
So(line, ShouldEqual, "Some usefull data.\r\n")
line, _ = br2.ReadString('\n')
So(line, ShouldEqual, ".\r\n")

command, err = p.ParseCommand(br)
So(err, ShouldEqual, nil)
Expand Down Expand Up @@ -140,16 +130,16 @@ func TestParser(t *testing.T) {
args []string
}{
{
line: "HELO",
line: "HELO\r\n",
verb: "HELO",
},
{
line: "HELO relay.example.org",
line: "HELO relay.example.org\r\n",
verb: "HELO",
args: []string{"relay.example.org"},
},
{
line: "MAIL FROM:<bob@example.org>",
line: "MAIL FROM:<bob@example.org>\r\n",
verb: "MAIL",
args: []string{"FROM:<bob@example.org>"},
},
Expand All @@ -166,7 +156,8 @@ func TestParser(t *testing.T) {
}

for _, test := range tests {
verb, args, err := parseLine(test.line)
br := bufio.NewReader(strings.NewReader(test.line))
verb, args, err := parseLine(br)
So(err, ShouldEqual, nil)
So(verb, ShouldEqual, test.verb)
So(args, ShouldResemble, test.args)
Expand All @@ -181,13 +172,14 @@ func TestParser(t *testing.T) {
addressString string
}{
{
line: "RCPT TO:<alice@example.com>",
line: "RCPT TO:<alice@example.com>\r\n",
addressString: "alice@example.com",
},
}

for _, test := range tests {
_, args, err := parseLine(test.line)
br := bufio.NewReader(strings.NewReader(test.line))
_, args, err := parseLine(br)
So(err, ShouldEqual, nil)

addr, err := parseTO(args)
Expand Down

0 comments on commit b91aa46

Please sign in to comment.