summaryrefslogtreecommitdiff
path: root/vendor/aws/aws-sdk-php/src/RequestCompressionMiddleware.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/RequestCompressionMiddleware.php')
-rw-r--r--vendor/aws/aws-sdk-php/src/RequestCompressionMiddleware.php164
1 files changed, 164 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/RequestCompressionMiddleware.php b/vendor/aws/aws-sdk-php/src/RequestCompressionMiddleware.php
new file mode 100644
index 0000000..a83e593
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/RequestCompressionMiddleware.php
@@ -0,0 +1,164 @@
+<?php
+namespace Aws;
+
+use GuzzleHttp\Psr7;
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * Used to compress request payloads if the service/operation support it.
+ *
+ * IMPORTANT: this middleware must be added after the "build" step.
+ *
+ * @internal
+ */
+class RequestCompressionMiddleware
+{
+ private $api;
+ private $minimumCompressionSize;
+ private $nextHandler;
+ private $encodings;
+ private $encoding;
+ private $encodingMap = [
+ 'gzip' => 'gzencode'
+ ];
+
+ /**
+ * Create a middleware wrapper function.
+ *
+ * @return callable
+ */
+ public static function wrap(array $config)
+ {
+ return function (callable $handler) use ($config) {
+ return new self($handler, $config);
+ };
+ }
+
+ public function __construct(callable $nextHandler, $config)
+ {
+ $this->minimumCompressionSize = $this->determineMinimumCompressionSize($config);
+ $this->api = $config['api'];
+ $this->nextHandler = $nextHandler;
+ }
+
+ public function __invoke(CommandInterface $command, RequestInterface $request)
+ {
+ if (isset($command['@request_min_compression_size_bytes'])
+ && is_int($command['@request_min_compression_size_bytes'])
+ && $this->isValidCompressionSize($command['@request_min_compression_size_bytes'])
+ ) {
+ $this->minimumCompressionSize = $command['@request_min_compression_size_bytes'];
+ }
+ $nextHandler = $this->nextHandler;
+ $operation = $this->api->getOperation($command->getName());
+ $compressionInfo = isset($operation['requestcompression'])
+ ? $operation['requestcompression']
+ : null;
+
+ if (!$this->shouldCompressRequestBody(
+ $compressionInfo,
+ $command,
+ $operation,
+ $request
+ )) {
+ return $nextHandler($command, $request);
+ }
+
+ $this->encodings = $compressionInfo['encodings'];
+ $request = $this->compressRequestBody($request);
+
+ return $nextHandler($command, $request);
+ }
+
+ private function compressRequestBody(
+ RequestInterface $request
+ ) {
+ $fn = $this->determineEncoding();
+ if (is_null($fn)) {
+ return $request;
+ }
+
+ $body = $request->getBody()->getContents();
+ $compressedBody = $fn($body);
+
+ return $request->withBody(Psr7\Utils::streamFor($compressedBody))
+ ->withHeader('content-encoding', $this->encoding);
+ }
+
+ private function determineEncoding()
+ {
+ foreach ($this->encodings as $encoding) {
+ if (isset($this->encodingMap[$encoding])) {
+ $this->encoding = $encoding;
+ return $this->encodingMap[$encoding];
+ }
+ }
+ return null;
+ }
+
+ private function shouldCompressRequestBody(
+ $compressionInfo,
+ $command,
+ $operation,
+ $request
+ ){
+ if ($compressionInfo) {
+ if (isset($command['@disable_request_compression'])
+ && $command['@disable_request_compression'] === true
+ ) {
+ return false;
+ } elseif ($this->hasStreamingTraitWithoutRequiresLength($command, $operation)
+ ) {
+ return true;
+ }
+
+ $requestBodySize = $request->hasHeader('content-length')
+ ? (int) $request->getHeaderLine('content-length')
+ : $request->getBody()->getSize();
+
+ if ($requestBodySize >= $this->minimumCompressionSize) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private function hasStreamingTraitWithoutRequiresLength($command, $operation)
+ {
+ foreach ($operation->getInput()->getMembers() as $name => $member) {
+ if (isset($command[$name])
+ && !empty($member['streaming'])
+ && empty($member['requiresLength'])
+ ){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private function determineMinimumCompressionSize($config) {
+ if (is_callable($config['request_min_compression_size_bytes'])) {
+ $minCompressionSz = $config['request_min_compression_size_bytes']();
+ } else {
+ $minCompressionSz = $config['request_min_compression_size_bytes'];
+ }
+
+ if ($this->isValidCompressionSize($minCompressionSz)) {
+ return $minCompressionSz;
+ }
+ }
+
+ private function isValidCompressionSize($compressionSize)
+ {
+ if (is_numeric($compressionSize)
+ && ($compressionSize >= 0 && $compressionSize <= 10485760)
+ ) {
+ return true;
+ }
+
+ throw new \InvalidArgumentException(
+ 'The minimum request compression size must be a '
+ . 'non-negative integer value between 0 and 10485760 bytes, inclusive.'
+ );
+ }
+} \ No newline at end of file