Use readNBytes in ByteArrayHttpMessageConverter when contentLength is available#30010
Closed
kilink wants to merge 1 commit intospring-projects:mainfrom
Closed
Use readNBytes in ByteArrayHttpMessageConverter when contentLength is available#30010kilink wants to merge 1 commit intospring-projects:mainfrom
readNBytes in ByteArrayHttpMessageConverter when contentLength is available#30010kilink wants to merge 1 commit intospring-projects:mainfrom
Conversation
If the content length is available, pass it to readNBytes when reading the message body. When the content length is less than the internal buffer size in InputStream (8192), this avoids a copy, as readNBytes will return the buffer directly. When the content length is greater than the buffer size used in InputStream, passing the content length at least avoids over-allocating the final buffer (e.g., if the content length were 8193 bytes, 1 byte more than the default buffer size). If the content length isn't present or is too large to represent as an integer, fall back to the default behavior of readAllBytes by passing in Integer.MAX_VALUE.
rstoyanchev
reviewed
Feb 24, 2023
Contributor
rstoyanchev
left a comment
There was a problem hiding this comment.
Thanks for the suggestion. I think we could do it in the main branch, since readNBytes was added in JDK 11.
One minor comment on the implementation. Given that readAllBytes internally is readNBytes(Integer.MAX_VALUE), couldn't the logic then be such that if there is a suitable contentLength call readNBytes, or otherwise fall back on readAllBytes.
readNBytes in ByteArrayHttpMessageConverter when when contentLength is available
readNBytes in ByteArrayHttpMessageConverter when when contentLength is availablereadNBytes in ByteArrayHttpMessageConverter when contentLength is available
rstoyanchev
pushed a commit
that referenced
this pull request
Mar 2, 2023
If content-length is available, pass it to readNBytes in ByteArrayHttpMessageConverter. When the content length is less than the internal buffer size in InputStream (8192), this avoids a copy, as readNBytes will return the buffer directly. When the content length is greater than the buffer size used in InputStream, passing the content-length at least avoids over-allocating the final buffer (e.g., if the content length were 8193 bytes, 1 byte more than the default buffer size). If the content length isn't present or is too large to represent as an integer, fall back to the default behavior of readAllBytes by passing in Integer.MAX_VALUE. See gh-30010
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
If the content length is available, pass it to readNBytes when reading the message body. When the content length is less than the internal buffer size in InputStream (8192), this avoids a copy, as readNBytes will return the buffer directly. When the content length is greater than the buffer size used in InputStream, passing the content length at least avoids over-allocating the final buffer (e.g., if the content length were 8193 bytes, 1 byte more than the default buffer size).
If the content length isn't present or is too large to represent as an integer, fall back to the default behavior of readAllBytes by passing in Integer.MAX_VALUE.