diff options
Diffstat (limited to 'aws/aws-sdk-php/src/EventBridge/EventBridgeEndpointMiddleware.php')
-rw-r--r-- | aws/aws-sdk-php/src/EventBridge/EventBridgeEndpointMiddleware.php | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/aws/aws-sdk-php/src/EventBridge/EventBridgeEndpointMiddleware.php b/aws/aws-sdk-php/src/EventBridge/EventBridgeEndpointMiddleware.php new file mode 100644 index 00000000..88ca111e --- /dev/null +++ b/aws/aws-sdk-php/src/EventBridge/EventBridgeEndpointMiddleware.php @@ -0,0 +1,116 @@ +<?php +namespace Aws\EventBridge; + +use Aws\CommandInterface; +use Aws\Endpoint\EndpointProvider; +use Aws\Endpoint\PartitionEndpointProvider; +use InvalidArgumentException; +use Psr\Http\Message\RequestInterface; + +/** + * Reroutes an eventbridge request to the proper endpoint + * @internal + */ +class EventBridgeEndpointMiddleware +{ + private $nextHandler; + private $region; + private $config; + private $endpointProvider; + private $isCustomEndpoint; + + /** + * Provide the URI scheme of the client sending requests. + * @param EndpointProvider $endpointProvider + * @return callable + */ + public static function wrap($region, $config, $endpointProvider, $isCustomEndpoint) + { + return function (callable $handler) use ( + $region, + $config, + $endpointProvider, + $isCustomEndpoint + ) { + return new self( + $handler, + $region, + $config, + $endpointProvider, + $isCustomEndpoint + ); + }; + } + + public function __construct( + callable $nextHandler, + $region, + $config, + $endpointProvider, + $isCustomEndpoint + ) { + $this->nextHandler = $nextHandler; + $this->region = $region; + $this->config = $config; + $this->endpointProvider = is_null($endpointProvider) + ? PartitionEndpointProvider::defaultProvider() + : $endpointProvider; + $this->isCustomEndpoint = $isCustomEndpoint; + } + + public function __invoke(CommandInterface $cmd, RequestInterface $req) { + $sigV4aCommands = ['PutEvents']; + if (in_array($cmd->getName(), $sigV4aCommands)) { + if (isset($cmd['EndpointId'])) { + $endpointID = $cmd['EndpointId']; + $this->validateEndpointId($endpointID); + if (!$this->isCustomEndpoint) { + $dnsSuffix = $this->endpointProvider + ->getPartition($this->region, 'eventbridge') + ->getDnsSuffix(); + $newUri = "{$endpointID}.endpoint.events.{$dnsSuffix}"; + $oldUri = $req->getUri(); + $req = $req->withUri($oldUri->withHost($newUri)); + } + $cmd['@context']['signature_version'] = 'v4a'; + } + } + $f = $this->nextHandler; + return $f($cmd, $req); + } + + protected static function isValidHostLabel($string) + { + if (empty($string) || strlen($string) > 63) { + return false; + } + if ($value = preg_match("/^[a-zA-Z0-9-.]+$/", $string)) { + return true; + } + return false; + } + + /** + * @param $endpointID + * @param CommandInterface $cmd + */ + private function validateEndpointId($endpointID) + { + if (empty($endpointID)) { + throw new \InvalidArgumentException("EventId must be a non-empty string"); + } + if (!self::isValidHostLabel($endpointID)) { + throw new InvalidArgumentException("EventId must be a valid host"); + } + if ($this->config['use_fips_endpoint']) { + throw new InvalidArgumentException( + "EventId is currently not compatible with FIPS pseudo regions" + ); + } + if ($this->config['dual_stack']) { + throw new InvalidArgumentException( + "EventId is currently not compatible with dualstack" + ); + } + } +} |