22
22
import java .net .ProtocolException ;
23
23
import java .net .SocketTimeoutException ;
24
24
import java .time .Duration ;
25
+ import java .util .ArrayList ;
26
+ import java .util .List ;
25
27
import java .util .Random ;
26
28
import java .util .concurrent .CountDownLatch ;
27
29
import java .util .concurrent .TimeUnit ;
28
30
import java .util .concurrent .atomic .AtomicInteger ;
31
+ import okhttp3 .ConnectionPool ;
29
32
import okhttp3 .OkHttpClient ;
30
33
import okhttp3 .OkHttpClientTestRule ;
31
34
import okhttp3 .Protocol ;
@@ -315,11 +318,16 @@ private OkHttpClientTestRule configureClientTestRule() {
315
318
webServer .enqueue (new MockResponse ()
316
319
.setResponseCode (101 )
317
320
.setHeader ("Upgrade" , "websocket" )
318
- .setHeader ("Sec-WebSocket-Accept" , "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=" ));
319
- newWebSocket ();
321
+ .setHeader ("Sec-WebSocket-Accept" , "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=" )
322
+ );
323
+ webServer .enqueue (new MockResponse ().setSocketPolicy (SocketPolicy .DISCONNECT_AT_START ));
324
+
325
+ RealWebSocket webSocket = newWebSocket ();
320
326
321
327
clientListener .assertFailure (101 , null , ProtocolException .class ,
322
328
"Expected 'Connection' header value 'Upgrade' but was 'null'" );
329
+
330
+ webSocket .cancel ();
323
331
}
324
332
325
333
@ Test public void wrongConnectionHeader () throws IOException {
@@ -328,21 +336,29 @@ private OkHttpClientTestRule configureClientTestRule() {
328
336
.setHeader ("Upgrade" , "websocket" )
329
337
.setHeader ("Connection" , "Downgrade" )
330
338
.setHeader ("Sec-WebSocket-Accept" , "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=" ));
331
- newWebSocket ();
339
+ webServer .enqueue (new MockResponse ().setSocketPolicy (SocketPolicy .DISCONNECT_AT_START ));
340
+
341
+ RealWebSocket webSocket = newWebSocket ();
332
342
333
343
clientListener .assertFailure (101 , null , ProtocolException .class ,
334
344
"Expected 'Connection' header value 'Upgrade' but was 'Downgrade'" );
345
+
346
+ webSocket .cancel ();
335
347
}
336
348
337
349
@ Test public void missingUpgradeHeader () throws IOException {
338
350
webServer .enqueue (new MockResponse ()
339
351
.setResponseCode (101 )
340
352
.setHeader ("Connection" , "Upgrade" )
341
353
.setHeader ("Sec-WebSocket-Accept" , "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=" ));
342
- newWebSocket ();
354
+ webServer .enqueue (new MockResponse ().setSocketPolicy (SocketPolicy .DISCONNECT_AT_START ));
355
+
356
+ RealWebSocket webSocket = newWebSocket ();
343
357
344
358
clientListener .assertFailure (101 , null , ProtocolException .class ,
345
359
"Expected 'Upgrade' header value 'websocket' but was 'null'" );
360
+
361
+ webSocket .cancel ();
346
362
}
347
363
348
364
@ Test public void wrongUpgradeHeader () throws IOException {
@@ -351,21 +367,29 @@ private OkHttpClientTestRule configureClientTestRule() {
351
367
.setHeader ("Connection" , "Upgrade" )
352
368
.setHeader ("Upgrade" , "Pepsi" )
353
369
.setHeader ("Sec-WebSocket-Accept" , "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=" ));
354
- newWebSocket ();
370
+ webServer .enqueue (new MockResponse ().setSocketPolicy (SocketPolicy .DISCONNECT_AT_START ));
371
+
372
+ RealWebSocket webSocket = newWebSocket ();
355
373
356
374
clientListener .assertFailure (101 , null , ProtocolException .class ,
357
375
"Expected 'Upgrade' header value 'websocket' but was 'Pepsi'" );
376
+
377
+ webSocket .cancel ();
358
378
}
359
379
360
380
@ Test public void missingMagicHeader () throws IOException {
361
381
webServer .enqueue (new MockResponse ()
362
382
.setResponseCode (101 )
363
383
.setHeader ("Connection" , "Upgrade" )
364
384
.setHeader ("Upgrade" , "websocket" ));
365
- newWebSocket ();
385
+ webServer .enqueue (new MockResponse ().setSocketPolicy (SocketPolicy .DISCONNECT_AT_START ));
386
+
387
+ RealWebSocket webSocket = newWebSocket ();
366
388
367
389
clientListener .assertFailure (101 , null , ProtocolException .class ,
368
390
"Expected 'Sec-WebSocket-Accept' header value 'ujmZX4KXZqjwy6vi1aQFH5p4Ygk=' but was 'null'" );
391
+
392
+ webSocket .cancel ();
369
393
}
370
394
371
395
@ Test public void wrongMagicHeader () throws IOException {
@@ -374,10 +398,14 @@ private OkHttpClientTestRule configureClientTestRule() {
374
398
.setHeader ("Connection" , "Upgrade" )
375
399
.setHeader ("Upgrade" , "websocket" )
376
400
.setHeader ("Sec-WebSocket-Accept" , "magic" ));
377
- newWebSocket ();
401
+ webServer .enqueue (new MockResponse ().setSocketPolicy (SocketPolicy .DISCONNECT_AT_START ));
402
+
403
+ RealWebSocket webSocket = newWebSocket ();
378
404
379
405
clientListener .assertFailure (101 , null , ProtocolException .class ,
380
406
"Expected 'Sec-WebSocket-Accept' header value 'ujmZX4KXZqjwy6vi1aQFH5p4Ygk=' but was 'magic'" );
407
+
408
+ webSocket .cancel ();
381
409
}
382
410
383
411
@ Test public void clientIncludesForbiddenHeader () throws IOException {
@@ -800,6 +828,45 @@ private OkHttpClientTestRule configureClientTestRule() {
800
828
webSocket .close (1000 , null );
801
829
}
802
830
831
+ /** https://github.com/square/okhttp/issues/7768 */
832
+ @ Test public void reconnectingToNonWebSocket () throws InterruptedException {
833
+ for (int i = 0 ; i < 30 ; i ++) {
834
+ webServer .enqueue (new MockResponse ()
835
+ .setBodyDelay (100 , TimeUnit .MILLISECONDS )
836
+ .setBody ("Wrong endpoint" )
837
+ .setResponseCode (401 ));
838
+ }
839
+
840
+ Request request = new Request .Builder ()
841
+ .url (webServer .url ("/" ))
842
+ .build ();
843
+
844
+ CountDownLatch attempts = new CountDownLatch (20 );
845
+
846
+ List <WebSocket > webSockets = new ArrayList <>();
847
+
848
+ WebSocketListener reconnectOnFailure = new WebSocketListener () {
849
+ @ Override
850
+ public void onFailure (WebSocket webSocket , Throwable t , Response response ) {
851
+ if (attempts .getCount () > 0 ) {
852
+ clientListener .setNextEventDelegate (this );
853
+ webSockets .add (client .newWebSocket (request , clientListener ));
854
+ attempts .countDown ();
855
+ }
856
+ }
857
+ };
858
+
859
+ clientListener .setNextEventDelegate (reconnectOnFailure );
860
+
861
+ webSockets .add (client .newWebSocket (request , clientListener ));
862
+
863
+ attempts .await ();
864
+
865
+ for (WebSocket webSocket : webSockets ) {
866
+ webSocket .cancel ();
867
+ }
868
+ }
869
+
803
870
@ Test public void compressedMessages () throws Exception {
804
871
successfulExtensions ("permessage-deflate" );
805
872
}
0 commit comments