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

NullPointerException when sending SSE with comment only #30169

Closed
SHSolution opened this issue Jan 4, 2023 · 6 comments · Fixed by #30177
Closed

NullPointerException when sending SSE with comment only #30169

SHSolution opened this issue Jan 4, 2023 · 6 comments · Fixed by #30177
Labels
area/rest kind/bug Something isn't working
Milestone

Comments

@SHSolution
Copy link

SHSolution commented Jan 4, 2023

Like explained here:
https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#examples

It should be possible to send Server Sent Events that just contain a comment (e.g. to be used as keep-alive mechanism: :keep-alive)

But when trying to send such an event this way:

broadcaster.broadcast(sse.newEventBuilder().comment("keep-alive...").build());

I do get a NPE:

java.lang.NullPointerException
        at org.jboss.resteasy.reactive.common.core.Serialisers.findResourceWriters(Serialisers.java:186)
        at org.jboss.resteasy.reactive.common.core.Serialisers.findWriters(Serialisers.java:262)
        at org.jboss.resteasy.reactive.common.core.Serialisers.findWriters(Serialisers.java:240)
        at org.jboss.resteasy.reactive.server.core.SseUtil.serialiseDataToString(SseUtil.java:129)
        at org.jboss.resteasy.reactive.server.core.SseUtil.serialiseEvent(SseUtil.java:72)
        at org.jboss.resteasy.reactive.server.core.SseUtil.send(SseUtil.java:38)
        at org.jboss.resteasy.reactive.server.jaxrs.SseEventSinkImpl.send(SseEventSinkImpl.java:35)
        at org.jboss.resteasy.reactive.server.jaxrs.SseBroadcasterImpl.broadcast(SseBroadcasterImpl.java:53)
        at org.acme.GreetingResource.broadcastInternal(GreetingResource.java:171)
        at org.acme.GreetingResource$1.run(GreetingResource.java:121)
        at java.base/java.lang.Thread.run(Thread.java:829)

IMO: it should not be tried to serialize the NULL data field so sending an keep-alive event would be possible, e.g.:

:keep-alive

see also this check here, which respects this specification:

@Override
public OutboundSseEventImpl build() {
    if (this.comment == null && this.data == null) {
        throw new IllegalArgumentException("Must set either comment or data");
    }
    return new OutboundSseEventImpl(name, id, reconnectDelay, type, genericType, mediaType, data, comment);
}

Would be nice if this could be fixed.

Even more I would appreciate a function (whether in SseBroadcaster or SseEventSink) which provides the feature to easily send keep-alive messages.

Tested with Quarkus version: 2.15.1.Final

Thanks and regards

Soeren

@gastaldi gastaldi added kind/bug Something isn't working area/rest and removed triage/needs-triage labels Jan 4, 2023
@quarkus-bot
Copy link

quarkus-bot bot commented Jan 4, 2023

/cc @FroMage(resteasy-reactive), @geoand(resteasy-reactive), @stuartwdouglas(resteasy-reactive)

@geoand
Copy link
Contributor

geoand commented Jan 4, 2023

As you have already done an initial analysis of the code, would you be willing to contribute a fix?

Thanks

@SHSolution
Copy link
Author

I could try but wanted to have this discussed first. I will try to provide a proposal how to solve this particular issue.

@geoand
Copy link
Contributor

geoand commented Jan 4, 2023

Let me know if you want me to handle it instead

As for:

Even more I would appreciate a function (whether in SseBroadcaster or SseEventSink) which provides the feature to easily send keep-alive messages

We can't do this unfortunately as these types are JAX-RS types, not Quarkus types.

@geoand
Copy link
Contributor

geoand commented Jan 4, 2023

I will actually handle this one myself, because I see that there is a bug in the client code as well

@geoand
Copy link
Contributor

geoand commented Jan 4, 2023

#30177 takes care of the issue

geoand added a commit that referenced this issue Jan 5, 2023
Properly handle SSE comments in RESTEasy Reactive client and server code
@quarkus-bot quarkus-bot bot added this to the 2.16 - main milestone Jan 5, 2023
@gsmet gsmet modified the milestones: 2.16 - main, 2.15.3.Final Jan 9, 2023
gsmet pushed a commit to gsmet/quarkus that referenced this issue Jan 9, 2023
benkard added a commit to benkard/mulkcms2 that referenced this issue Jan 14, 2023
This MR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [io.quarkus:quarkus-maven-plugin](https://github.com/quarkusio/quarkus) | build | patch | `2.15.2.Final` -> `2.15.3.Final` |
| [io.quarkus:quarkus-universe-bom](https://github.com/quarkusio/quarkus-platform) | import | patch | `2.15.2.Final` -> `2.15.3.Final` |

---

### Release Notes

<details>
<summary>quarkusio/quarkus</summary>

### [`v2.15.3.Final`](https://github.com/quarkusio/quarkus/releases/tag/2.15.3.Final)

[Compare Source](quarkusio/quarkus@2.15.2.Final...2.15.3.Final)

##### Complete changelog

-   [#&#8203;30255](quarkusio/quarkus#30255) - Introduce a JSON Stream parser for the reactive rest client
-   [#&#8203;30242](quarkusio/quarkus#30242) - Throw an IllegalStateException with basic info about the provider that failed to provide a resource
-   [#&#8203;30227](quarkusio/quarkus#30227) - SmallRye GraphQL 1.9.1/2.0.1 + config property to control Federation
-   [#&#8203;30218](quarkusio/quarkus#30218) - OIDC documentation fixes
-   [#&#8203;30200](quarkusio/quarkus#30200) - Ensure that Kotlin implementation of QuarkusApplication works properly
-   [#&#8203;30195](quarkusio/quarkus#30195) - Log graphql.execution.AbortExecutionException when it occurs
-   [#&#8203;30190](quarkusio/quarkus#30190) - 2.15.2.Final breaks command mode with main class extends from QuarkusApplication in kotlin
-   [#&#8203;30187](quarkusio/quarkus#30187) - Bump xstream from 1.4.19 to 1.4.20
-   [#&#8203;30183](quarkusio/quarkus#30183) - Fixing typos in security overview doc
-   [#&#8203;30177](quarkusio/quarkus#30177) - Properly handle SSE comments in RESTEasy Reactive client and server code
-   [#&#8203;30172](quarkusio/quarkus#30172) - Codestarts - Fix flattening of log levels
-   [#&#8203;30169](quarkusio/quarkus#30169) - NullPointerException when sending SSE with comment only
-   [#&#8203;30161](quarkusio/quarkus#30161) - Align behavior for getDeferredIdentity and getIdentity in TestIdentityAssociation
-   [#&#8203;30160](quarkusio/quarkus#30160) - Different behavior in TestIdentityAssociation for getDeferredIdentity and getIdentity
-   [#&#8203;30157](quarkusio/quarkus#30157) - Gradle quarkusDev: don't use test classes dir for app classes
-   [#&#8203;30155](quarkusio/quarkus#30155) - Show how to verify smallrye-jwt issuer in a shared network
-   [#&#8203;30154](quarkusio/quarkus#30154) - Remove remaining references to javax classes
-   [#&#8203;30152](quarkusio/quarkus#30152) - Improve error handling of AbortExecutionException in smallrye-graphql extension
-   [#&#8203;30146](quarkusio/quarkus#30146) - Properly segregate Json MessageBodyReader/Writer classes for server and client
-   [#&#8203;30145](quarkusio/quarkus#30145) - GraphQL federation directives, which allow multiple values, do not match Apollo contract
-   [#&#8203;30142](quarkusio/quarkus#30142) - When disabling name and version for label selectod in k8s, don't remove from labels
-   [#&#8203;30138](quarkusio/quarkus#30138) - Keycloak Dev Services
-   [#&#8203;30132](quarkusio/quarkus#30132) - Register REST Client body parameters for reflection
-   [#&#8203;30119](quarkusio/quarkus#30119) - Enable/disable GraphQL Federation automatically (+ add a config property for it)
-   [#&#8203;30100](quarkusio/quarkus#30100) - Setting `add-version-to-label-selectors: false` removes the app.kubernetes.io/version label
-   [#&#8203;30078](quarkusio/quarkus#30078) - Quarkus Kotlin Native Reactive REST Client not working properly
-   [#&#8203;30061](quarkusio/quarkus#30061) - Adding Kotlin Tests Breaks Kotlin/Java project
-   [#&#8203;30044](quarkusio/quarkus#30044) - Resteasy Reactive Rest Client fails to re-construct large chunks of streamed json (stream+json) and fails deserialization
-   [#&#8203;29998](quarkusio/quarkus#29998) - Bump to smallrye-config 2.13.1
-   [#&#8203;29918](quarkusio/quarkus#29918) - smallrye-config: Converter<Int> throws IllegalStateException
-   [#&#8203;29609](quarkusio/quarkus#29609) - Remove Reflection replacements, now supported by GraalVM

</details>

<details>
<summary>quarkusio/quarkus-platform</summary>

### [`v2.15.3.Final`](quarkusio/quarkus-platform@2.15.2.Final...2.15.3.Final)

[Compare Source](quarkusio/quarkus-platform@2.15.2.Final...2.15.3.Final)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4yNC4wIiwidXBkYXRlZEluVmVyIjoiMzQuMjQuMCJ9-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/rest kind/bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants