aboutsummaryrefslogtreecommitdiff
path: root/src/net/textproto/reader.go
diff options
context:
space:
mode:
authorDaniel Speichert <daniel@speichert.pl>2015-12-29 16:46:40 +0100
committerRuss Cox <rsc@golang.org>2016-01-08 16:32:42 +0000
commit8ae584f21e32ab1a07d9d5d4d39cb5f7530c49df (patch)
tree234b57d95df44789b5b20fb823207115b0bc57d4 /src/net/textproto/reader.go
parentbb8c2e19a7fe2ca2283eca44dba2047c9f4307fe (diff)
downloadgo-8ae584f21e32ab1a07d9d5d4d39cb5f7530c49df.tar.xz
net/textproto: accept multi-line error messages
Ads documentation for both formats of messages accepted by ReadResponse(). Validity of message should not be altered by the validation process. On message with unexpected code, a properly formatted message was not fully read. Fixes #10230 Change-Id: Ic0b473059a68ab624ce0525e359d0f5d0b8d2117 Reviewed-on: https://go-review.googlesource.com/18172 Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/net/textproto/reader.go')
-rw-r--r--src/net/textproto/reader.go16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/net/textproto/reader.go b/src/net/textproto/reader.go
index 17edfadad2..91bbb57304 100644
--- a/src/net/textproto/reader.go
+++ b/src/net/textproto/reader.go
@@ -237,7 +237,12 @@ func (r *Reader) ReadCodeLine(expectCode int) (code int, message string, err err
// separated by a newline (\n).
//
// See page 36 of RFC 959 (http://www.ietf.org/rfc/rfc959.txt) for
-// details.
+// details of another form of response accepted:
+//
+// code-message line 1
+// message line 2
+// ...
+// code message line n
//
// If the prefix of the status does not match the digits in expectCode,
// ReadResponse returns with err set to &Error{code, message}.
@@ -248,7 +253,8 @@ func (r *Reader) ReadCodeLine(expectCode int) (code int, message string, err err
//
func (r *Reader) ReadResponse(expectCode int) (code int, message string, err error) {
code, continued, message, err := r.readCodeLine(expectCode)
- for err == nil && continued {
+ multi := continued
+ for continued {
line, err := r.ReadLine()
if err != nil {
return 0, "", err
@@ -256,7 +262,7 @@ func (r *Reader) ReadResponse(expectCode int) (code int, message string, err err
var code2 int
var moreMessage string
- code2, continued, moreMessage, err = parseCodeLine(line, expectCode)
+ code2, continued, moreMessage, err = parseCodeLine(line, 0)
if err != nil || code2 != code {
message += "\n" + strings.TrimRight(line, "\r\n")
continued = true
@@ -264,6 +270,10 @@ func (r *Reader) ReadResponse(expectCode int) (code int, message string, err err
}
message += "\n" + moreMessage
}
+ if err != nil && multi && message != "" {
+ // replace one line error message with all lines (full message)
+ err = &Error{code, message}
+ }
return
}