@@ -17,10 +17,9 @@ import (
17
17
// A Reader implements convenience methods for reading requests
18
18
// or responses from a text protocol network connection.
19
19
type Reader struct {
20
- R * bufio.Reader
21
- dot * dotReader
22
- buf []byte // a re-usable buffer for readContinuedLineSlice
23
- reachEnd bool
20
+ R * bufio.Reader
21
+ dot * dotReader
22
+ buf []byte // a re-usable buffer for readContinuedLineSlice
24
23
}
25
24
26
25
// NewReader returns a new Reader reading from r.
@@ -158,7 +157,15 @@ func (r *Reader) readContinuedLineSlice(validateFirstLine func([]byte) error) ([
158
157
r .buf = append (r .buf [:0 ], trim (line )... )
159
158
160
159
// Read continuation lines.
161
- for r .skipSpace () > 0 {
160
+ for {
161
+ n , err := r .skipSpace ()
162
+ if n == 0 || err != nil {
163
+ // Return nil instead of EOF if have non-empty line to return
164
+ if err == io .EOF && len (r .buf ) > 0 {
165
+ err = nil
166
+ }
167
+ return r .buf , err
168
+ }
162
169
line , err := r .readLineSlice ()
163
170
if err != nil {
164
171
break
@@ -170,24 +177,21 @@ func (r *Reader) readContinuedLineSlice(validateFirstLine func([]byte) error) ([
170
177
}
171
178
172
179
// skipSpace skips R over all spaces and returns the number of bytes skipped.
173
- func (r * Reader ) skipSpace () int {
180
+ func (r * Reader ) skipSpace () ( int , error ) {
174
181
n := 0
175
182
for {
176
183
c , err := r .R .ReadByte ()
177
184
if err != nil {
178
- // Bufio may not keep err until next read.
179
- if err == io .EOF {
180
- r .reachEnd = true
181
- }
182
- break
185
+ // Bufio will keep err until next read.
186
+ return n , err
183
187
}
184
188
if c != ' ' && c != '\t' {
185
189
r .R .UnreadByte ()
186
190
break
187
191
}
188
192
n ++
189
193
}
190
- return n
194
+ return n , nil
191
195
}
192
196
193
197
func (r * Reader ) readCodeLine (expectCode int ) (code int , continued bool , message string , err error ) {
@@ -505,7 +509,7 @@ func (r *Reader) ReadMIMEHeader() (MIMEHeader, error) {
505
509
return m , ProtocolError ("malformed MIME header initial line: " + string (line ))
506
510
}
507
511
508
- for ! r . reachEnd {
512
+ for {
509
513
kv , err := r .readContinuedLineSlice (mustHaveFieldNameColon )
510
514
if len (kv ) == 0 {
511
515
return m , err
@@ -545,8 +549,6 @@ func (r *Reader) ReadMIMEHeader() (MIMEHeader, error) {
545
549
return m , err
546
550
}
547
551
}
548
-
549
- return m , io .EOF
550
552
}
551
553
552
554
// noValidation is a no-op validation func for readContinuedLineSlice
0 commit comments