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

Resteasy Reactive Rest Client fails to re-construct large chunks of streamed json (stream+json) and fails deserialization #30044

Closed
fleckware opened this issue Dec 22, 2022 · 3 comments · Fixed by #30255

Comments

@fleckware
Copy link

Describe the bug

Note: This is related to #30040 in that both result in JsonMappingExceptions, but this is a different issue.

I am trying to use RestMediaType.APPLICATION_STREAM_JSON to stream a Multi that contains a few larger objects (think ~25 kB each) from my reactive java server to a reactive java client, using the rest client.

However, the deserialization of the objects fails with Unexpected end-of-input errors, either at the end of 1943 bytes or 8192 bytes. (For the 1943 case, I think there is potentially header info on the first chunk that is cutting into the 8192 total, since when I try to collect the chunks as Strings instead of reading them as my custom objects, all but the first String are 8192 chars long)

Through my own investigation I have found the workaround is to increase the Vertx HttpClientOptions for DEFAULT_MAX_CHUNK_SIZE and DEFAULT_RECEIVE_BUFFER_SIZE, both of which are defaulted to 8192

Maybe that is the final solution, but I would think that the rest client should be able to use the newline-delimited json to determine when it has received an entire object, and buffer/hold in memory up to that point before attempting to deserialize.

Expected behavior

Rest client can properly receive and deserialize a stream of larger json objects, without having to fiddle with the http client options myself

Actual behavior

Errors in the client:

com.fasterxml.jackson.databind.JsonMappingException: Unexpected end-of-input in field name
 at [Source: (ByteArrayInputStream); line: 1, column: 1943]
...
com.fasterxml.jackson.core.io.JsonEOFException: Unexpected end-of-input in VALUE_STRING
 at [Source: (ByteArrayInputStream); line: 1, column: 8192]

How to Reproduce?

Reproducer: service3 (client) and service4 (server) in https://github.com/fleckware/quarkus-test

  1. in one terminal ./gradlew service4:quarkusDev
  2. in a separate terminal ./gradlew service3:quarkusDev
  3. in a separate terminal curl localhost:8081/service4/test/large > output.json
  4. observe that when hitting the streaming endpoint on the server directly, there is no issue
  5. now try to hit it using the rest client curl localhost:8080/service3/test/large
  6. observe the json mapping error in the service3 terminal

Output of uname -a or ver

No response

Output of java -version

openjdk 11.0.10

GraalVM version (if different from Java)

No response

Quarkus version or git rev

2.15.0

Build tool (ie. output of mvnw --version or gradlew --version)

gradle 7.4.2

Additional information

No response

@quarkus-bot
Copy link

quarkus-bot bot commented Dec 22, 2022

/cc @FroMage(resteasy-reactive), @Sgitario(rest-client), @cescoffier(rest-client), @geoand(rest-client,resteasy-reactive), @stuartwdouglas(resteasy-reactive)

@cescoffier cescoffier changed the title Resteasy Reactive Rest Client fails to re-construct large chunks of streamed json and fails deserialization Resteasy Reactive Rest Client fails to re-construct large chunks of streamed json (stream+json) and fails deserialization Jan 9, 2023
cescoffier added a commit to cescoffier/quarkus that referenced this issue Jan 9, 2023
The previous behavior generated a corrupted payload when the frame was cut in the middle of the JSON object. This new simple parser accumulates correctly.

Fix quarkusio#30044
@cescoffier
Copy link
Member

Thank you for the report and the very nice reproducer.
The problem is the absence of a proper parser for application/stream+json.

#30255 contains the fix.

@quarkus-bot quarkus-bot bot added this to the 2.16 - main milestone Jan 9, 2023
@fleckware
Copy link
Author

fleckware commented Jan 9, 2023

Thank you! Will that PR closes #30040 as well ? I notice you used the endpoint from that issue as a unit test

@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
The previous behavior generated a corrupted payload when the frame was cut in the middle of the JSON object. This new simple parser accumulates correctly.

Fix quarkusio#30044

(cherry picked from commit e7eeaea)
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-->
ebullient pushed a commit to maxandersen/quarkus that referenced this issue Jan 24, 2023
The previous behavior generated a corrupted payload when the frame was cut in the middle of the JSON object. This new simple parser accumulates correctly.

Fix quarkusio#30044
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Done
Development

Successfully merging a pull request may close this issue.

3 participants