From eb3c8d1a7e1cfe86df2a0dd27146f8f8dd70e605 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Fri, 11 Mar 2022 16:53:24 +0000 Subject: [PATCH] Refine status code in WebSocket client transport See gh-10 --- .../graphql/client/WebSocketGraphQlTransport.java | 13 +++++++------ .../client/MockWebSocketGraphQlTransportTests.java | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/client/WebSocketGraphQlTransport.java b/spring-graphql/src/main/java/org/springframework/graphql/client/WebSocketGraphQlTransport.java index eaf9e952..d3e9bdf9 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/client/WebSocketGraphQlTransport.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/client/WebSocketGraphQlTransport.java @@ -275,7 +275,7 @@ final class WebSocketGraphQlTransport implements GraphQlTransport { graphQlSession.handleComplete(message); break; default: - return Mono.error(new IllegalStateException("Unexpected message: " + message)); + return session.close(new CloseStatus(4400, "Invalid message")); } } return Mono.empty(); @@ -448,7 +448,8 @@ final class WebSocketGraphQlTransport implements GraphQlTransport { logger.error("Closing " + this.connection.getDescription() + " after failure to send 'complete' for subscription id='" + id + "'."); } - this.connection.close().subscribe(); + // No other suitable status (like server error but there is none for client) + this.connection.close(CloseStatus.PROTOCOL_ERROR).subscribe(); } } } @@ -541,7 +542,7 @@ final class WebSocketGraphQlTransport implements GraphQlTransport { * Close the underlying connection. */ public Mono close() { - return this.connection.close(); + return this.connection.close(CloseStatus.GOING_AWAY); } /** @@ -568,7 +569,7 @@ final class WebSocketGraphQlTransport implements GraphQlTransport { */ private interface DisposableConnection { - Mono close(); + Mono close(CloseStatus status); Mono notifyWhenClosed(); @@ -580,8 +581,8 @@ final class WebSocketGraphQlTransport implements GraphQlTransport { return new DisposableConnection() { @Override - public Mono close() { - return session.close(); + public Mono close(CloseStatus status) { + return session.close(status); } @Override diff --git a/spring-graphql/src/test/java/org/springframework/graphql/client/MockWebSocketGraphQlTransportTests.java b/spring-graphql/src/test/java/org/springframework/graphql/client/MockWebSocketGraphQlTransportTests.java index 4173319a..85be9839 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/client/MockWebSocketGraphQlTransportTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/client/MockWebSocketGraphQlTransportTests.java @@ -216,7 +216,7 @@ public class MockWebSocketGraphQlTransportTests { // Stop this.transport.stop().block(TIMEOUT); assertThat(this.webSocketClient.getConnection(0).isOpen()).isFalse(); - assertThat(this.webSocketClient.getConnection(0).closeStatus().block(TIMEOUT)).isEqualTo(CloseStatus.NORMAL); + assertThat(this.webSocketClient.getConnection(0).closeStatus().block(TIMEOUT)).isEqualTo(CloseStatus.GOING_AWAY); // New requests are rejected GraphQlRequest request = this.mockServer.expectOperation("{Query1}").andRespond(this.response1); @@ -300,7 +300,7 @@ public class MockWebSocketGraphQlTransportTests { TestWebSocketClient client = new TestWebSocketClient(new UnexpectedResponseHandler()); WebSocketGraphQlTransport transport = createTransport(client); - String expectedMessage = "disconnected with CloseStatus[code=1002, reason=null]"; + String expectedMessage = "disconnected with CloseStatus[code=4400, reason=Invalid message]"; StepVerifier.create(transport.execute(new GraphQlRequest("{Query1}"))) .expectErrorSatisfies(ex -> assertThat(ex).hasMessageEndingWith(expectedMessage))