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