* @copyright 2016 Microsoft Corporation * @license https://github.com/azure/azure-storage-php/LICENSE * @link https://github.com/azure/azure-storage-php */ namespace MicrosoftAzure\Storage\Common; use MicrosoftAzure\Storage\Blob\BlobRestProxy; use MicrosoftAzure\Storage\Common\Internal\Resources; use MicrosoftAzure\Storage\Common\Internal\Validate; use MicrosoftAzure\Storage\Common\Internal\Utilities; use MicrosoftAzure\Storage\Common\Internal\Filters\DateFilter; use MicrosoftAzure\Storage\Common\Internal\Filters\HeadersFilter; use MicrosoftAzure\Storage\Common\Internal\Filters\AuthenticationFilter; use MicrosoftAzure\Storage\Common\Internal\InvalidArgumentTypeException; use MicrosoftAzure\Storage\Common\Internal\Serialization\XmlSerializer; use MicrosoftAzure\Storage\Common\Internal\Authentication\SharedKeyAuthScheme; use MicrosoftAzure\Storage\Common\Internal\Authentication\TableSharedKeyLiteAuthScheme; use MicrosoftAzure\Storage\Common\Internal\StorageServiceSettings; use MicrosoftAzure\Storage\Queue\QueueRestProxy; use MicrosoftAzure\Storage\Table\TableRestProxy; use MicrosoftAzure\Storage\Table\Internal\AtomReaderWriter; use MicrosoftAzure\Storage\Table\Internal\MimeReaderWriter; /** * Builds azure service objects. * * @category Microsoft * @package MicrosoftAzure\Storage\Common * @author Azure Storage PHP SDK * @copyright 2016 Microsoft Corporation * @license https://github.com/azure/azure-storage-php/LICENSE * @version Release: 0.11.0 * @link https://github.com/azure/azure-storage-php */ class ServicesBuilder { /** * @var ServicesBuilder */ private static $_instance = null; /** * Gets the serializer used in the REST services construction. * * @return MicrosoftAzure\Storage\Common\Internal\Serialization\ISerializer */ protected function serializer() { return new XmlSerializer(); } /** * Gets the MIME serializer used in the REST services construction. * * @return \MicrosoftAzure\Storage\Table\Internal\IMimeReaderWriter */ protected function mimeSerializer() { return new MimeReaderWriter(); } /** * Gets the Atom serializer used in the REST services construction. * * @return \MicrosoftAzure\Storage\Table\Internal\IAtomReaderWriter */ protected function atomSerializer() { return new AtomReaderWriter(); } /** * Gets the Queue authentication scheme. * * @param string $accountName The account name. * @param string $accountKey The account key. * * @return \MicrosoftAzure\Storage\Common\Internal\Authentication\StorageAuthScheme */ protected function queueAuthenticationScheme($accountName, $accountKey) { return new SharedKeyAuthScheme($accountName, $accountKey); } /** * Gets the Blob authentication scheme. * * @param string $accountName The account name. * @param string $accountKey The account key. * * @return \MicrosoftAzure\Storage\Common\Internal\Authentication\StorageAuthScheme */ protected function blobAuthenticationScheme($accountName, $accountKey) { return new SharedKeyAuthScheme($accountName, $accountKey); } /** * Gets the Table authentication scheme. * * @param string $accountName The account name. * @param string $accountKey The account key. * * @return TableSharedKeyLiteAuthScheme */ protected function tableAuthenticationScheme($accountName, $accountKey) { return new TableSharedKeyLiteAuthScheme($accountName, $accountKey); } /** * Builds a queue object. * * @param string $connectionString The configuration connection string. * @param array $options Array of options to pass to the service * * @return \MicrosoftAzure\Storage\Queue\Internal\IQueue */ public function createQueueService($connectionString, $options = []) { $settings = StorageServiceSettings::createFromConnectionString( $connectionString ); $serializer = $this->serializer(); $uri = Utilities::tryAddUrlScheme( $settings->getQueueEndpointUri() ); $queueWrapper = new QueueRestProxy( $uri, $settings->getName(), $serializer, $options ); // Adding headers filter $headers = array( Resources::USER_AGENT => self::getUserAgent(), ); $headers[Resources::X_MS_VERSION] = Resources::STORAGE_API_LATEST_VERSION; $headersFilter = new HeadersFilter($headers); $queueWrapper = $queueWrapper->withFilter($headersFilter); // Adding date filter $dateFilter = new DateFilter(); $queueWrapper = $queueWrapper->withFilter($dateFilter); // Adding authentication filter $authFilter = new AuthenticationFilter( $this->queueAuthenticationScheme( $settings->getName(), $settings->getKey() ) ); $queueWrapper = $queueWrapper->withFilter($authFilter); return $queueWrapper; } /** * Builds a blob object. * * @param string $connectionString The configuration connection string. * @param array $options Array of options to pass to the service * @return \MicrosoftAzure\Storage\Blob\Internal\IBlob */ public function createBlobService($connectionString, $options = []) { $settings = StorageServiceSettings::createFromConnectionString( $connectionString ); $serializer = $this->serializer(); $uri = Utilities::tryAddUrlScheme( $settings->getBlobEndpointUri() ); $blobWrapper = new BlobRestProxy( $uri, $settings->getName(), $serializer, $options ); // Adding headers filter $headers = array( Resources::USER_AGENT => self::getUserAgent(), ); $headers[Resources::X_MS_VERSION] = Resources::STORAGE_API_LATEST_VERSION; $headersFilter = new HeadersFilter($headers); $blobWrapper = $blobWrapper->withFilter($headersFilter); // Adding date filter $dateFilter = new DateFilter(); $blobWrapper = $blobWrapper->withFilter($dateFilter); $authFilter = new AuthenticationFilter( $this->blobAuthenticationScheme( $settings->getName(), $settings->getKey() ) ); $blobWrapper = $blobWrapper->withFilter($authFilter); return $blobWrapper; } /** * Builds a table object. * * @param string $connectionString The configuration connection string. * @param array $options Array of options to pass to the service * * @return \MicrosoftAzure\Storage\Table\Internal\ITable */ public function createTableService($connectionString, $options = []) { $settings = StorageServiceSettings::createFromConnectionString( $connectionString ); $atomSerializer = $this->atomSerializer(); $mimeSerializer = $this->mimeSerializer(); $serializer = $this->serializer(); $uri = Utilities::tryAddUrlScheme( $settings->getTableEndpointUri() ); $tableWrapper = new TableRestProxy( $uri, $atomSerializer, $mimeSerializer, $serializer, $options ); // Adding headers filter $headers = array(); $latestServicesVersion = Resources::STORAGE_API_LATEST_VERSION; $currentVersion = Resources::DATA_SERVICE_VERSION_VALUE; $maxVersion = Resources::MAX_DATA_SERVICE_VERSION_VALUE; $accept = Resources::ACCEPT_HEADER_VALUE; $acceptCharset = Resources::ACCEPT_CHARSET_VALUE; $userAgent = self::getUserAgent(); $headers[Resources::X_MS_VERSION] = $latestServicesVersion; $headers[Resources::DATA_SERVICE_VERSION] = $currentVersion; $headers[Resources::MAX_DATA_SERVICE_VERSION] = $maxVersion; $headers[Resources::MAX_DATA_SERVICE_VERSION] = $maxVersion; $headers[Resources::ACCEPT_HEADER] = $accept; $headers[Resources::ACCEPT_CHARSET] = $acceptCharset; $headers[Resources::USER_AGENT] = $userAgent; $headersFilter = new HeadersFilter($headers); $tableWrapper = $tableWrapper->withFilter($headersFilter); // Adding date filter $dateFilter = new DateFilter(); $tableWrapper = $tableWrapper->withFilter($dateFilter); // Adding authentication filter $authFilter = new AuthenticationFilter( $this->tableAuthenticationScheme( $settings->getName(), $settings->getKey() ) ); $tableWrapper = $tableWrapper->withFilter($authFilter); return $tableWrapper; } /** * Gets the user agent string used in request header. * * @return string */ private static function getUserAgent() { // e.g. User-Agent: Azure-Storage/0.10.0 (PHP 5.5.32) return 'Azure-Storage/' . Resources::SDK_VERSION . ' (PHP ' . PHP_VERSION . ')'; } /** * Gets the static instance of this class. * * @return ServicesBuilder */ public static function getInstance() { if (!isset(self::$_instance)) { self::$_instance = new ServicesBuilder(); } return self::$_instance; } }