File indexing completed on 2024-06-23 05:55:45

0001 <?php
0002 /**
0003  * Zend Framework
0004  *
0005  * LICENSE
0006  *
0007  * This source file is subject to the new BSD license that is bundled
0008  * with this package in the file LICENSE.txt.
0009  * It is also available through the world-wide-web at this URL:
0010  * http://framework.zend.com/license/new-bsd
0011  * If you did not receive a copy of the license and are unable to
0012  * obtain it through the world-wide-web, please send an email
0013  * to license@zend.com so we can send you a copy immediately.
0014  *
0015  * @category   Zend
0016  * @package    Zend_Service_WindowsAzure
0017  * @subpackage Storage
0018  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0019  * @license    http://todo     name_todo
0020  * @version    $Id$
0021  */
0022 
0023 /**
0024  * see Zend_Service_WindowsAzure_Storage
0025  */
0026 // require_once 'Zend/Service/WindowsAzure/Storage.php';
0027 
0028 /**
0029  * @see Zend_Service_WindowsAzure_Storage_QueueInstance
0030  */
0031 // require_once 'Zend/Service/WindowsAzure/Storage/QueueInstance.php';
0032 
0033 /**
0034  * @see Zend_Service_WindowsAzure_Storage_QueueMessage
0035  */
0036 // require_once 'Zend/Service/WindowsAzure/Storage/QueueMessage.php';
0037 
0038 /**
0039  * @category   Zend
0040  * @package    Zend_Service_WindowsAzure
0041  * @subpackage Storage
0042  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0043  * @license    http://framework.zend.com/license/new-bsd     New BSD License
0044  */
0045 class Zend_Service_WindowsAzure_Storage_Queue extends Zend_Service_WindowsAzure_Storage
0046 {
0047   /**
0048    * Maximal message size (in bytes)
0049    */
0050   const MAX_MESSAGE_SIZE = 8388608;
0051   
0052   /**
0053    * Maximal message ttl (in seconds)
0054    */
0055   const MAX_MESSAGE_TTL = 604800;
0056   
0057   /**
0058    * Creates a new Zend_Service_WindowsAzure_Storage_Queue instance
0059    *
0060    * @param string $host Storage host name
0061    * @param string $accountName Account name for Windows Azure
0062    * @param string $accountKey Account key for Windows Azure
0063    * @param boolean $usePathStyleUri Use path-style URI's
0064    * @param Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy Retry policy to use when making requests
0065    */
0066   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)
0067   {
0068     parent::__construct($host, $accountName, $accountKey, $usePathStyleUri, $retryPolicy);
0069     
0070     // API version
0071     $this->_apiVersion = '2009-09-19';
0072   }
0073   
0074   /**
0075    * Check if a queue exists
0076    * 
0077    * @param string $queueName Queue name
0078    * @return boolean
0079    */
0080   public function queueExists($queueName = '')
0081   {
0082     if ($queueName === '') {
0083       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0084       throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
0085     }
0086     if (!self::isValidQueueName($queueName)) {
0087       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0088         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.');
0089     }
0090       
0091     // List queues
0092         $queues = $this->listQueues($queueName, 1);
0093         foreach ($queues as $queue) {
0094             if ($queue->Name == $queueName) {
0095                 return true;
0096             }
0097         }
0098         
0099         return false;
0100   }
0101   
0102   /**
0103    * Create queue
0104    *
0105    * @param string $queueName Queue name
0106    * @param array  $metadata  Key/value pairs of meta data
0107    * @return object Queue properties
0108    * @throws Zend_Service_WindowsAzure_Exception
0109    */
0110   public function createQueue($queueName = '', $metadata = array())
0111   {
0112     if ($queueName === '') {
0113       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0114       throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
0115     }
0116     if (!self::isValidQueueName($queueName)) {
0117       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0118         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.');
0119     }
0120       
0121     // Create metadata headers
0122     $headers = array();
0123     $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); 
0124     
0125     // Perform request
0126     $response = $this->_performRequest($queueName, '', Zend_Http_Client::PUT, $headers);  
0127     if ($response->isSuccessful()) {
0128       
0129         return new Zend_Service_WindowsAzure_Storage_QueueInstance(
0130             $queueName,
0131             $metadata
0132         );
0133     } else {
0134       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0135       throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
0136     }
0137   }
0138   
0139   /**
0140    * Create queue if it does not exist
0141    *
0142    * @param string $queueName Queue name
0143    * @param array  $metadata  Key/value pairs of meta data
0144    * @throws Zend_Service_WindowsAzure_Exception
0145    */
0146   public function createQueueIfNotExists($queueName = '', $metadata = array())
0147   {
0148     if (!$this->queueExists($queueName)) {
0149       $this->createQueue($queueName, $metadata);
0150     }
0151   }
0152   
0153   /**
0154    * Get queue
0155    * 
0156    * @param string $queueName  Queue name
0157    * @return Zend_Service_WindowsAzure_Storage_QueueInstance
0158    * @throws Zend_Service_WindowsAzure_Exception
0159    */
0160   public function getQueue($queueName = '')
0161   {
0162     if ($queueName === '') {
0163       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0164       throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
0165     }
0166     if (!self::isValidQueueName($queueName)) {
0167       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0168         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.');
0169     }
0170         
0171     // Perform request
0172     $response = $this->_performRequest($queueName, '?comp=metadata', Zend_Http_Client::GET);  
0173     if ($response->isSuccessful()) {
0174         // Parse metadata
0175         $metadata = $this->_parseMetadataHeaders($response->getHeaders());
0176       
0177         // Return queue
0178         $queue = new Zend_Service_WindowsAzure_Storage_QueueInstance(
0179             $queueName,
0180             $metadata
0181         );
0182         $queue->ApproximateMessageCount = intval($response->getHeader('x-ms-approximate-message-count'));
0183         return $queue;
0184     } else {
0185       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0186         throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
0187     }
0188   }
0189   
0190   /**
0191    * Get queue metadata
0192    * 
0193    * @param string $queueName  Queue name
0194    * @return array Key/value pairs of meta data
0195    * @throws Zend_Service_WindowsAzure_Exception
0196    */
0197   public function getQueueMetadata($queueName = '')
0198   {
0199     if ($queueName === '') {
0200       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0201       throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
0202     }
0203     if (!self::isValidQueueName($queueName)) {
0204       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0205         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.');
0206     }
0207       
0208       return $this->getQueue($queueName)->Metadata;
0209   }
0210   
0211   /**
0212    * Set queue metadata
0213    * 
0214    * 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.
0215    *
0216    * @param string $queueName  Queue name
0217    * @param array  $metadata       Key/value pairs of meta data
0218    * @throws Zend_Service_WindowsAzure_Exception
0219    */
0220   public function setQueueMetadata($queueName = '', $metadata = array())
0221   {
0222     if ($queueName === '') {
0223       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0224       throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
0225     }
0226     if (!self::isValidQueueName($queueName)) {
0227       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0228         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.');
0229     }
0230     if (count($metadata) == 0) {
0231         return;
0232     }
0233         
0234     // Create metadata headers
0235     $headers = array();
0236     $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); 
0237     
0238     // Perform request
0239     $response = $this->_performRequest($queueName, '?comp=metadata', Zend_Http_Client::PUT, $headers);
0240 
0241     if (!$response->isSuccessful()) {
0242       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0243       throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
0244     }
0245   }
0246   
0247   /**
0248    * Delete queue
0249    *
0250    * @param string $queueName Queue name
0251    * @throws Zend_Service_WindowsAzure_Exception
0252    */
0253   public function deleteQueue($queueName = '')
0254   {
0255     if ($queueName === '') {
0256       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0257       throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
0258     }
0259     if (!self::isValidQueueName($queueName)) {
0260       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0261         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.');
0262     }
0263       
0264     // Perform request
0265     $response = $this->_performRequest($queueName, '', Zend_Http_Client::DELETE);
0266     if (!$response->isSuccessful()) {
0267       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0268       throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
0269     }
0270   }
0271   
0272   /**
0273    * List queues
0274    *
0275    * @param string $prefix     Optional. Filters the results to return only queues whose name begins with the specified prefix.
0276    * @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)
0277    * @param string $marker     Optional string value that identifies the portion of the list to be returned with the next list operation.
0278    * @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')
0279    * @param int    $currentResultCount Current result count (internal use)
0280    * @return array
0281    * @throws Zend_Service_WindowsAzure_Exception
0282    */
0283   public function listQueues($prefix = null, $maxResults = null, $marker = null, $include = null, $currentResultCount = 0)
0284   {
0285       // Build query string
0286     $queryString = array('comp=list');
0287         if (!is_null($prefix)) {
0288           $queryString[] = 'prefix=' . $prefix;
0289         }
0290       if (!is_null($maxResults)) {
0291           $queryString[] = 'maxresults=' . $maxResults;
0292       }
0293       if (!is_null($marker)) {
0294           $queryString[] = 'marker=' . $marker;
0295       }
0296     if (!is_null($include)) {
0297           $queryString[] = 'include=' . $include;
0298       }
0299       $queryString = self::createQueryStringFromArray($queryString);
0300           
0301     // Perform request
0302     $response = $this->_performRequest('', $queryString, Zend_Http_Client::GET);  
0303     if ($response->isSuccessful()) {
0304       $xmlQueues = $this->_parseResponse($response)->Queues->Queue;
0305       $xmlMarker = (string)$this->_parseResponse($response)->NextMarker;
0306 
0307       $queues = array();
0308       if (!is_null($xmlQueues)) {
0309         
0310         for ($i = 0; $i < count($xmlQueues); $i++) {
0311           $queues[] = new Zend_Service_WindowsAzure_Storage_QueueInstance(
0312             (string)$xmlQueues[$i]->Name,
0313             $this->_parseMetadataElement($xmlQueues[$i])
0314           );
0315         }
0316       }
0317       $currentResultCount = $currentResultCount + count($queues);
0318       if (!is_null($maxResults) && $currentResultCount < $maxResults) {
0319           if (!is_null($xmlMarker) && $xmlMarker != '') {
0320               $queues = array_merge($queues, $this->listQueues($prefix, $maxResults, $xmlMarker, $include, $currentResultCount));
0321           }
0322       }
0323       if (!is_null($maxResults) && count($queues) > $maxResults) {
0324           $queues = array_slice($queues, 0, $maxResults);
0325       }
0326           
0327       return $queues;
0328     } else {
0329       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0330       throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
0331     }
0332   }
0333   
0334   /**
0335    * Put message into queue
0336    *
0337    * @param string $queueName  Queue name
0338    * @param string $message    Message
0339    * @param int    $ttl        Message Time-To-Live (in seconds). Defaults to 7 days if the parameter is omitted.
0340    * @throws Zend_Service_WindowsAzure_Exception
0341    */
0342   public function putMessage($queueName = '', $message = '', $ttl = null)
0343   {
0344     if ($queueName === '') {
0345       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0346       throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
0347     }
0348     if (!self::isValidQueueName($queueName)) {
0349       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0350         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.');
0351     }
0352     if (strlen($message) > self::MAX_MESSAGE_SIZE) {
0353       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0354         throw new Zend_Service_WindowsAzure_Exception('Message is too big. Message content should be < 8KB.');
0355     }
0356     if ($message == '') {
0357       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0358         throw new Zend_Service_WindowsAzure_Exception('Message is not specified.');
0359     }
0360     if (!is_null($ttl) && ($ttl <= 0 || $ttl > self::MAX_MESSAGE_SIZE)) {
0361       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0362         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.');
0363     }
0364         
0365       // Build query string
0366     $queryString = array();
0367         if (!is_null($ttl)) {
0368           $queryString[] = 'messagettl=' . $ttl;
0369         }
0370       $queryString = self::createQueryStringFromArray($queryString);
0371           
0372       // Build body
0373       $rawData = '';
0374       $rawData .= '<QueueMessage>';
0375       $rawData .= '    <MessageText>' . base64_encode($message) . '</MessageText>';
0376       $rawData .= '</QueueMessage>';
0377           
0378     // Perform request
0379     $response = $this->_performRequest($queueName . '/messages', $queryString, Zend_Http_Client::POST, array(), false, $rawData);
0380 
0381     if (!$response->isSuccessful()) {
0382       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0383       throw new Zend_Service_WindowsAzure_Exception('Error putting message into queue.');
0384     }
0385   }
0386   
0387   /**
0388    * Get queue messages
0389    *
0390    * @param string $queueName         Queue name
0391    * @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.
0392    * @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.
0393    * @param string $peek              Peek only?
0394    * @return array
0395    * @throws Zend_Service_WindowsAzure_Exception
0396    */
0397   public function getMessages($queueName = '', $numOfMessages = 1, $visibilityTimeout = null, $peek = false)
0398   {
0399     if ($queueName === '') {
0400       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0401       throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
0402     }
0403     if (!self::isValidQueueName($queueName)) {
0404       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0405         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.');
0406     }
0407     if ($numOfMessages < 1 || $numOfMessages > 32 || intval($numOfMessages) != $numOfMessages) {
0408       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0409         throw new Zend_Service_WindowsAzure_Exception('Invalid number of messages to retrieve.');
0410     }
0411     if (!is_null($visibilityTimeout) && ($visibilityTimeout <= 0 || $visibilityTimeout > 7200)) {
0412       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0413         throw new Zend_Service_WindowsAzure_Exception('Visibility timeout is invalid. Maximum value is 2 hours (7200 seconds) and should be greater than zero.');
0414     }
0415         
0416       // Build query string
0417     $queryString = array();
0418       if ($peek) {
0419           $queryString[] = 'peekonly=true';
0420       }
0421       if ($numOfMessages > 1) {
0422           $queryString[] = 'numofmessages=' . $numOfMessages;
0423       }
0424       if (!$peek && !is_null($visibilityTimeout)) {
0425           $queryString[] = 'visibilitytimeout=' . $visibilityTimeout;
0426       }   
0427       $queryString = self::createQueryStringFromArray($queryString);
0428           
0429     // Perform request
0430     $response = $this->_performRequest($queueName . '/messages', $queryString, Zend_Http_Client::GET);  
0431     if ($response->isSuccessful()) {
0432         // Parse results
0433       $result = $this->_parseResponse($response);
0434         if (!$result) {
0435             return array();
0436         }
0437 
0438         $xmlMessages = null;
0439         if (count($result->QueueMessage) > 1) {
0440             $xmlMessages = $result->QueueMessage;
0441         } else {
0442             $xmlMessages = array($result->QueueMessage);
0443         }
0444       
0445       $messages = array();
0446       for ($i = 0; $i < count($xmlMessages); $i++) {
0447         $messages[] = new Zend_Service_WindowsAzure_Storage_QueueMessage(
0448           (string)$xmlMessages[$i]->MessageId,
0449           (string)$xmlMessages[$i]->InsertionTime,
0450           (string)$xmlMessages[$i]->ExpirationTime,
0451           ($peek ? '' : (string)$xmlMessages[$i]->PopReceipt),
0452           ($peek ? '' : (string)$xmlMessages[$i]->TimeNextVisible),
0453           (string)$xmlMessages[$i]->DequeueCount,
0454           base64_decode((string)$xmlMessages[$i]->MessageText)
0455           );
0456       }
0457           
0458       return $messages;
0459     } else {
0460       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0461       throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
0462     }
0463   }
0464   
0465   /**
0466    * Peek queue messages
0467    *
0468    * @param string $queueName         Queue name
0469    * @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.
0470    * @return array
0471    * @throws Zend_Service_WindowsAzure_Exception
0472    */
0473   public function peekMessages($queueName = '', $numOfMessages = 1)
0474   {
0475       return $this->getMessages($queueName, $numOfMessages, null, true);
0476   }
0477   
0478   /**
0479    * Checks to see if a given queue has messages
0480    *
0481    * @param string $queueName         Queue name
0482    * @return boolean
0483    * @throws Zend_Service_WindowsAzure_Exception
0484    */
0485   public function hasMessages($queueName = '')
0486   {
0487     return count($this->peekMessages($queueName)) > 0;
0488   }
0489   
0490   /**
0491    * Clear queue messages
0492    *
0493    * @param string $queueName         Queue name
0494    * @throws Zend_Service_WindowsAzure_Exception
0495    */
0496   public function clearMessages($queueName = '')
0497   {
0498     if ($queueName === '') {
0499       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0500       throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
0501     }
0502     if (!self::isValidQueueName($queueName)) {
0503       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0504         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.');
0505     }
0506 
0507     // Perform request
0508     $response = $this->_performRequest($queueName . '/messages', '', Zend_Http_Client::DELETE); 
0509     if (!$response->isSuccessful()) {
0510       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0511       throw new Zend_Service_WindowsAzure_Exception('Error clearing messages from queue.');
0512     }
0513   }
0514   
0515   /**
0516    * Delete queue message
0517    *
0518    * @param string $queueName Queue name
0519    * @param Zend_Service_WindowsAzure_Storage_QueueMessage $message Message to delete from queue. A message retrieved using "peekMessages" can NOT be deleted!
0520    * @throws Zend_Service_WindowsAzure_Exception
0521    */
0522   public function deleteMessage($queueName = '', Zend_Service_WindowsAzure_Storage_QueueMessage $message)
0523   {
0524     if ($queueName === '') {
0525       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0526       throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.');
0527     }
0528     if (!self::isValidQueueName($queueName)) {
0529       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0530         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.');
0531     }
0532     if ($message->PopReceipt == '') {
0533       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0534         throw new Zend_Service_WindowsAzure_Exception('A message retrieved using "peekMessages" can NOT be deleted! Use "getMessages" instead.');
0535     }
0536 
0537     // Perform request
0538     $response = $this->_performRequest($queueName . '/messages/' . $message->MessageId, '?popreceipt=' . urlencode($message->PopReceipt), Zend_Http_Client::DELETE);  
0539     if (!$response->isSuccessful()) {
0540       // require_once 'Zend/Service/WindowsAzure/Exception.php';
0541       throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.'));
0542     }
0543   }
0544   
0545   /**
0546    * Is valid queue name?
0547    *
0548    * @param string $queueName Queue name
0549    * @return boolean
0550    */
0551     public static function isValidQueueName($queueName = '')
0552     {
0553         if (preg_match("/^[a-z0-9][a-z0-9-]*$/", $queueName) === 0) {
0554             return false;
0555         }
0556     
0557         if (strpos($queueName, '--') !== false) {
0558             return false;
0559         }
0560     
0561         if (strtolower($queueName) != $queueName) {
0562             return false;
0563         }
0564     
0565         if (strlen($queueName) < 3 || strlen($queueName) > 63) {
0566             return false;
0567         }
0568             
0569         if (substr($queueName, -1) == '-') {
0570             return false;
0571         }
0572     
0573         return true;
0574     }
0575     
0576   /**
0577    * Get error message from Zend_Http_Response
0578    * 
0579    * @param Zend_Http_Response $response Repsonse
0580    * @param string $alternativeError Alternative error message
0581    * @return string
0582    */
0583   protected function _getErrorMessage(Zend_Http_Response $response, $alternativeError = 'Unknown error.')
0584   {
0585     $response = $this->_parseResponse($response);
0586     if ($response && $response->Message) {
0587         return (string)$response->Message;
0588     } else {
0589         return $alternativeError;
0590     }
0591   }
0592 }