Skip to content

SignerUtils#moveContentLength Opens a Stream Unnecessarily #5444

@RealTYPICAL

Description

@RealTYPICAL

Describe the bug

SignerUtils#moveContentLength conditionally has to read the entire contents of an input stream in case a content length header isn't there. This is problematic because:

  • Some streams can only be opened once.
  • It's a performance penalty if the stream takes time to be opened.

Expected Behavior

The stream should only be opened if the content length needs to be computed.

Current Behavior

It will open a stream and then close it for no purpose.

Reproduction Steps

AtomicBoolean opened = new AtomicBoolean(false);
s3Client.putObject(b -> b.bucket("bucket").key("key"), RequestBody.fromContentProvider(() -> {
	if (opened.getAndSet(true)) {
		throw new RuntimeException("Could only be opened once.");
	}
	return new ByteArrayInputStream("a".repeat(10).getBytes());
}, 10, "application/octet-stream"));

Possible Solution

SignerUtils#moveContentLength should take a ContentStreamProvider and only open the stream if it's necessary for computing the content length.

Additional Information/Context

No response

AWS Java SDK version used

2.26.22

JDK version used

openjdk version "21.0.1"

Operating System and version

Windows 10 and WSL2

Metadata

Metadata

Assignees

Labels

bugThis issue is a bug.p2This is a standard priority issue

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions