diff --git a/.gitignore b/.gitignore index 8365624..4b7b1f9 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ _testmain.go *.exe *.test + +# +*.out diff --git a/pop3proto.go b/pop3proto.go index e6c9b1b..ac972c0 100644 --- a/pop3proto.go +++ b/pop3proto.go @@ -110,18 +110,17 @@ func (r *Reader) ReadResponse() (string, error) { } func (r *Reader) parseResponse(line string) (string, error) { - var index int + s := strings.ToUpper(line) - if index = strings.Index(line, " "); index < 0 { - return "", ResponseError(fmt.Sprintf("invalid response format: %s", line)) - } - - switch strings.ToUpper(line[:index]) { - case "+OK": - return line[index+1:], nil - case "-ERR": - return "", ResponseError(line[index+1:]) - default: + if s == "+OK" { + return "", nil + } else if strings.HasPrefix(s, "+OK ") { + return line[4:], nil + } else if s == "-ERR" { + return "", ResponseError("") + } else if strings.HasPrefix(s, "-ERR ") { + return "", ResponseError(line[5:]) + } else { return "", ResponseError(fmt.Sprintf("unknown response: %s", line)) } } diff --git a/pop3proto_test.go b/pop3proto_test.go index 835c02c..215ff79 100644 --- a/pop3proto_test.go +++ b/pop3proto_test.go @@ -59,15 +59,51 @@ func TestReadResponse(t *testing.T) { t.Fatalf("%v, %v", s, err) } + r = reader("+OK\n") + s, err = r.ReadResponse() + if s != "" || err != nil { + t.Fatalf("%v, %v", s, err) + } + + r = reader("+OK \n") + s, err = r.ReadResponse() + if s != "" || err != nil { + t.Fatalf("%v, %v", s, err) + } + + r = reader("+OKAY\n") + s, err = r.ReadResponse() + if s != "" || err == nil || err.Error() != "unknown response: +OKAY" { + t.Fatalf("%v, %v", s, err) + } + r = reader("-ERR message\n") s, err = r.ReadResponse() if s != "" || err == nil || err.Error() != "message" { t.Fatalf("%v, %v", s, err) } + r = reader("-ERR\n") + s, err = r.ReadResponse() + if s != "" || err == nil || err.Error() != "" { + t.Fatalf("%v, %v", s, err) + } + + r = reader("-ERR \n") + s, err = r.ReadResponse() + if s != "" || err == nil || err.Error() != "" { + t.Fatalf("%v, %v", s, err) + } + + r = reader("-ERROR\n") + s, err = r.ReadResponse() + if s != "" || err == nil || err.Error() != "unknown response: -ERROR" { + t.Fatalf("%v, %v", s, err) + } + r = reader("message\n") s, err = r.ReadResponse() - if s != "" || err == nil || err.Error() != "invalid response format: message" { + if s != "" || err == nil || err.Error() != "unknown response: message" { t.Fatalf("%v, %v", s, err) } @@ -76,6 +112,18 @@ func TestReadResponse(t *testing.T) { if s != "" || err == nil || err.Error() != "unknown response: * message" { t.Fatalf("%v, %v", s, err) } + + r = reader(" message\n") + s, err = r.ReadResponse() + if s != "" || err == nil || err.Error() != "unknown response: message" { + t.Fatalf("%v, %v", s, err) + } + + r = reader("\n") + s, err = r.ReadResponse() + if s != "" || err == nil || err.Error() != "unknown response: " { + t.Fatalf("%v, %v", s, err) + } } func TestWriteLine(t *testing.T) {