Skip to content

Conversation

@yenfryherrerafeliz
Copy link
Contributor

@yenfryherrerafeliz yenfryherrerafeliz commented Nov 20, 2025

Issues #3124, #3018, #3181:

Description of changes:

  • Evaluates if a client's operation requires http streaming flag to be set to true, and if so then it pass the option along.
  • Make error parsers to reused a parsed body for scenario where the body is non seekable and can't be consumed again.
  • Make sure empty payloads are not parsed.

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

- Evaluates if a client's operation requires http streaming flag to be set to true, and if so then it pass the option along.
- Make error parsers to reused a parsed body for scenario where the body is non seekable and can't be consumed again.

Also change the condition:
 (!$body->isSeekable() || $body->getSize())
To:
 (!$body->isSeekable() || !$body->getSize())

The reason is that a stream non seekable will most likely not have a size, which means this condition will always be true.
Reverted the condition to what it was:
(!$body->isSeekable() || $body->getSize())

Why?, I need to understand better what is the usage of this condition before changing. It was breaking some integ tests.
- When a response body is empty then we dont try to parse it.
- When the response body is non seekable then, we read the full body before parsing.
@yenfryherrerafeliz
Copy link
Contributor Author

Running integ tets
vendor/bin/behat --format=progress --tags=integ
...................................................................... 70
...................................................................... 140
...................................................................... 210
......................................

66 scenarios (66 passed)
248 steps (248 passed)
5m9.29s (45.13Mb)
Running smoke tests
vendor/bin/behat --format=progress --suite=smoke --tags='~@noassumerole'
...................................................................... 70
...................................................................... 140
...................................................................... 210
............

111 scenarios (111 passed)
222 steps (222 passed)
0m45.99s (95.47Mb)

@yenfryherrerafeliz yenfryherrerafeliz marked this pull request as ready for review November 26, 2025 15:04

abstract protected function payload(
ResponseInterface $response,
ResponseInterface|SimpleXMLElement|array $responseOrParsedBody,
Copy link
Member

@stobrien89 stobrien89 Dec 23, 2025

Choose a reason for hiding this comment

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

this would be better as mixed so we're not pulling in codec-specific dependencies, but mixing responses and parsed data here doesn't feel right— is it possible to delegate this call back to extractPayload?

throw new \RuntimeException('The HTTP handler was rejected without an "exception" key value pair.');
}

$serviceError = "AWS HTTP error: " . $err['exception']->getMessage();
Copy link
Member

Choose a reason for hiding this comment

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

The change in format might affect log parsing. I'd leave this unless it's accounted for later

return $this->parser->parse($member, $errorBody[0]);
}

throw new ParserException(
Copy link
Member

Choose a reason for hiding this comment

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

This could be a breaking change if callers don't expect this

Copy link
Member

Choose a reason for hiding this comment

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

Still has the static $streamingCommands property defined (not shown in diff), but it's no longer used. Should be removed

Comment on lines 44 to 46
$tempBody = Utils::streamFor();
Utils::copyToStream($body, $tempBody);
$body = $tempBody;
Copy link
Member

Choose a reason for hiding this comment

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

this could be (lazy rather than eager):

if (!$body->isSeekable()) {
    $body = new CachingStream($body);
}

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I don't think it is necessary to have a lazy stream there. The whole content is consumed right after this block, at line 52. Unless you are thinking in any other use case?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I have replaced that logic for $body->getContents() instead, which avoids having to do a copy operation.

When the response body is a non seekable stream, which happens when the stream flag is set in the request, the parser condition to do a parsing is evaluated to true, but in empty payloads, such as when doing head requests, it fails. To remedy this we read the full body content and evaluate whether the returned value is empty before parsing.
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.

2 participants