PageRenderTime 48ms CodeModel.GetById 6ms RepoModel.GetById 0ms app.codeStats 0ms

/Zend/Service/WindowsAzure/Storage/Queue.php

http://grupal.googlecode.com/
PHP | 592 lines | 346 code | 55 blank | 191 comment | 86 complexity | 5d565412c389b32edf25c18ad5de011b MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Service_WindowsAzure
  17. * @subpackage Storage
  18. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://todo name_todo
  20. * @version $Id: Queue.php 24593 2012-01-05 20:35:02Z matthew $
  21. */
  22. /**
  23. * see Zend_Service_WindowsAzure_Storage
  24. */
  25. require_once 'Zend/Service/WindowsAzure/Storage.php';
  26. /**
  27. * @see Zend_Service_WindowsAzure_Storage_QueueInstance
  28. */
  29. require_once 'Zend/Service/WindowsAzure/Storage/QueueInstance.php';
  30. /**
  31. * @see Zend_Service_WindowsAzure_Storage_QueueMessage
  32. */
  33. require_once 'Zend/Service/WindowsAzure/Storage/QueueMessage.php';
  34. /**
  35. * @category Zend
  36. * @package Zend_Service_WindowsAzure
  37. * @subpackage Storage
  38. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  39. * @license http://framework.zend.com/license/new-bsd New BSD License
  40. */
  41. class Zend_Service_WindowsAzure_Storage_Queue extends Zend_Service_WindowsAzure_Storage
  42. {
  43. /**
  44. * Maximal message size (in bytes)
  45. */
  46. const MAX_MESSAGE_SIZE = 8388608;
  47. /**
  48. * Maximal message ttl (in seconds)
  49. */
  50. const MAX_MESSAGE_TTL = 604800;
  51. /**
  52. * Creates a new Zend_Service_WindowsAzure_Storage_Queue instance
  53. *
  54. * @param string $host Storage host name
  55. * @param string $accountName Account name for Windows Azure
  56. * @param string $accountKey Account key for Windows Azure
  57. * @param boolean $usePathStyleUri Use path-style URI's
  58. * @param Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy Retry policy to use when making requests
  59. */
  60. public function __construct($host = Zend_Service_WindowsAzure_Storage::URL_DEV_QUEUE, $accountName = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_ACCOUNT, $accountKey = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_KEY, $usePathStyleUri = false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy = null)
  61. {
  62. parent::__construct($host, $accountName, $accountKey, $usePathStyleUri, $retryPolicy);
  63. // API version
  64. $this->_apiVersion = '2009-09-19';
  65. }
  66. /**
  67. * Check if a queue exists
  68. *
  69. * @param string $queueName Queue name
  70. * @return boolean
  71. */
  72. public function queueExists($queueName = '')
  73. {
  74. if ($queueName === '') {
  75. require_once 'Zend/Service/WindowsAzure/Exception.php';
  76. throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
  77. }
  78. if (!self::isValidQueueName($queueName)) {
  79. require_once 'Zend/Service/WindowsAzure/Exception.php';
  80. throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.');
  81. }
  82. // List queues
  83. $queues = $this->listQueues($queueName, 1);
  84. foreach ($queues as $queue) {
  85. if ($queue->Name == $queueName) {
  86. return true;
  87. }
  88. }
  89. return false;
  90. }
  91. /**
  92. * Create queue
  93. *
  94. * @param string $queueName Queue name
  95. * @param array $metadata Key/value pairs of meta data
  96. * @return object Queue properties
  97. * @throws Zend_Service_WindowsAzure_Exception
  98. */
  99. public function createQueue($queueName = '', $metadata = array())
  100. {
  101. if ($queueName === '') {
  102. require_once 'Zend/Service/WindowsAzure/Exception.php';
  103. throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
  104. }
  105. if (!self::isValidQueueName($queueName)) {
  106. require_once 'Zend/Service/WindowsAzure/Exception.php';
  107. throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.');
  108. }
  109. // Create metadata headers
  110. $headers = array();
  111. $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata));
  112. // Perform request
  113. $response = $this->_performRequest($queueName, '', Zend_Http_Client::PUT, $headers);
  114. if ($response->isSuccessful()) {
  115. return new Zend_Service_WindowsAzure_Storage_QueueInstance(
  116. $queueName,
  117. $metadata
  118. );
  119. } else {
  120. require_once 'Zend/Service/WindowsAzure/Exception.php';
  121. throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
  122. }
  123. }
  124. /**
  125. * Create queue if it does not exist
  126. *
  127. * @param string $queueName Queue name
  128. * @param array $metadata Key/value pairs of meta data
  129. * @throws Zend_Service_WindowsAzure_Exception
  130. */
  131. public function createQueueIfNotExists($queueName = '', $metadata = array())
  132. {
  133. if (!$this->queueExists($queueName)) {
  134. $this->createQueue($queueName, $metadata);
  135. }
  136. }
  137. /**
  138. * Get queue
  139. *
  140. * @param string $queueName Queue name
  141. * @return Zend_Service_WindowsAzure_Storage_QueueInstance
  142. * @throws Zend_Service_WindowsAzure_Exception
  143. */
  144. public function getQueue($queueName = '')
  145. {
  146. if ($queueName === '') {
  147. require_once 'Zend/Service/WindowsAzure/Exception.php';
  148. throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
  149. }
  150. if (!self::isValidQueueName($queueName)) {
  151. require_once 'Zend/Service/WindowsAzure/Exception.php';
  152. throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.');
  153. }
  154. // Perform request
  155. $response = $this->_performRequest($queueName, '?comp=metadata', Zend_Http_Client::GET);
  156. if ($response->isSuccessful()) {
  157. // Parse metadata
  158. $metadata = $this->_parseMetadataHeaders($response->getHeaders());
  159. // Return queue
  160. $queue = new Zend_Service_WindowsAzure_Storage_QueueInstance(
  161. $queueName,
  162. $metadata
  163. );
  164. $queue->ApproximateMessageCount = intval($response->getHeader('x-ms-approximate-message-count'));
  165. return $queue;
  166. } else {
  167. require_once 'Zend/Service/WindowsAzure/Exception.php';
  168. throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
  169. }
  170. }
  171. /**
  172. * Get queue metadata
  173. *
  174. * @param string $queueName Queue name
  175. * @return array Key/value pairs of meta data
  176. * @throws Zend_Service_WindowsAzure_Exception
  177. */
  178. public function getQueueMetadata($queueName = '')
  179. {
  180. if ($queueName === '') {
  181. require_once 'Zend/Service/WindowsAzure/Exception.php';
  182. throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
  183. }
  184. if (!self::isValidQueueName($queueName)) {
  185. require_once 'Zend/Service/WindowsAzure/Exception.php';
  186. throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.');
  187. }
  188. return $this->getQueue($queueName)->Metadata;
  189. }
  190. /**
  191. * Set queue metadata
  192. *
  193. * Calling the Set Queue Metadata operation overwrites all existing metadata that is associated with the queue. It's not possible to modify an individual name/value pair.
  194. *
  195. * @param string $queueName Queue name
  196. * @param array $metadata Key/value pairs of meta data
  197. * @throws Zend_Service_WindowsAzure_Exception
  198. */
  199. public function setQueueMetadata($queueName = '', $metadata = array())
  200. {
  201. if ($queueName === '') {
  202. require_once 'Zend/Service/WindowsAzure/Exception.php';
  203. throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
  204. }
  205. if (!self::isValidQueueName($queueName)) {
  206. require_once 'Zend/Service/WindowsAzure/Exception.php';
  207. throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.');
  208. }
  209. if (count($metadata) == 0) {
  210. return;
  211. }
  212. // Create metadata headers
  213. $headers = array();
  214. $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata));
  215. // Perform request
  216. $response = $this->_performRequest($queueName, '?comp=metadata', Zend_Http_Client::PUT, $headers);
  217. if (!$response->isSuccessful()) {
  218. require_once 'Zend/Service/WindowsAzure/Exception.php';
  219. throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
  220. }
  221. }
  222. /**
  223. * Delete queue
  224. *
  225. * @param string $queueName Queue name
  226. * @throws Zend_Service_WindowsAzure_Exception
  227. */
  228. public function deleteQueue($queueName = '')
  229. {
  230. if ($queueName === '') {
  231. require_once 'Zend/Service/WindowsAzure/Exception.php';
  232. throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
  233. }
  234. if (!self::isValidQueueName($queueName)) {
  235. require_once 'Zend/Service/WindowsAzure/Exception.php';
  236. throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.');
  237. }
  238. // Perform request
  239. $response = $this->_performRequest($queueName, '', Zend_Http_Client::DELETE);
  240. if (!$response->isSuccessful()) {
  241. require_once 'Zend/Service/WindowsAzure/Exception.php';
  242. throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
  243. }
  244. }
  245. /**
  246. * List queues
  247. *
  248. * @param string $prefix Optional. Filters the results to return only queues whose name begins with the specified prefix.
  249. * @param int $maxResults Optional. Specifies the maximum number of queues to return per call to Azure storage. This does NOT affect list size returned by this function. (maximum: 5000)
  250. * @param string $marker Optional string value that identifies the portion of the list to be returned with the next list operation.
  251. * @param string $include Optional. Include this parameter to specify that the queue's metadata be returned as part of the response body. (allowed values: '', 'metadata')
  252. * @param int $currentResultCount Current result count (internal use)
  253. * @return array
  254. * @throws Zend_Service_WindowsAzure_Exception
  255. */
  256. public function listQueues($prefix = null, $maxResults = null, $marker = null, $include = null, $currentResultCount = 0)
  257. {
  258. // Build query string
  259. $queryString = array('comp=list');
  260. if (!is_null($prefix)) {
  261. $queryString[] = 'prefix=' . $prefix;
  262. }
  263. if (!is_null($maxResults)) {
  264. $queryString[] = 'maxresults=' . $maxResults;
  265. }
  266. if (!is_null($marker)) {
  267. $queryString[] = 'marker=' . $marker;
  268. }
  269. if (!is_null($include)) {
  270. $queryString[] = 'include=' . $include;
  271. }
  272. $queryString = self::createQueryStringFromArray($queryString);
  273. // Perform request
  274. $response = $this->_performRequest('', $queryString, Zend_Http_Client::GET);
  275. if ($response->isSuccessful()) {
  276. $xmlQueues = $this->_parseResponse($response)->Queues->Queue;
  277. $xmlMarker = (string)$this->_parseResponse($response)->NextMarker;
  278. $queues = array();
  279. if (!is_null($xmlQueues)) {
  280. for ($i = 0; $i < count($xmlQueues); $i++) {
  281. $queues[] = new Zend_Service_WindowsAzure_Storage_QueueInstance(
  282. (string)$xmlQueues[$i]->Name,
  283. $this->_parseMetadataElement($xmlQueues[$i])
  284. );
  285. }
  286. }
  287. $currentResultCount = $currentResultCount + count($queues);
  288. if (!is_null($maxResults) && $currentResultCount < $maxResults) {
  289. if (!is_null($xmlMarker) && $xmlMarker != '') {
  290. $queues = array_merge($queues, $this->listQueues($prefix, $maxResults, $xmlMarker, $include, $currentResultCount));
  291. }
  292. }
  293. if (!is_null($maxResults) && count($queues) > $maxResults) {
  294. $queues = array_slice($queues, 0, $maxResults);
  295. }
  296. return $queues;
  297. } else {
  298. require_once 'Zend/Service/WindowsAzure/Exception.php';
  299. throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
  300. }
  301. }
  302. /**
  303. * Put message into queue
  304. *
  305. * @param string $queueName Queue name
  306. * @param string $message Message
  307. * @param int $ttl Message Time-To-Live (in seconds). Defaults to 7 days if the parameter is omitted.
  308. * @throws Zend_Service_WindowsAzure_Exception
  309. */
  310. public function putMessage($queueName = '', $message = '', $ttl = null)
  311. {
  312. if ($queueName === '') {
  313. require_once 'Zend/Service/WindowsAzure/Exception.php';
  314. throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
  315. }
  316. if (!self::isValidQueueName($queueName)) {
  317. require_once 'Zend/Service/WindowsAzure/Exception.php';
  318. throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.');
  319. }
  320. if (strlen($message) > self::MAX_MESSAGE_SIZE) {
  321. require_once 'Zend/Service/WindowsAzure/Exception.php';
  322. throw new Zend_Service_WindowsAzure_Exception('Message is too big. Message content should be < 8KB.');
  323. }
  324. if ($message == '') {
  325. require_once 'Zend/Service/WindowsAzure/Exception.php';
  326. throw new Zend_Service_WindowsAzure_Exception('Message is not specified.');
  327. }
  328. if (!is_null($ttl) && ($ttl <= 0 || $ttl > self::MAX_MESSAGE_SIZE)) {
  329. require_once 'Zend/Service/WindowsAzure/Exception.php';
  330. throw new Zend_Service_WindowsAzure_Exception('Message TTL is invalid. Maximal TTL is 7 days (' . self::MAX_MESSAGE_SIZE . ' seconds) and should be greater than zero.');
  331. }
  332. // Build query string
  333. $queryString = array();
  334. if (!is_null($ttl)) {
  335. $queryString[] = 'messagettl=' . $ttl;
  336. }
  337. $queryString = self::createQueryStringFromArray($queryString);
  338. // Build body
  339. $rawData = '';
  340. $rawData .= '<QueueMessage>';
  341. $rawData .= ' <MessageText>' . base64_encode($message) . '</MessageText>';
  342. $rawData .= '</QueueMessage>';
  343. // Perform request
  344. $response = $this->_performRequest($queueName . '/messages', $queryString, Zend_Http_Client::POST, array(), false, $rawData);
  345. if (!$response->isSuccessful()) {
  346. require_once 'Zend/Service/WindowsAzure/Exception.php';
  347. throw new Zend_Service_WindowsAzure_Exception('Error putting message into queue.');
  348. }
  349. }
  350. /**
  351. * Get queue messages
  352. *
  353. * @param string $queueName Queue name
  354. * @param string $numOfMessages Optional. A nonzero integer value that specifies the number of messages to retrieve from the queue, up to a maximum of 32. By default, a single message is retrieved from the queue with this operation.
  355. * @param int $visibilityTimeout Optional. An integer value that specifies the message's visibility timeout in seconds. The maximum value is 2 hours. The default message visibility timeout is 30 seconds.
  356. * @param string $peek Peek only?
  357. * @return array
  358. * @throws Zend_Service_WindowsAzure_Exception
  359. */
  360. public function getMessages($queueName = '', $numOfMessages = 1, $visibilityTimeout = null, $peek = false)
  361. {
  362. if ($queueName === '') {
  363. require_once 'Zend/Service/WindowsAzure/Exception.php';
  364. throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
  365. }
  366. if (!self::isValidQueueName($queueName)) {
  367. require_once 'Zend/Service/WindowsAzure/Exception.php';
  368. throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.');
  369. }
  370. if ($numOfMessages < 1 || $numOfMessages > 32 || intval($numOfMessages) != $numOfMessages) {
  371. require_once 'Zend/Service/WindowsAzure/Exception.php';
  372. throw new Zend_Service_WindowsAzure_Exception('Invalid number of messages to retrieve.');
  373. }
  374. if (!is_null($visibilityTimeout) && ($visibilityTimeout <= 0 || $visibilityTimeout > 7200)) {
  375. require_once 'Zend/Service/WindowsAzure/Exception.php';
  376. throw new Zend_Service_WindowsAzure_Exception('Visibility timeout is invalid. Maximum value is 2 hours (7200 seconds) and should be greater than zero.');
  377. }
  378. // Build query string
  379. $queryString = array();
  380. if ($peek) {
  381. $queryString[] = 'peekonly=true';
  382. }
  383. if ($numOfMessages > 1) {
  384. $queryString[] = 'numofmessages=' . $numOfMessages;
  385. }
  386. if (!$peek && !is_null($visibilityTimeout)) {
  387. $queryString[] = 'visibilitytimeout=' . $visibilityTimeout;
  388. }
  389. $queryString = self::createQueryStringFromArray($queryString);
  390. // Perform request
  391. $response = $this->_performRequest($queueName . '/messages', $queryString, Zend_Http_Client::GET);
  392. if ($response->isSuccessful()) {
  393. // Parse results
  394. $result = $this->_parseResponse($response);
  395. if (!$result) {
  396. return array();
  397. }
  398. $xmlMessages = null;
  399. if (count($result->QueueMessage) > 1) {
  400. $xmlMessages = $result->QueueMessage;
  401. } else {
  402. $xmlMessages = array($result->QueueMessage);
  403. }
  404. $messages = array();
  405. for ($i = 0; $i < count($xmlMessages); $i++) {
  406. $messages[] = new Zend_Service_WindowsAzure_Storage_QueueMessage(
  407. (string)$xmlMessages[$i]->MessageId,
  408. (string)$xmlMessages[$i]->InsertionTime,
  409. (string)$xmlMessages[$i]->ExpirationTime,
  410. ($peek ? '' : (string)$xmlMessages[$i]->PopReceipt),
  411. ($peek ? '' : (string)$xmlMessages[$i]->TimeNextVisible),
  412. (string)$xmlMessages[$i]->DequeueCount,
  413. base64_decode((string)$xmlMessages[$i]->MessageText)
  414. );
  415. }
  416. return $messages;
  417. } else {
  418. require_once 'Zend/Service/WindowsAzure/Exception.php';
  419. throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
  420. }
  421. }
  422. /**
  423. * Peek queue messages
  424. *
  425. * @param string $queueName Queue name
  426. * @param string $numOfMessages Optional. A nonzero integer value that specifies the number of messages to retrieve from the queue, up to a maximum of 32. By default, a single message is retrieved from the queue with this operation.
  427. * @return array
  428. * @throws Zend_Service_WindowsAzure_Exception
  429. */
  430. public function peekMessages($queueName = '', $numOfMessages = 1)
  431. {
  432. return $this->getMessages($queueName, $numOfMessages, null, true);
  433. }
  434. /**
  435. * Checks to see if a given queue has messages
  436. *
  437. * @param string $queueName Queue name
  438. * @return boolean
  439. * @throws Zend_Service_WindowsAzure_Exception
  440. */
  441. public function hasMessages($queueName = '')
  442. {
  443. return count($this->peekMessages($queueName)) > 0;
  444. }
  445. /**
  446. * Clear queue messages
  447. *
  448. * @param string $queueName Queue name
  449. * @throws Zend_Service_WindowsAzure_Exception
  450. */
  451. public function clearMessages($queueName = '')
  452. {
  453. if ($queueName === '') {
  454. require_once 'Zend/Service/WindowsAzure/Exception.php';
  455. throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
  456. }
  457. if (!self::isValidQueueName($queueName)) {
  458. require_once 'Zend/Service/WindowsAzure/Exception.php';
  459. throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.');
  460. }
  461. // Perform request
  462. $response = $this->_performRequest($queueName . '/messages', '', Zend_Http_Client::DELETE);
  463. if (!$response->isSuccessful()) {
  464. require_once 'Zend/Service/WindowsAzure/Exception.php';
  465. throw new Zend_Service_WindowsAzure_Exception('Error clearing messages from queue.');
  466. }
  467. }
  468. /**
  469. * Delete queue message
  470. *
  471. * @param string $queueName Queue name
  472. * @param Zend_Service_WindowsAzure_Storage_QueueMessage $message Message to delete from queue. A message retrieved using "peekMessages" can NOT be deleted!
  473. * @throws Zend_Service_WindowsAzure_Exception
  474. */
  475. public function deleteMessage($queueName = '', Zend_Service_WindowsAzure_Storage_QueueMessage $message)
  476. {
  477. if ($queueName === '') {
  478. require_once 'Zend/Service/WindowsAzure/Exception.php';
  479. throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
  480. }
  481. if (!self::isValidQueueName($queueName)) {
  482. require_once 'Zend/Service/WindowsAzure/Exception.php';
  483. throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.');
  484. }
  485. if ($message->PopReceipt == '') {
  486. require_once 'Zend/Service/WindowsAzure/Exception.php';
  487. throw new Zend_Service_WindowsAzure_Exception('A message retrieved using "peekMessages" can NOT be deleted! Use "getMessages" instead.');
  488. }
  489. // Perform request
  490. $response = $this->_performRequest($queueName . '/messages/' . $message->MessageId, '?popreceipt=' . urlencode($message->PopReceipt), Zend_Http_Client::DELETE);
  491. if (!$response->isSuccessful()) {
  492. require_once 'Zend/Service/WindowsAzure/Exception.php';
  493. throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
  494. }
  495. }
  496. /**
  497. * Is valid queue name?
  498. *
  499. * @param string $queueName Queue name
  500. * @return boolean
  501. */
  502. public static function isValidQueueName($queueName = '')
  503. {
  504. if (preg_match("/^[a-z0-9][a-z0-9-]*$/", $queueName) === 0) {
  505. return false;
  506. }
  507. if (strpos($queueName, '--') !== false) {
  508. return false;
  509. }
  510. if (strtolower($queueName) != $queueName) {
  511. return false;
  512. }
  513. if (strlen($queueName) < 3 || strlen($queueName) > 63) {
  514. return false;
  515. }
  516. if (substr($queueName, -1) == '-') {
  517. return false;
  518. }
  519. return true;
  520. }
  521. /**
  522. * Get error message from Zend_Http_Response
  523. *
  524. * @param Zend_Http_Response $response Repsonse
  525. * @param string $alternativeError Alternative error message
  526. * @return string
  527. */
  528. protected function _getErrorMessage(Zend_Http_Response $response, $alternativeError = 'Unknown error.')
  529. {
  530. $response = $this->_parseResponse($response);
  531. if ($response && $response->Message) {
  532. return (string)$response->Message;
  533. } else {
  534. return $alternativeError;
  535. }
  536. }
  537. }