| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | <?phpnamespace Aws\Endpoint;use JmesPath\Env;class PartitionEndpointProvider{    /** @var Partition[] */    private $partitions;    /** @var string */    private $defaultPartition;    /** @var array  */    private $options;    /**     * The 'options' parameter accepts the following arguments:     *     * - sts_regional_endpoints: For STS legacy regions, set to 'regional' to     *   use regional endpoints, 'legacy' to use the legacy global endpoint.     *   Defaults to 'legacy'.     * - s3_us_east_1_regional_endpoint: For S3 us-east-1 region, set to 'regional'     *   to use the regional endpoint, 'legacy' to use the legacy global endpoint.     *   Defaults to 'legacy'.     *     * @param array $partitions     * @param string $defaultPartition     * @param array $options     */    public function __construct(        array $partitions,        $defaultPartition = 'aws',        $options = []    ) {        $this->partitions = array_map(function (array $definition) {            return new Partition($definition);        }, array_values($partitions));        $this->defaultPartition = $defaultPartition;        $this->options = $options;    }    public function __invoke(array $args = [])    {        $partition = $this->getPartition(            isset($args['region']) ? $args['region'] : '',            isset($args['service']) ? $args['service'] : ''        );        $args['options'] = $this->options;        return $partition($args);    }    /**     * Returns the partition containing the provided region or the default     * partition if no match is found.     *     * @param string $region     * @param string $service     *     * @return Partition     */    public function getPartition($region, $service)    {        foreach ($this->partitions as $partition) {            if ($partition->isRegionMatch($region, $service)) {                return $partition;            }        }        return $this->getPartitionByName($this->defaultPartition);    }    /**     * Returns the partition with the provided name or null if no partition with     * the provided name can be found.     *     * @param string $name     *     * @return Partition|null     */    public function getPartitionByName($name)    {        foreach ($this->partitions as $partition) {            if ($name === $partition->getName()) {                return $partition;            }        }    }    /**     * Creates and returns the default SDK partition provider.     *     * @param array $options     * @return PartitionEndpointProvider     */    public static function defaultProvider($options = [])    {        $data = \Aws\load_compiled_json(__DIR__ . '/../data/endpoints.json');        $prefixData = \Aws\load_compiled_json(__DIR__ . '/../data/endpoints_prefix_history.json');        $mergedData = self::mergePrefixData($data, $prefixData);        return new self($mergedData['partitions'], 'aws', $options);    }    /**     * Copy endpoint data for other prefixes used by a given service     *     * @param $data     * @param $prefixData     * @return array     */    public static function mergePrefixData($data, $prefixData)    {        $prefixGroups = $prefixData['prefix-groups'];        foreach ($data["partitions"] as $index => $partition) {            foreach ($prefixGroups as $current => $old) {                $serviceData = Env::search("services.\"{$current}\"", $partition);                if (!empty($serviceData)) {                    foreach ($old as $prefix) {                        if (empty(Env::search("services.\"{$prefix}\"", $partition))) {                            $data["partitions"][$index]["services"][$prefix] = $serviceData;                        }                    }                }            }        }        return $data;    }}
 |