PartitionEndpointProvider.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. namespace Aws\Endpoint;
  3. use JmesPath\Env;
  4. class PartitionEndpointProvider
  5. {
  6. /** @var Partition[] */
  7. private $partitions;
  8. /** @var string */
  9. private $defaultPartition;
  10. /** @var array */
  11. private $options;
  12. /**
  13. * The 'options' parameter accepts the following arguments:
  14. *
  15. * - sts_regional_endpoints: For STS legacy regions, set to 'regional' to
  16. * use regional endpoints, 'legacy' to use the legacy global endpoint.
  17. * Defaults to 'legacy'.
  18. * - s3_us_east_1_regional_endpoint: For S3 us-east-1 region, set to 'regional'
  19. * to use the regional endpoint, 'legacy' to use the legacy global endpoint.
  20. * Defaults to 'legacy'.
  21. *
  22. * @param array $partitions
  23. * @param string $defaultPartition
  24. * @param array $options
  25. */
  26. public function __construct(
  27. array $partitions,
  28. $defaultPartition = 'aws',
  29. $options = []
  30. ) {
  31. $this->partitions = array_map(function (array $definition) {
  32. return new Partition($definition);
  33. }, array_values($partitions));
  34. $this->defaultPartition = $defaultPartition;
  35. $this->options = $options;
  36. }
  37. public function __invoke(array $args = [])
  38. {
  39. $partition = $this->getPartition(
  40. isset($args['region']) ? $args['region'] : '',
  41. isset($args['service']) ? $args['service'] : ''
  42. );
  43. $args['options'] = $this->options;
  44. return $partition($args);
  45. }
  46. /**
  47. * Returns the partition containing the provided region or the default
  48. * partition if no match is found.
  49. *
  50. * @param string $region
  51. * @param string $service
  52. *
  53. * @return Partition
  54. */
  55. public function getPartition($region, $service)
  56. {
  57. foreach ($this->partitions as $partition) {
  58. if ($partition->isRegionMatch($region, $service)) {
  59. return $partition;
  60. }
  61. }
  62. return $this->getPartitionByName($this->defaultPartition);
  63. }
  64. /**
  65. * Returns the partition with the provided name or null if no partition with
  66. * the provided name can be found.
  67. *
  68. * @param string $name
  69. *
  70. * @return Partition|null
  71. */
  72. public function getPartitionByName($name)
  73. {
  74. foreach ($this->partitions as $partition) {
  75. if ($name === $partition->getName()) {
  76. return $partition;
  77. }
  78. }
  79. }
  80. /**
  81. * Creates and returns the default SDK partition provider.
  82. *
  83. * @param array $options
  84. * @return PartitionEndpointProvider
  85. */
  86. public static function defaultProvider($options = [])
  87. {
  88. $data = \Aws\load_compiled_json(__DIR__ . '/../data/endpoints.json');
  89. $prefixData = \Aws\load_compiled_json(__DIR__ . '/../data/endpoints_prefix_history.json');
  90. $mergedData = self::mergePrefixData($data, $prefixData);
  91. return new self($mergedData['partitions'], 'aws', $options);
  92. }
  93. /**
  94. * Copy endpoint data for other prefixes used by a given service
  95. *
  96. * @param $data
  97. * @param $prefixData
  98. * @return array
  99. */
  100. public static function mergePrefixData($data, $prefixData)
  101. {
  102. $prefixGroups = $prefixData['prefix-groups'];
  103. foreach ($data["partitions"] as $index => $partition) {
  104. foreach ($prefixGroups as $current => $old) {
  105. $serviceData = Env::search("services.\"{$current}\"", $partition);
  106. if (!empty($serviceData)) {
  107. foreach ($old as $prefix) {
  108. if (empty(Env::search("services.\"{$prefix}\"", $partition))) {
  109. $data["partitions"][$index]["services"][$prefix] = $serviceData;
  110. }
  111. }
  112. }
  113. }
  114. }
  115. return $data;
  116. }
  117. }