| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | <?phpnamespace 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);    }}
 |