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

fix: S3 200 error customization should only not apply to streaming + blob shapes #1633

Merged
merged 16 commits into from
Aug 6, 2024

Conversation

dayaffe
Copy link
Contributor

@dayaffe dayaffe commented Jul 15, 2024

Issue #

#1629

Description of changes

  • S3 200 Error customization should only not apply to streaming + blob shapes not all streaming shapes.
  • This change only effects one method selectObjectContent which didn't have the customization applied but now does. The response of this method contains an event stream.
  • We should only check the root of the response for an node not if is present anywhere in the response

New/existing dependencies impact assessment, if applicable

Conventional Commits

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@jbelkins
Copy link
Contributor

so event streams DO get the s3/200 customization applied to them?

Copy link
Contributor

@sichanyoo sichanyoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: comments and namings

Copy link
Contributor

@jbelkins jbelkins left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Questions inline

return
}

let statusCode = try isRootErrorElement(data: data) ? errorStatusCode : response.statusCode
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How do we know we will have enough data here to determine if the body returns an error?
readData() could return zero bytes if the data is not yet available, and the stream could be filled with error data after this step is complete.

Copy link
Contributor Author

@dayaffe dayaffe Jul 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we don't get all the messages back all at once, each response is a separate action so it should be checking each streamed message for Error at root

@sichanyoo sichanyoo self-requested a review July 26, 2024 17:53
Copy link
Contributor

@sichanyoo sichanyoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be good to go pending approval from Josh also

extension ByteStream {

// Copy an existing ByteStream, optionally with new data
public func copy(data: Data?) -> ByteStream {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this need to be public? Is it used anywhere other than in the middleware above?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, can this param be non-nil Data? In the code above, data is safe-unwrapped before this function is called

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sure I can make it private and non-nil unless we want to make it generally available and move it to a place like SmithyStreams or ClientRuntime. Only issue with that is neither has both ByteStream and the various types of streams

case .data(let existingData):
return .data(data ?? existingData)
case .stream(let existingStream):
return .stream(data != nil ? BufferedStream(data: data, isClosed: true) : existingStream)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't the copied stream be created un-closed? At this point we don't know if there will be more data in the stream in the future.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If its created unclosed then the AsyncThrowingStream will never complete when looping through it. It yields each event until an end event and then hangs forever.

@dayaffe dayaffe requested a review from jbelkins August 5, 2024 21:35
@dayaffe dayaffe merged commit 4aecaa0 into main Aug 6, 2024
28 checks passed
@dayaffe dayaffe deleted the day/s3200 branch August 6, 2024 14:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants