Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WebSocket: introduce a reliable way to detect "WebSocket is closed" error #5221

Open
mkouba opened this issue Jun 4, 2024 · 6 comments
Open

Comments

@mkouba
Copy link

mkouba commented Jun 4, 2024

Describe the feature

Currently, when the connection is closed but the client still attempts to write a message the API returns a failed Future where the cause is represented as a NoStackTraceThrowable with message WebSocket is closed. Consequently, it's not possible to detect this kind of error in a reliable way.

It might be useful to introduce either (A) a specific exception like WebSocketClosedException or (B) any other means, such as an error code (enum, constant, etc.) stored in the throwable/failed future.

Use cases

In Quarkus, we would like to be able to catch this kind of error and react appropriately.

@mkouba
Copy link
Author

mkouba commented Jun 4, 2024

CC @geoand @cescoffier @vietj

@geoand
Copy link
Contributor

geoand commented Jun 4, 2024

+1

@vietj
Copy link
Member

vietj commented Jun 5, 2024

@mkouba I think you can set a close handler on the WebSocket and be aware of when a WebSocket is closed and cannot send message anymore

@mkouba
Copy link
Author

mkouba commented Jun 5, 2024

@mkouba I think you can set a close handler on the WebSocket and be aware of when a WebSocket is closed and cannot send message anymore

Yes, that's possible and we use it but for a different purpose. In this particular case, we need to react immediately, e.g. when WebSocket#writeTextMessage(String, Handler<AsyncResult<Void>>) is called.

@vietj
Copy link
Member

vietj commented Jun 5, 2024

we totally can do that, I was just pointing out that the common design we advocate is that you set a boolean closed that is set to true when the close handler is called and it can be probed

@mkouba
Copy link
Author

mkouba commented Jun 6, 2024

we totally can do that, I was just pointing out that the common design we advocate is that you set a boolean closed that is set to true when the close handler is called and it can be probed

I get it and as I already mentioned we use this pattern but it does not really help if you need to analyze a failure produced by WebSocket#writeTextMessage() and friends. Currently, we have to test the exception message like this: https://github.com/quarkusio/quarkus/blob/3.11.1/extensions/websockets-next/runtime/src/main/java/io/quarkus/websockets/next/runtime/Endpoints.java#L250-L262. Which is far from being ideal. As you can see, we test the "closed boolean" first in the connection.isClosed() method but then we still need to analyze the exception in order to react appropriately.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants