/** * @covers Guzzle\Aws\S3\S3Client::getEndpoints */ public function testReturnsEndpoints() { $this->assertEquals(array('us-east-1' => 's3.amazonaws.com', 'us-west-1' => 's3-us-west-1.amazonaws.com', 'EU' => 's3-eu-west-1.amazonaws.com', 'ap-southeast-1' => 's3-ap-southeast-1.amazonaws.com', 'ap-northeast-1' => 's3-ap-northeast-1.amazonaws.com'), S3Client::getEndpoints()); }
/** * Create a canonicalized Resource string for a signature. * * @param array $headers Associative array of request headers. * @param string $path Path part of the URL. * * @return string Returns a canonicalized resource string. */ public function createCanonicalizedResource(array $headers, $path) { $subResource = ''; $parts = parse_url($path); $path = $parts['path']; $needsEndingSlash = false; if (!empty($headers)) { $headers = array_change_key_case($headers, CASE_LOWER); if ($headers['host']) { $matches = array(); $usesS3 = preg_match('/^([a-zA-Z0-9_\\-\\.]+)\\.(?:' . implode('|', array_map('preg_quote', S3Client::getEndpoints())) . ').*$/', $headers['host'], $matches); // If this is a CNAME, then just use the Host header $host = $usesS3 ? $matches[1] : str_replace(S3Client::getEndpoints(), '', $headers['host']); if ($host) { if (preg_match('/^[A-Za-z0-9._\\-]+$/', $host)) { $bucket = $host . '/'; if ($path && $path[0] == '/') { $path = substr($path, 1); } } else { $bucket = parse_url($host, PHP_URL_HOST); } $path = '/' . $bucket . $path; } } } // Add an ending slash to the bucket if it was omitted if (preg_match('/^\\/[A-Za-z0-9._\\-]+$/', $path)) { $path .= '/'; } // Add the sub resource if a valid sub resource is present if (array_key_exists('query', $parts)) { $q = array(); parse_str($parts['query'], $q); $subs = array(); foreach ($q as $key => $value) { if (in_array($key, $this->subResources)) { $subs[$key] = $value; } } if (count($subs)) { $subResource .= '?'; ksort($subs); $first = true; foreach ($subs as $key => $value) { if (!$first) { $subResource .= '&'; } $subResource .= $key; if ($value) { $subResource .= '=' . $value; } $first = false; } $needsEndingSlash = false; } } $result = ($path ? $path : '/') . $subResource; // @codeCoverageIgnoreStart if ($needsEndingSlash) { $result .= '/'; } // @codeCoverageIgnoreEnd return $result; }