diff options
author | Andrew Dolgov <[email protected]> | 2022-11-23 21:14:33 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2022-11-23 21:14:33 +0300 |
commit | 0c8af4992cb0f7589dcafaad65ada12753c64594 (patch) | |
tree | 18e83d068c3e7dd2499331de977782b382279396 /vendor/aws/aws-sdk-php/src/StreamRequestPayloadMiddleware.php |
initial
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/StreamRequestPayloadMiddleware.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/StreamRequestPayloadMiddleware.php | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/StreamRequestPayloadMiddleware.php b/vendor/aws/aws-sdk-php/src/StreamRequestPayloadMiddleware.php new file mode 100644 index 0000000..dd63d3a --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/StreamRequestPayloadMiddleware.php @@ -0,0 +1,85 @@ +<?php +namespace Aws; + +use Aws\Api\Service; +use Aws\Exception\IncalculablePayloadException; +use Psr\Http\Message\RequestInterface; + +/** + * @internal + */ +class StreamRequestPayloadMiddleware +{ + private $nextHandler; + private $service; + + /** + * Create a middleware wrapper function + * + * @param Service $service + * @return \Closure + */ + public static function wrap(Service $service) + { + return function (callable $handler) use ($service) { + return new self($handler, $service); + }; + } + + public function __construct(callable $nextHandler, Service $service) + { + $this->nextHandler = $nextHandler; + $this->service = $service; + } + + public function __invoke(CommandInterface $command, RequestInterface $request) + { + $nextHandler = $this->nextHandler; + + $operation = $this->service->getOperation($command->getName()); + $contentLength = $request->getHeader('content-length'); + $hasStreaming = false; + $requiresLength = false; + + // Check if any present input member is a stream and requires the + // content length + foreach ($operation->getInput()->getMembers() as $name => $member) { + if (!empty($member['streaming']) && isset($command[$name])) { + $hasStreaming = true; + if (!empty($member['requiresLength'])) { + $requiresLength = true; + } + } + } + + if ($hasStreaming) { + + // Add 'transfer-encoding' header if payload size not required to + // to be calculated and not already known + if (empty($requiresLength) + && empty($contentLength) + && isset($operation['authtype']) + && $operation['authtype'] == 'v4-unsigned-body' + ) { + $request = $request->withHeader('transfer-encoding', 'chunked'); + + // Otherwise, make sure 'content-length' header is added + } else { + if (empty($contentLength)) { + $size = $request->getBody()->getSize(); + if (is_null($size)) { + throw new IncalculablePayloadException('Payload' + . ' content length is required and can not be' + . ' calculated.'); + } + $request = $request->withHeader( + 'content-length', + $size + ); + } + } + } + + return $nextHandler($command, $request); + } +} |