From: Christopher Wedgwood Date: Thu, 29 Apr 2010 18:01:21 +0000 (-0700) Subject: net: parser should handle EOF without newline properly. X-Git-Tag: weekly.2010-05-04~45 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=be9f6344a774e2edc2bb931194273cf1adcd587f;p=gostls13.git net: parser should handle EOF without newline properly. Fixes #686. R=rsc CC=adg, golang-dev https://golang.org/cl/979044 --- diff --git a/src/pkg/net/parse.go b/src/pkg/net/parse.go index ff980f412e..2bc0db4655 100644 --- a/src/pkg/net/parse.go +++ b/src/pkg/net/parse.go @@ -13,31 +13,32 @@ import ( ) type file struct { - file *os.File - data []byte + file *os.File + data []byte + atEOF bool } func (f *file) close() { f.file.Close() } func (f *file) getLineFromData() (s string, ok bool) { data := f.data - for i := 0; i < len(data); i++ { + i := 0 + for i = 0; i < len(data); i++ { if data[i] == '\n' { s = string(data[0:i]) ok = true // move data i++ n := len(data) - i - for j := 0; j < n; j++ { - data[j] = data[i+j] - } + copy(data[0:], data[i:]) f.data = data[0:n] return } } - if len(f.data) > 0 { + if f.atEOF && len(f.data) > 0 { + // EOF, return all we have s = string(data) - f.data = nil + f.data = f.data[0:0] ok = true } return @@ -49,10 +50,13 @@ func (f *file) readLine() (s string, ok bool) { } if len(f.data) < cap(f.data) { ln := len(f.data) - n, _ := io.ReadFull(f.file, f.data[ln:cap(f.data)]) + n, err := io.ReadFull(f.file, f.data[ln:cap(f.data)]) if n >= 0 { f.data = f.data[0 : ln+n] } + if err == os.EOF { + f.atEOF = true + } } s, ok = f.getLineFromData() return @@ -63,7 +67,7 @@ func open(name string) (*file, os.Error) { if err != nil { return nil, err } - return &file{fd, make([]byte, 1024)[0:0]}, nil + return &file{fd, make([]byte, 1024)[0:0], false}, nil } func byteIndex(s string, c byte) int {