@@ -130,11 +130,13 @@ func TestHandshake(t *testing.T) {
130130 nc := websocket .NetConn (c )
131131 defer nc .Close ()
132132
133- nc .SetWriteDeadline (time .Now ().Add (time .Second * 10 ))
133+ nc .SetWriteDeadline (time .Now ().Add (time .Second * 15 ))
134134
135- _ , err = nc .Write ([]byte ("hello" ))
136- if err != nil {
137- return err
135+ for i := 0 ; i < 3 ; i ++ {
136+ _ , err = nc .Write ([]byte ("hello" ))
137+ if err != nil {
138+ return err
139+ }
138140 }
139141
140142 return nil
@@ -151,16 +153,39 @@ func TestHandshake(t *testing.T) {
151153 nc := websocket .NetConn (c )
152154 defer nc .Close ()
153155
154- nc .SetReadDeadline (time .Now ().Add (time .Second * 10 ))
156+ nc .SetReadDeadline (time .Now ().Add (time .Second * 15 ))
155157
156- p := make ([]byte , len ("hello" ))
157- _ , err = io .ReadFull (nc , p )
158- if err != nil {
158+ read := func () error {
159+ p := make ([]byte , len ("hello" ))
160+ // We do not use io.ReadFull here as it masks EOFs.
161+ // See https://github.com/nhooyr/websocket/issues/100#issuecomment-508148024
162+ _ , err = nc .Read (p )
163+ if err != nil {
164+ return err
165+ }
166+
167+ if string (p ) != "hello" {
168+ return xerrors .Errorf ("unexpected payload %q received" , string (p ))
169+ }
170+ return nil
171+ }
172+
173+ for i := 0 ; i < 3 ; i ++ {
174+ err = read ()
175+ if err != nil {
176+ return err
177+ }
178+ }
179+
180+ // Ensure the close frame is converted to an EOF and multiple read's after all return EOF.
181+ err = read ()
182+ if err != io .EOF {
159183 return err
160184 }
161185
162- if string (p ) != "hello" {
163- return xerrors .Errorf ("unexpected payload %q received" , string (p ))
186+ err = read ()
187+ if err != io .EOF {
188+ return err
164189 }
165190
166191 return nil
0 commit comments