@@ -130,11 +130,13 @@ func TestHandshake(t *testing.T) {
130
130
nc := websocket .NetConn (c )
131
131
defer nc .Close ()
132
132
133
- nc .SetWriteDeadline (time .Now ().Add (time .Second * 10 ))
133
+ nc .SetWriteDeadline (time .Now ().Add (time .Second * 15 ))
134
134
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
+ }
138
140
}
139
141
140
142
return nil
@@ -151,16 +153,39 @@ func TestHandshake(t *testing.T) {
151
153
nc := websocket .NetConn (c )
152
154
defer nc .Close ()
153
155
154
- nc .SetReadDeadline (time .Now ().Add (time .Second * 10 ))
156
+ nc .SetReadDeadline (time .Now ().Add (time .Second * 15 ))
155
157
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 {
159
183
return err
160
184
}
161
185
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
164
189
}
165
190
166
191
return nil
0 commit comments