diff options
| author | Daniel Speichert <daniel@speichert.pl> | 2015-12-29 16:46:40 +0100 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2016-01-08 16:32:42 +0000 |
| commit | 8ae584f21e32ab1a07d9d5d4d39cb5f7530c49df (patch) | |
| tree | 234b57d95df44789b5b20fb823207115b0bc57d4 /src/net/textproto/reader.go | |
| parent | bb8c2e19a7fe2ca2283eca44dba2047c9f4307fe (diff) | |
| download | go-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.go | 16 |
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 } |
