first commit
This commit is contained in:
@@ -0,0 +1,326 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Atom;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Atom\AtomLink;
|
||||
|
||||
/**
|
||||
* The base class of ATOM library.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
class AtomBase
|
||||
{
|
||||
/**
|
||||
* The attributes of the feed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $attributes;
|
||||
|
||||
/**
|
||||
* Creates an ATOM base object with default parameters.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->attributes = array();
|
||||
$atomlink = new AtomLink();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the attributes of the ATOM class.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAttributes()
|
||||
{
|
||||
return $this->attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the attributes of the ATOM class.
|
||||
*
|
||||
* @param array $attributes The attributes of the array.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function setAttributes($attributes)
|
||||
{
|
||||
Validate::isArray($attributes, 'attributes');
|
||||
$this->attributes = $attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets an attribute to the ATOM object instance.
|
||||
*
|
||||
* @param string $attributeKey The key of the attribute.
|
||||
* @param mixed $attributeValue The value of the attribute.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setAttribute($attributeKey, $attributeValue)
|
||||
{
|
||||
$this->attributes[$attributeKey] = $attributeValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an attribute with a specified attribute key.
|
||||
*
|
||||
* @param string $attributeKey The key of the attribute.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function getAttribute($attributeKey)
|
||||
{
|
||||
return $this->attributes[$attributeKey];
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes author node.
|
||||
*
|
||||
* @param array $xmlWriter The XML writer.
|
||||
* @param array $itemArray An array of item to write.
|
||||
* @param array $elementName The name of the element.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function writeArrayItem($xmlWriter, $itemArray, $elementName)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
Validate::isArray($itemArray, 'itemArray');
|
||||
Validate::isString($elementName, 'elementName');
|
||||
|
||||
foreach ($itemArray as $itemInstance) {
|
||||
$xmlWriter->startElementNS(
|
||||
'atom',
|
||||
$elementName,
|
||||
Resources::ATOM_NAMESPACE
|
||||
);
|
||||
$itemInstance->writeInnerXml($xmlWriter);
|
||||
$xmlWriter->endElement();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes author node.
|
||||
*
|
||||
* @param array $xmlArray An array of simple xml elements.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function processAuthorNode($xmlArray)
|
||||
{
|
||||
$author = array();
|
||||
$authorItem = $xmlArray[Resources::AUTHOR];
|
||||
|
||||
if (is_array($authorItem)) {
|
||||
foreach ($xmlArray[Resources::AUTHOR] as $authorXmlInstance) {
|
||||
$authorInstance = new Person();
|
||||
$authorInstance->parseXml($authorXmlInstance->asXML());
|
||||
$author[] = $authorInstance;
|
||||
}
|
||||
} else {
|
||||
$authorInstance = new Person();
|
||||
$authorInstance->parseXml($authorItem->asXML());
|
||||
$author[] = $authorInstance;
|
||||
}
|
||||
return $author;
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes entry node.
|
||||
*
|
||||
* @param array $xmlArray An array of simple xml elements.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function processEntryNode($xmlArray)
|
||||
{
|
||||
$entry = array();
|
||||
$entryItem = $xmlArray[Resources::ENTRY];
|
||||
|
||||
if (is_array($entryItem)) {
|
||||
foreach ($xmlArray[Resources::ENTRY] as $entryXmlInstance) {
|
||||
$entryInstance = new Entry();
|
||||
$entryInstance->fromXml($entryXmlInstance);
|
||||
$entry[] = $entryInstance;
|
||||
}
|
||||
} else {
|
||||
$entryInstance = new Entry();
|
||||
$entryInstance->fromXml($entryItem);
|
||||
$entry[] = $entryInstance;
|
||||
}
|
||||
return $entry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes category node.
|
||||
*
|
||||
* @param array $xmlArray An array of simple xml elements.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function processCategoryNode($xmlArray)
|
||||
{
|
||||
$category = array();
|
||||
$categoryItem = $xmlArray[Resources::CATEGORY];
|
||||
|
||||
if (is_array($categoryItem)) {
|
||||
foreach ($xmlArray[Resources::CATEGORY] as $categoryXmlInstance) {
|
||||
$categoryInstance = new Category();
|
||||
$categoryInstance->parseXml($categoryXmlInstance->asXML());
|
||||
$category[] = $categoryInstance;
|
||||
}
|
||||
} else {
|
||||
$categoryInstance = new Category();
|
||||
$categoryInstance->parseXml($categoryItem->asXML());
|
||||
$category[] = $categoryInstance;
|
||||
}
|
||||
return $category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes contributor node.
|
||||
*
|
||||
* @param array $xmlArray An array of simple xml elements.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function processContributorNode($xmlArray)
|
||||
{
|
||||
$category = array();
|
||||
$contributorItem = $xmlArray[Resources::CONTRIBUTOR];
|
||||
|
||||
if (is_array($contributorItem)) {
|
||||
foreach ($xmlArray[Resources::CONTRIBUTOR] as $contributorXmlInstance) {
|
||||
$contributorInstance = new Person();
|
||||
$contributorInstance->parseXml($contributorXmlInstance->asXML());
|
||||
$contributor[] = $contributorInstance;
|
||||
}
|
||||
} elseif (is_string($contributorItem)) {
|
||||
$contributorInstance = new Person();
|
||||
$contributorInstance->setName((string)$contributorItem);
|
||||
$contributor[] = $contributorInstance;
|
||||
} else {
|
||||
$contributorInstance = new Person();
|
||||
$contributorInstance->parseXml($contributorItem->asXML());
|
||||
$contributor[] = $contributorInstance;
|
||||
}
|
||||
return $contributor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes link node.
|
||||
*
|
||||
* @param array $xmlArray An array of simple xml elements.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function processLinkNode($xmlArray)
|
||||
{
|
||||
$link = array();
|
||||
$linkValue = $xmlArray[Resources::LINK];
|
||||
|
||||
if (is_array($linkValue)) {
|
||||
foreach ($xmlArray[Resources::LINK] as $linkValueInstance) {
|
||||
$linkInstance = new AtomLink();
|
||||
$linkInstance->parseXml($linkValueInstance->asXML());
|
||||
$link[] = $linkInstance;
|
||||
}
|
||||
} else {
|
||||
$linkInstance = new AtomLink();
|
||||
$linkInstance->parseXml($linkValue->asXML());
|
||||
$link[] = $linkInstance;
|
||||
}
|
||||
|
||||
return $link;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an optional attribute for ATOM.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
* @param string $attributeName The name of the attribute.
|
||||
* @param mixed $attributeValue The value of the attribute.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
protected function writeOptionalAttribute(
|
||||
$xmlWriter,
|
||||
$attributeName,
|
||||
$attributeValue
|
||||
) {
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
Validate::isString($attributeName, 'attributeName');
|
||||
|
||||
if (!empty($attributeValue)) {
|
||||
$xmlWriter->writeAttribute(
|
||||
$attributeName,
|
||||
$attributeValue
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the optional elements namespaces.
|
||||
*
|
||||
* @param \XmlWriter $xmlWriter The XML writer.
|
||||
* @param string $prefix The prefix.
|
||||
* @param string $elementName The element name.
|
||||
* @param string $namespace The namespace name.
|
||||
* @param string $elementValue The element value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
protected function writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
$prefix,
|
||||
$elementName,
|
||||
$namespace,
|
||||
$elementValue
|
||||
) {
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
Validate::isString($elementName, 'elementName');
|
||||
|
||||
if (!empty($elementValue)) {
|
||||
$xmlWriter->writeElementNS(
|
||||
$prefix,
|
||||
$elementName,
|
||||
$namespace,
|
||||
$elementValue
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,343 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Atom;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
|
||||
/**
|
||||
* This link defines a reference from an entry or feed to a Web resource.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
class AtomLink extends AtomBase
|
||||
{
|
||||
/**
|
||||
* The undefined content.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $undefinedContent;
|
||||
|
||||
/**
|
||||
* The HREF of the link.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $href;
|
||||
|
||||
/**
|
||||
* The rel attribute of the link.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $rel;
|
||||
|
||||
/**
|
||||
* The media type of the link.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $type;
|
||||
|
||||
/**
|
||||
* The language of HREF.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $hreflang;
|
||||
|
||||
/**
|
||||
* The titile of the link.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $title;
|
||||
|
||||
/**
|
||||
* The length of the link.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $length;
|
||||
|
||||
/**
|
||||
* Creates a AtomLink instance with specified text.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse an ATOM Link xml.
|
||||
*
|
||||
* @param string $xmlString an XML based string of ATOM Link.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function parseXml($xmlString)
|
||||
{
|
||||
Validate::notNull($xmlString, 'xmlString');
|
||||
Validate::isString($xmlString, 'xmlString');
|
||||
$atomLinkXml = simplexml_load_string($xmlString);
|
||||
$attributes = $atomLinkXml->attributes();
|
||||
|
||||
if (!empty($attributes['href'])) {
|
||||
$this->href = (string)$attributes['href'];
|
||||
}
|
||||
|
||||
if (!empty($attributes['rel'])) {
|
||||
$this->rel = (string)$attributes['rel'];
|
||||
}
|
||||
|
||||
if (!empty($attributes['type'])) {
|
||||
$this->type = (string)$attributes['type'];
|
||||
}
|
||||
|
||||
if (!empty($attributes['hreflang'])) {
|
||||
$this->hreflang = (string)$attributes['hreflang'];
|
||||
}
|
||||
|
||||
if (!empty($attributes['title'])) {
|
||||
$this->title = (string)$attributes['title'];
|
||||
}
|
||||
|
||||
if (!empty($attributes['length'])) {
|
||||
$this->length = (int)$attributes['length'];
|
||||
}
|
||||
|
||||
$undefinedContent = (string)$atomLinkXml;
|
||||
if (empty($undefinedContent)) {
|
||||
$this->undefinedContent = null;
|
||||
} else {
|
||||
$this->undefinedContent = (string)$atomLinkXml;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the href of the link.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getHref()
|
||||
{
|
||||
return $this->href;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the href of the link.
|
||||
*
|
||||
* @param string $href The href of the link.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setHref($href)
|
||||
{
|
||||
$this->href = $href;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the rel of the atomLink.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRel()
|
||||
{
|
||||
return $this->rel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the rel of the link.
|
||||
*
|
||||
* @param string $rel The rel of the atomLink.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setRel($rel)
|
||||
{
|
||||
$this->rel = $rel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the type of the link.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the type of the link.
|
||||
*
|
||||
* @param string $type The type of the link.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setType($type)
|
||||
{
|
||||
$this->type = $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the language of the href.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getHrefLang()
|
||||
{
|
||||
return $this->hrefLang;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the language of the href.
|
||||
*
|
||||
* @param string $hrefLang The language of the href.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setHrefLang($hrefLang)
|
||||
{
|
||||
$this->hrefLang = $hrefLang;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the title of the link.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTitle()
|
||||
{
|
||||
return $this->title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the title of the link.
|
||||
*
|
||||
* @param string $title The title of the link.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setTitle($title)
|
||||
{
|
||||
$this->title = $title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the length of the link.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getLength()
|
||||
{
|
||||
return $this->length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the length of the link.
|
||||
*
|
||||
* @param string $length The length of the link.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setLength($length)
|
||||
{
|
||||
$this->length = $length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the undefined content.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUndefinedContent()
|
||||
{
|
||||
return $this->undefinedContent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the undefined content.
|
||||
*
|
||||
* @param string $undefinedContent The undefined content.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setUndefinedContent($undefinedContent)
|
||||
{
|
||||
$this->undefinedContent = $undefinedContent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an XML representing the ATOM link item.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The xml writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
$xmlWriter->startElementNS(
|
||||
'atom',
|
||||
Resources::LINK,
|
||||
Resources::ATOM_NAMESPACE
|
||||
);
|
||||
$this->writeInnerXml($xmlWriter);
|
||||
$xmlWriter->endElement();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the inner XML representing the ATOM link item.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The xml writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeInnerXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
|
||||
$this->writeOptionalAttribute($xmlWriter, 'href', $this->href);
|
||||
$this->writeOptionalAttribute($xmlWriter, 'rel', $this->rel);
|
||||
$this->writeOptionalAttribute($xmlWriter, 'type', $this->type);
|
||||
$this->writeOptionalAttribute($xmlWriter, 'hreflang', $this->hreflang);
|
||||
$this->writeOptionalAttribute($xmlWriter, 'title', $this->title);
|
||||
$this->writeOptionalAttribute($xmlWriter, 'length', $this->length);
|
||||
|
||||
if (!empty($this->undefinedContent)) {
|
||||
$xmlWriter->writeRaw($this->undefinedContent);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,253 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Atom;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
|
||||
/**
|
||||
* The category class of the ATOM standard.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
class Category extends AtomBase
|
||||
{
|
||||
/**
|
||||
* The term of the category.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $term;
|
||||
|
||||
/**
|
||||
* The scheme of the category.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $scheme;
|
||||
|
||||
/**
|
||||
* The label of the category.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $label;
|
||||
|
||||
/**
|
||||
* The undefined content of the category.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $undefinedContent;
|
||||
|
||||
/**
|
||||
* Creates a Category instance with specified text.
|
||||
*
|
||||
* @param string $undefinedContent The undefined content of the category.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function __construct($undefinedContent = Resources::EMPTY_STRING)
|
||||
{
|
||||
$this->undefinedContent = $undefinedContent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an ATOM Category instance with specified xml string.
|
||||
*
|
||||
* @param string $xmlString an XML based string of ATOM CONTENT.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function parseXml($xmlString)
|
||||
{
|
||||
Validate::notNull($xmlString, 'xmlString');
|
||||
Validate::isString($xmlString, 'xmlString');
|
||||
$categoryXml = simplexml_load_string($xmlString);
|
||||
$attributes = $categoryXml->attributes();
|
||||
if (!empty($attributes['term'])) {
|
||||
$this->term = (string)$attributes['term'];
|
||||
}
|
||||
|
||||
if (!empty($attributes['scheme'])) {
|
||||
$this->scheme = (string)$attributes['scheme'];
|
||||
}
|
||||
|
||||
if (!empty($attributes['label'])) {
|
||||
$this->label = (string)$attributes['label'];
|
||||
}
|
||||
|
||||
$this->undefinedContent =(string)$categoryXml;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the term of the category.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTerm()
|
||||
{
|
||||
return $this->term;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the term of the category.
|
||||
*
|
||||
* @param string $term The term of the category.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setTerm($term)
|
||||
{
|
||||
$this->term = $term;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the scheme of the category.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getScheme()
|
||||
{
|
||||
return $this->scheme;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the scheme of the category.
|
||||
*
|
||||
* @param string $scheme The scheme of the category.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setScheme($scheme)
|
||||
{
|
||||
$this->scheme = $scheme;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the label of the category.
|
||||
*
|
||||
* @return string The label.
|
||||
*/
|
||||
public function getLabel()
|
||||
{
|
||||
return $this->label;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the label of the category.
|
||||
*
|
||||
* @param string $label The label of the category.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setLabel($label)
|
||||
{
|
||||
$this->label = $label;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the undefined content of the category.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUndefinedContent()
|
||||
{
|
||||
return $this->undefinedContent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the undefined content of the category.
|
||||
*
|
||||
* @param string $undefinedContent The undefined content of the category.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setUndefinedContent($undefinedContent)
|
||||
{
|
||||
$this->undefinedContent = $undefinedContent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an XML representing the category.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
$xmlWriter->startElementNS(
|
||||
'atom',
|
||||
'category',
|
||||
Resources::ATOM_NAMESPACE
|
||||
);
|
||||
$this->writeInnerXml($xmlWriter);
|
||||
$xmlWriter->endElement();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an XML representing the category.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeInnerXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
$this->writeOptionalAttribute(
|
||||
$xmlWriter,
|
||||
'term',
|
||||
$this->term
|
||||
);
|
||||
|
||||
$this->writeOptionalAttribute(
|
||||
$xmlWriter,
|
||||
'scheme',
|
||||
$this->scheme
|
||||
);
|
||||
|
||||
$this->writeOptionalAttribute(
|
||||
$xmlWriter,
|
||||
'label',
|
||||
$this->label
|
||||
);
|
||||
|
||||
if (!empty($this->undefinedContent)) {
|
||||
$xmlWriter->WriteRaw($this->undefinedContent);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Atom;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\Internal\Atom\AtomProperties;
|
||||
/**
|
||||
* The content class of ATOM standard.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
class Content extends AtomBase
|
||||
{
|
||||
/**
|
||||
* The text of the content.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $text;
|
||||
|
||||
/**
|
||||
* The type of the content.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $type;
|
||||
|
||||
/**
|
||||
* Source XML object
|
||||
*
|
||||
* @var \SimpleXMLElement
|
||||
*/
|
||||
protected $xml;
|
||||
|
||||
/**
|
||||
* Creates a Content instance with specified text.
|
||||
*
|
||||
* @param string $text The text of the content.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function __construct($text = null)
|
||||
{
|
||||
$this->text = $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an ATOM CONTENT instance with specified xml string.
|
||||
*
|
||||
* @param string $xmlString an XML based string of ATOM CONTENT.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function parseXml($xmlString)
|
||||
{
|
||||
Validate::notNull($xmlString, 'xmlString');
|
||||
Validate::isString($xmlString, 'xmlString');
|
||||
|
||||
$this->fromXml(simplexml_load_string($xmlString));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an ATOM CONTENT instance with specified simpleXML object
|
||||
*
|
||||
* @param \SimpleXMLElement $contentXml xml element of ATOM CONTENT
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function fromXml($contentXml)
|
||||
{
|
||||
Validate::notNull($contentXml, 'contentXml');
|
||||
Validate::isA($contentXml, '\SimpleXMLElement', 'contentXml');
|
||||
|
||||
$attributes = $contentXml->attributes();
|
||||
|
||||
if (!empty($attributes['type'])) {
|
||||
$this->content = (string)$attributes['type'];
|
||||
}
|
||||
|
||||
$text = '';
|
||||
foreach ($contentXml->children() as $child) {
|
||||
$text .= $child->asXML();
|
||||
}
|
||||
|
||||
$this->text = $text;
|
||||
|
||||
$this->xml = $contentXml;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the text of the content.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getText()
|
||||
{
|
||||
return $this->text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the text of the content.
|
||||
*
|
||||
* @param string $text The text of the content.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setText($text)
|
||||
{
|
||||
$this->text = $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the xml object of the content.
|
||||
*
|
||||
* @return \SimpleXMLElement
|
||||
*/
|
||||
public function getXml()
|
||||
{
|
||||
return $this->xml;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the type of the content.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the type of the content.
|
||||
*
|
||||
* @param string $type The type of the content.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setType($type)
|
||||
{
|
||||
$this->type = $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an XML representing the content.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
$xmlWriter->startElementNS(
|
||||
'atom',
|
||||
'content',
|
||||
Resources::ATOM_NAMESPACE
|
||||
);
|
||||
|
||||
$this->writeOptionalAttribute(
|
||||
$xmlWriter,
|
||||
'type',
|
||||
$this->type
|
||||
);
|
||||
|
||||
$this->writeInnerXml($xmlWriter);
|
||||
$xmlWriter->endElement();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an inner XML representing the content.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeInnerXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
$xmlWriter->writeRaw($this->text);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,645 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Atom;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
|
||||
/**
|
||||
* The Entry class of ATOM standard.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
class Entry extends AtomBase
|
||||
{
|
||||
// @codingStandardsIgnoreStart
|
||||
|
||||
/**
|
||||
* The author of the entry.
|
||||
*
|
||||
* @var Person
|
||||
*/
|
||||
protected $author;
|
||||
|
||||
/**
|
||||
* The category of the entry.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $category;
|
||||
|
||||
/**
|
||||
* The content of the entry.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $content;
|
||||
|
||||
/**
|
||||
* The contributor of the entry.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $contributor;
|
||||
|
||||
/**
|
||||
* An unqiue ID representing the entry.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
* The link of the entry.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $link;
|
||||
|
||||
/**
|
||||
* Is the entry published.
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
protected $published;
|
||||
|
||||
/**
|
||||
* The copy right of the entry.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $rights;
|
||||
|
||||
/**
|
||||
* The source of the entry.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $source;
|
||||
|
||||
/**
|
||||
* The summary of the entry.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $summary;
|
||||
|
||||
/**
|
||||
* The title of the entry.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $title;
|
||||
|
||||
/**
|
||||
* Is the entry updated.
|
||||
*
|
||||
* @var \DateTime
|
||||
*/
|
||||
protected $updated;
|
||||
|
||||
/**
|
||||
* The extension element of the entry.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $extensionElement;
|
||||
|
||||
/**
|
||||
* Creates an ATOM Entry instance with default parameters.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->attributes = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Populate the properties of an ATOM Entry instance with specified XML..
|
||||
*
|
||||
* @param string $xmlString A string representing an ATOM entry instance.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function parseXml($xmlString)
|
||||
{
|
||||
Validate::notNull($xmlString, 'xmlString');
|
||||
|
||||
$this->fromXml(simplexml_load_string($xmlString));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an ATOM ENTRY instance with specified simpleXML object
|
||||
*
|
||||
* @param \SimpleXMLElement $entryXml xml element of ATOM ENTRY
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function fromXml($entryXml) {
|
||||
Validate::notNull($entryXml, 'entryXml');
|
||||
Validate::isA($entryXml, '\SimpleXMLElement', 'entryXml');
|
||||
|
||||
$this->attributes = (array)$entryXml->attributes();
|
||||
$entryArray = (array)$entryXml;
|
||||
|
||||
if (array_key_exists(Resources::AUTHOR, $entryArray)) {
|
||||
$this->author = $this->processAuthorNode($entryArray);
|
||||
}
|
||||
|
||||
if (array_key_exists(Resources::CATEGORY, $entryArray)) {
|
||||
$this->category = $this->processCategoryNode($entryArray);
|
||||
}
|
||||
|
||||
if (array_key_exists('content', $entryArray)) {
|
||||
$content = new Content();
|
||||
$content->fromXml($entryArray['content']);
|
||||
$this->content = $content;
|
||||
}
|
||||
|
||||
if (array_key_exists(Resources::CONTRIBUTOR, $entryArray)) {
|
||||
$this->contributor = $this->processContributorNode($entryArray);
|
||||
}
|
||||
|
||||
if (array_key_exists('id', $entryArray)) {
|
||||
$this->id = (string)$entryArray['id'];
|
||||
}
|
||||
|
||||
if (array_key_exists(Resources::LINK, $entryArray)) {
|
||||
$this->link = $this->processLinkNode($entryArray);
|
||||
}
|
||||
|
||||
if (array_key_exists('published', $entryArray)) {
|
||||
$this->published = $entryArray['published'];
|
||||
}
|
||||
|
||||
if (array_key_exists('rights', $entryArray)) {
|
||||
$this->rights = $entryArray['rights'];
|
||||
}
|
||||
|
||||
if (array_key_exists('source', $entryArray)) {
|
||||
$source = new Source();
|
||||
$source->parseXml($entryArray['source']->asXML());
|
||||
$this->source = $source;
|
||||
}
|
||||
|
||||
if (array_key_exists('title', $entryArray)) {
|
||||
$this->title = $entryArray['title'];
|
||||
}
|
||||
|
||||
if (array_key_exists('updated', $entryArray)) {
|
||||
$this->updated = \DateTime::createFromFormat(
|
||||
\DateTime::ATOM,
|
||||
(string)$entryArray['updated']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the author of the entry.
|
||||
*
|
||||
* @return Person
|
||||
*/
|
||||
public function getAuthor()
|
||||
{
|
||||
return $this->author;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the author of the entry.
|
||||
*
|
||||
* @param Person $author The author of the entry.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setAuthor($author)
|
||||
{
|
||||
$this->author = $author;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the category.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getCategory()
|
||||
{
|
||||
return $this->category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the category.
|
||||
*
|
||||
* @param string $category The category of the entry.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setCategory($category)
|
||||
{
|
||||
$this->category = $category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the content.
|
||||
*
|
||||
* @return Content.
|
||||
*/
|
||||
public function getContent()
|
||||
{
|
||||
return $this->content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the content.
|
||||
*
|
||||
* @param Content $content Sets the content of the entry.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setContent($content)
|
||||
{
|
||||
$this->content = $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the contributor.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getContributor()
|
||||
{
|
||||
return $this->contributor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the contributor.
|
||||
*
|
||||
* @param string $contributor The contributor of the entry.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setContributor($contributor)
|
||||
{
|
||||
$this->contributor = $contributor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the ID of the entry.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getId()
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the ID of the entry.
|
||||
*
|
||||
* @param string $id The id of the entry.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setId($id)
|
||||
{
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the link of the entry.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getLink()
|
||||
{
|
||||
return $this->link;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the link of the entry.
|
||||
*
|
||||
* @param string $link The link of the entry.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setLink($link)
|
||||
{
|
||||
$this->link = $link;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets published of the entry.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function getPublished()
|
||||
{
|
||||
return $this->published;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets published of the entry.
|
||||
*
|
||||
* @param boolean $published Is the entry published.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setPublished($published)
|
||||
{
|
||||
$this->published = $published;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the rights of the entry.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRights()
|
||||
{
|
||||
return $this->rights;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the rights of the entry.
|
||||
*
|
||||
* @param string $rights The rights of the entry.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setRights($rights)
|
||||
{
|
||||
$this->rights = $rights;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the source of the entry.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSource()
|
||||
{
|
||||
return $this->source;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the source of the entry.
|
||||
*
|
||||
* @param string $source The source of the entry.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setSource($source)
|
||||
{
|
||||
$this->source = $source;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the summary of the entry.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSummary()
|
||||
{
|
||||
return $this->summary;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the summary of the entry.
|
||||
*
|
||||
* @param string $summary The summary of the entry.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setSummary($summary)
|
||||
{
|
||||
$this->summary = $summary;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the title of the entry.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTitle()
|
||||
{
|
||||
return $this->title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the title of the entry.
|
||||
*
|
||||
* @param string $title The title of the entry.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setTitle($title)
|
||||
{
|
||||
$this->title = $title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets updated.
|
||||
*
|
||||
* @return \DateTime
|
||||
*/
|
||||
public function getUpdated()
|
||||
{
|
||||
return $this->updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets updated
|
||||
*
|
||||
* @param \DateTime $updated updated.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setUpdated($updated)
|
||||
{
|
||||
$this->updated = $updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets extension element.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getExtensionElement()
|
||||
{
|
||||
return $this->extensionElement;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets extension element.
|
||||
*
|
||||
* @param string $extensionElement The extension element of the entry.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setExtensionElement($extensionElement)
|
||||
{
|
||||
$this->extensionElement = $extensionElement;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a inner XML string representing the entry.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
$xmlWriter->startElementNS(
|
||||
'atom',
|
||||
Resources::ENTRY,
|
||||
Resources::ATOM_NAMESPACE
|
||||
);
|
||||
$this->writeInnerXml($xmlWriter);
|
||||
$xmlWriter->endElement();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a inner XML string representing the entry.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeInnerXml($xmlWriter)
|
||||
{
|
||||
if (!is_null($this->attributes)) {
|
||||
if (is_array($this->attributes)) {
|
||||
foreach (
|
||||
$this->attributes
|
||||
as $attributeName => $attributeValue
|
||||
) {
|
||||
$xmlWriter->writeAttribute($attributeName, $attributeValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_null($this->author)) {
|
||||
$this->writeArrayItem(
|
||||
$xmlWriter,
|
||||
$this->author,
|
||||
Resources::AUTHOR
|
||||
);
|
||||
}
|
||||
|
||||
if (!is_null($this->category)) {
|
||||
$this->writeArrayItem(
|
||||
$xmlWriter,
|
||||
$this->category,
|
||||
Resources::CATEGORY
|
||||
);
|
||||
}
|
||||
|
||||
if (!is_null($this->content)) {
|
||||
$this->content->writeXml($xmlWriter);
|
||||
}
|
||||
|
||||
if (!is_null($this->contributor)) {
|
||||
$this->writeArrayItem(
|
||||
$xmlWriter,
|
||||
$this->contributor,
|
||||
Resources::CONTRIBUTOR
|
||||
);
|
||||
}
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'id',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->id
|
||||
);
|
||||
|
||||
if (!is_null($this->link)) {
|
||||
$this->writeArrayItem(
|
||||
$xmlWriter,
|
||||
$this->link,
|
||||
Resources::LINK
|
||||
);
|
||||
}
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'published',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->published
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'rights',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->rights
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'source',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->source
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'summary',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->summary
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'title',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->title
|
||||
);
|
||||
|
||||
if (!is_null($this->updated)) {
|
||||
$xmlWriter->writeElementNS(
|
||||
'atom',
|
||||
'updated',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->updated->format(\DateTime::ATOM)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// @codingStandardsIgnoreEnd
|
||||
@@ -0,0 +1,730 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Atom;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
|
||||
/**
|
||||
* The feed class of ATOM library.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
class Feed extends AtomBase
|
||||
{
|
||||
// @codingStandardsIgnoreStart
|
||||
|
||||
/**
|
||||
* The entry of the feed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $entry;
|
||||
|
||||
/**
|
||||
* the author of the feed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $author;
|
||||
|
||||
/**
|
||||
* The category of the feed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $category;
|
||||
|
||||
/**
|
||||
* The contributor of the feed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $contributor;
|
||||
|
||||
/**
|
||||
* The generator of the feed.
|
||||
*
|
||||
* @var Generator
|
||||
*/
|
||||
protected $generator;
|
||||
|
||||
/**
|
||||
* The icon of the feed.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $icon;
|
||||
|
||||
/**
|
||||
* The ID of the feed.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
* The link of the feed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $link;
|
||||
|
||||
/**
|
||||
* The logo of the feed.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $logo;
|
||||
|
||||
/**
|
||||
* The rights of the feed.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $rights;
|
||||
|
||||
/**
|
||||
* The subtitle of the feed.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $subtitle;
|
||||
|
||||
/**
|
||||
* The title of the feed.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $title;
|
||||
|
||||
/**
|
||||
* The update of the feed.
|
||||
*
|
||||
* @var \DateTime
|
||||
*/
|
||||
protected $updated;
|
||||
|
||||
/**
|
||||
* The extension element of the feed.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $extensionElement;
|
||||
|
||||
/**
|
||||
* Creates an ATOM FEED object with default parameters.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->attributes = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a feed object with specified XML string.
|
||||
*
|
||||
* @param string $xmlString An XML string representing the feed object.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function parseXml($xmlString)
|
||||
{
|
||||
$feedXml = simplexml_load_string($xmlString);
|
||||
$attributes = $feedXml->attributes();
|
||||
$feedArray = (array)$feedXml;
|
||||
if (!empty($attributes)) {
|
||||
$this->attributes = (array)$attributes;
|
||||
}
|
||||
|
||||
if (array_key_exists('author', $feedArray)) {
|
||||
$this->author = $this->processAuthorNode($feedArray);
|
||||
}
|
||||
|
||||
if (array_key_exists('entry', $feedArray)) {
|
||||
$this->entry = $this->processEntryNode($feedArray);
|
||||
}
|
||||
|
||||
if (array_key_exists('category', $feedArray)) {
|
||||
$this->category = $this->processCategoryNode($feedArray);
|
||||
}
|
||||
|
||||
if (array_key_exists('contributor', $feedArray)) {
|
||||
$this->contributor = $this->processContributorNode($feedArray);
|
||||
}
|
||||
|
||||
if (array_key_exists('generator', $feedArray)) {
|
||||
$generator = new Generator();
|
||||
$generatorValue = $feedArray['generator'];
|
||||
if (is_string($generatorValue)) {
|
||||
$generator->setText($generatorValue);
|
||||
} else {
|
||||
$generator->parseXml($generatorValue->asXML());
|
||||
}
|
||||
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
if (array_key_exists('icon', $feedArray)) {
|
||||
$this->icon = (string)$feedArray['icon'];
|
||||
}
|
||||
|
||||
if (array_key_exists('id', $feedArray)) {
|
||||
$this->id = (string)$feedArray['id'];
|
||||
}
|
||||
|
||||
if (array_key_exists('link', $feedArray)) {
|
||||
$this->link = $this->processLinkNode($feedArray);
|
||||
}
|
||||
|
||||
if (array_key_exists('logo', $feedArray)) {
|
||||
$this->logo = (string)$feedArray['logo'];
|
||||
}
|
||||
|
||||
if (array_key_exists('rights', $feedArray)) {
|
||||
$this->rights = (string)$feedArray['rights'];
|
||||
}
|
||||
|
||||
if (array_key_exists('subtitle', $feedArray)) {
|
||||
$this->subtitle = (string)$feedArray['subtitle'];
|
||||
}
|
||||
|
||||
if (array_key_exists('title', $feedArray)) {
|
||||
$this->title = (string)$feedArray['title'];
|
||||
}
|
||||
|
||||
if (array_key_exists('updated', $feedArray)) {
|
||||
$this->updated = \DateTime::createFromFormat(
|
||||
\DateTime::ATOM,
|
||||
(string)$feedArray['updated']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the attributes of the feed.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAttributes()
|
||||
{
|
||||
return $this->attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the attributes of the feed.
|
||||
*
|
||||
* @param array $attributes The attributes of the array.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function setAttributes($attributes)
|
||||
{
|
||||
Validate::isArray($attributes, 'attributes');
|
||||
$this->attributes = $attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an attribute to the feed object instance.
|
||||
*
|
||||
* @param string $attributeKey The key of the attribute.
|
||||
* @param mixed $attributeValue The value of the attribute.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function addAttribute($attributeKey, $attributeValue)
|
||||
{
|
||||
$this->attributes[$attributeKey] = $attributeValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the author of the feed.
|
||||
*
|
||||
* @return Person
|
||||
*/
|
||||
public function getAuthor()
|
||||
{
|
||||
return $this->author;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the author of the feed.
|
||||
*
|
||||
* @param Person $author The author of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setAuthor($author)
|
||||
{
|
||||
Validate::isArray($author, 'author');
|
||||
$person = new Person();
|
||||
foreach ($author as $authorInstance) {
|
||||
Validate::isInstanceOf($authorInstance, $person, 'author');
|
||||
}
|
||||
$this->author = $author;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the category of the feed.
|
||||
*
|
||||
* @return Category
|
||||
*/
|
||||
public function getCategory()
|
||||
{
|
||||
return $this->category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the category of the feed.
|
||||
*
|
||||
* @param Category $category The category of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setCategory($category)
|
||||
{
|
||||
Validate::isArray($category, 'category');
|
||||
$categoryClassInstance = new Category();
|
||||
foreach ($category as $categoryInstance) {
|
||||
Validate::isInstanceOf(
|
||||
$categoryInstance,
|
||||
$categoryClassInstance,
|
||||
'category'
|
||||
);
|
||||
}
|
||||
$this->category = $category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets contributor.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getContributor()
|
||||
{
|
||||
return $this->contributor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets contributor.
|
||||
*
|
||||
* @param string $contributor The contributor of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setContributor($contributor)
|
||||
{
|
||||
Validate::isArray($contributor, 'contributor');
|
||||
$person = new Person();
|
||||
foreach ($contributor as $contributorInstance) {
|
||||
Validate::isInstanceOf($contributorInstance, $person, 'contributor');
|
||||
}
|
||||
$this->contributor = $contributor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets generator.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getGenerator()
|
||||
{
|
||||
return $this->generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the generator.
|
||||
*
|
||||
* @param string $generator Sets the generator of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setGenerator($generator)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the icon of the feed.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getIcon()
|
||||
{
|
||||
return $this->icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the icon of the feed.
|
||||
*
|
||||
* @param string $icon The icon of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setIcon($icon)
|
||||
{
|
||||
$this->icon = $icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the ID of the feed.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getId()
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the ID of the feed.
|
||||
*
|
||||
* @param string $id The ID of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setId($id)
|
||||
{
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the link of the feed.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getLink()
|
||||
{
|
||||
return $this->link;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the link of the feed.
|
||||
*
|
||||
* @param array $link The link of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setLink($link)
|
||||
{
|
||||
Validate::isArray($link, 'link');
|
||||
$this->link = $link;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the logo of the feed.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getLogo()
|
||||
{
|
||||
return $this->logo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the logo of the feed.
|
||||
*
|
||||
* @param string $logo The logo of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setLogo($logo)
|
||||
{
|
||||
$this->logo = $logo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the rights of the feed.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRights()
|
||||
{
|
||||
return $this->rights;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the rights of the feed.
|
||||
*
|
||||
* @param string $rights The rights of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setRights($rights)
|
||||
{
|
||||
$this->rights = $rights;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the sub title.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSubtitle()
|
||||
{
|
||||
return $this->subtitle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the sub title of the feed.
|
||||
*
|
||||
* @param string $subtitle Sets the sub title of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setSubtitle($subtitle)
|
||||
{
|
||||
$this->subtitle = $subtitle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the title of the feed.
|
||||
*
|
||||
* @return string.
|
||||
*/
|
||||
public function getTitle()
|
||||
{
|
||||
return $this->title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the title of the feed.
|
||||
*
|
||||
* @param string $title The title of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setTitle($title)
|
||||
{
|
||||
$this->title = $title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the updated.
|
||||
*
|
||||
* @return \DateTime
|
||||
*/
|
||||
public function getUpdated()
|
||||
{
|
||||
return $this->updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the updated.
|
||||
*
|
||||
* @param \DateTime $updated updated
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setUpdated($updated)
|
||||
{
|
||||
Validate::isInstanceOf($updated, new \DateTime(), 'updated');
|
||||
$this->updated = $updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the extension element.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getExtensionElement()
|
||||
{
|
||||
return $this->extensionElement;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the extension element.
|
||||
*
|
||||
* @param string $extensionElement The extension element.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setExtensionElement($extensionElement)
|
||||
{
|
||||
$this->extensionElement = $extensionElement;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the entry of the feed.
|
||||
*
|
||||
* @return Entry
|
||||
*/
|
||||
public function getEntry()
|
||||
{
|
||||
return $this->entry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the entry of the feed.
|
||||
*
|
||||
* @param Entry $entry The entry of the feed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setEntry($entry)
|
||||
{
|
||||
$this->entry = $entry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an XML representing the feed object.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
|
||||
$xmlWriter->startElementNS('atom', 'feed', Resources::ATOM_NAMESPACE);
|
||||
$this->writeInnerXml($xmlWriter);
|
||||
$xmlWriter->endElement();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an XML representing the feed object.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeInnerXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
|
||||
if (!is_null($this->attributes)) {
|
||||
if (is_array($this->attributes)) {
|
||||
foreach (
|
||||
$this->attributes
|
||||
as $attributeName => $attributeValue
|
||||
) {
|
||||
$xmlWriter->writeAttribute($attributeName, $attributeValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_null($this->author)) {
|
||||
$this->writeArrayItem(
|
||||
$xmlWriter,
|
||||
$this->author,
|
||||
Resources::AUTHOR
|
||||
);
|
||||
}
|
||||
|
||||
if (!is_null($this->category)) {
|
||||
$this->writeArrayItem(
|
||||
$xmlWriter,
|
||||
$this->category,
|
||||
Resources::CATEGORY
|
||||
);
|
||||
}
|
||||
|
||||
if (!is_null($this->contributor)) {
|
||||
$this->writeArrayItem(
|
||||
$xmlWriter,
|
||||
$this->contributor,
|
||||
Resources::CONTRIBUTOR
|
||||
);
|
||||
}
|
||||
|
||||
if (!is_null($this->generator)) {
|
||||
$this->generator->writeXml($xmlWriter);
|
||||
}
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'icon',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->icon
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'logo',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->logo
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'id',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->id
|
||||
);
|
||||
|
||||
if (!is_null($this->link)) {
|
||||
$this->writeArrayItem(
|
||||
$xmlWriter,
|
||||
$this->link,
|
||||
Resources::LINK
|
||||
);
|
||||
}
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'rights',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->rights
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'subtitle',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->subtitle
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'title',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->title
|
||||
);
|
||||
|
||||
if (!is_null($this->updated)) {
|
||||
$xmlWriter->writeElementNS(
|
||||
'atom',
|
||||
'updated',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->updated->format(\DateTime::ATOM)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// @codingStandardsIgnoreEnd
|
||||
@@ -0,0 +1,200 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Atom;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
|
||||
/**
|
||||
* The generator class of ATOM library.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
class Generator extends AtomBase
|
||||
{
|
||||
/**
|
||||
* The of the generator.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $text;
|
||||
|
||||
/**
|
||||
* The Uri of the generator.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $uri;
|
||||
|
||||
/**
|
||||
* The version of the generator.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $version;
|
||||
|
||||
/**
|
||||
* Creates a generator instance with specified XML string.
|
||||
*
|
||||
* @param string $xmlString A string representing a generator
|
||||
* instance.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function parseXml($xmlString)
|
||||
{
|
||||
$generatorXml = new \SimpleXMLElement($xmlString);
|
||||
$generatorArray = (array)$generatorXml;
|
||||
$attributes = $generatorXml->attributes();
|
||||
if (!empty($attributes['uri'])) {
|
||||
$this->uri = (string)$attributes['uri'];
|
||||
}
|
||||
|
||||
if (!empty($attributes['version'])) {
|
||||
$this->version = (string)$attributes['version'];
|
||||
}
|
||||
|
||||
$this->text = (string)$generatorXml;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an ATOM generator instance with specified name.
|
||||
*
|
||||
* @param string $text The text content of the generator.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function __construct($text = null)
|
||||
{
|
||||
if (!empty($text)) {
|
||||
$this->text = $text;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the text of the generator.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getText()
|
||||
{
|
||||
return $this->text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the text of the generator.
|
||||
*
|
||||
* @param string $text The text of the generator.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setText($text)
|
||||
{
|
||||
$this->text = $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the URI of the generator.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUri()
|
||||
{
|
||||
return $this->uri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the URI of the generator.
|
||||
*
|
||||
* @param string $uri The URI of the generator.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setUri($uri)
|
||||
{
|
||||
$this->uri = $uri;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the version of the generator.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getVersion()
|
||||
{
|
||||
return $this->version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the version of the generator.
|
||||
*
|
||||
* @param string $version The version of the generator.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setVersion($version)
|
||||
{
|
||||
$this->version = $version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an XML representing the generator.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeXml($xmlWriter)
|
||||
{
|
||||
$xmlWriter->startElementNS(
|
||||
'atom',
|
||||
Resources::CATEGORY,
|
||||
Resources::ATOM_NAMESPACE
|
||||
);
|
||||
|
||||
$this->writeOptionalAttribute(
|
||||
$xmlWriter,
|
||||
'uri',
|
||||
$this->uri
|
||||
);
|
||||
|
||||
$this->writeOptionalAttribute(
|
||||
$xmlWriter,
|
||||
'version',
|
||||
$this->version
|
||||
);
|
||||
|
||||
$xmlWriter->writeRaw($this->text);
|
||||
$xmlWriter->endElement();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,222 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Atom;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
|
||||
/**
|
||||
* The person class of ATOM library.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
class Person extends AtomBase
|
||||
{
|
||||
/**
|
||||
* The name of the person.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name;
|
||||
|
||||
/**
|
||||
* The Uri of the person.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $uri;
|
||||
|
||||
/**
|
||||
* The email of the person.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $email;
|
||||
|
||||
/**
|
||||
* Creates an ATOM person instance with specified name.
|
||||
*
|
||||
* @param string $name The name of the person.
|
||||
*/
|
||||
public function __construct($name = Resources::EMPTY_STRING)
|
||||
{
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Populates the properties with a specified XML string.
|
||||
*
|
||||
* @param string $xmlString An XML based string representing
|
||||
* the Person instance.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function parseXml($xmlString)
|
||||
{
|
||||
$personXml = simplexml_load_string($xmlString);
|
||||
$attributes = $personXml->attributes();
|
||||
$personArray = (array)$personXml;
|
||||
|
||||
if (array_key_exists('name', $personArray)) {
|
||||
$this->name = (string)$personArray['name'];
|
||||
}
|
||||
|
||||
if (array_key_exists('uri', $personArray)) {
|
||||
$this->uri = (string)$personArray['uri'];
|
||||
}
|
||||
|
||||
if (array_key_exists('email', $personArray)) {
|
||||
$this->email = (string)$personArray['email'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the name of the person.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the name of the person.
|
||||
*
|
||||
* @param string $name The name of the person.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setName($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the URI of the person.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUri()
|
||||
{
|
||||
return $this->uri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the URI of the person.
|
||||
*
|
||||
* @param string $uri The URI of the person.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setUri($uri)
|
||||
{
|
||||
$this->uri = $uri;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the email of the person.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getEmail()
|
||||
{
|
||||
return $this->email;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the email of the person.
|
||||
*
|
||||
* @param string $email The email of the person.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setEmail($email)
|
||||
{
|
||||
$this->email = $email;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an XML representing the person.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
$xmlWriter->startElementNS(
|
||||
'atom',
|
||||
'person',
|
||||
Resources::ATOM_NAMESPACE
|
||||
);
|
||||
$this->writeInnerXml($xmlWriter);
|
||||
$xmlWriter->endElement();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a inner XML representing the person.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeInnerXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
$xmlWriter->writeElementNS(
|
||||
'atom',
|
||||
'name',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->name
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'uri',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->uri
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'email',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->email
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,632 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Atom;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
|
||||
/**
|
||||
* The source class of ATOM library.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Atom
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/WindowsAzure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
class Source extends AtomBase
|
||||
{
|
||||
// @codingStandardsIgnoreStart
|
||||
|
||||
/**
|
||||
* The author the source.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $author;
|
||||
|
||||
/**
|
||||
* The category of the source.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $category;
|
||||
|
||||
/**
|
||||
* The contributor of the source.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $contributor;
|
||||
|
||||
/**
|
||||
* The generator of the source.
|
||||
*
|
||||
* @var Generator
|
||||
*/
|
||||
protected $generator;
|
||||
|
||||
/**
|
||||
* The icon of the source.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $icon;
|
||||
|
||||
/**
|
||||
* The ID of the source.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
* The link of the source.
|
||||
*
|
||||
* @var AtomLink
|
||||
*/
|
||||
protected $link;
|
||||
|
||||
/**
|
||||
* The logo of the source.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $logo;
|
||||
|
||||
/**
|
||||
* The rights of the source.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $rights;
|
||||
|
||||
/**
|
||||
* The subtitle of the source.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $subtitle;
|
||||
|
||||
/**
|
||||
* The title of the source.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $title;
|
||||
|
||||
/**
|
||||
* The update of the source.
|
||||
*
|
||||
* @var \DateTime
|
||||
*/
|
||||
protected $updated;
|
||||
|
||||
/**
|
||||
* The extension element of the source.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $extensionElement;
|
||||
|
||||
/**
|
||||
* Creates an ATOM FEED object with default parameters.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->attributes = array();
|
||||
$this->category = array();
|
||||
$this->contributor = array();
|
||||
$this->author = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a source object with specified XML string.
|
||||
*
|
||||
* @param string $xmlString The XML string representing a source.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function parseXml($xmlString)
|
||||
{
|
||||
$sourceXml = new \SimpleXMLElement($xmlString);
|
||||
$attributes = $sourceXml->attributes();
|
||||
$sourceArray = (array)$sourceXml;
|
||||
|
||||
if (array_key_exists(Resources::AUTHOR, $sourceArray)) {
|
||||
$this->content = $this->processAuthorNode($sourceArray);
|
||||
}
|
||||
|
||||
if (array_key_exists(Resources::CATEGORY, $sourceArray)) {
|
||||
$this->category = $this->processCategoryNode($sourceArray);
|
||||
}
|
||||
|
||||
if (array_key_exists(Resources::CONTRIBUTOR, $sourceArray)) {
|
||||
$this->contributor = $this->processContributorNode($sourceArray);
|
||||
}
|
||||
|
||||
if (array_key_exists('generator', $sourceArray)) {
|
||||
$generator = new Generator();
|
||||
$generator->setText((string)$sourceArray['generator']->asXML());
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
if (array_key_exists('icon', $sourceArray)) {
|
||||
$this->icon = (string)$sourceArray['icon'];
|
||||
}
|
||||
|
||||
if (array_key_exists('id', $sourceArray)) {
|
||||
$this->id = (string)$sourceArray['id'];
|
||||
}
|
||||
|
||||
if (array_key_exists(Resources::LINK, $sourceArray)) {
|
||||
$this->link = $this->processLinkNode($sourceArray);
|
||||
}
|
||||
|
||||
if (array_key_exists('logo', $sourceArray)) {
|
||||
$this->logo = (string)$sourceArray['logo'];
|
||||
}
|
||||
|
||||
if (array_key_exists('rights', $sourceArray)) {
|
||||
$this->rights = (string)$sourceArray['rights'];
|
||||
}
|
||||
|
||||
if (array_key_exists('subtitle', $sourceArray)) {
|
||||
$this->subtitle = (string)$sourceArray['subtitle'];
|
||||
}
|
||||
|
||||
if (array_key_exists('title', $sourceArray)) {
|
||||
$this->title = (string)$sourceArray['title'];
|
||||
}
|
||||
|
||||
if (array_key_exists('updated', $sourceArray)) {
|
||||
$this->updated = \DateTime::createFromFormat(
|
||||
\DateTime::ATOM,
|
||||
(string)$sourceArray['updated']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the author of the source.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAuthor()
|
||||
{
|
||||
return $this->author;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the author of the source.
|
||||
*
|
||||
* @param array $author An array of authors of the sources.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setAuthor($author)
|
||||
{
|
||||
$this->author = $author;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the category of the source.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getCategory()
|
||||
{
|
||||
return $this->category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the category of the source.
|
||||
*
|
||||
* @param array $category The category of the source.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setCategory($category)
|
||||
{
|
||||
$this->category = $category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets contributor.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getContributor()
|
||||
{
|
||||
return $this->contributor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets contributor.
|
||||
*
|
||||
* @param array $contributor The contributors of the source.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setContributor($contributor)
|
||||
{
|
||||
$this->contributor = $contributor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets generator.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function getGenerator()
|
||||
{
|
||||
return $this->generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the generator.
|
||||
*
|
||||
* @param Generator $generator Sets the generator of the source.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setGenerator($generator)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the icon of the source.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getIcon()
|
||||
{
|
||||
return $this->icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the icon of the source.
|
||||
*
|
||||
* @param string $icon The icon of the source.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function setIcon($icon)
|
||||
{
|
||||
$this->icon = $icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the ID of the source.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getId()
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the ID of the source.
|
||||
*
|
||||
* @param string $id The ID of the source.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function setId($id)
|
||||
{
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the link of the source.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getLink()
|
||||
{
|
||||
return $this->link;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the link of the source.
|
||||
*
|
||||
* @param array $link The link of the source.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setLink($link)
|
||||
{
|
||||
$this->link = $link;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the logo of the source.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getLogo()
|
||||
{
|
||||
return $this->logo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the logo of the source.
|
||||
*
|
||||
* @param string $logo The logo of the source.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setLogo($logo)
|
||||
{
|
||||
$this->logo = $logo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the rights of the source.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRights()
|
||||
{
|
||||
return $this->rights;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the rights of the source.
|
||||
*
|
||||
* @param string $rights The rights of the source.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setRights($rights)
|
||||
{
|
||||
$this->rights = $rights;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the sub title.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSubtitle()
|
||||
{
|
||||
return $this->subtitle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the sub title of the source.
|
||||
*
|
||||
* @param string $subtitle Sets the sub title of the source.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setSubtitle($subtitle)
|
||||
{
|
||||
$this->subtitle = $subtitle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the title of the source.
|
||||
*
|
||||
* @return string.
|
||||
*/
|
||||
public function getTitle()
|
||||
{
|
||||
return $this->title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the title of the source.
|
||||
*
|
||||
* @param string $title The title of the source.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setTitle($title)
|
||||
{
|
||||
$this->title = $title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the updated.
|
||||
*
|
||||
* @return \DateTime
|
||||
*/
|
||||
public function getUpdated()
|
||||
{
|
||||
return $this->updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the updated.
|
||||
*
|
||||
* @param \DateTime $updated updated
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setUpdated($updated)
|
||||
{
|
||||
$this->updated = $updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the extension element.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getExtensionElement()
|
||||
{
|
||||
return $this->extensionElement;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the extension element.
|
||||
*
|
||||
* @param string $extensionElement The extension element.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setExtensionElement($extensionElement)
|
||||
{
|
||||
$this->extensionElement = $extensionElement;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an XML representing the source object.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
$xmlWriter->startElementNS(
|
||||
'atom',
|
||||
'source',
|
||||
Resources::ATOM_NAMESPACE
|
||||
);
|
||||
$this->writeInnerXml($xmlWriter);
|
||||
$xmlWriter->endElement();
|
||||
}
|
||||
/**
|
||||
* Writes a inner XML representing the source object.
|
||||
*
|
||||
* @param \XMLWriter $xmlWriter The XML writer.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function writeInnerXml($xmlWriter)
|
||||
{
|
||||
Validate::notNull($xmlWriter, 'xmlWriter');
|
||||
if (!is_null($this->attributes)) {
|
||||
if (is_array($this->attributes)) {
|
||||
foreach ($this->attributes as $attributeName => $attributeValue) {
|
||||
$xmlWriter->writeAttribute($attributeName, $attributeValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_null($this->author)) {
|
||||
Validate::isArray($this->author, Resources::AUTHOR);
|
||||
$this->writeArrayItem($xmlWriter, $this->author, Resources::AUTHOR);
|
||||
}
|
||||
|
||||
if (!is_null($this->category)) {
|
||||
Validate::isArray($this->category, Resources::CATEGORY);
|
||||
$this->writeArrayItem(
|
||||
$xmlWriter,
|
||||
$this->category,
|
||||
Resources::CATEGORY
|
||||
);
|
||||
}
|
||||
|
||||
if (!is_null($this->contributor)) {
|
||||
Validate::isArray($this->contributor, Resources::CONTRIBUTOR);
|
||||
$this->writeArrayItem(
|
||||
$xmlWriter,
|
||||
$this->contributor,
|
||||
Resources::CONTRIBUTOR
|
||||
);
|
||||
}
|
||||
|
||||
if (!is_null($this->generator)) {
|
||||
$this->generator->writeXml($xmlWriter);
|
||||
}
|
||||
|
||||
if (!is_null($this->icon)) {
|
||||
$xmlWriter->writeElementNS(
|
||||
'atom',
|
||||
'icon',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->icon
|
||||
);
|
||||
}
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'logo',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->logo
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'id',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->id
|
||||
);
|
||||
|
||||
if (!is_null($this->link)) {
|
||||
Validate::isArray($this->link, Resources::LINK);
|
||||
$this->writeArrayItem(
|
||||
$xmlWriter,
|
||||
$this->link,
|
||||
Resources::LINK
|
||||
);
|
||||
}
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'rights',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->rights
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'subtitle',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->subtitle
|
||||
);
|
||||
|
||||
$this->writeOptionalElementNS(
|
||||
$xmlWriter,
|
||||
'atom',
|
||||
'title',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->title
|
||||
);
|
||||
|
||||
if (!is_null($this->updated)) {
|
||||
$xmlWriter->writeElementNS(
|
||||
'atom',
|
||||
'updated',
|
||||
Resources::ATOM_NAMESPACE,
|
||||
$this->updated->format(\DateTime::ATOM)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// @codingStandardsIgnoreEnd
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Authentication
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Authentication;
|
||||
|
||||
/**
|
||||
* Interface for azure authentication schemes.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Authentication
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
interface IAuthScheme
|
||||
{
|
||||
/**
|
||||
* Returns authorization header to be included in the request.
|
||||
*
|
||||
* @param array $headers request headers.
|
||||
* @param string $url reuqest url.
|
||||
* @param array $queryParams query variables.
|
||||
* @param string $httpMethod request http method.
|
||||
*
|
||||
* @see Specifying the Authorization Header section at
|
||||
* http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @abstract
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getAuthorizationHeader($headers, $url, $queryParams,
|
||||
$httpMethod
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Authentication
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link http://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Authentication;
|
||||
use WindowsAzure\Common\Internal\Authentication\IAuthScheme;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\Internal\OAuthRestProxy;
|
||||
use WindowsAzure\Common\Models\OAuthAccessToken;
|
||||
|
||||
/**
|
||||
* Provides shared key authentication scheme for OAuth.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Authentication
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link http://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class OAuthScheme implements IAuthScheme
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $accountName;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $accountKey;
|
||||
|
||||
/**
|
||||
* @var WindowsAzure\Common\Models\OAuthAccessToken
|
||||
*/
|
||||
protected $accessToken;
|
||||
|
||||
/**
|
||||
* @var WindowsAzure\Common\Internal\OAuthRestProxy
|
||||
*/
|
||||
protected $oauthService;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $grantType;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $scope;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $accountName account name.
|
||||
* @param string $accountKey account
|
||||
* secondary key.
|
||||
*
|
||||
* @param string $grantType grant type
|
||||
* for OAuth request.
|
||||
*
|
||||
* @param string $scope scope for
|
||||
* OAurh request.
|
||||
*
|
||||
* @param WindowsAzure\Common\Internal\OAuthRestProxy $oauthService account
|
||||
* primary or secondary key.
|
||||
*/
|
||||
public function __construct(
|
||||
$accountName,
|
||||
$accountKey,
|
||||
$grantType,
|
||||
$scope,
|
||||
$oauthService
|
||||
) {
|
||||
Validate::isString($accountName, 'accountName');
|
||||
Validate::isString($accountKey, 'accountKey');
|
||||
Validate::isString($grantType, 'grantType');
|
||||
Validate::isString($scope, 'scope');
|
||||
Validate::notNull($oauthService, 'oauthService');
|
||||
|
||||
$this->accountName = $accountName;
|
||||
$this->accountKey = $accountKey;
|
||||
$this->grantType = $grantType;
|
||||
$this->scope = $scope;
|
||||
$this->oauthService = $oauthService;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns authorization header to be included in the request.
|
||||
*
|
||||
* @param array $headers request headers.
|
||||
* @param string $url reuqest url.
|
||||
* @param array $queryParams query variables.
|
||||
* @param string $httpMethod request http method.
|
||||
*
|
||||
* @see Specifying the Authorization Header section at
|
||||
* http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getAuthorizationHeader($headers, $url, $queryParams, $httpMethod)
|
||||
{
|
||||
if (($this->accessToken == null)
|
||||
|| ($this->accessToken->getExpiresIn() < time())
|
||||
) {
|
||||
$this->accessToken = $this->oauthService->getAccessToken(
|
||||
$this->grantType,
|
||||
$this->accountName,
|
||||
$this->accountKey,
|
||||
$this->scope
|
||||
);
|
||||
}
|
||||
|
||||
return Resources::OAUTH_ACCESS_TOKEN_PREFIX .
|
||||
$this->accessToken->getAccessToken();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Authentication
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Authentication;
|
||||
use WindowsAzure\Common\Internal\Authentication\StorageAuthScheme;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
|
||||
/**
|
||||
* Provides shared key authentication scheme for blob and queue. For more info
|
||||
* check: http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Authentication
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class SharedKeyAuthScheme extends StorageAuthScheme
|
||||
{
|
||||
protected $includedHeaders;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $accountName storage account name.
|
||||
* @param string $accountKey storage account primary or secondary key.
|
||||
*
|
||||
* @return
|
||||
* WindowsAzure\Common\Internal\Authentication\SharedKeyAuthScheme
|
||||
*/
|
||||
public function __construct($accountName, $accountKey)
|
||||
{
|
||||
parent::__construct($accountName, $accountKey);
|
||||
|
||||
$this->includedHeaders = array();
|
||||
$this->includedHeaders[] = Resources::CONTENT_ENCODING;
|
||||
$this->includedHeaders[] = Resources::CONTENT_LANGUAGE;
|
||||
$this->includedHeaders[] = Resources::CONTENT_LENGTH;
|
||||
$this->includedHeaders[] = Resources::CONTENT_MD5;
|
||||
$this->includedHeaders[] = Resources::CONTENT_TYPE;
|
||||
$this->includedHeaders[] = Resources::DATE;
|
||||
$this->includedHeaders[] = Resources::IF_MODIFIED_SINCE;
|
||||
$this->includedHeaders[] = Resources::IF_MATCH;
|
||||
$this->includedHeaders[] = Resources::IF_NONE_MATCH;
|
||||
$this->includedHeaders[] = Resources::IF_UNMODIFIED_SINCE;
|
||||
$this->includedHeaders[] = Resources::RANGE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes the authorization signature for blob and queue shared key.
|
||||
*
|
||||
* @param array $headers request headers.
|
||||
* @param string $url reuqest url.
|
||||
* @param array $queryParams query variables.
|
||||
* @param string $httpMethod request http method.
|
||||
*
|
||||
* @see Blob and Queue Services (Shared Key Authentication) at
|
||||
* http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function computeSignature($headers, $url, $queryParams, $httpMethod)
|
||||
{
|
||||
$canonicalizedHeaders = parent::computeCanonicalizedHeaders($headers);
|
||||
|
||||
$canonicalizedResource = parent::computeCanonicalizedResource(
|
||||
$url, $queryParams
|
||||
);
|
||||
|
||||
|
||||
$stringToSign = array();
|
||||
$stringToSign[] = strtoupper($httpMethod);
|
||||
|
||||
foreach ($this->includedHeaders as $header) {
|
||||
$stringToSign[] = Utilities::tryGetValue($headers, $header);
|
||||
}
|
||||
|
||||
if (count($canonicalizedHeaders) > 0) {
|
||||
$stringToSign[] = implode("\n", $canonicalizedHeaders);
|
||||
}
|
||||
|
||||
$stringToSign[] = $canonicalizedResource;
|
||||
$stringToSign = implode("\n", $stringToSign);
|
||||
|
||||
return $stringToSign;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns authorization header to be included in the request.
|
||||
*
|
||||
* @param array $headers request headers.
|
||||
* @param string $url reuqest url.
|
||||
* @param array $queryParams query variables.
|
||||
* @param string $httpMethod request http method.
|
||||
*
|
||||
* @see Specifying the Authorization Header section at
|
||||
* http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getAuthorizationHeader($headers, $url, $queryParams, $httpMethod)
|
||||
{
|
||||
$signature = $this->computeSignature(
|
||||
$headers, $url, $queryParams, $httpMethod
|
||||
);
|
||||
|
||||
return 'SharedKey ' . $this->accountName . ':' . base64_encode(
|
||||
hash_hmac('sha256', $signature, base64_decode($this->accountKey), true)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,215 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Authentication
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Authentication;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
use WindowsAzure\Common\Internal\Authentication\IAuthScheme;
|
||||
|
||||
|
||||
/**
|
||||
* Base class for azure authentication schemes.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Authentication
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
abstract class StorageAuthScheme implements IAuthScheme
|
||||
{
|
||||
protected $accountName;
|
||||
protected $accountKey;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $accountName storage account name.
|
||||
* @param string $accountKey storage account primary or secondary key.
|
||||
*
|
||||
* @return
|
||||
* WindowsAzure\Common\Internal\Authentication\StorageAuthScheme
|
||||
*/
|
||||
public function __construct($accountName, $accountKey)
|
||||
{
|
||||
$this->accountKey = $accountKey;
|
||||
$this->accountName = $accountName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes canonicalized headers for headers array.
|
||||
*
|
||||
* @param array $headers request headers.
|
||||
*
|
||||
* @see Constructing the Canonicalized Headers String section at
|
||||
* http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function computeCanonicalizedHeaders($headers)
|
||||
{
|
||||
$canonicalizedHeaders = array();
|
||||
$normalizedHeaders = array();
|
||||
$validPrefix = Resources::X_MS_HEADER_PREFIX;
|
||||
|
||||
if (is_null($normalizedHeaders)) {
|
||||
return $canonicalizedHeaders;
|
||||
}
|
||||
|
||||
foreach ($headers as $header => $value) {
|
||||
// Convert header to lower case.
|
||||
$header = strtolower($header);
|
||||
|
||||
// Retrieve all headers for the resource that begin with x-ms-,
|
||||
// including the x-ms-date header.
|
||||
if (Utilities::startsWith($header, $validPrefix)) {
|
||||
// Unfold the string by replacing any breaking white space
|
||||
// (meaning what splits the headers, which is \r\n) with a single
|
||||
// space.
|
||||
$value = str_replace("\r\n", ' ', $value);
|
||||
|
||||
// Trim any white space around the colon in the header.
|
||||
$value = ltrim($value);
|
||||
$header = rtrim($header);
|
||||
|
||||
$normalizedHeaders[$header] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
// Sort the headers lexicographically by header name, in ascending order.
|
||||
// Note that each header may appear only once in the string.
|
||||
ksort($normalizedHeaders);
|
||||
|
||||
foreach ($normalizedHeaders as $key => $value) {
|
||||
$canonicalizedHeaders[] = $key . ':' . $value;
|
||||
}
|
||||
|
||||
return $canonicalizedHeaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes canonicalized resources from URL using Table formar
|
||||
*
|
||||
* @param string $url request url.
|
||||
* @param array $queryParams request query variables.
|
||||
*
|
||||
* @see Constructing the Canonicalized Resource String section at
|
||||
* http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function computeCanonicalizedResourceForTable($url, $queryParams)
|
||||
{
|
||||
$queryParams = array_change_key_case($queryParams);
|
||||
|
||||
// 1. Beginning with an empty string (""), append a forward slash (/),
|
||||
// followed by the name of the account that owns the accessed resource.
|
||||
$canonicalizedResource = '/' . $this->accountName;
|
||||
|
||||
// 2. Append the resource's encoded URI path, without any query parameters.
|
||||
$canonicalizedResource .= parse_url($url, PHP_URL_PATH);
|
||||
|
||||
// 3. The query string should include the question mark and the comp
|
||||
// parameter (for example, ?comp=metadata). No other parameters should
|
||||
// be included on the query string.
|
||||
if (array_key_exists(Resources::QP_COMP, $queryParams)) {
|
||||
$canonicalizedResource .= '?' . Resources::QP_COMP . '=';
|
||||
$canonicalizedResource .= $queryParams[Resources::QP_COMP];
|
||||
}
|
||||
|
||||
return $canonicalizedResource;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes canonicalized resources from URL.
|
||||
*
|
||||
* @param string $url request url.
|
||||
* @param array $queryParams request query variables.
|
||||
*
|
||||
* @see Constructing the Canonicalized Resource String section at
|
||||
* http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function computeCanonicalizedResource($url, $queryParams)
|
||||
{
|
||||
$queryParams = array_change_key_case($queryParams);
|
||||
|
||||
// 1. Beginning with an empty string (""), append a forward slash (/),
|
||||
// followed by the name of the account that owns the accessed resource.
|
||||
$canonicalizedResource = '/' . $this->accountName;
|
||||
|
||||
// 2. Append the resource's encoded URI path, without any query parameters.
|
||||
$canonicalizedResource .= parse_url($url, PHP_URL_PATH);
|
||||
|
||||
// 3. Retrieve all query parameters on the resource URI, including the comp
|
||||
// parameter if it exists.
|
||||
// 4. Sort the query parameters lexicographically by parameter name, in
|
||||
// ascending order.
|
||||
if (count($queryParams) > 0) {
|
||||
ksort($queryParams);
|
||||
}
|
||||
|
||||
// 5. Convert all parameter names to lowercase.
|
||||
// 6. URL-decode each query parameter name and value.
|
||||
// 7. Append each query parameter name and value to the string in the
|
||||
// following format:
|
||||
// parameter-name:parameter-value
|
||||
// 9. Group query parameters
|
||||
// 10. Append a new line character (\n) after each name-value pair.
|
||||
foreach ($queryParams as $key => $value) {
|
||||
// Grouping query parameters
|
||||
$values = explode(Resources::SEPARATOR, $value);
|
||||
sort($values);
|
||||
$separated = implode(Resources::SEPARATOR, $values);
|
||||
|
||||
$canonicalizedResource .= "\n" . $key . ':' . $separated;
|
||||
}
|
||||
|
||||
return $canonicalizedResource;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes the authorization signature.
|
||||
*
|
||||
* @param array $headers request headers.
|
||||
* @param string $url reuqest url.
|
||||
* @param array $queryParams query variables.
|
||||
* @param string $httpMethod request http method.
|
||||
*
|
||||
* @see check all authentication schemes at
|
||||
* http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @abstract
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract protected function computeSignature($headers, $url, $queryParams,
|
||||
$httpMethod
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Authentication
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link http://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Authentication;
|
||||
use WindowsAzure\Common\Internal\Authentication\StorageAuthScheme;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
|
||||
/**
|
||||
* Provides shared key authentication scheme for blob and queue. For more info
|
||||
* check: http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Authentication
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link http://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class TableSharedKeyLiteAuthScheme extends StorageAuthScheme
|
||||
{
|
||||
protected $includedHeaders;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $accountName storage account name.
|
||||
* @param string $accountKey storage account primary or secondary key.
|
||||
*
|
||||
* @return TableSharedKeyLiteAuthScheme
|
||||
*/
|
||||
public function __construct($accountName, $accountKey)
|
||||
{
|
||||
parent::__construct($accountName, $accountKey);
|
||||
|
||||
$this->includedHeaders = array();
|
||||
$this->includedHeaders[] = Resources::DATE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes the authorization signature for blob and queue shared key.
|
||||
*
|
||||
* @param array $headers request headers.
|
||||
* @param string $url reuqest url.
|
||||
* @param array $queryParams query variables.
|
||||
* @param string $httpMethod request http method.
|
||||
*
|
||||
* @see Blob and Queue Services (Shared Key Authentication) at
|
||||
* http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function computeSignature($headers, $url, $queryParams, $httpMethod)
|
||||
{
|
||||
$canonicalizedResource = parent::computeCanonicalizedResourceForTable(
|
||||
$url, $queryParams
|
||||
);
|
||||
|
||||
$stringToSign = array();
|
||||
|
||||
foreach ($this->includedHeaders as $header) {
|
||||
$stringToSign[] = Utilities::tryGetValue($headers, $header);
|
||||
}
|
||||
|
||||
$stringToSign[] = $canonicalizedResource;
|
||||
$stringToSign = implode("\n", $stringToSign);
|
||||
|
||||
return $stringToSign;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns authorization header to be included in the request.
|
||||
*
|
||||
* @param array $headers request headers.
|
||||
* @param string $url reuqest url.
|
||||
* @param array $queryParams query variables.
|
||||
* @param string $httpMethod request http method.
|
||||
*
|
||||
* @see Specifying the Authorization Header section at
|
||||
* http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getAuthorizationHeader($headers, $url, $queryParams, $httpMethod)
|
||||
{
|
||||
$signature = $this->computeSignature(
|
||||
$headers, $url, $queryParams, $httpMethod
|
||||
);
|
||||
|
||||
return 'SharedKeyLite ' . $this->accountName . ':' . base64_encode(
|
||||
hash_hmac('sha256', $signature, base64_decode($this->accountKey), true)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,366 @@
|
||||
<?php
|
||||
// phpcs:disable WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Error message to be escaped when caught and printed.
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
|
||||
/**
|
||||
* Helper methods for parsing connection strings. The rules for formatting connection
|
||||
* strings are defined here:
|
||||
* www.connectionstrings.com/articles/show/important-rules-for-connection-strings
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class ConnectionStringParser
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_argumentName;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_value;
|
||||
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
private $_pos;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_state;
|
||||
|
||||
/**
|
||||
* Parses the connection string into a collection of key/value pairs.
|
||||
*
|
||||
* @param string $argumentName Name of the argument to be used in error
|
||||
* messages.
|
||||
* @param string $connectionString Connection string.
|
||||
*
|
||||
* @return array
|
||||
*
|
||||
* @static
|
||||
*/
|
||||
public static function parseConnectionString($argumentName, $connectionString)
|
||||
{
|
||||
Validate::isString($argumentName, 'argumentName');
|
||||
Validate::notNullOrEmpty($argumentName, 'argumentName');
|
||||
Validate::isString($connectionString, 'connectionString');
|
||||
Validate::notNullOrEmpty($connectionString, 'connectionString');
|
||||
|
||||
$parser = new ConnectionStringParser($argumentName, $connectionString);
|
||||
return $parser->_parse();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the object.
|
||||
*
|
||||
* @param string $argumentName Name of the argument to be used in error
|
||||
* messages.
|
||||
* @param string $value Connection string.
|
||||
*/
|
||||
private function __construct($argumentName, $value)
|
||||
{
|
||||
$this->_argumentName = $argumentName;
|
||||
$this->_value = $value;
|
||||
$this->_pos = 0;
|
||||
$this->_state = ParserState::EXPECT_KEY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the connection string.
|
||||
*
|
||||
* @return array
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
private function _parse()
|
||||
{
|
||||
$key = null;
|
||||
$value = null;
|
||||
$connectionStringValues = array();
|
||||
|
||||
while (true) {
|
||||
$this->_skipWhiteSpaces();
|
||||
|
||||
if ( $this->_pos == strlen($this->_value)
|
||||
&& $this->_state != ParserState::EXPECT_VALUE
|
||||
) {
|
||||
// Not stopping after the end has been reached and a value is
|
||||
// expected results in creating an empty value, which we expect.
|
||||
break;
|
||||
}
|
||||
|
||||
switch ($this->_state) {
|
||||
case ParserState::EXPECT_KEY:
|
||||
$key = $this->_extractKey();
|
||||
$this->_state = ParserState::EXPECT_ASSIGNMENT;
|
||||
break;
|
||||
|
||||
case ParserState::EXPECT_ASSIGNMENT:
|
||||
$this->_skipOperator('=');
|
||||
$this->_state = ParserState::EXPECT_VALUE;
|
||||
break;
|
||||
|
||||
case ParserState::EXPECT_VALUE:
|
||||
$value = $this->_extractValue();
|
||||
$this->_state = ParserState::EXPECT_SEPARATOR;
|
||||
$connectionStringValues[$key] = $value;
|
||||
$key = null;
|
||||
$value = null;
|
||||
break;
|
||||
|
||||
default:
|
||||
$this->_skipOperator(';');
|
||||
$this->_state = ParserState::EXPECT_KEY;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Must end parsing in the valid state (expected key or separator)
|
||||
if ($this->_state == ParserState::EXPECT_ASSIGNMENT) {
|
||||
throw $this->_createException(
|
||||
$this->_pos,
|
||||
Resources::MISSING_CONNECTION_STRING_CHAR,
|
||||
'='
|
||||
);
|
||||
}
|
||||
|
||||
return $connectionStringValues;
|
||||
}
|
||||
|
||||
/**
|
||||
*Generates an invalid connection string exception with the detailed error
|
||||
* message.
|
||||
*
|
||||
* @param integer $position The position of the error.
|
||||
* @param string $errorString The short error formatting string.
|
||||
*
|
||||
* @return \RuntimeException
|
||||
*/
|
||||
private function _createException($position, $errorString)
|
||||
{
|
||||
$arguments = func_get_args();
|
||||
|
||||
// Remove first argument (position)
|
||||
unset($arguments[0]);
|
||||
|
||||
// Create a short error message.
|
||||
$errorString = sprintf($errorString, $arguments);
|
||||
|
||||
// Add position.
|
||||
$errorString = sprintf(
|
||||
Resources::ERROR_PARSING_STRING,
|
||||
$errorString,
|
||||
$position
|
||||
);
|
||||
|
||||
// Create final error message.
|
||||
$errorString = sprintf(
|
||||
Resources::INVALID_CONNECTION_STRING,
|
||||
$this->_argumentName,
|
||||
$errorString
|
||||
);
|
||||
|
||||
return new \RuntimeException($errorString);
|
||||
}
|
||||
|
||||
/**
|
||||
* Skips whitespaces at the current position.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
private function _skipWhiteSpaces()
|
||||
{
|
||||
while ( $this->_pos < strlen($this->_value)
|
||||
&& ctype_space($this->_value[$this->_pos])
|
||||
) {
|
||||
$this->_pos++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the key's value.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function _extractValue()
|
||||
{
|
||||
$value = Resources::EMPTY_STRING;
|
||||
|
||||
if ($this->_pos < strlen($this->_value)) {
|
||||
$ch = $this->_value[$this->_pos];
|
||||
|
||||
if ($ch == '"' || $ch == '\'') {
|
||||
// Value is contained between double quotes or skipped single quotes.
|
||||
$this->_pos++;
|
||||
$value = $this->_extractString($ch);
|
||||
} else {
|
||||
$firstPos = $this->_pos;
|
||||
$isFound = false;
|
||||
|
||||
while ($this->_pos < strlen($this->_value) && !$isFound) {
|
||||
$ch = $this->_value[$this->_pos];
|
||||
|
||||
if ($ch == ';') {
|
||||
$isFound = true;
|
||||
} else {
|
||||
$this->_pos++;
|
||||
}
|
||||
}
|
||||
|
||||
$value = rtrim(
|
||||
substr($this->_value, $firstPos, $this->_pos - $firstPos)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts key at the current position.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function _extractKey()
|
||||
{
|
||||
$key = null;
|
||||
$firstPos = $this->_pos;
|
||||
$ch = $this->_value[$this->_pos];
|
||||
|
||||
if ($ch == '"' || $ch == '\'') {
|
||||
$this->_pos++;
|
||||
$key = $this->_extractString($ch);
|
||||
} else if ($ch == ';' || $ch == '=') {
|
||||
// Key name was expected.
|
||||
throw $this->_createException(
|
||||
$firstPos,
|
||||
Resources::ERROR_CONNECTION_STRING_MISSING_KEY
|
||||
);
|
||||
} else {
|
||||
while ($this->_pos < strlen($this->_value)) {
|
||||
$ch = $this->_value[$this->_pos];
|
||||
|
||||
// At this point we've read the key, break.
|
||||
if ($ch == '=') {
|
||||
break;
|
||||
}
|
||||
|
||||
$this->_pos++;
|
||||
}
|
||||
$key = rtrim(substr($this->_value, $firstPos, $this->_pos - $firstPos));
|
||||
}
|
||||
|
||||
if (strlen($key) == 0) {
|
||||
// Empty key name.
|
||||
throw $this->_createException(
|
||||
$firstPos,
|
||||
Resources::ERROR_CONNECTION_STRING_EMPTY_KEY
|
||||
);
|
||||
}
|
||||
|
||||
return $key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the string until the given quotation mark.
|
||||
*
|
||||
* @param string $quote The quotation mark terminating the string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function _extractString($quote)
|
||||
{
|
||||
$firstPos = $this->_pos;
|
||||
|
||||
while ( $this->_pos < strlen($this->_value)
|
||||
&& $this->_value[$this->_pos] != $quote
|
||||
) {
|
||||
$this->_pos++;
|
||||
}
|
||||
|
||||
if ($this->_pos == strlen($this->_value)) {
|
||||
// Runaway string.
|
||||
throw $this->_createException(
|
||||
$this->_pos,
|
||||
Resources::ERROR_CONNECTION_STRING_MISSING_CHARACTER,
|
||||
$quote
|
||||
);
|
||||
}
|
||||
|
||||
return substr($this->_value, $firstPos, $this->_pos++ - $firstPos);
|
||||
}
|
||||
|
||||
/**
|
||||
* Skips specified operator.
|
||||
*
|
||||
* @param string $operatorChar The operator character.
|
||||
*
|
||||
* @return none
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
private function _skipOperator($operatorChar)
|
||||
{
|
||||
if ($this->_value[$this->_pos] != $operatorChar) {
|
||||
// Character was expected.
|
||||
throw $this->_createException(
|
||||
$this->_pos,
|
||||
Resources::MISSING_CONNECTION_STRING_CHAR,
|
||||
$operatorChar
|
||||
);
|
||||
}
|
||||
|
||||
$this->_pos++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* State of the connection string parser.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class ParserState
|
||||
{
|
||||
const EXPECT_KEY = 'ExpectKey';
|
||||
const EXPECT_ASSIGNMENT = 'ExpectAssignment';
|
||||
const EXPECT_VALUE = 'ExpectValue';
|
||||
const EXPECT_SEPARATOR = 'ExpectSeparator';
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
|
||||
/**
|
||||
* Holder for default connection string sources used in CloudConfigurationManager.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class ConnectionStringSource
|
||||
{
|
||||
/**
|
||||
* The list of all sources which comes as default.
|
||||
*
|
||||
* @var type
|
||||
*/
|
||||
private static $_defaultSources;
|
||||
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
private static $_isInitialized;
|
||||
|
||||
/**
|
||||
* Environment variable source name.
|
||||
*/
|
||||
const ENVIRONMENT_SOURCE = 'environment_source';
|
||||
|
||||
/**
|
||||
* Initializes the default sources.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
private static function _init()
|
||||
{
|
||||
if (!self::$_isInitialized) {
|
||||
self::$_defaultSources = array(
|
||||
self::ENVIRONMENT_SOURCE => array(__CLASS__, 'environmentSource')
|
||||
);
|
||||
self::$_isInitialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a connection string value from the system environment.
|
||||
*
|
||||
* @param string $key The connection string name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function environmentSource($key)
|
||||
{
|
||||
Validate::isString($key, 'key');
|
||||
|
||||
return getenv($key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets list of default sources.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getDefaultSources()
|
||||
{
|
||||
self::_init();
|
||||
return self::$_defaultSources;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
|
||||
/**
|
||||
* Interface for service with filers.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
interface FilterableService
|
||||
{
|
||||
/**
|
||||
* Adds new filter to proxy object and returns new BlobRestProxy with
|
||||
* that filter.
|
||||
*
|
||||
* @param WindowsAzure\Common\Internal\IServiceFilter $filter Filter to add for
|
||||
* the pipeline.
|
||||
*
|
||||
* @return mix.
|
||||
*/
|
||||
public function withFilter($filter);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Filters;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\IServiceFilter;
|
||||
use WindowsAzure\Common\Internal\Authentication\SharedKeyAuthScheme;
|
||||
use WindowsAzure\Common\Internal\Authentication\TableSharedKeyLiteAuthScheme;
|
||||
use WindowsAzure\Common\Internal\InvalidArgumentTypeException;
|
||||
|
||||
/**
|
||||
* Adds authentication header to the http request object.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class AuthenticationFilter implements IServiceFilter
|
||||
{
|
||||
/**
|
||||
* @var WindowsAzure\Common\Internal\Authentication\StorageAuthScheme
|
||||
*/
|
||||
private $_authenticationScheme;
|
||||
|
||||
/**
|
||||
* Creates AuthenticationFilter with the passed scheme.
|
||||
*
|
||||
* @param StorageAuthScheme $authenticationScheme The authentication scheme.
|
||||
*/
|
||||
public function __construct($authenticationScheme)
|
||||
{
|
||||
$this->_authenticationScheme = $authenticationScheme;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds authentication header to the request headers.
|
||||
*
|
||||
* @param HttpClient $request HTTP channel object.
|
||||
*
|
||||
* @return \HTTP_Request2
|
||||
*/
|
||||
public function handleRequest($request)
|
||||
{
|
||||
$signedKey = $this->_authenticationScheme->getAuthorizationHeader(
|
||||
$request->getHeaders(), $request->getUrl(),
|
||||
$request->getUrl()->getQueryVariables(), $request->getMethod()
|
||||
);
|
||||
$request->setHeader(Resources::AUTHENTICATION, $signedKey);
|
||||
|
||||
return $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does nothing with the response.
|
||||
*
|
||||
* @param HttpClient $request HTTP channel object.
|
||||
* @param \HTTP_Request2_Response $response HTTP response object.
|
||||
*
|
||||
* @return \HTTP_Request2_Response
|
||||
*/
|
||||
public function handleResponse($request, $response)
|
||||
{
|
||||
// Do nothing with the response.
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Filters;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\IServiceFilter;
|
||||
|
||||
/**
|
||||
* Adds date header to the http request.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class DateFilter implements IServiceFilter
|
||||
{
|
||||
/**
|
||||
* Adds date (in GMT format) header to the request headers.
|
||||
*
|
||||
* @param HttpClient $request HTTP channel object.
|
||||
*
|
||||
* @return \HTTP_Request2
|
||||
*/
|
||||
public function handleRequest($request)
|
||||
{
|
||||
$date = gmdate(Resources::AZURE_DATE_FORMAT, time());
|
||||
$request->setHeader(Resources::DATE, $date);
|
||||
|
||||
return $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does nothing with the response.
|
||||
*
|
||||
* @param HttpClient $request HTTP channel object.
|
||||
* @param \HTTP_Request2_Response $response HTTP response object.
|
||||
*
|
||||
* @return \HTTP_Request2_Response
|
||||
*/
|
||||
public function handleResponse($request, $response)
|
||||
{
|
||||
// Do nothing with the response.
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Filters;
|
||||
|
||||
/**
|
||||
* The exponential retry policy.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class ExponentialRetryPolicy extends RetryPolicy
|
||||
{
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
private $_deltaBackoffIntervalInMs;
|
||||
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
private $_maximumAttempts;
|
||||
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
private $_resolvedMaxBackoff;
|
||||
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
private $_resolvedMinBackoff;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $_retryableStatusCodes;
|
||||
|
||||
/**
|
||||
* Initializes new object from ExponentialRetryPolicy.
|
||||
*
|
||||
* @param array $retryableStatusCodes The retryable status codes.
|
||||
* @param integer $deltaBackoff The backoff time delta.
|
||||
* @param integer $maximumAttempts The number of max attempts.
|
||||
*/
|
||||
public function __construct($retryableStatusCodes,
|
||||
$deltaBackoff = parent::DEFAULT_CLIENT_BACKOFF,
|
||||
$maximumAttempts = parent::DEFAULT_CLIENT_RETRY_COUNT
|
||||
) {
|
||||
$this->_deltaBackoffIntervalInMs = $deltaBackoff;
|
||||
$this->_maximumAttempts = $maximumAttempts;
|
||||
$this->_resolvedMaxBackoff = parent::DEFAULT_MAX_BACKOFF;
|
||||
$this->_resolvedMinBackoff = parent::DEFAULT_MIN_BACKOFF;
|
||||
$this->_retryableStatusCodes = $retryableStatusCodes;
|
||||
sort($retryableStatusCodes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates if there should be a retry or not.
|
||||
*
|
||||
* @param integer $retryCount The retry count.
|
||||
* @param \HTTP_Request2_Response $response The HTTP response object.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function shouldRetry($retryCount, $response)
|
||||
{
|
||||
if ( $retryCount >= $this->_maximumAttempts
|
||||
|| array_search($response->getStatus(), $this->_retryableStatusCodes)
|
||||
|| is_null($response)
|
||||
) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the backoff for the retry policy.
|
||||
*
|
||||
* @param integer $retryCount The retry count.
|
||||
* @param \HTTP_Request2_Response $response The HTTP response object.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function calculateBackoff($retryCount, $response)
|
||||
{
|
||||
// Calculate backoff Interval between 80% and 120% of the desired
|
||||
// backoff, multiply by 2^n -1 for
|
||||
// exponential
|
||||
$incrementDelta = (int) (pow(2, $retryCount) - 1);
|
||||
$boundedRandDelta = (int) ($this->_deltaBackoffIntervalInMs * 0.8)
|
||||
+ mt_rand(
|
||||
0,
|
||||
(int) ($this->_deltaBackoffIntervalInMs * 1.2)
|
||||
- (int) ($this->_deltaBackoffIntervalInMs * 0.8)
|
||||
);
|
||||
$incrementDelta *= $boundedRandDelta;
|
||||
|
||||
// Enforce max / min backoffs
|
||||
return min(
|
||||
$this->_resolvedMinBackoff + $incrementDelta,
|
||||
$this->_resolvedMaxBackoff
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Filters;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\IServiceFilter;
|
||||
|
||||
/**
|
||||
* Adds all passed headers to the HTTP request headers.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class HeadersFilter implements IServiceFilter
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $_headers;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param array $headers static headers to be added.
|
||||
*
|
||||
* @return HeadersFilter
|
||||
*/
|
||||
public function __construct($headers)
|
||||
{
|
||||
$this->_headers = $headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds static header(s) to the HTTP request headers
|
||||
*
|
||||
* @param HttpClient $request HTTP channel object.
|
||||
*
|
||||
* @return \HTTP_Request2
|
||||
*/
|
||||
public function handleRequest($request)
|
||||
{
|
||||
foreach ($this->_headers as $key => $value) {
|
||||
$headers = $request->getHeaders();
|
||||
if (!array_key_exists($key, $headers)) {
|
||||
$request->setHeader($key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
return $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does nothing with the response.
|
||||
*
|
||||
* @param HttpClient $request HTTP channel object.
|
||||
* @param \HTTP_Request2_Response $response HTTP response object.
|
||||
*
|
||||
* @return \HTTP_Request2_Response
|
||||
*/
|
||||
public function handleResponse($request, $response)
|
||||
{
|
||||
// Do nothing with the response.
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Filters;
|
||||
|
||||
/**
|
||||
* The retry policy abstract class.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
abstract class RetryPolicy
|
||||
{
|
||||
const DEFAULT_CLIENT_BACKOFF = 30000;
|
||||
const DEFAULT_CLIENT_RETRY_COUNT = 3;
|
||||
const DEFAULT_MAX_BACKOFF = 90000;
|
||||
const DEFAULT_MIN_BACKOFF = 300;
|
||||
|
||||
/**
|
||||
* Indicates if there should be a retry or not.
|
||||
*
|
||||
* @param integer $retryCount The retry count.
|
||||
* @param \HTTP_Request2_Response $response The HTTP response object.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public abstract function shouldRetry($retryCount, $response);
|
||||
|
||||
/**
|
||||
* Calculates the backoff for the retry policy.
|
||||
*
|
||||
* @param integer $retryCount The retry count.
|
||||
* @param \HTTP_Request2_Response $response The HTTP response object.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public abstract function calculateBackoff($retryCount, $response);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Filters;
|
||||
use WindowsAzure\Common\Internal\IServiceFilter;
|
||||
|
||||
/**
|
||||
* Short description
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class RetryPolicyFilter implements IServiceFilter
|
||||
{
|
||||
/**
|
||||
* @var RetryPolicy
|
||||
*/
|
||||
private $_retryPolicy;
|
||||
|
||||
/**
|
||||
* Initializes new object from RetryPolicyFilter.
|
||||
*
|
||||
* @param RetryPolicy $retryPolicy The retry policy object.
|
||||
*/
|
||||
public function __construct($retryPolicy)
|
||||
{
|
||||
$this->_retryPolicy = $retryPolicy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the request before sending.
|
||||
*
|
||||
* @param \HTTP_Request2 $request The HTTP request.
|
||||
*
|
||||
* @return \HTTP_Request2
|
||||
*/
|
||||
public function handleRequest($request)
|
||||
{
|
||||
return $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the response after sending.
|
||||
*
|
||||
* @param \HTTP_Request2 $request The HTTP request.
|
||||
* @param \HTTP_Request2_Response $response The HTTP response.
|
||||
*
|
||||
* @return \HTTP_Request2_Response
|
||||
*/
|
||||
public function handleResponse($request, $response)
|
||||
{
|
||||
for ($retryCount = 0;; $retryCount++) {
|
||||
$shouldRetry = $this->_retryPolicy->shouldRetry(
|
||||
$retryCount,
|
||||
$response
|
||||
);
|
||||
|
||||
if (!$shouldRetry) {
|
||||
return $response;
|
||||
}
|
||||
|
||||
// Backoff for some time according to retry policy
|
||||
$backoffTime = $this->_retryPolicy->calculateBackoff(
|
||||
$retryCount,
|
||||
$response
|
||||
);
|
||||
sleep($backoffTime * 0.001);
|
||||
$response = $request->send(array());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Filters;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\Internal\IServiceFilter;
|
||||
use WindowsAzure\Common\Internal\Authentication\SharedKeyAuthScheme;
|
||||
use WindowsAzure\Common\Internal\Authentication\TableSharedKeyLiteAuthScheme;
|
||||
use WindowsAzure\Common\Internal\InvalidArgumentTypeException;
|
||||
use WindowsAzure\ServiceBus\Internal\WrapTokenManager;
|
||||
|
||||
|
||||
/**
|
||||
* Adds WRAP authentication header to the http request object.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Filters
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class WrapFilter implements IServiceFilter
|
||||
{
|
||||
/**
|
||||
* @var WrapTokenManager
|
||||
*/
|
||||
private $_wrapTokenManager;
|
||||
|
||||
/**
|
||||
* Creates a WrapFilter with specified WRAP parameters.
|
||||
*
|
||||
* @param string $wrapUri The URI of the WRAP service.
|
||||
* @param string $wrapUsername The user name of the WRAP account.
|
||||
* @param string $wrapPassword The password of the WRAP account.
|
||||
* @param IWrap $wrapRestProxy The WRAP service REST proxy.
|
||||
*/
|
||||
public function __construct(
|
||||
$wrapUri,
|
||||
$wrapUsername,
|
||||
$wrapPassword,
|
||||
$wrapRestProxy
|
||||
) {
|
||||
$this->_wrapTokenManager = new WrapTokenManager(
|
||||
$wrapUri,
|
||||
$wrapUsername,
|
||||
$wrapPassword,
|
||||
$wrapRestProxy
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds WRAP authentication header to the request headers.
|
||||
*
|
||||
* @param HttpClient $request HTTP channel object.
|
||||
*
|
||||
* @return \HTTP_Request2
|
||||
*/
|
||||
public function handleRequest($request)
|
||||
{
|
||||
Validate::notNull($request, 'request');
|
||||
$wrapAccessToken = $this->_wrapTokenManager->getAccessToken(
|
||||
$request->getUrl()
|
||||
);
|
||||
|
||||
$authorization = sprintf(
|
||||
Resources::WRAP_AUTHORIZATION,
|
||||
$wrapAccessToken
|
||||
);
|
||||
|
||||
$request->setHeader(Resources::AUTHENTICATION, $authorization);
|
||||
|
||||
return $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the original response.
|
||||
*
|
||||
* @param HttpClient $request A HTTP channel object.
|
||||
* @param \HTTP_Request2_Response $response A HTTP response object.
|
||||
*
|
||||
* @return \HTTP_Request2_Response
|
||||
*/
|
||||
public function handleResponse($request, $response)
|
||||
{
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Http;
|
||||
require_once 'PEAR.php';
|
||||
require_once 'Mail/mimePart.php';
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
|
||||
/**
|
||||
* Batch request marshaler
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class BatchRequest
|
||||
{
|
||||
/**
|
||||
* Http call context list
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_contexts;
|
||||
|
||||
/**
|
||||
* Headers
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_headers;
|
||||
|
||||
/**
|
||||
* Request body
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_body;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->_contexts = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Append new context to batch request
|
||||
*
|
||||
* @param WindowsAzure\Common\Internal\Http\HttpCallContext $context Http call
|
||||
* context to add to batch request
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function appendContext($context)
|
||||
{
|
||||
$this->_contexts[] = $context;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode contexts
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function encode()
|
||||
{
|
||||
$mimeType = Resources::MULTIPART_MIXED_TYPE;
|
||||
$batchGuid = Utilities::getGuid();
|
||||
$batchId = sprintf('batch_%s', $batchGuid);
|
||||
$contentType1 = array('content_type' => "$mimeType");
|
||||
$changeSetGuid = Utilities::getGuid();
|
||||
$changeSetId = sprintf('changeset_%s', $changeSetGuid);
|
||||
$contentType2 = array('content_type' => "$mimeType; boundary=$changeSetId");
|
||||
$options = array(
|
||||
'encoding' => 'binary',
|
||||
'content_type' => Resources::HTTP_TYPE
|
||||
);
|
||||
|
||||
// Create changeset MIME part
|
||||
$changeSet = new \Mail_mimePart();
|
||||
|
||||
$i = 1;
|
||||
foreach ($this->_contexts as $context) {
|
||||
$context->addHeader(Resources::CONTENT_ID, $i);
|
||||
$changeSet->addSubpart((string)$context, $options);
|
||||
|
||||
$i++;
|
||||
}
|
||||
|
||||
// Encode the changeset MIME part
|
||||
$changeSetEncoded = $changeSet->encode($changeSetId);
|
||||
|
||||
// Create the batch MIME part
|
||||
$batch = new \Mail_mimePart(Resources::EMPTY_STRING, $contentType1);
|
||||
|
||||
// Add changeset encoded to batch MIME part
|
||||
$batch->addSubpart($changeSetEncoded['body'], $contentType2);
|
||||
|
||||
// Encode batch MIME part
|
||||
$batchEncoded = $batch->encode($batchId);
|
||||
|
||||
$this->_headers = $batchEncoded['headers'];
|
||||
$this->_body = $batchEncoded['body'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get "Request body"
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getBody()
|
||||
{
|
||||
return $this->_body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get "Headers"
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getHeaders()
|
||||
{
|
||||
return $this->_headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get request contexts
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getContexts()
|
||||
{
|
||||
return $this->_contexts;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Http;
|
||||
require_once 'PEAR.php';
|
||||
require_once 'Mail/mimeDecode.php';
|
||||
require_once 'HTTP/Request2/Response.php';
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\ServiceException;
|
||||
|
||||
/**
|
||||
* Batch response parser
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class BatchResponse
|
||||
{
|
||||
/**
|
||||
* Http responses list
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_contexts;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $content Http response
|
||||
* as string
|
||||
*
|
||||
* @param WindowsAzure\Common\Internal\Http\BatchRequest $request Source batch
|
||||
* request object
|
||||
*/
|
||||
public function __construct($content, $request = null)
|
||||
{
|
||||
$params['include_bodies'] = true;
|
||||
$params['input'] = $content;
|
||||
$mimeDecoder = new \Mail_mimeDecode($content);
|
||||
$structure = $mimeDecoder->decode($params);
|
||||
$parts = $structure->parts;
|
||||
$this->_contexts = array();
|
||||
$requestContexts = null;
|
||||
|
||||
if ($request != null) {
|
||||
Validate::isA(
|
||||
$request,
|
||||
'WindowsAzure\Common\Internal\Http\BatchRequest',
|
||||
'request'
|
||||
);
|
||||
$requestContexts = $request->getContexts();
|
||||
}
|
||||
|
||||
$i = 0;
|
||||
foreach ($parts as $part) {
|
||||
if (!empty($part->body)) {
|
||||
$headerEndPos = strpos($part->body, "\r\n\r\n");
|
||||
|
||||
$header = substr($part->body, 0, $headerEndPos);
|
||||
$body = substr($part->body, $headerEndPos + 4);
|
||||
$headerStrings = explode("\r\n", $header);
|
||||
|
||||
$response = new \HTTP_Request2_Response(array_shift($headerStrings));
|
||||
foreach ($headerStrings as $headerString) {
|
||||
$response->parseHeaderLine($headerString);
|
||||
}
|
||||
$response->appendBody($body);
|
||||
|
||||
$this->_contexts[] = $response;
|
||||
|
||||
if (is_array($requestContexts)) {
|
||||
$expectedCodes = $requestContexts[$i]->getStatusCodes();
|
||||
$statusCode = $response->getStatus();
|
||||
|
||||
if (!in_array($statusCode, $expectedCodes)) {
|
||||
$reason = $response->getReasonPhrase();
|
||||
|
||||
throw new ServiceException($statusCode, $reason, $body); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Error message to be escaped when caught and printed.
|
||||
}
|
||||
}
|
||||
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get parsed contexts as array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getContexts()
|
||||
{
|
||||
return $this->_contexts;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,446 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Http
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Http;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\Internal\Http\Url;
|
||||
|
||||
/**
|
||||
* Holds basic elements for making HTTP call.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Http
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class HttpCallContext
|
||||
{
|
||||
/**
|
||||
* The HTTP method used to make this call.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_method;
|
||||
|
||||
/**
|
||||
* HTTP request headers.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_headers;
|
||||
|
||||
/**
|
||||
* The URI query parameters.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_queryParams;
|
||||
|
||||
/**
|
||||
* The HTTP POST parameters.
|
||||
*
|
||||
* @var array.
|
||||
*/
|
||||
private $_postParameters;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_uri;
|
||||
|
||||
/**
|
||||
* The URI path.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_path;
|
||||
|
||||
/**
|
||||
* The expected status codes.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_statusCodes;
|
||||
|
||||
/**
|
||||
* The HTTP request body.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_body;
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->_method = null;
|
||||
$this->_body = null;
|
||||
$this->_path = null;
|
||||
$this->_uri = null;
|
||||
$this->_queryParams = array();
|
||||
$this->_postParameters = array();
|
||||
$this->_statusCodes = array();
|
||||
$this->_headers = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets method.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getMethod()
|
||||
{
|
||||
return $this->_method;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets method.
|
||||
*
|
||||
* @param string $method The method value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setMethod($method)
|
||||
{
|
||||
Validate::isString($method, 'method');
|
||||
|
||||
$this->_method = $method;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets headers.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getHeaders()
|
||||
{
|
||||
return $this->_headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets headers.
|
||||
*
|
||||
* Ignores the header if its value is empty.
|
||||
*
|
||||
* @param array $headers The headers value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setHeaders($headers)
|
||||
{
|
||||
$this->_headers = array();
|
||||
foreach ($headers as $key => $value) {
|
||||
$this->addHeader($key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets queryParams.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getQueryParameters()
|
||||
{
|
||||
return $this->_queryParams;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets queryParams.
|
||||
*
|
||||
* Ignores the query variable if its value is empty.
|
||||
*
|
||||
* @param array $queryParams The queryParams value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setQueryParameters($queryParams)
|
||||
{
|
||||
$this->_queryParams = array();
|
||||
foreach ($queryParams as $key => $value) {
|
||||
$this->addQueryParameter($key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets uri.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUri()
|
||||
{
|
||||
return $this->_uri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets uri.
|
||||
*
|
||||
* @param string $uri The uri value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setUri($uri)
|
||||
{
|
||||
Validate::isString($uri, 'uri');
|
||||
|
||||
$this->_uri = $uri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets path.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getPath()
|
||||
{
|
||||
return $this->_path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets path.
|
||||
*
|
||||
* @param string $path The path value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setPath($path)
|
||||
{
|
||||
Validate::isString($path, 'path');
|
||||
|
||||
$this->_path = $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets statusCodes.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getStatusCodes()
|
||||
{
|
||||
return $this->_statusCodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets statusCodes.
|
||||
*
|
||||
* @param array $statusCodes The statusCodes value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setStatusCodes($statusCodes)
|
||||
{
|
||||
$this->_statusCodes = array();
|
||||
foreach ($statusCodes as $value) {
|
||||
$this->addStatusCode($value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets body.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getBody()
|
||||
{
|
||||
return $this->_body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets body.
|
||||
*
|
||||
* @param string $body The body value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setBody($body)
|
||||
{
|
||||
Validate::isString($body, 'body');
|
||||
|
||||
$this->_body = $body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds or sets header pair.
|
||||
*
|
||||
* @param string $name The HTTP header name.
|
||||
* @param string $value The HTTP header value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function addHeader($name, $value)
|
||||
{
|
||||
Validate::isString($name, 'name');
|
||||
Validate::isString($value, 'value');
|
||||
|
||||
$this->_headers[$name] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds or sets header pair.
|
||||
*
|
||||
* Ignores header if it's value satisfies empty().
|
||||
*
|
||||
* @param string $name The HTTP header name.
|
||||
* @param string $value The HTTP header value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function addOptionalHeader($name, $value)
|
||||
{
|
||||
Validate::isString($name, 'name');
|
||||
Validate::isString($value, 'value');
|
||||
|
||||
if (!empty($value)) {
|
||||
$this->_headers[$name] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes header from the HTTP request headers.
|
||||
*
|
||||
* @param string $name The HTTP header name.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function removeHeader($name)
|
||||
{
|
||||
Validate::isString($name, 'name');
|
||||
Validate::notNullOrEmpty($name, 'name');
|
||||
|
||||
unset($this->_headers[$name]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds or sets query parameter pair.
|
||||
*
|
||||
* @param string $name The URI query parameter name.
|
||||
* @param string $value The URI query parameter value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function addQueryParameter($name, $value)
|
||||
{
|
||||
Validate::isString($name, 'name');
|
||||
Validate::isString($value, 'value');
|
||||
|
||||
$this->_queryParams[$name] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets HTTP POST parameters.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getPostParameters()
|
||||
{
|
||||
return $this->_postParameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets HTTP POST parameters.
|
||||
*
|
||||
* @param array $postParameters The HTTP POST parameters.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setPostParameters($postParameters)
|
||||
{
|
||||
Validate::isArray($postParameters, 'postParameters');
|
||||
$this->_postParameters = $postParameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds or sets query parameter pair.
|
||||
*
|
||||
* Ignores query parameter if it's value satisfies empty().
|
||||
*
|
||||
* @param string $name The URI query parameter name.
|
||||
* @param string $value The URI query parameter value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function addOptionalQueryParameter($name, $value)
|
||||
{
|
||||
Validate::isString($name, 'name');
|
||||
Validate::isString($value, 'value');
|
||||
|
||||
if (!empty($value)) {
|
||||
$this->_queryParams[$name] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds status code to the expected status codes.
|
||||
*
|
||||
* @param integer $statusCode The expected status code.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function addStatusCode($statusCode)
|
||||
{
|
||||
Validate::isInteger($statusCode, 'statusCode');
|
||||
|
||||
$this->_statusCodes[] = $statusCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets header value.
|
||||
*
|
||||
* @param string $name The header name.
|
||||
*
|
||||
* @return mix
|
||||
*/
|
||||
public function getHeader($name)
|
||||
{
|
||||
return Utilities::tryGetValue($this->_headers, $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the context object to string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
$headers = Resources::EMPTY_STRING;
|
||||
$uri = new Url($this->_uri);
|
||||
$uri = $uri->getUrl();
|
||||
|
||||
foreach ($this->_headers as $key => $value) {
|
||||
$headers .= "$key: $value\n";
|
||||
}
|
||||
|
||||
$str = "$this->_method $uri$this->_path HTTP/1.1\n$headers\n";
|
||||
$str .= "$this->_body";
|
||||
|
||||
return $str;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,388 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Http
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Http;
|
||||
use WindowsAzure\Common\Internal\Http\IHttpClient;
|
||||
use WindowsAzure\Common\Internal\IServiceFilter;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\ServiceException;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\Internal\Http\IUrl;
|
||||
|
||||
require_once 'HTTP/Request2.php';
|
||||
|
||||
/**
|
||||
* HTTP client which sends and receives HTTP requests and responses.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Http
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class HttpClient implements IHttpClient
|
||||
{
|
||||
/**
|
||||
* @var \HTTP_Request2
|
||||
*/
|
||||
private $_request;
|
||||
|
||||
/**
|
||||
* @var WindowsAzure\Common\Internal\Http\IUrl
|
||||
*/
|
||||
private $_requestUrl;
|
||||
|
||||
/**
|
||||
* Holds the latest response object
|
||||
*
|
||||
* @var \HTTP_Request2_Response
|
||||
*/
|
||||
private $_response;
|
||||
|
||||
/**
|
||||
* Holds expected status code after sending the request.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_expectedStatusCodes;
|
||||
|
||||
/**
|
||||
* Initializes new HttpClient object.
|
||||
*
|
||||
* @param string $certificatePath The certificate path.
|
||||
* @param string $certificateAuthorityPath The path of the certificate authority.
|
||||
*
|
||||
* @return WindowsAzure\Common\Internal\Http\HttpClient
|
||||
*/
|
||||
function __construct(
|
||||
$certificatePath = Resources::EMPTY_STRING,
|
||||
$certificateAuthorityPath = Resources::EMPTY_STRING
|
||||
) {
|
||||
|
||||
$config = array(
|
||||
Resources::USE_BRACKETS => true,
|
||||
Resources::SSL_VERIFY_PEER => false,
|
||||
Resources::SSL_VERIFY_HOST => false
|
||||
);
|
||||
|
||||
if (!empty($certificatePath)) {
|
||||
$config[Resources::SSL_LOCAL_CERT] = $certificatePath;
|
||||
$config[Resources::SSL_VERIFY_HOST] = true;
|
||||
}
|
||||
|
||||
if (!empty($certificateAuthorityPath)) {
|
||||
$config[Resources::SSL_CAFILE] = $certificateAuthorityPath;
|
||||
$config[Resources::SSL_VERIFY_PEER] = true;
|
||||
}
|
||||
|
||||
$this->_request = new \HTTP_Request2(
|
||||
null, null, $config
|
||||
);
|
||||
|
||||
$this->setHeader('user-agent', null);
|
||||
|
||||
$this->_requestUrl = null;
|
||||
$this->_response = null;
|
||||
$this->_expectedStatusCodes = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes deep copy from the current object.
|
||||
*
|
||||
* @return WindowsAzure\Common\Internal\Http\HttpClient
|
||||
*/
|
||||
public function __clone()
|
||||
{
|
||||
$this->_request = clone $this->_request;
|
||||
|
||||
if (!is_null($this->_requestUrl)) {
|
||||
$this->_requestUrl = clone $this->_requestUrl;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the request url.
|
||||
*
|
||||
* @param WindowsAzure\Common\Internal\Http\IUrl $url request url.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setUrl($url)
|
||||
{
|
||||
$this->_requestUrl = $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets request url. Note that you must check if the returned object is null or
|
||||
* not.
|
||||
*
|
||||
* @return WindowsAzure\Common\Internal\Http\IUrl
|
||||
*/
|
||||
public function getUrl()
|
||||
{
|
||||
return $this->_requestUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets request's HTTP method. You can use \HTTP_Request2 constants like
|
||||
* Resources::HTTP_GET or strings like 'GET'.
|
||||
*
|
||||
* @param string $method request's HTTP method.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setMethod($method)
|
||||
{
|
||||
$this->_request->setMethod($method);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets request's HTTP method.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getMethod()
|
||||
{
|
||||
return $this->_request->getMethod();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets request's headers. The returned array key (header names) are all in
|
||||
* lower case even if they were set having some upper letters.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getHeaders()
|
||||
{
|
||||
return $this->_request->getHeaders();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a an existing request header to value or creates a new one if the $header
|
||||
* doesn't exist.
|
||||
*
|
||||
* @param string $header header name.
|
||||
* @param string $value header value.
|
||||
* @param bool $replace whether to replace previous header with the same name
|
||||
* or append to its value (comma separated)
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setHeader($header, $value, $replace = false)
|
||||
{
|
||||
Validate::isString($value, 'value');
|
||||
|
||||
$this->_request->setHeader($header, $value, $replace);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets request headers using array
|
||||
*
|
||||
* @param array $headers headers key-value array
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setHeaders($headers)
|
||||
{
|
||||
foreach ($headers as $key => $value) {
|
||||
$this->setHeader($key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets HTTP POST parameters.
|
||||
*
|
||||
* @param array $postParameters The HTTP POST parameters.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setPostParameters($postParameters)
|
||||
{
|
||||
$this->_request->addPostParameter($postParameters);
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes the reuqest through HTTP pipeline with passed $filters,
|
||||
* sends HTTP request to the wire and process the response in the HTTP pipeline.
|
||||
*
|
||||
* @param array $filters HTTP filters which will be applied to the request before
|
||||
* send and then applied to the response.
|
||||
* @param IUrl $url Request url.
|
||||
*
|
||||
* @throws WindowsAzure\Common\ServiceException
|
||||
*
|
||||
* @return string The response body
|
||||
*/
|
||||
public function send($filters, $url = null)
|
||||
{
|
||||
if (isset($url)) {
|
||||
$this->setUrl($url);
|
||||
$this->_request->setUrl($this->_requestUrl->getUrl());
|
||||
}
|
||||
|
||||
$contentLength = Resources::EMPTY_STRING;
|
||||
if ( strtoupper($this->getMethod()) != Resources::HTTP_GET
|
||||
&& strtoupper($this->getMethod()) != Resources::HTTP_DELETE
|
||||
&& strtoupper($this->getMethod()) != Resources::HTTP_HEAD
|
||||
) {
|
||||
$contentLength = 0;
|
||||
|
||||
if (!is_null($this->getBody())) {
|
||||
$contentLength = strlen($this->getBody());
|
||||
}
|
||||
$this->_request->setHeader(Resources::CONTENT_LENGTH, $contentLength);
|
||||
}
|
||||
|
||||
foreach ($filters as $filter) {
|
||||
$this->_request = $filter->handleRequest($this)->_request;
|
||||
}
|
||||
|
||||
$this->_response = $this->_request->send();
|
||||
|
||||
$start = count($filters) - 1;
|
||||
for ($index = $start; $index >= 0; $index--) {
|
||||
$this->_response = $filters[$index]->handleResponse(
|
||||
$this, $this->_response
|
||||
);
|
||||
}
|
||||
|
||||
self::throwIfError(
|
||||
$this->_response->getStatus(),
|
||||
$this->_response->getReasonPhrase(),
|
||||
$this->_response->getBody(),
|
||||
$this->_expectedStatusCodes
|
||||
);
|
||||
|
||||
return $this->_response->getBody();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets successful status code
|
||||
*
|
||||
* @param array|string $statusCodes successful status code.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setExpectedStatusCode($statusCodes)
|
||||
{
|
||||
if (!is_array($statusCodes)) {
|
||||
$this->_expectedStatusCodes[] = $statusCodes;
|
||||
} else {
|
||||
$this->_expectedStatusCodes = $statusCodes;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets successful status code
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getSuccessfulStatusCode()
|
||||
{
|
||||
return $this->_expectedStatusCodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets configuration parameter.
|
||||
*
|
||||
* @param string $name The configuration parameter name.
|
||||
* @param mix $value The configuration parameter value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setConfig($name, $value = null)
|
||||
{
|
||||
$this->_request->setConfig($name, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets value for configuration parameter.
|
||||
*
|
||||
* @param string $name configuration parameter name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getConfig($name)
|
||||
{
|
||||
return $this->_request->getConfig($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the request body.
|
||||
*
|
||||
* @param string $body body to use.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setBody($body)
|
||||
{
|
||||
Validate::isString($body, 'body');
|
||||
$this->_request->setBody($body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the request body.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getBody()
|
||||
{
|
||||
return $this->_request->getBody();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the response object.
|
||||
*
|
||||
* @return \HTTP_Request2_Response
|
||||
*/
|
||||
public function getResponse()
|
||||
{
|
||||
return $this->_response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws ServiceException if the recieved status code is not expected.
|
||||
*
|
||||
* @param string $actual The received status code.
|
||||
* @param string $reason The reason phrase.
|
||||
* @param string $message The detailed message (if any).
|
||||
* @param array $expected The expected status codes.
|
||||
*
|
||||
* @return none
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @throws ServiceException
|
||||
*/
|
||||
public static function throwIfError($actual, $reason, $message, $expected)
|
||||
{
|
||||
if (!in_array($actual, $expected)) {
|
||||
throw new ServiceException($actual, $reason, $message); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Error message to be escaped when caught and printed.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,204 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Http
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Http;
|
||||
|
||||
/**
|
||||
* Defines required methods for a HTTP client proxy.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Http
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
interface IHttpClient
|
||||
{
|
||||
/**
|
||||
* Sets the request url.
|
||||
*
|
||||
* @param WindowsAzure\Common\Internal\Http\IUrl $url request url.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setUrl($url);
|
||||
|
||||
/**
|
||||
* Gets request url.
|
||||
*
|
||||
* @return WindowsAzure\Common\Internal\Http\IUrl
|
||||
*/
|
||||
public function getUrl();
|
||||
|
||||
/**
|
||||
* Sets request's HTTP method.
|
||||
*
|
||||
* @param string $method request's HTTP method.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setMethod($method);
|
||||
|
||||
/**
|
||||
* Gets request's HTTP method.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getMethod();
|
||||
|
||||
/**
|
||||
* Gets request's headers
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getHeaders();
|
||||
|
||||
/**
|
||||
* Sets a an existing request header to value or creates a new one if the $header
|
||||
* doesn't exist.
|
||||
*
|
||||
* @param string $header header name.
|
||||
* @param string $value header value.
|
||||
* @param bool $replace whether to replace previous header with the same name
|
||||
* or append to its value (comma separated)
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setHeader($header, $value, $replace = false);
|
||||
|
||||
/**
|
||||
* Sets request headers using array
|
||||
*
|
||||
* @param array $headers headers key-value array
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setHeaders($headers);
|
||||
|
||||
/**
|
||||
* Sets HTTP POST parameters.
|
||||
*
|
||||
* @param array $postParameters The HTTP POST parameters.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setPostParameters($postParameters);
|
||||
|
||||
/**
|
||||
* Processes the reuqest through HTTP pipeline with passed $filters,
|
||||
* sends HTTP request to the wire and process the response in the HTTP pipeline.
|
||||
*
|
||||
* @param array $filters HTTP filters which will be applied to the request before
|
||||
* send and then applied to the response.
|
||||
* @param IUrl $url Request url.
|
||||
*
|
||||
* @return string The response body.
|
||||
*/
|
||||
public function send($filters, $url = null);
|
||||
|
||||
/**
|
||||
* Sets successful status code
|
||||
*
|
||||
* @param array|string $statusCodes successful status code.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setExpectedStatusCode($statusCodes);
|
||||
|
||||
/**
|
||||
* Gets successful status code
|
||||
*
|
||||
* @return array.
|
||||
*/
|
||||
public function getSuccessfulStatusCode();
|
||||
|
||||
/**
|
||||
* Sets a configuration element for the request.
|
||||
*
|
||||
* @param string $name configuration parameter name.
|
||||
* @param mix $value configuration parameter value.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setConfig($name, $value = null);
|
||||
|
||||
/**
|
||||
* Gets value for configuration parameter.
|
||||
*
|
||||
* @param string $name configuration parameter name.
|
||||
*
|
||||
* @return string.
|
||||
*/
|
||||
public function getConfig($name);
|
||||
|
||||
/**
|
||||
* Sets the request body.
|
||||
*
|
||||
* @param string $body body to use.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setBody($body);
|
||||
|
||||
/**
|
||||
* Gets the request body.
|
||||
*
|
||||
* @return string.
|
||||
*/
|
||||
public function getBody();
|
||||
|
||||
/**
|
||||
* Makes deep copy from the current object.
|
||||
*
|
||||
* @return WindowsAzure\Common\Internal\Http\HttpClient
|
||||
*/
|
||||
public function __clone();
|
||||
|
||||
/**
|
||||
* Gets the response object.
|
||||
*
|
||||
* @return \HTTP_Request2_Response.
|
||||
*/
|
||||
public function getResponse();
|
||||
|
||||
/**
|
||||
* Throws ServiceException if the recieved status code is not expected.
|
||||
*
|
||||
* @param string $actual The received status code.
|
||||
* @param string $reason The reason phrase.
|
||||
* @param string $message The detailed message (if any).
|
||||
* @param array $expected The expected status codes.
|
||||
*
|
||||
* @return none
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @throws ServiceException
|
||||
*/
|
||||
public static function throwIfError($actual, $reason, $message, $expected);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Http
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Http;
|
||||
|
||||
/**
|
||||
* Defines what are main url functionalities that should be supported
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Http
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
interface IUrl
|
||||
{
|
||||
/**
|
||||
* Returns the query portion of the url
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getQuery();
|
||||
|
||||
/**
|
||||
* Returns the query portion of the url in array form
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getQueryVariables();
|
||||
|
||||
/**
|
||||
* Sets a an existing query parameter to value or creates a new one if the $key
|
||||
* doesn't exist.
|
||||
*
|
||||
* @param string $key query parameter name.
|
||||
* @param string $value query value.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setQueryVariable($key, $value);
|
||||
|
||||
/**
|
||||
* Gets actual URL string.
|
||||
*
|
||||
* @return string.
|
||||
*/
|
||||
public function getUrl();
|
||||
|
||||
/**
|
||||
* Sets url path
|
||||
*
|
||||
* @param string $urlPath url path to set.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setUrlPath($urlPath);
|
||||
|
||||
/**
|
||||
* Appends url path
|
||||
*
|
||||
* @param string $urlPath url path to append.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function appendUrlPath($urlPath);
|
||||
|
||||
/**
|
||||
* Gets actual URL string.
|
||||
*
|
||||
* @return string.
|
||||
*/
|
||||
public function __toString();
|
||||
|
||||
/**
|
||||
* Makes deep copy from the current object.
|
||||
*
|
||||
* @return WindowsAzure\Common\Internal\Http\Url
|
||||
*/
|
||||
public function __clone();
|
||||
|
||||
/**
|
||||
* Sets the query string to the specified variables in $array
|
||||
*
|
||||
* @param array $array key/value representation of query variables.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setQueryVariables($array);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,192 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Http
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Http;
|
||||
require_once 'Net/URL2.php';
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Http\IUrl;
|
||||
|
||||
/**
|
||||
* Default IUrl implementation.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Http
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class Url implements IUrl
|
||||
{
|
||||
/**
|
||||
* @var \Net_URL2
|
||||
*/
|
||||
private $_url;
|
||||
|
||||
/**
|
||||
* Sets the url path to '/' if it's empty
|
||||
*
|
||||
* @param string $url the url string
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
private function _setPathIfEmpty($url)
|
||||
{
|
||||
$path = parse_url($url, PHP_URL_PATH);
|
||||
|
||||
if (empty($path)) {
|
||||
$this->setUrlPath('/');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $url the url to set.
|
||||
*
|
||||
* @return WindowsAzure\Common\Internal\Http\Url
|
||||
*/
|
||||
public function __construct($url)
|
||||
{
|
||||
$errorMessage = Resources::INVALID_URL_MSG;
|
||||
Validate::isTrue(filter_var($url, FILTER_VALIDATE_URL), $errorMessage);
|
||||
|
||||
$this->_url = new \Net_URL2($url);
|
||||
$this->_setPathIfEmpty($url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes deep copy from the current object.
|
||||
*
|
||||
* @return WindowsAzure\Common\Internal\Http\Url
|
||||
*/
|
||||
public function __clone()
|
||||
{
|
||||
$this->_url = clone $this->_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the query portion of the url
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getQuery()
|
||||
{
|
||||
return $this->_url->getQuery();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the query portion of the url in array form
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getQueryVariables()
|
||||
{
|
||||
return $this->_url->getQueryVariables();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a an existing query parameter to value or creates a new one if the $key
|
||||
* doesn't exist.
|
||||
*
|
||||
* @param string $key query parameter name.
|
||||
* @param string $value query value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setQueryVariable($key, $value)
|
||||
{
|
||||
Validate::isString($key, 'key');
|
||||
Validate::isString($value, 'value');
|
||||
|
||||
$this->_url->setQueryVariable($key, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets actual URL string.
|
||||
*
|
||||
* @return string.
|
||||
*/
|
||||
public function getUrl()
|
||||
{
|
||||
return $this->_url->getURL();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets url path
|
||||
*
|
||||
* @param string $urlPath url path to set.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setUrlPath($urlPath)
|
||||
{
|
||||
Validate::isString($urlPath, 'urlPath');
|
||||
|
||||
$this->_url->setPath($urlPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends url path
|
||||
*
|
||||
* @param string $urlPath url path to append.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function appendUrlPath($urlPath)
|
||||
{
|
||||
Validate::isString($urlPath, 'urlPath');
|
||||
|
||||
$newUrlPath = parse_url($this->_url, PHP_URL_PATH) . $urlPath;
|
||||
$this->_url->setPath($newUrlPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets actual URL string.
|
||||
*
|
||||
* @return string.
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->_url->getURL();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the query string to the specified variables in $array
|
||||
*
|
||||
* @param array $array key/value representation of query variables.
|
||||
*
|
||||
* @return none.
|
||||
*/
|
||||
public function setQueryVariables($array)
|
||||
{
|
||||
foreach ($array as $key => $value) {
|
||||
$this->setQueryVariable($key, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
|
||||
/**
|
||||
* ServceFilter is called when the sending the request and after receiving the
|
||||
* response.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
interface IServiceFilter
|
||||
{
|
||||
/**
|
||||
* Processes HTTP request before send.
|
||||
*
|
||||
* @param mix $request HTTP request object.
|
||||
*
|
||||
* @return mix processed HTTP request object.
|
||||
*/
|
||||
public function handleRequest($request);
|
||||
|
||||
/**
|
||||
* Processes HTTP response after send.
|
||||
*
|
||||
* @param mix $request HTTP request object.
|
||||
* @param mix $response HTTP response object.
|
||||
*
|
||||
* @return mix processed HTTP response object.
|
||||
*/
|
||||
public function handleResponse($request, $response);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
|
||||
/**
|
||||
* Exception thrown if an argument type does not match with the expected type.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class InvalidArgumentTypeException extends \InvalidArgumentException
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $validType The valid type that should be provided by the user.
|
||||
* @param string $name The parameter name.
|
||||
*
|
||||
* @return WindowsAzure\Common\Internal\InvalidArgumentTypeException
|
||||
*/
|
||||
public function __construct($validType, $name = null)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(Resources::INVALID_PARAM_MSG, $name, $validType)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
|
||||
/**
|
||||
* Logger class for debugging purpose.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class Logger
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private static $_filePath;
|
||||
|
||||
/**
|
||||
* Logs $var to file.
|
||||
*
|
||||
* @param mix $var The data to log.
|
||||
* @param string $tip The help message.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function log($var, $tip = Resources::EMPTY_STRING)
|
||||
{
|
||||
if (!empty($tip)) {
|
||||
error_log($tip . "\n", 3, self::$_filePath);
|
||||
}
|
||||
|
||||
if (is_array($var) || is_object($var)) {
|
||||
error_log(print_r($var, true), 3, self::$_filePath);
|
||||
} else {
|
||||
error_log($var . "\n", 3, self::$_filePath);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets file path to use.
|
||||
*
|
||||
* @param string $filePath The log file path.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function setLogFile($filePath)
|
||||
{
|
||||
self::$_filePath = $filePath;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,267 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
|
||||
/**
|
||||
* Represents the settings used to sign and access a request against the service
|
||||
* management.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class MediaServicesSettings extends ServiceSettings
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_accountName;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_accessKey;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_endpointUri;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_oauthEndpointUri;
|
||||
|
||||
/**
|
||||
* Validator for the MediaServicesAccountName setting. It has to be provided.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_accountNameSetting;
|
||||
|
||||
/**
|
||||
* Validator for the MediaServicesAccessKey setting. It has to be provided.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_accessKeySetting;
|
||||
|
||||
/**
|
||||
* Validator for the MediaServicesEndpoint setting. Must be a valid Uri.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_endpointUriSetting;
|
||||
|
||||
/**
|
||||
* Validator for the MediaServicesOAuthEndpoint setting. Must be a valid Uri.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_oauthEndpointUriSetting;
|
||||
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
protected static $isInitialized = false;
|
||||
|
||||
/**
|
||||
* Holds the expected setting keys.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $validSettingKeys = array();
|
||||
|
||||
/**
|
||||
* Initializes static members of the class.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
protected static function init()
|
||||
{
|
||||
self::$_endpointUriSetting = self::settingWithFunc(
|
||||
Resources::MEDIA_SERVICES_ENDPOINT_URI_NAME,
|
||||
Validate::getIsValidUri()
|
||||
);
|
||||
|
||||
self::$_oauthEndpointUriSetting = self::settingWithFunc(
|
||||
Resources::MEDIA_SERVICES_OAUTH_ENDPOINT_URI_NAME,
|
||||
Validate::getIsValidUri()
|
||||
);
|
||||
|
||||
self::$_accountNameSetting = self::setting(
|
||||
Resources::MEDIA_SERVICES_ACCOUNT_NAME
|
||||
);
|
||||
|
||||
self::$_accessKeySetting = self::setting(
|
||||
Resources::MEDIA_SERVICES_ACCESS_KEY
|
||||
);
|
||||
|
||||
self::$validSettingKeys[] = Resources::MEDIA_SERVICES_ENDPOINT_URI_NAME;
|
||||
self::$validSettingKeys[] = Resources::MEDIA_SERVICES_OAUTH_ENDPOINT_URI_NAME;
|
||||
self::$validSettingKeys[] = Resources::MEDIA_SERVICES_ACCOUNT_NAME;
|
||||
self::$validSettingKeys[] = Resources::MEDIA_SERVICES_ACCESS_KEY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new media services settings instance.
|
||||
*
|
||||
* @param string $accountName The user provided account name.
|
||||
* @param string $accessKey The user provided primary access key
|
||||
* @param string $endpointUri The service management endpoint uri.
|
||||
* @param string $oauthEndpointUri The OAuth service endpoint uri.
|
||||
*/
|
||||
public function __construct(
|
||||
$accountName,
|
||||
$accessKey,
|
||||
$endpointUri = null,
|
||||
$oauthEndpointUri = null
|
||||
) {
|
||||
Validate::notNullOrEmpty($accountName, 'accountName');
|
||||
Validate::notNullOrEmpty($accessKey, 'accountKey');
|
||||
Validate::isString($accountName, 'accountName');
|
||||
Validate::isString($accessKey, 'accountKey');
|
||||
|
||||
if ($endpointUri != null) {
|
||||
Validate::isValidUri($endpointUri);
|
||||
} else {
|
||||
$endpointUri = Resources::MEDIA_SERVICES_URL;
|
||||
}
|
||||
|
||||
if ($oauthEndpointUri != null) {
|
||||
Validate::isValidUri($oauthEndpointUri);
|
||||
} else {
|
||||
$oauthEndpointUri = Resources::MEDIA_SERVICES_OAUTH_URL;
|
||||
}
|
||||
|
||||
$this->_accountName = $accountName;
|
||||
$this->_accessKey = $accessKey;
|
||||
$this->_endpointUri = $endpointUri;
|
||||
$this->_oauthEndpointUri = $oauthEndpointUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a MediaServicesSettings object from the given connection string.
|
||||
*
|
||||
* @param string $connectionString The media services settings connection string.
|
||||
*
|
||||
* @return MediaServicesSettings
|
||||
*/
|
||||
public static function createFromConnectionString($connectionString)
|
||||
{
|
||||
$tokenizedSettings = self::parseAndValidateKeys($connectionString);
|
||||
|
||||
$matchedSpecs = self::matchedSpecification(
|
||||
$tokenizedSettings,
|
||||
self::allRequired(
|
||||
self::$_accountNameSetting,
|
||||
self::$_accessKeySetting
|
||||
),
|
||||
self::optional(
|
||||
self::$_endpointUriSetting,
|
||||
self::$_oauthEndpointUriSetting
|
||||
)
|
||||
);
|
||||
if ($matchedSpecs) {
|
||||
$endpointUri = Utilities::tryGetValueInsensitive(
|
||||
Resources::MEDIA_SERVICES_ENDPOINT_URI_NAME,
|
||||
$tokenizedSettings,
|
||||
Resources::MEDIA_SERVICES_URL
|
||||
);
|
||||
|
||||
$oauthEndpointUri = Utilities::tryGetValueInsensitive(
|
||||
Resources::MEDIA_SERVICES_OAUTH_ENDPOINT_URI_NAME,
|
||||
$tokenizedSettings,
|
||||
Resources::MEDIA_SERVICES_OAUTH_URL
|
||||
);
|
||||
|
||||
$accountName = Utilities::tryGetValueInsensitive(
|
||||
Resources::MEDIA_SERVICES_ACCOUNT_NAME,
|
||||
$tokenizedSettings
|
||||
);
|
||||
|
||||
$accessKey = Utilities::tryGetValueInsensitive(
|
||||
Resources::MEDIA_SERVICES_ACCESS_KEY,
|
||||
$tokenizedSettings
|
||||
);
|
||||
|
||||
return new MediaServicesSettings(
|
||||
$accountName,
|
||||
$accessKey,
|
||||
$endpointUri,
|
||||
$oauthEndpointUri
|
||||
);
|
||||
}
|
||||
|
||||
self::noMatch($connectionString);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets media services account name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getAccountName()
|
||||
{
|
||||
return $this->_accountName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets media services access key.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getAccessKey()
|
||||
{
|
||||
return $this->_accessKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets media services endpoint uri.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getEndpointUri()
|
||||
{
|
||||
return $this->_endpointUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets media services OAuth endpoint uri.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getOAuthEndpointUri()
|
||||
{
|
||||
return $this->_oauthEndpointUri;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\ServiceRestProxy;
|
||||
use WindowsAzure\Common\Models\OAuthAccessToken;
|
||||
use WindowsAzure\Common\Internal\Serialization\JsonSerializer;
|
||||
|
||||
/**
|
||||
* OAuth rest proxy.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class OAuthRestProxy extends ServiceRestProxy
|
||||
{
|
||||
/**
|
||||
* Initializes new OAuthRestProxy object.
|
||||
*
|
||||
* @param IHttpClient $channel The HTTP client used to send HTTP requests.
|
||||
* @param string $uri The storage account uri.
|
||||
*/
|
||||
public function __construct($channel, $uri)
|
||||
{
|
||||
parent::__construct(
|
||||
$channel,
|
||||
$uri,
|
||||
Resources::EMPTY_STRING,
|
||||
new JsonSerializer()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get OAuth access token.
|
||||
*
|
||||
* @param string $grantType OAuth request grant_type field value.
|
||||
* @param string $clientId OAuth request clent_id field value.
|
||||
* @param string $clientSecret OAuth request clent_secret field value.
|
||||
* @param string $scope OAuth request scope field value.
|
||||
*
|
||||
* @return WindowsAzure\Common\Internal\Models\OAuthAccessToken
|
||||
*/
|
||||
public function getAccessToken($grantType, $clientId, $clientSecret, $scope)
|
||||
{
|
||||
$method = Resources::HTTP_POST;
|
||||
$headers = array();
|
||||
$queryParams = array();
|
||||
$postParameters = array();
|
||||
$statusCode = Resources::STATUS_OK;
|
||||
|
||||
$postParameters = $this->addPostParameter(
|
||||
$postParameters,
|
||||
Resources::OAUTH_GRANT_TYPE,
|
||||
$grantType
|
||||
);
|
||||
|
||||
$postParameters = $this->addPostParameter(
|
||||
$postParameters,
|
||||
Resources::OAUTH_CLIENT_ID,
|
||||
$clientId
|
||||
);
|
||||
|
||||
$postParameters = $this->addPostParameter(
|
||||
$postParameters,
|
||||
Resources::OAUTH_CLIENT_SECRET,
|
||||
$clientSecret
|
||||
);
|
||||
|
||||
$postParameters = $this->addPostParameter(
|
||||
$postParameters,
|
||||
Resources::OAUTH_SCOPE,
|
||||
$scope
|
||||
);
|
||||
|
||||
$response = $this->send(
|
||||
$method,
|
||||
$headers,
|
||||
$queryParams,
|
||||
$postParameters,
|
||||
Resources::EMPTY_STRING,
|
||||
$statusCode
|
||||
);
|
||||
|
||||
return OAuthAccessToken::create(
|
||||
$this->dataSerializer->unserialize($response->getBody())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,458 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
|
||||
/**
|
||||
* Project resources.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class Resources
|
||||
{
|
||||
// @codingStandardsIgnoreStart
|
||||
|
||||
// Connection strings
|
||||
const USE_DEVELOPMENT_STORAGE_NAME = 'UseDevelopmentStorage';
|
||||
const DEVELOPMENT_STORAGE_PROXY_URI_NAME = 'DevelopmentStorageProxyUri';
|
||||
const DEFAULT_ENDPOINTS_PROTOCOL_NAME = 'DefaultEndpointsProtocol';
|
||||
const ACCOUNT_NAME_NAME = 'AccountName';
|
||||
const ACCOUNT_KEY_NAME = 'AccountKey';
|
||||
const BLOB_ENDPOINT_NAME = 'BlobEndpoint';
|
||||
const QUEUE_ENDPOINT_NAME = 'QueueEndpoint';
|
||||
const TABLE_ENDPOINT_NAME = 'TableEndpoint';
|
||||
const SHARED_ACCESS_SIGNATURE_NAME = 'SharedAccessSignature';
|
||||
const DEV_STORE_NAME = 'devstoreaccount1';
|
||||
const DEV_STORE_KEY = 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==';
|
||||
const BLOB_BASE_DNS_NAME = 'blob.core.windows.net';
|
||||
const QUEUE_BASE_DNS_NAME = 'queue.core.windows.net';
|
||||
const TABLE_BASE_DNS_NAME = 'table.core.windows.net';
|
||||
const DEV_STORE_CONNECTION_STRING = 'BlobEndpoint=127.0.0.1:10000;QueueEndpoint=127.0.0.1:10001;TableEndpoint=127.0.0.1:10002;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==';
|
||||
const SUBSCRIPTION_ID_NAME = 'SubscriptionID';
|
||||
const CERTIFICATE_PATH_NAME = 'CertificatePath';
|
||||
const SERVICE_MANAGEMENT_ENDPOINT_NAME = 'ServiceManagementEndpoint';
|
||||
const SERVICE_BUS_ENDPOINT_NAME = 'Endpoint';
|
||||
const SHARED_SECRET_ISSUER_NAME = 'SharedSecretIssuer';
|
||||
const SHARED_SECRET_VALUE_NAME = 'SharedSecretValue';
|
||||
const STS_ENDPOINT_NAME = 'StsEndpoint';
|
||||
const MEDIA_SERVICES_ENDPOINT_URI_NAME = 'MediaServicesEndpoint';
|
||||
const MEDIA_SERVICES_ACCOUNT_NAME = 'AccountName';
|
||||
const MEDIA_SERVICES_ACCESS_KEY = 'AccessKey';
|
||||
const MEDIA_SERVICES_OAUTH_ENDPOINT_URI_NAME = 'OAuthEndpoint';
|
||||
|
||||
// Messages
|
||||
const INVALID_TYPE_MSG = 'The provided variable should be of type: ';
|
||||
const INVALID_META_MSG = 'Metadata cannot contain newline characters.';
|
||||
const AZURE_ERROR_MSG = "Fail:\nCode: %s\nValue: %s\ndetails (if any): %s.";
|
||||
const NOT_IMPLEMENTED_MSG = 'This method is not implemented.';
|
||||
const NULL_OR_EMPTY_MSG = "'%s' can't be NULL or empty.";
|
||||
const NULL_MSG = "'%s' can't be NULL.";
|
||||
const INVALID_URL_MSG = 'Provided URL is invalid.';
|
||||
const INVALID_HT_MSG = 'The header type provided is invalid.';
|
||||
const INVALID_EDM_MSG = 'The provided EDM type is invalid.';
|
||||
const INVALID_PROP_MSG = 'One of the provided properties is not an instance of class Property';
|
||||
const INVALID_ENTITY_MSG = 'The provided entity object is invalid.';
|
||||
const INVALID_VERSION_MSG = 'Server does not support any known protocol versions.';
|
||||
const INVALID_BO_TYPE_MSG = 'Batch operation name is not supported or invalid.';
|
||||
const INVALID_BO_PN_MSG = 'Batch operation parameter is not supported.';
|
||||
const INVALID_OC_COUNT_MSG = 'Operations and contexts must be of same size.';
|
||||
const INVALID_EXC_OBJ_MSG = 'Exception object type should be ServiceException.';
|
||||
const NULL_TABLE_KEY_MSG = 'Partition and row keys can\'t be NULL.';
|
||||
const BATCH_ENTITY_DEL_MSG = 'The entity was deleted successfully.';
|
||||
const INVALID_PROP_VAL_MSG = "'%s' property value must satisfy %s.";
|
||||
const INVALID_PARAM_MSG = "The provided variable '%s' should be of type '%s'";
|
||||
const INVALID_STRING_LENGTH = "The provided variable '%s' should be of %s characters long";
|
||||
const INVALID_BTE_MSG = "The blob block type must exist in %s";
|
||||
const INVALID_BLOB_PAT_MSG = 'The provided access type is invalid.';
|
||||
const INVALID_SVC_PROP_MSG = 'The provided service properties is invalid.';
|
||||
const UNKNOWN_SRILZER_MSG = 'The provided serializer type is unknown';
|
||||
const INVALID_CREATE_SERVICE_OPTIONS_MSG = 'Must provide valid location or affinity group.';
|
||||
const INVALID_UPDATE_SERVICE_OPTIONS_MSG = 'Must provide either description or label.';
|
||||
const INVALID_CONFIG_MSG = 'Config object must be of type Configuration';
|
||||
const INVALID_ACH_MSG = 'The provided access condition header is invalid';
|
||||
const INVALID_RECEIVE_MODE_MSG = 'The receive message option is in neither RECEIVE_AND_DELETE nor PEEK_LOCK mode.';
|
||||
const INVALID_CONFIG_URI = "The provided URI '%s' is invalid. It has to pass the check 'filter_var(<user_uri>, FILTER_VALIDATE_URL)'.";
|
||||
const INVALID_CONFIG_VALUE = "The provided config value '%s' does not belong to the valid values subset:\n%s";
|
||||
const INVALID_ACCOUNT_KEY_FORMAT = "The provided account key '%s' is not a valid base64 string. It has to pass the check 'base64_decode(<user_account_key>, true)'.";
|
||||
const MISSING_CONNECTION_STRING_SETTINGS = "The provided connection string '%s' does not have complete configuration settings.";
|
||||
const INVALID_CONNECTION_STRING_SETTING_KEY = "The setting key '%s' is not found in the expected configuration setting keys:\n%s";
|
||||
const INVALID_CERTIFICATE_PATH = "The provided certificate path '%s' is invalid.";
|
||||
const INSTANCE_TYPE_VALIDATION_MSG = 'The type of %s is %s but is expected to be %s.';
|
||||
const MISSING_CONNECTION_STRING_CHAR = "Missing %s character";
|
||||
const ERROR_PARSING_STRING = "'%s' at position %d.";
|
||||
const INVALID_CONNECTION_STRING = "Argument '%s' is not a valid connection string: '%s'";
|
||||
const ERROR_CONNECTION_STRING_MISSING_KEY = 'Missing key name';
|
||||
const ERROR_CONNECTION_STRING_EMPTY_KEY = 'Empty key name';
|
||||
const ERROR_CONNECTION_STRING_MISSING_CHARACTER = "Missing %s character";
|
||||
const ERROR_EMPTY_SETTINGS = 'No keys were found in the connection string';
|
||||
const MISSING_LOCK_LOCATION_MSG = 'The lock location of the brokered message is missing.';
|
||||
const INVALID_SLOT = "The provided deployment slot '%s' is not valid. Only 'staging' and 'production' are accepted.";
|
||||
const INVALID_DEPLOYMENT_LOCATOR_MSG = 'A slot or deployment name must be provided.';
|
||||
const INVALID_CHANGE_MODE_MSG = "The change mode must be 'Auto' or 'Manual'. Use Mode class constants for that purpose.";
|
||||
const INVALID_DEPLOYMENT_STATUS_MSG = "The change mode must be 'Running' or 'Suspended'. Use DeploymentStatus class constants for that purpose.";
|
||||
const ERROR_OAUTH_GET_ACCESS_TOKEN = 'Unable to get oauth access token for endpoint \'%s\', account name \'%s\'';
|
||||
const ERROR_OAUTH_SERVICE_MISSING = 'OAuth service missing for account name \'%s\'';
|
||||
const ERROR_METHOD_NOT_FOUND = 'Method \'%s\' not found in object class \'%s\'';
|
||||
const ERROR_INVALID_DATE_STRING = 'Parameter \'%s\' is not a date formatted string \'%s\'';
|
||||
|
||||
// HTTP Headers
|
||||
const X_MS_HEADER_PREFIX = 'x-ms-';
|
||||
const X_MS_META_HEADER_PREFIX = 'x-ms-meta-';
|
||||
const X_MS_APPROXIMATE_MESSAGES_COUNT = 'x-ms-approximate-messages-count';
|
||||
const X_MS_POPRECEIPT = 'x-ms-popreceipt';
|
||||
const X_MS_TIME_NEXT_VISIBLE = 'x-ms-time-next-visible';
|
||||
const X_MS_BLOB_PUBLIC_ACCESS = 'x-ms-blob-public-access';
|
||||
const X_MS_VERSION = 'x-ms-version';
|
||||
const X_MS_DATE = 'x-ms-date';
|
||||
const X_MS_BLOB_SEQUENCE_NUMBER = 'x-ms-blob-sequence-number';
|
||||
const X_MS_BLOB_SEQUENCE_NUMBER_ACTION = 'x-ms-sequence-number-action';
|
||||
const X_MS_BLOB_TYPE = 'x-ms-blob-type';
|
||||
const X_MS_BLOB_CONTENT_TYPE = 'x-ms-blob-content-type';
|
||||
const X_MS_BLOB_CONTENT_ENCODING = 'x-ms-blob-content-encoding';
|
||||
const X_MS_BLOB_CONTENT_LANGUAGE = 'x-ms-blob-content-language';
|
||||
const X_MS_BLOB_CONTENT_MD5 = 'x-ms-blob-content-md5';
|
||||
const X_MS_BLOB_CACHE_CONTROL = 'x-ms-blob-cache-control';
|
||||
const X_MS_BLOB_CONTENT_LENGTH = 'x-ms-blob-content-length';
|
||||
const X_MS_COPY_SOURCE = 'x-ms-copy-source';
|
||||
const X_MS_RANGE = 'x-ms-range';
|
||||
const X_MS_RANGE_GET_CONTENT_MD5 = 'x-ms-range-get-content-md5';
|
||||
const X_MS_LEASE_DURATION = 'x-ms-lease-duration';
|
||||
const X_MS_LEASE_ID = 'x-ms-lease-id';
|
||||
const X_MS_LEASE_TIME = 'x-ms-lease-time';
|
||||
const X_MS_LEASE_STATUS = 'x-ms-lease-status';
|
||||
const X_MS_LEASE_ACTION = 'x-ms-lease-action';
|
||||
const X_MS_DELETE_SNAPSHOTS = 'x-ms-delete-snapshots';
|
||||
const X_MS_PAGE_WRITE = 'x-ms-page-write';
|
||||
const X_MS_SNAPSHOT = 'x-ms-snapshot';
|
||||
const X_MS_SOURCE_IF_MODIFIED_SINCE = 'x-ms-source-if-modified-since';
|
||||
const X_MS_SOURCE_IF_UNMODIFIED_SINCE = 'x-ms-source-if-unmodified-since';
|
||||
const X_MS_SOURCE_IF_MATCH = 'x-ms-source-if-match';
|
||||
const X_MS_SOURCE_IF_NONE_MATCH = 'x-ms-source-if-none-match';
|
||||
const X_MS_SOURCE_LEASE_ID = 'x-ms-source-lease-id';
|
||||
const X_MS_CONTINUATION_NEXTTABLENAME = 'x-ms-continuation-nexttablename';
|
||||
const X_MS_CONTINUATION_NEXTPARTITIONKEY = 'x-ms-continuation-nextpartitionkey';
|
||||
const X_MS_CONTINUATION_NEXTROWKEY = 'x-ms-continuation-nextrowkey';
|
||||
const X_MS_REQUEST_ID = 'x-ms-request-id';
|
||||
const ETAG = 'etag';
|
||||
const LAST_MODIFIED = 'last-modified';
|
||||
const DATE = 'date';
|
||||
const AUTHENTICATION = 'authorization';
|
||||
const WRAP_AUTHORIZATION = 'WRAP access_token="%s"';
|
||||
const CONTENT_ENCODING = 'content-encoding';
|
||||
const CONTENT_LANGUAGE = 'content-language';
|
||||
const CONTENT_LENGTH = 'content-length';
|
||||
const CONTENT_LENGTH_NO_SPACE = 'contentlength';
|
||||
const CONTENT_MD5 = 'content-md5';
|
||||
const CONTENT_TYPE = 'content-type';
|
||||
const CONTENT_ID = 'content-id';
|
||||
const CONTENT_RANGE = 'content-range';
|
||||
const CACHE_CONTROL = 'cache-control';
|
||||
const IF_MODIFIED_SINCE = 'if-modified-since';
|
||||
const IF_MATCH = 'if-match';
|
||||
const IF_NONE_MATCH = 'if-none-match';
|
||||
const IF_UNMODIFIED_SINCE = 'if-unmodified-since';
|
||||
const RANGE = 'range';
|
||||
const DATA_SERVICE_VERSION = 'dataserviceversion';
|
||||
const MAX_DATA_SERVICE_VERSION = 'maxdataserviceversion';
|
||||
const ACCEPT_HEADER = 'accept';
|
||||
const ACCEPT_CHARSET = 'accept-charset';
|
||||
const USER_AGENT = 'User-Agent';
|
||||
|
||||
// Type
|
||||
const QUEUE_TYPE_NAME = 'IQueue';
|
||||
const BLOB_TYPE_NAME = 'IBlob';
|
||||
const TABLE_TYPE_NAME = 'ITable';
|
||||
const SERVICE_MANAGEMENT_TYPE_NAME = 'IServiceManagement';
|
||||
const SERVICE_BUS_TYPE_NAME = 'IServiceBus';
|
||||
const WRAP_TYPE_NAME = 'IWrap';
|
||||
|
||||
// WRAP
|
||||
const WRAP_ACCESS_TOKEN = 'wrap_access_token';
|
||||
const WRAP_ACCESS_TOKEN_EXPIRES_IN = 'wrap_access_token_expires_in';
|
||||
const WRAP_NAME = 'wrap_name';
|
||||
const WRAP_PASSWORD = 'wrap_password';
|
||||
const WRAP_SCOPE = 'wrap_scope';
|
||||
|
||||
// OAuth
|
||||
const OAUTH_GRANT_TYPE = 'grant_type';
|
||||
const OAUTH_CLIENT_ID = 'client_id';
|
||||
const OAUTH_CLIENT_SECRET = 'client_secret';
|
||||
const OAUTH_SCOPE = 'scope';
|
||||
const OAUTH_GT_CLIENT_CREDENTIALS = 'client_credentials';
|
||||
const OAUTH_ACCESS_TOKEN = 'access_token';
|
||||
const OAUTH_EXPIRES_IN = 'expires_in';
|
||||
const OAUTH_ACCESS_TOKEN_PREFIX = 'Bearer ';
|
||||
|
||||
// HTTP Methods
|
||||
const HTTP_GET = 'GET';
|
||||
const HTTP_PUT = 'PUT';
|
||||
const HTTP_POST = 'POST';
|
||||
const HTTP_HEAD = 'HEAD';
|
||||
const HTTP_DELETE = 'DELETE';
|
||||
const HTTP_MERGE = 'MERGE';
|
||||
|
||||
// Misc
|
||||
const EMPTY_STRING = '';
|
||||
const SEPARATOR = ',';
|
||||
const AZURE_DATE_FORMAT = 'D, d M Y H:i:s T';
|
||||
const TIMESTAMP_FORMAT = 'Y-m-d H:i:s';
|
||||
const EMULATED = 'EMULATED';
|
||||
const EMULATOR_BLOB_URI = '127.0.0.1:10000';
|
||||
const EMULATOR_QUEUE_URI = '127.0.0.1:10001';
|
||||
const EMULATOR_TABLE_URI = '127.0.0.1:10002';
|
||||
const ASTERISK = '*';
|
||||
const SERVICE_MANAGEMENT_URL = 'https://management.core.windows.net';
|
||||
const HTTP_SCHEME = 'http';
|
||||
const HTTPS_SCHEME = 'https';
|
||||
const SETTING_NAME = 'SettingName';
|
||||
const SETTING_CONSTRAINT = 'SettingConstraint';
|
||||
const DEV_STORE_URI = 'http://127.0.0.1';
|
||||
const SERVICE_URI_FORMAT = "%s://%s.%s";
|
||||
const WRAP_ENDPOINT_URI_FORMAT = "https://%s-sb.accesscontrol.windows.net/WRAPv0.9";
|
||||
|
||||
// Xml Namespaces
|
||||
const WA_XML_NAMESPACE = 'http://schemas.microsoft.com/windowsazure';
|
||||
const ATOM_XML_NAMESPACE = 'http://www.w3.org/2005/Atom';
|
||||
const DS_XML_NAMESPACE = 'http://schemas.microsoft.com/ado/2007/08/dataservices';
|
||||
const DSM_XML_NAMESPACE = 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata';
|
||||
const XSI_XML_NAMESPACE = 'http://www.w3.org/2001/XMLSchema-instance';
|
||||
|
||||
|
||||
// Header values
|
||||
const SDK_USER_AGENT = 'Azure-SDK-For-PHP/0.4.1';
|
||||
const STORAGE_API_LATEST_VERSION = '2014-02-14'; // was 2012-02-12; see HS#7569
|
||||
const SM_API_LATEST_VERSION = '2011-10-01';
|
||||
const DATA_SERVICE_VERSION_VALUE = '1.0;NetFx';
|
||||
const MAX_DATA_SERVICE_VERSION_VALUE = '2.0;NetFx';
|
||||
const ACCEPT_HEADER_VALUE = 'application/atom+xml,application/xml';
|
||||
const ATOM_ENTRY_CONTENT_TYPE = 'application/atom+xml;type=entry;charset=utf-8';
|
||||
const ATOM_FEED_CONTENT_TYPE = 'application/atom+xml;type=feed;charset=utf-8';
|
||||
const ACCEPT_CHARSET_VALUE = 'utf-8';
|
||||
const INT32_MAX = 2147483647;
|
||||
const MEDIA_SERVICES_API_LATEST_VERSION = '2.2';
|
||||
const MEDIA_SERVICES_DATA_SERVICE_VERSION_VALUE = '3.0;NetFx';
|
||||
const MEDIA_SERVICES_MAX_DATA_SERVICE_VERSION_VALUE = '3.0;NetFx';
|
||||
|
||||
// Query parameter names
|
||||
const QP_PREFIX = 'Prefix';
|
||||
const QP_MAX_RESULTS = 'MaxResults';
|
||||
const QP_METADATA = 'Metadata';
|
||||
const QP_MARKER = 'Marker';
|
||||
const QP_NEXT_MARKER = 'NextMarker';
|
||||
const QP_COMP = 'comp';
|
||||
const QP_VISIBILITY_TIMEOUT = 'visibilitytimeout';
|
||||
const QP_POPRECEIPT = 'popreceipt';
|
||||
const QP_NUM_OF_MESSAGES = 'numofmessages';
|
||||
const QP_PEEK_ONLY = 'peekonly';
|
||||
const QP_MESSAGE_TTL = 'messagettl';
|
||||
const QP_INCLUDE = 'include';
|
||||
const QP_TIMEOUT = 'timeout';
|
||||
const QP_DELIMITER = 'Delimiter';
|
||||
const QP_REST_TYPE = 'restype';
|
||||
const QP_SNAPSHOT = 'snapshot';
|
||||
const QP_BLOCKID = 'blockid';
|
||||
const QP_BLOCK_LIST_TYPE = 'blocklisttype';
|
||||
const QP_SELECT = '$select';
|
||||
const QP_TOP = '$top';
|
||||
const QP_SKIP = '$skip';
|
||||
const QP_FILTER = '$filter';
|
||||
const QP_NEXT_TABLE_NAME = 'NextTableName';
|
||||
const QP_NEXT_PK = 'NextPartitionKey';
|
||||
const QP_NEXT_RK = 'NextRowKey';
|
||||
const QP_ACTION = 'action';
|
||||
const QP_EMBED_DETAIL = 'embed-detail';
|
||||
|
||||
// Query parameter values
|
||||
const QPV_REGENERATE = 'regenerate';
|
||||
const QPV_CONFIG = 'config';
|
||||
const QPV_STATUS = 'status';
|
||||
const QPV_UPGRADE = 'upgrade';
|
||||
const QPV_WALK_UPGRADE_DOMAIN = 'walkupgradedomain';
|
||||
const QPV_REBOOT = 'reboot';
|
||||
const QPV_REIMAGE = 'reimage';
|
||||
const QPV_ROLLBACK = 'rollback';
|
||||
|
||||
// Request body content types
|
||||
const URL_ENCODED_CONTENT_TYPE = 'application/x-www-form-urlencoded';
|
||||
const XML_CONTENT_TYPE = 'application/xml';
|
||||
const BINARY_FILE_TYPE = 'application/octet-stream';
|
||||
const XML_ATOM_CONTENT_TYPE = 'application/atom+xml';
|
||||
const HTTP_TYPE = 'application/http';
|
||||
const MULTIPART_MIXED_TYPE = 'multipart/mixed';
|
||||
|
||||
// Common used XML tags
|
||||
const XTAG_ATTRIBUTES = '@attributes';
|
||||
const XTAG_NAMESPACE = '@namespace';
|
||||
const XTAG_LABEL = 'Label';
|
||||
const XTAG_NAME = 'Name';
|
||||
const XTAG_DESCRIPTION = 'Description';
|
||||
const XTAG_LOCATION = 'Location';
|
||||
const XTAG_AFFINITY_GROUP = 'AffinityGroup';
|
||||
const XTAG_HOSTED_SERVICES = 'HostedServices';
|
||||
const XTAG_STORAGE_SERVICES = 'StorageServices';
|
||||
const XTAG_STORAGE_SERVICE = 'StorageService';
|
||||
const XTAG_DISPLAY_NAME = 'DisplayName';
|
||||
const XTAG_SERVICE_NAME = 'ServiceName';
|
||||
const XTAG_URL = 'Url';
|
||||
const XTAG_ID = 'ID';
|
||||
const XTAG_STATUS = 'Status';
|
||||
const XTAG_HTTP_STATUS_CODE = 'HttpStatusCode';
|
||||
const XTAG_CODE = 'Code';
|
||||
const XTAG_MESSAGE = 'Message';
|
||||
const XTAG_STORAGE_SERVICE_PROPERTIES = 'StorageServiceProperties';
|
||||
const XTAG_ENDPOINT = 'Endpoint';
|
||||
const XTAG_ENDPOINTS = 'Endpoints';
|
||||
const XTAG_PRIMARY = 'Primary';
|
||||
const XTAG_SECONDARY = 'Secondary';
|
||||
const XTAG_KEY_TYPE = 'KeyType';
|
||||
const XTAG_STORAGE_SERVICE_KEYS = 'StorageServiceKeys';
|
||||
const XTAG_ERROR = 'Error';
|
||||
const XTAG_HOSTED_SERVICE = 'HostedService';
|
||||
const XTAG_HOSTED_SERVICE_PROPERTIES = 'HostedServiceProperties';
|
||||
const XTAG_CREATE_HOSTED_SERVICE = 'CreateHostedService';
|
||||
const XTAG_CREATE_STORAGE_SERVICE_INPUT = 'CreateStorageServiceInput';
|
||||
const XTAG_UPDATE_STORAGE_SERVICE_INPUT = 'UpdateStorageServiceInput';
|
||||
const XTAG_CREATE_AFFINITY_GROUP = 'CreateAffinityGroup';
|
||||
const XTAG_UPDATE_AFFINITY_GROUP = 'UpdateAffinityGroup';
|
||||
const XTAG_UPDATE_HOSTED_SERVICE = 'UpdateHostedService';
|
||||
const XTAG_PACKAGE_URL = 'PackageUrl';
|
||||
const XTAG_CONFIGURATION = 'Configuration';
|
||||
const XTAG_START_DEPLOYMENT = 'StartDeployment';
|
||||
const XTAG_TREAT_WARNINGS_AS_ERROR = 'TreatWarningsAsError';
|
||||
const XTAG_CREATE_DEPLOYMENT = 'CreateDeployment';
|
||||
const XTAG_DEPLOYMENT_SLOT = 'DeploymentSlot';
|
||||
const XTAG_PRIVATE_ID = 'PrivateID';
|
||||
const XTAG_ROLE_INSTANCE_LIST = 'RoleInstanceList';
|
||||
const XTAG_UPGRADE_DOMAIN_COUNT = 'UpgradeDomainCount';
|
||||
const XTAG_ROLE_LIST = 'RoleList';
|
||||
const XTAG_SDK_VERSION = 'SdkVersion';
|
||||
const XTAG_INPUT_ENDPOINT_LIST = 'InputEndpointList';
|
||||
const XTAG_LOCKED = 'Locked';
|
||||
const XTAG_ROLLBACK_ALLOWED = 'RollbackAllowed';
|
||||
const XTAG_UPGRADE_STATUS = 'UpgradeStatus';
|
||||
const XTAG_UPGRADE_TYPE = 'UpgradeType';
|
||||
const XTAG_CURRENT_UPGRADE_DOMAIN_STATE = 'CurrentUpgradeDomainState';
|
||||
const XTAG_CURRENT_UPGRADE_DOMAIN = 'CurrentUpgradeDomain';
|
||||
const XTAG_ROLE_NAME = 'RoleName';
|
||||
const XTAG_INSTANCE_NAME = 'InstanceName';
|
||||
const XTAG_INSTANCE_STATUS = 'InstanceStatus';
|
||||
const XTAG_INSTANCE_UPGRADE_DOMAIN = 'InstanceUpgradeDomain';
|
||||
const XTAG_INSTANCE_FAULT_DOMAIN = 'InstanceFaultDomain';
|
||||
const XTAG_INSTANCE_SIZE = 'InstanceSize';
|
||||
const XTAG_INSTANCE_STATE_DETAILS = 'InstanceStateDetails';
|
||||
const XTAG_INSTANCE_ERROR_CODE = 'InstanceErrorCode';
|
||||
const XTAG_OS_VERSION = 'OsVersion';
|
||||
const XTAG_ROLE_INSTANCE = 'RoleInstance';
|
||||
const XTAG_ROLE = 'Role';
|
||||
const XTAG_INPUT_ENDPOINT = 'InputEndpoint';
|
||||
const XTAG_VIP = 'Vip';
|
||||
const XTAG_PORT = 'Port';
|
||||
const XTAG_DEPLOYMENT = 'Deployment';
|
||||
const XTAG_DEPLOYMENTS = 'Deployments';
|
||||
const XTAG_REGENERATE_KEYS = 'RegenerateKeys';
|
||||
const XTAG_SWAP = 'Swap';
|
||||
const XTAG_PRODUCTION = 'Production';
|
||||
const XTAG_SOURCE_DEPLOYMENT = 'SourceDeployment';
|
||||
const XTAG_CHANGE_CONFIGURATION = 'ChangeConfiguration';
|
||||
const XTAG_MODE = 'Mode';
|
||||
const XTAG_UPDATE_DEPLOYMENT_STATUS = 'UpdateDeploymentStatus';
|
||||
const XTAG_ROLE_TO_UPGRADE = 'RoleToUpgrade';
|
||||
const XTAG_FORCE = 'Force';
|
||||
const XTAG_UPGRADE_DEPLOYMENT = 'UpgradeDeployment';
|
||||
const XTAG_UPGRADE_DOMAIN = 'UpgradeDomain';
|
||||
const XTAG_WALK_UPGRADE_DOMAIN = 'WalkUpgradeDomain';
|
||||
const XTAG_ROLLBACK_UPDATE_OR_UPGRADE = 'RollbackUpdateOrUpgrade';
|
||||
const XTAG_CONTAINER_NAME = 'ContainerName';
|
||||
const XTAG_ACCOUNT_NAME = 'AccountName';
|
||||
|
||||
// Service Bus
|
||||
const LIST_TOPICS_PATH = '$Resources/Topics';
|
||||
const LIST_QUEUES_PATH = '$Resources/Queues';
|
||||
const LIST_RULES_PATH = '%s/subscriptions/%s/rules';
|
||||
const LIST_SUBSCRIPTIONS_PATH = '%s/subscriptions';
|
||||
const RECEIVE_MESSAGE_PATH = '%s/messages/head';
|
||||
const RECEIVE_SUBSCRIPTION_MESSAGE_PATH = '%s/subscriptions/%s/messages/head';
|
||||
const SEND_MESSAGE_PATH = '%s/messages';
|
||||
const RULE_PATH = '%s/subscriptions/%s/rules/%s';
|
||||
const SUBSCRIPTION_PATH = '%s/subscriptions/%s';
|
||||
const DEFAULT_RULE_NAME = '$Default';
|
||||
const UNIQUE_ID_PREFIX = 'urn:uuid:';
|
||||
const SERVICE_BUS_NAMESPACE = 'http://schemas.microsoft.com/netservices/2010/10/servicebus/connect';
|
||||
const BROKER_PROPERTIES = 'BrokerProperties';
|
||||
const XMLNS_ATOM = 'xmlns:atom';
|
||||
const XMLNS = 'xmlns';
|
||||
const ATOM_NAMESPACE = 'http://www.w3.org/2005/Atom';
|
||||
|
||||
// ATOM string
|
||||
const AUTHOR = 'author';
|
||||
const CATEGORY = 'category';
|
||||
const CONTRIBUTOR = 'contributor';
|
||||
const ENTRY = 'entry';
|
||||
const LINK = 'link';
|
||||
const PROPERTIES = 'properties';
|
||||
const ELEMENT = 'element';
|
||||
|
||||
// PHP URL Keys
|
||||
const PHP_URL_SCHEME = 'scheme';
|
||||
const PHP_URL_HOST = 'host';
|
||||
const PHP_URL_PORT = 'port';
|
||||
const PHP_URL_USER = 'user';
|
||||
const PHP_URL_PASS = 'pass';
|
||||
const PHP_URL_PATH = 'path';
|
||||
const PHP_URL_QUERY = 'query';
|
||||
const PHP_URL_FRAGMENT = 'fragment';
|
||||
|
||||
// Status Codes
|
||||
const STATUS_OK = 200;
|
||||
const STATUS_CREATED = 201;
|
||||
const STATUS_ACCEPTED = 202;
|
||||
const STATUS_NO_CONTENT = 204;
|
||||
const STATUS_PARTIAL_CONTENT = 206;
|
||||
const STATUS_MOVED_PERMANENTLY = 301;
|
||||
|
||||
// HTTP_Request2 config parameter names
|
||||
const USE_BRACKETS = 'use_brackets';
|
||||
const SSL_VERIFY_PEER = 'ssl_verify_peer';
|
||||
const SSL_VERIFY_HOST = 'ssl_verify_host';
|
||||
const SSL_LOCAL_CERT = 'ssl_local_cert';
|
||||
const SSL_CAFILE = 'ssl_cafile';
|
||||
const CONNECT_TIMEOUT = 'connect_timeout';
|
||||
|
||||
// Media services
|
||||
const MEDIA_SERVICES_URL = 'https://media.windows.net/API/';
|
||||
const MEDIA_SERVICES_OAUTH_URL = 'https://wamsprodglobal001acs.accesscontrol.windows.net/v2/OAuth2-13';
|
||||
const MEDIA_SERVICES_OAUTH_SCOPE = 'urn:WindowsAzureMediaServices';
|
||||
const MEDIA_SERVICES_INPUT_ASSETS_REL = 'http://schemas.microsoft.com/ado/2007/08/dataservices/related/InputMediaAssets';
|
||||
const MEDIA_SERVICES_ASSET_REL = 'http://schemas.microsoft.com/ado/2007/08/dataservices/related/Asset';
|
||||
const MEDIA_SERVICES_ENCRYPTION_VERSION = '1.0';
|
||||
|
||||
|
||||
// @codingStandardsIgnoreEnd
|
||||
}
|
||||
@@ -0,0 +1,207 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\Internal\Http\Url;
|
||||
|
||||
/**
|
||||
* Base class for all REST proxies.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class RestProxy
|
||||
{
|
||||
/**
|
||||
* @var WindowsAzure\Common\Internal\Http\IHttpClient
|
||||
*/
|
||||
private $_channel;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $_filters;
|
||||
|
||||
/**
|
||||
* @var WindowsAzure\Common\Internal\Serialization\ISerializer
|
||||
*/
|
||||
protected $dataSerializer;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_uri;
|
||||
|
||||
/**
|
||||
* Initializes new RestProxy object.
|
||||
*
|
||||
* @param IHttpClient $channel The HTTP client used to send HTTP requests.
|
||||
* @param ISerializer $dataSerializer The data serializer.
|
||||
* @param string $uri The uri of the service.
|
||||
*/
|
||||
public function __construct($channel, $dataSerializer, $uri)
|
||||
{
|
||||
$this->_channel = $channel;
|
||||
$this->_filters = array();
|
||||
$this->dataSerializer = $dataSerializer;
|
||||
$this->_uri = $uri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets HTTP filters that will process each request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getFilters()
|
||||
{
|
||||
return $this->_filters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Uri of the service.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUri()
|
||||
{
|
||||
return $this->_uri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the Uri of the service.
|
||||
*
|
||||
* @param string $uri The URI of the request.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function setUri($uri)
|
||||
{
|
||||
$this->_uri = $uri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends HTTP request with the specified HTTP call context.
|
||||
*
|
||||
* @param WindowsAzure\Common\Internal\Http\HttpCallContext $context The HTTP
|
||||
* call context.
|
||||
*
|
||||
* @return \HTTP_Request2_Response
|
||||
*/
|
||||
protected function sendContext($context)
|
||||
{
|
||||
$channel = clone $this->_channel;
|
||||
$contextUrl = $context->getUri();
|
||||
$url = new Url(empty($contextUrl) ? $this->_uri : $contextUrl);
|
||||
$headers = $context->getHeaders();
|
||||
$statusCodes = $context->getStatusCodes();
|
||||
$body = $context->getBody();
|
||||
$queryParams = $context->getQueryParameters();
|
||||
$postParameters = $context->getPostParameters();
|
||||
$path = $context->getPath();
|
||||
|
||||
$channel->setMethod($context->getMethod());
|
||||
$channel->setExpectedStatusCode($statusCodes);
|
||||
$channel->setBody($body);
|
||||
$channel->setHeaders($headers);
|
||||
|
||||
if (count($postParameters) > 0) {
|
||||
$channel->setPostParameters($postParameters);
|
||||
}
|
||||
$url->setQueryVariables($queryParams);
|
||||
$url->appendUrlPath($path);
|
||||
|
||||
$channel->send($this->_filters, $url);
|
||||
|
||||
return $channel->getResponse();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds new filter to new service rest proxy object and returns that object back.
|
||||
*
|
||||
* @param WindowsAzure\Common\Internal\IServiceFilter $filter Filter to add for
|
||||
* the pipeline.
|
||||
*
|
||||
* @return RestProxy.
|
||||
*/
|
||||
public function withFilter($filter)
|
||||
{
|
||||
$serviceProxyWithFilter = clone $this;
|
||||
$serviceProxyWithFilter->_filters[] = $filter;
|
||||
|
||||
return $serviceProxyWithFilter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds optional query parameter.
|
||||
*
|
||||
* Doesn't add the value if it satisfies empty().
|
||||
*
|
||||
* @param array &$queryParameters The query parameters.
|
||||
* @param string $key The query variable name.
|
||||
* @param string $value The query variable value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
protected function addOptionalQueryParam(&$queryParameters, $key, $value)
|
||||
{
|
||||
Validate::isArray($queryParameters, 'queryParameters');
|
||||
Validate::isString($key, 'key');
|
||||
Validate::isString($value, 'value');
|
||||
|
||||
if (!is_null($value) && Resources::EMPTY_STRING !== $value) {
|
||||
$queryParameters[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds optional header.
|
||||
*
|
||||
* Doesn't add the value if it satisfies empty().
|
||||
*
|
||||
* @param array &$headers The HTTP header parameters.
|
||||
* @param string $key The HTTP header name.
|
||||
* @param string $value The HTTP header value.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
protected function addOptionalHeader(&$headers, $key, $value)
|
||||
{
|
||||
Validate::isArray($headers, 'headers');
|
||||
Validate::isString($key, 'key');
|
||||
Validate::isString($value, 'value');
|
||||
|
||||
if (!is_null($value) && Resources::EMPTY_STRING !== $value) {
|
||||
$headers[$key] = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Serialization
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Serialization;
|
||||
|
||||
/**
|
||||
* The serialization interface.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Serialization
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
interface ISerializer
|
||||
{
|
||||
|
||||
/**
|
||||
* Serialize an object into a XML.
|
||||
*
|
||||
* @param Object $targetObject The target object to be serialized.
|
||||
* @param string $rootName The name of the root.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function objectSerialize($targetObject, $rootName);
|
||||
|
||||
/**
|
||||
* Serializes given array. The array indices must be string to use them as
|
||||
* as element name.
|
||||
*
|
||||
* @param array $array The object to serialize represented in array.
|
||||
* @param array $properties The used properties in the serialization process.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function serialize($array, $properties = null);
|
||||
|
||||
|
||||
/**
|
||||
* Unserializes given serialized string.
|
||||
*
|
||||
* @param string $serialized The serialized object in string representation.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function unserialize($serialized);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Serialization
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Serialization;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
/**
|
||||
* Perform JSON serialization / deserialization
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Serialization
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class JsonSerializer implements ISerializer
|
||||
{
|
||||
/**
|
||||
* Serialize an object with specified root element name.
|
||||
*
|
||||
* @param object $targetObject The target object.
|
||||
* @param string $rootName The name of the root element.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function objectSerialize($targetObject, $rootName)
|
||||
{
|
||||
Validate::notNull($targetObject, 'targetObject');
|
||||
Validate::isString($rootName, 'rootName');
|
||||
|
||||
$contianer = new \stdClass();
|
||||
|
||||
$contianer->$rootName = $targetObject;
|
||||
|
||||
return json_encode($contianer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializes given array. The array indices must be string to use them as
|
||||
* as element name.
|
||||
*
|
||||
* @param array $array The object to serialize represented in array.
|
||||
* @param array $properties The used properties in the serialization process.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function serialize($array, $properties = null)
|
||||
{
|
||||
Validate::isArray($array, 'array');
|
||||
|
||||
return json_encode($array);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unserializes given serialized string to array.
|
||||
*
|
||||
* @param string $serialized The serialized object in string representation.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function unserialize($serialized)
|
||||
{
|
||||
Validate::isString($serialized, 'serialized');
|
||||
|
||||
$json = json_decode($serialized);
|
||||
if ($json && !is_array($json)) {
|
||||
return get_object_vars($json);
|
||||
} else {
|
||||
return $json;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,245 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Serialization
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal\Serialization;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
|
||||
/**
|
||||
* Short description
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal\Serialization
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class XmlSerializer implements ISerializer
|
||||
{
|
||||
const STANDALONE = 'standalone';
|
||||
const ROOT_NAME = 'rootName';
|
||||
const DEFAULT_TAG = 'defaultTag';
|
||||
|
||||
/**
|
||||
* Converts a SimpleXML object to an Array recursively
|
||||
* ensuring all sub-elements are arrays as well.
|
||||
*
|
||||
* @param string $sxml The SimpleXML object.
|
||||
* @param array $arr The array into which to store results.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function _sxml2arr($sxml, $arr = null)
|
||||
{
|
||||
foreach ((array) $sxml as $key => $value) {
|
||||
if (is_object($value) || (is_array($value))) {
|
||||
$arr[$key] = $this->_sxml2arr($value);
|
||||
} else {
|
||||
$arr[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes an array and produces XML based on it.
|
||||
*
|
||||
* @param XMLWriter $xmlw XMLWriter object that was previously instanted
|
||||
* and is used for creating the XML.
|
||||
* @param array $data Array to be converted to XML.
|
||||
* @param string $defaultTag Default XML tag to be used if none specified.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function _arr2xml(\XMLWriter $xmlw, $data, $defaultTag = null)
|
||||
{
|
||||
foreach ($data as $key => $value) {
|
||||
if ($key === Resources::XTAG_ATTRIBUTES) {
|
||||
foreach ($value as $attributeName => $attributeValue) {
|
||||
$xmlw->writeAttribute($attributeName, $attributeValue);
|
||||
}
|
||||
} else if (is_array($value)) {
|
||||
if (!is_int($key)) {
|
||||
if ($key != Resources::EMPTY_STRING) {
|
||||
$xmlw->startElement($key);
|
||||
} else {
|
||||
$xmlw->startElement($defaultTag);
|
||||
}
|
||||
}
|
||||
|
||||
$this->_arr2xml($xmlw, $value);
|
||||
|
||||
if (!is_int($key)) {
|
||||
$xmlw->endElement();
|
||||
}
|
||||
} else {
|
||||
$xmlw->writeElement($key, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the attributes of a specified object if get attributes
|
||||
* method is exposed.
|
||||
*
|
||||
* @param object $targetObject The target object.
|
||||
* @param array $methodArray The array of method of the target object.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
private static function _getInstanceAttributes($targetObject, $methodArray)
|
||||
{
|
||||
foreach ($methodArray as $method) {
|
||||
if ($method->name == 'getAttributes') {
|
||||
$classProperty = $method->invoke($targetObject);
|
||||
return $classProperty;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize an object with specified root element name.
|
||||
*
|
||||
* @param object $targetObject The target object.
|
||||
* @param string $rootName The name of the root element.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function objectSerialize($targetObject, $rootName)
|
||||
{
|
||||
Validate::notNull($targetObject, 'targetObject');
|
||||
Validate::isString($rootName, 'rootName');
|
||||
$xmlWriter = new \XmlWriter();
|
||||
$xmlWriter->openMemory();
|
||||
$xmlWriter->setIndent(true);
|
||||
$reflectionClass = new \ReflectionClass($targetObject);
|
||||
$methodArray = $reflectionClass->getMethods();
|
||||
$attributes = self::_getInstanceAttributes(
|
||||
$targetObject,
|
||||
$methodArray
|
||||
);
|
||||
|
||||
$xmlWriter->startElement($rootName);
|
||||
if (!is_null($attributes)) {
|
||||
foreach (array_keys($attributes) as $attributeKey) {
|
||||
$xmlWriter->writeAttribute(
|
||||
$attributeKey,
|
||||
$attributes[$attributeKey]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($methodArray as $method) {
|
||||
if ((strpos($method->name, 'get') === 0)
|
||||
&& $method->isPublic()
|
||||
&& ($method->name != 'getAttributes')
|
||||
) {
|
||||
$variableName = substr($method->name, 3);
|
||||
$variableValue = $method->invoke($targetObject);
|
||||
if (!empty($variableValue)) {
|
||||
if (gettype($variableValue) === 'object') {
|
||||
$xmlWriter->writeRaw(
|
||||
XmlSerializer::objectSerialize(
|
||||
$variableValue, $variableName
|
||||
)
|
||||
);
|
||||
} else {
|
||||
$xmlWriter->writeElement($variableName, $variableValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$xmlWriter->endElement();
|
||||
return $xmlWriter->outputMemory(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializes given array. The array indices must be string to use them as
|
||||
* as element name.
|
||||
*
|
||||
* @param array $array The object to serialize represented in array.
|
||||
* @param array $properties The used properties in the serialization process.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function serialize($array, $properties = null)
|
||||
{
|
||||
$xmlVersion = '1.0';
|
||||
$xmlEncoding = 'UTF-8';
|
||||
$standalone = Utilities::tryGetValue($properties, self::STANDALONE);
|
||||
$defaultTag = Utilities::tryGetValue($properties, self::DEFAULT_TAG);
|
||||
$rootName = Utilities::tryGetValue($properties, self::ROOT_NAME);
|
||||
$docNamespace = Utilities::tryGetValue(
|
||||
$array,
|
||||
Resources::XTAG_NAMESPACE,
|
||||
null
|
||||
);
|
||||
|
||||
if (!is_array($array)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$xmlw = new \XmlWriter();
|
||||
$xmlw->openMemory();
|
||||
$xmlw->setIndent(true);
|
||||
$xmlw->startDocument($xmlVersion, $xmlEncoding, $standalone);
|
||||
|
||||
if (is_null($docNamespace)) {
|
||||
$xmlw->startElement($rootName);
|
||||
} else {
|
||||
foreach ($docNamespace as $uri => $prefix) {
|
||||
$xmlw->startElementNS($prefix, $rootName, $uri);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
unset($array[Resources::XTAG_NAMESPACE]);
|
||||
self::_arr2xml($xmlw, $array, $defaultTag);
|
||||
|
||||
$xmlw->endElement();
|
||||
|
||||
return $xmlw->outputMemory(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unserializes given serialized string.
|
||||
*
|
||||
* @param string $serialized The serialized object in string representation.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function unserialize($serialized)
|
||||
{
|
||||
$sxml = new \SimpleXMLElement($serialized);
|
||||
|
||||
return $this->_sxml2arr($sxml);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,267 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
|
||||
/**
|
||||
* Represents the settings used to sign and access a request against the service
|
||||
* bus.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class ServiceBusSettings extends ServiceSettings
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_serviceBusEndpointUri;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_wrapEndpointUri;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_wrapName;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_wrapPassword;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_namespace;
|
||||
|
||||
/**
|
||||
* Validator for the SharedSecretValue setting. It has to be provided.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_wrapPasswordSetting;
|
||||
|
||||
/**
|
||||
* Validator for the SharedSecretIssuer setting. It has to be provided.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_wrapNameSetting;
|
||||
|
||||
/**
|
||||
* Validator for the Endpoint setting. Must be a valid Uri.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_serviceBusEndpointSetting;
|
||||
|
||||
/**
|
||||
* Validator for the StsEndpoint setting. Must be a valid Uri.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_wrapEndpointUriSetting;
|
||||
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
protected static $isInitialized = false;
|
||||
|
||||
/**
|
||||
* Holds the expected setting keys.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $validSettingKeys = array();
|
||||
|
||||
/**
|
||||
* Initializes static members of the class.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
protected static function init()
|
||||
{
|
||||
self::$_serviceBusEndpointSetting = self::settingWithFunc(
|
||||
Resources::SERVICE_BUS_ENDPOINT_NAME,
|
||||
Validate::getIsValidUri()
|
||||
);
|
||||
|
||||
self::$_wrapNameSetting = self::setting(
|
||||
Resources::SHARED_SECRET_ISSUER_NAME
|
||||
);
|
||||
|
||||
self::$_wrapPasswordSetting = self::setting(
|
||||
Resources::SHARED_SECRET_VALUE_NAME
|
||||
);
|
||||
|
||||
self::$_wrapEndpointUriSetting = self::settingWithFunc(
|
||||
Resources::STS_ENDPOINT_NAME,
|
||||
Validate::getIsValidUri()
|
||||
);
|
||||
|
||||
self::$validSettingKeys[] = Resources::SERVICE_BUS_ENDPOINT_NAME;
|
||||
self::$validSettingKeys[] = Resources::SHARED_SECRET_ISSUER_NAME;
|
||||
self::$validSettingKeys[] = Resources::SHARED_SECRET_VALUE_NAME;
|
||||
self::$validSettingKeys[] = Resources::STS_ENDPOINT_NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new Service Bus settings instance.
|
||||
*
|
||||
* @param string $serviceBusEndpoint The Service Bus endpoint uri.
|
||||
* @param string $namespace The service namespace.
|
||||
* @param string $wrapName The wrap name.
|
||||
* @param string $wrapPassword The wrap password.
|
||||
*/
|
||||
public function __construct(
|
||||
$serviceBusEndpoint,
|
||||
$namespace,
|
||||
$wrapEndpointUri,
|
||||
$wrapName,
|
||||
$wrapPassword
|
||||
) {
|
||||
$this->_namespace = $namespace;
|
||||
$this->_serviceBusEndpointUri = $serviceBusEndpoint;
|
||||
$this->_wrapEndpointUri = $wrapEndpointUri;
|
||||
$this->_wrapName = $wrapName;
|
||||
$this->_wrapPassword = $wrapPassword;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a ServiceBusSettings object from the given connection string.
|
||||
*
|
||||
* @param string $connectionString The storage settings connection string.
|
||||
*
|
||||
* @return ServiceBusSettings
|
||||
*/
|
||||
public static function createFromConnectionString($connectionString)
|
||||
{
|
||||
$tokenizedSettings = self::parseAndValidateKeys($connectionString);
|
||||
|
||||
$matchedSpecs = self::matchedSpecification(
|
||||
$tokenizedSettings,
|
||||
self::allRequired(
|
||||
self::$_serviceBusEndpointSetting,
|
||||
self::$_wrapNameSetting,
|
||||
self::$_wrapPasswordSetting
|
||||
),
|
||||
self::optional(self::$_wrapEndpointUriSetting)
|
||||
);
|
||||
|
||||
if ($matchedSpecs) {
|
||||
$endpoint = Utilities::tryGetValueInsensitive(
|
||||
Resources::SERVICE_BUS_ENDPOINT_NAME,
|
||||
$tokenizedSettings
|
||||
);
|
||||
|
||||
// Parse the namespace part from the URI
|
||||
$namespace = explode('.', parse_url($endpoint, PHP_URL_HOST));
|
||||
$namespace = $namespace[0];
|
||||
$wrapEndpointUri = Utilities::tryGetValueInsensitive(
|
||||
Resources::STS_ENDPOINT_NAME,
|
||||
$tokenizedSettings,
|
||||
sprintf(Resources::WRAP_ENDPOINT_URI_FORMAT, $namespace)
|
||||
);
|
||||
$issuerName = Utilities::tryGetValueInsensitive(
|
||||
Resources::SHARED_SECRET_ISSUER_NAME,
|
||||
$tokenizedSettings
|
||||
);
|
||||
$issuerValue = Utilities::tryGetValueInsensitive(
|
||||
Resources::SHARED_SECRET_VALUE_NAME,
|
||||
$tokenizedSettings
|
||||
);
|
||||
|
||||
return new ServiceBusSettings(
|
||||
$endpoint,
|
||||
$namespace,
|
||||
$wrapEndpointUri,
|
||||
$issuerName,
|
||||
$issuerValue
|
||||
);
|
||||
}
|
||||
|
||||
self::noMatch($connectionString);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Service Bus endpoint URI.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getServiceBusEndpointUri()
|
||||
{
|
||||
return $this->_serviceBusEndpointUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the wrap endpoint URI.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getWrapEndpointUri()
|
||||
{
|
||||
return $this->_wrapEndpointUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the wrap name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getWrapName()
|
||||
{
|
||||
return $this->_wrapName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the wrap password.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getWrapPassword()
|
||||
{
|
||||
return $this->_wrapPassword;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the namespace name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getNamespace()
|
||||
{
|
||||
return $this->_namespace;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,207 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
|
||||
/**
|
||||
* Represents the settings used to sign and access a request against the service
|
||||
* management. For more information about service management connection strings check
|
||||
* this page: http://msdn.microsoft.com/en-us/library/windowsazure/gg466228.aspx
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class ServiceManagementSettings extends ServiceSettings
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_subscriptionId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_certificatePath;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_endpointUri;
|
||||
|
||||
/**
|
||||
* Validator for the ServiceManagementEndpoint setting. Must be a valid Uri.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_endpointSetting;
|
||||
|
||||
/**
|
||||
* Validator for the CertificatePath setting. It has to be provided.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_certificatePathSetting;
|
||||
|
||||
/**
|
||||
* Validator for the SubscriptionId setting. It has to be provided.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_subscriptionIdSetting;
|
||||
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
protected static $isInitialized = false;
|
||||
|
||||
/**
|
||||
* Holds the expected setting keys.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $validSettingKeys = array();
|
||||
|
||||
/**
|
||||
* Initializes static members of the class.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
protected static function init()
|
||||
{
|
||||
self::$_endpointSetting = self::settingWithFunc(
|
||||
Resources::SERVICE_MANAGEMENT_ENDPOINT_NAME,
|
||||
Validate::getIsValidUri()
|
||||
);
|
||||
|
||||
self::$_certificatePathSetting = self::setting(
|
||||
Resources::CERTIFICATE_PATH_NAME
|
||||
);
|
||||
|
||||
self::$_subscriptionIdSetting = self::setting(
|
||||
Resources::SUBSCRIPTION_ID_NAME
|
||||
);
|
||||
|
||||
self::$validSettingKeys[] = Resources::SUBSCRIPTION_ID_NAME;
|
||||
self::$validSettingKeys[] = Resources::CERTIFICATE_PATH_NAME;
|
||||
self::$validSettingKeys[] = Resources::SERVICE_MANAGEMENT_ENDPOINT_NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new service management settings instance.
|
||||
*
|
||||
* @param string $subscriptionId The user provided subscription id.
|
||||
* @param string $endpointUri The service management endpoint uri.
|
||||
* @param string $certificatePath The management certificate path.
|
||||
*/
|
||||
public function __construct($subscriptionId, $endpointUri, $certificatePath)
|
||||
{
|
||||
$this->_certificatePath = $certificatePath;
|
||||
$this->_endpointUri = $endpointUri;
|
||||
$this->_subscriptionId = $subscriptionId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a ServiceManagementSettings object from the given connection string.
|
||||
*
|
||||
* @param string $connectionString The storage settings connection string.
|
||||
*
|
||||
* @return ServiceManagementSettings
|
||||
*/
|
||||
public static function createFromConnectionString($connectionString)
|
||||
{
|
||||
$tokenizedSettings = self::parseAndValidateKeys($connectionString);
|
||||
|
||||
$matchedSpecs = self::matchedSpecification(
|
||||
$tokenizedSettings,
|
||||
self::allRequired(
|
||||
self::$_subscriptionIdSetting,
|
||||
self::$_certificatePathSetting
|
||||
),
|
||||
self::optional(
|
||||
self::$_endpointSetting
|
||||
)
|
||||
);
|
||||
if ($matchedSpecs) {
|
||||
$endpointUri = Utilities::tryGetValueInsensitive(
|
||||
Resources::SERVICE_MANAGEMENT_ENDPOINT_NAME,
|
||||
$tokenizedSettings,
|
||||
Resources::SERVICE_MANAGEMENT_URL
|
||||
);
|
||||
$subscriptionId = Utilities::tryGetValueInsensitive(
|
||||
Resources::SUBSCRIPTION_ID_NAME,
|
||||
$tokenizedSettings
|
||||
);
|
||||
$certificatePath = Utilities::tryGetValueInsensitive(
|
||||
Resources::CERTIFICATE_PATH_NAME,
|
||||
$tokenizedSettings
|
||||
);
|
||||
|
||||
return new ServiceManagementSettings(
|
||||
$subscriptionId,
|
||||
$endpointUri,
|
||||
$certificatePath
|
||||
);
|
||||
}
|
||||
|
||||
self::noMatch($connectionString);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets service management endpoint uri.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getEndpointUri()
|
||||
{
|
||||
return $this->_endpointUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the subscription id.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSubscriptionId()
|
||||
{
|
||||
return $this->_subscriptionId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the certificate path.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getCertificatePath()
|
||||
{
|
||||
return $this->_certificatePath;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,347 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
use WindowsAzure\Common\Internal\Validate;
|
||||
use WindowsAzure\Common\Internal\Utilities;
|
||||
use WindowsAzure\Common\Internal\RestProxy;
|
||||
use WindowsAzure\Common\Internal\Http\Url;
|
||||
use WindowsAzure\Common\Internal\Http\HttpCallContext;
|
||||
|
||||
/**
|
||||
* Base class for all services rest proxies.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class ServiceRestProxy extends RestProxy
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $_accountName;
|
||||
|
||||
/**
|
||||
* Initializes new ServiceRestProxy object.
|
||||
*
|
||||
* @param IHttpClient $channel The HTTP client used to send HTTP requests.
|
||||
* @param string $uri The storage account uri.
|
||||
* @param string $accountName The name of the account.
|
||||
* @param ISerializer $dataSerializer The data serializer.
|
||||
*/
|
||||
public function __construct($channel, $uri, $accountName, $dataSerializer)
|
||||
{
|
||||
parent::__construct($channel, $dataSerializer, $uri);
|
||||
$this->_accountName = $accountName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the account name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getAccountName()
|
||||
{
|
||||
return $this->_accountName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends HTTP request with the specified HTTP call context.
|
||||
*
|
||||
* @param WindowsAzure\Common\Internal\Http\HttpCallContext $context The HTTP
|
||||
* call context.
|
||||
*
|
||||
* @return \HTTP_Request2_Response
|
||||
*/
|
||||
protected function sendContext($context)
|
||||
{
|
||||
$context->setUri($this->getUri());
|
||||
return parent::sendContext($context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends HTTP request with the specified parameters.
|
||||
*
|
||||
* @param string $method HTTP method used in the request
|
||||
* @param array $headers HTTP headers.
|
||||
* @param array $queryParams URL query parameters.
|
||||
* @param array $postParameters The HTTP POST parameters.
|
||||
* @param string $path URL path
|
||||
* @param int $statusCode Expected status code received in the response
|
||||
* @param string $body Request body
|
||||
*
|
||||
* @return \HTTP_Request2_Response
|
||||
*/
|
||||
protected function send(
|
||||
$method,
|
||||
$headers,
|
||||
$queryParams,
|
||||
$postParameters,
|
||||
$path,
|
||||
$statusCode,
|
||||
$body = Resources::EMPTY_STRING
|
||||
) {
|
||||
$context = new HttpCallContext();
|
||||
$context->setBody($body);
|
||||
$context->setHeaders($headers);
|
||||
$context->setMethod($method);
|
||||
$context->setPath($path);
|
||||
$context->setQueryParameters($queryParams);
|
||||
$context->setPostParameters($postParameters);
|
||||
|
||||
if (is_array($statusCode)) {
|
||||
$context->setStatusCodes($statusCode);
|
||||
} else {
|
||||
$context->addStatusCode($statusCode);
|
||||
}
|
||||
|
||||
return $this->sendContext($context);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds optional header to headers if set
|
||||
*
|
||||
* @param array $headers The array of request headers.
|
||||
* @param AccessCondition $accessCondition The access condition object.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function addOptionalAccessConditionHeader($headers, $accessCondition)
|
||||
{
|
||||
if (!is_null($accessCondition)) {
|
||||
$header = $accessCondition->getHeader();
|
||||
|
||||
if ($header != Resources::EMPTY_STRING) {
|
||||
$value = $accessCondition->getValue();
|
||||
if ($value instanceof \DateTime) {
|
||||
$value = gmdate(
|
||||
Resources::AZURE_DATE_FORMAT,
|
||||
$value->getTimestamp()
|
||||
);
|
||||
}
|
||||
$headers[$header] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds optional header to headers if set
|
||||
*
|
||||
* @param array $headers The array of request headers.
|
||||
* @param AccessCondition $accessCondition The access condition object.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function addOptionalSourceAccessConditionHeader(
|
||||
$headers,
|
||||
$accessCondition
|
||||
) {
|
||||
if (!is_null($accessCondition)) {
|
||||
$header = $accessCondition->getHeader();
|
||||
$headerName = null;
|
||||
if (!empty($header)) {
|
||||
switch($header) {
|
||||
case Resources::IF_MATCH:
|
||||
$headerName = Resources::X_MS_SOURCE_IF_MATCH;
|
||||
break;
|
||||
|
||||
case Resources::IF_UNMODIFIED_SINCE:
|
||||
$headerName = Resources::X_MS_SOURCE_IF_UNMODIFIED_SINCE;
|
||||
break;
|
||||
|
||||
case Resources::IF_MODIFIED_SINCE:
|
||||
$headerName = Resources::X_MS_SOURCE_IF_MODIFIED_SINCE;
|
||||
break;
|
||||
|
||||
case Resources::IF_NONE_MATCH:
|
||||
$headerName = Resources::X_MS_SOURCE_IF_NONE_MATCH;
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new \Exception(Resources::INVALID_ACH_MSG); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Error message to be escaped when caught and printed.
|
||||
break;
|
||||
}
|
||||
}
|
||||
$value = $accessCondition->getValue();
|
||||
if ($value instanceof \DateTime) {
|
||||
$value = gmdate(
|
||||
Resources::AZURE_DATE_FORMAT,
|
||||
$value->getTimestamp()
|
||||
);
|
||||
}
|
||||
|
||||
$this->addOptionalHeader($headers, $headerName, $value);
|
||||
}
|
||||
|
||||
return $headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds HTTP POST parameter to the specified
|
||||
*
|
||||
* @param array $postParameters An array of HTTP POST parameters.
|
||||
* @param string $key The key of a HTTP POST parameter.
|
||||
* @param string $value the value of a HTTP POST parameter.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function addPostParameter(
|
||||
$postParameters,
|
||||
$key,
|
||||
$value
|
||||
) {
|
||||
Validate::isArray($postParameters, 'postParameters');
|
||||
$postParameters[$key] = $value;
|
||||
return $postParameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Groups set of values into one value separated with Resources::SEPARATOR
|
||||
*
|
||||
* @param array $values array of values to be grouped.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function groupQueryValues($values)
|
||||
{
|
||||
Validate::isArray($values, 'values');
|
||||
$joined = Resources::EMPTY_STRING;
|
||||
|
||||
foreach ($values as $value) {
|
||||
if (!is_null($value) && !empty($value)) {
|
||||
$joined .= $value . Resources::SEPARATOR;
|
||||
}
|
||||
}
|
||||
|
||||
return trim($joined, Resources::SEPARATOR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds metadata elements to headers array
|
||||
*
|
||||
* @param array $headers HTTP request headers
|
||||
* @param array $metadata user specified metadata
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function addMetadataHeaders($headers, $metadata)
|
||||
{
|
||||
$this->validateMetadata($metadata);
|
||||
|
||||
$metadata = $this->generateMetadataHeaders($metadata);
|
||||
$headers = array_merge($headers, $metadata);
|
||||
|
||||
return $headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates metadata headers by prefixing each element with 'x-ms-meta'.
|
||||
*
|
||||
* @param array $metadata user defined metadata.
|
||||
*
|
||||
* @return array.
|
||||
*/
|
||||
public function generateMetadataHeaders($metadata)
|
||||
{
|
||||
$metadataHeaders = array();
|
||||
|
||||
if (is_array($metadata) && !is_null($metadata)) {
|
||||
foreach ($metadata as $key => $value) {
|
||||
$headerName = Resources::X_MS_META_HEADER_PREFIX;
|
||||
if ( strpos($value, "\r") !== false
|
||||
|| strpos($value, "\n") !== false
|
||||
) {
|
||||
throw new \InvalidArgumentException(Resources::INVALID_META_MSG); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Error message to be escaped when caught and printed.
|
||||
}
|
||||
|
||||
$headerName .= strtolower($key);
|
||||
$metadataHeaders[$headerName] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $metadataHeaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets metadata array by parsing them from given headers.
|
||||
*
|
||||
* @param array $headers HTTP headers containing metadata elements.
|
||||
*
|
||||
* @return array.
|
||||
*/
|
||||
public function getMetadataArray($headers)
|
||||
{
|
||||
$metadata = array();
|
||||
foreach ($headers as $key => $value) {
|
||||
$isMetadataHeader = Utilities::startsWith(
|
||||
strtolower($key),
|
||||
Resources::X_MS_META_HEADER_PREFIX
|
||||
);
|
||||
|
||||
if ($isMetadataHeader) {
|
||||
$MetadataName = str_replace(
|
||||
Resources::X_MS_META_HEADER_PREFIX,
|
||||
Resources::EMPTY_STRING,
|
||||
strtolower($key)
|
||||
);
|
||||
|
||||
$metadata[$MetadataName] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $metadata;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the provided metadata array.
|
||||
*
|
||||
* @param mix $metadata The metadata array.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public function validateMetadata($metadata)
|
||||
{
|
||||
if (!is_null($metadata)) {
|
||||
Validate::isArray($metadata, 'metadata');
|
||||
} else {
|
||||
$metadata = array();
|
||||
}
|
||||
|
||||
foreach ($metadata as $key => $value) {
|
||||
Validate::isString($key, 'metadata key');
|
||||
Validate::isString($value, 'metadata value');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,274 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
|
||||
/**
|
||||
* Base class for all REST services settings.
|
||||
*
|
||||
* Derived classes must implement the following members:
|
||||
* 1- $isInitialized: A static property that indicates whether the class's static
|
||||
* members have been initialized.
|
||||
* 2- init(): A protected static method that initializes static members.
|
||||
* 3- $validSettingKeys: A static property that contains valid setting keys for this
|
||||
* service.
|
||||
* 4- createFromConnectionString($connectionString): A public static function that
|
||||
* takes a connection string and returns the created settings object.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
abstract class ServiceSettings
|
||||
{
|
||||
/**
|
||||
* Throws an exception if the connection string format does not match any of the
|
||||
* available formats.
|
||||
*
|
||||
* @param type $connectionString The invalid formatted connection string.
|
||||
*
|
||||
* @return none
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
protected static function noMatch($connectionString)
|
||||
{
|
||||
throw new \RuntimeException(
|
||||
sprintf(Resources::MISSING_CONNECTION_STRING_SETTINGS, $connectionString) // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Error message to be escaped when caught and printed.
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the connection string and then validate that the parsed keys belong to
|
||||
* the $validSettingKeys
|
||||
*
|
||||
* @param string $connectionString The user provided connection string.
|
||||
*
|
||||
* @return array The tokenized connection string keys.
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
protected static function parseAndValidateKeys($connectionString)
|
||||
{
|
||||
// Initialize the static values if they are not initialized yet.
|
||||
if (!static::$isInitialized) {
|
||||
static::init();
|
||||
static::$isInitialized = true;
|
||||
}
|
||||
|
||||
$tokenizedSettings = ConnectionStringParser::parseConnectionString(
|
||||
'connectionString',
|
||||
$connectionString
|
||||
);
|
||||
|
||||
// Assure that all given keys are valid.
|
||||
foreach ($tokenizedSettings as $key => $value) {
|
||||
if (!Utilities::inArrayInsensitive($key, static::$validSettingKeys) ) {
|
||||
throw new \RuntimeException(sprintf(Resources::INVALID_CONNECTION_STRING_SETTING_KEY, $key, implode("\n", static::$validSettingKeys))); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Error message to be escaped when caught and printed.
|
||||
}
|
||||
}
|
||||
|
||||
return $tokenizedSettings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an anonymous function that acts as predicate.
|
||||
*
|
||||
* @param array $requirements The array of conditions to satisfy.
|
||||
* @param boolean $isRequired Either these conditions are all required or all
|
||||
* optional.
|
||||
* @param boolean $atLeastOne Indicates that at least one requirement must
|
||||
* succeed.
|
||||
*
|
||||
* @return callable
|
||||
*/
|
||||
protected static function getValidator($requirements, $isRequired, $atLeastOne)
|
||||
{
|
||||
// @codingStandardsIgnoreStart
|
||||
|
||||
return function ($userSettings)
|
||||
use ($requirements, $isRequired, $atLeastOne) {
|
||||
$oneFound = false;
|
||||
$result = array_change_key_case($userSettings);
|
||||
foreach ($requirements as $requirement) {
|
||||
$settingName = strtolower($requirement[Resources::SETTING_NAME]);
|
||||
|
||||
// Check if the setting name exists in the provided user settings.
|
||||
if (array_key_exists($settingName, $result)) {
|
||||
// Check if the provided user setting value is valid.
|
||||
$validationFunc = $requirement[Resources::SETTING_CONSTRAINT];
|
||||
$isValid = $validationFunc($result[$settingName]);
|
||||
|
||||
if ($isValid) {
|
||||
// Remove the setting as indicator for successful validation.
|
||||
unset($result[$settingName]);
|
||||
$oneFound = true;
|
||||
}
|
||||
} else {
|
||||
// If required then fail because the setting does not exist
|
||||
if ($isRequired) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($atLeastOne) {
|
||||
// At least one requirement must succeed, otherwise fail.
|
||||
return $oneFound ? $result : null;
|
||||
} else {
|
||||
return $result;
|
||||
}
|
||||
};
|
||||
|
||||
// @codingStandardsIgnoreEnd
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates at lease one succeed predicate for the provided list of requirements.
|
||||
*
|
||||
* @return callable
|
||||
*/
|
||||
protected static function atLeastOne()
|
||||
{
|
||||
$allSettings = func_get_args();
|
||||
return self::getValidator($allSettings, false, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an optional predicate for the provided list of requirements.
|
||||
*
|
||||
* @return callable
|
||||
*/
|
||||
protected static function optional()
|
||||
{
|
||||
$optionalSettings = func_get_args();
|
||||
return self::getValidator($optionalSettings, false, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an required predicate for the provided list of requirements.
|
||||
*
|
||||
* @return callable
|
||||
*/
|
||||
protected static function allRequired()
|
||||
{
|
||||
$requiredSettings = func_get_args();
|
||||
return self::getValidator($requiredSettings, true, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a setting value condition using the passed predicate.
|
||||
*
|
||||
* @param string $name The setting key name.
|
||||
* @param callable $predicate The setting value predicate.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected static function settingWithFunc($name, $predicate)
|
||||
{
|
||||
$requirement = array();
|
||||
$requirement[Resources::SETTING_NAME] = $name;
|
||||
$requirement[Resources::SETTING_CONSTRAINT] = $predicate;
|
||||
|
||||
return $requirement;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a setting value condition that validates it is one of the
|
||||
* passed valid values.
|
||||
*
|
||||
* @param string $name The setting key name.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected static function setting($name)
|
||||
{
|
||||
$validValues = func_get_args();
|
||||
|
||||
// Remove $name argument.
|
||||
unset($validValues[0]);
|
||||
|
||||
$validValuesCount = func_num_args();
|
||||
|
||||
$predicate = function ($settingValue) use ($validValuesCount, $validValues) {
|
||||
if (empty($validValues)) {
|
||||
// No restrictions, succeed,
|
||||
return true;
|
||||
}
|
||||
|
||||
// Check to find if the $settingValue is valid or not. The index must
|
||||
// start from 1 as unset deletes the value but does not update the array
|
||||
// indecies.
|
||||
for ($index = 1; $index < $validValuesCount; $index++) {
|
||||
if ($settingValue == $validValues[$index]) {
|
||||
// $settingValue is found in valid values set, succeed.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
throw new \RuntimeException(sprintf(Resources::INVALID_CONFIG_VALUE, $settingValue, implode("\n", $validValues))); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Error message to be escaped when caught and printed.
|
||||
// $settingValue is missing in valid values set, fail.
|
||||
return false;
|
||||
};
|
||||
|
||||
return self::settingWithFunc($name, $predicate);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests to see if a given list of settings matches a set of filters exactly.
|
||||
*
|
||||
* @param array $settings The settings to check.
|
||||
*
|
||||
* @return boolean If any filter returns null, false. If there are any settings
|
||||
* left over after all filters are processed, false. Otherwise true.
|
||||
*/
|
||||
protected static function matchedSpecification($settings)
|
||||
{
|
||||
$constraints = func_get_args();
|
||||
|
||||
// Remove first element which corresponds to $settings
|
||||
unset($constraints[0]);
|
||||
|
||||
foreach ($constraints as $constraint) {
|
||||
$remainingSettings = $constraint($settings);
|
||||
|
||||
if (is_null($remainingSettings)) {
|
||||
return false;
|
||||
} else {
|
||||
$settings = $remainingSettings;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($settings)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,487 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
use WindowsAzure\Common\Internal\ConnectionStringParser;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
|
||||
/**
|
||||
* Represents the settings used to sign and access a request against the storage
|
||||
* service. For more information about storage service connection strings check this
|
||||
* page: http://msdn.microsoft.com/en-us/library/ee758697
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class StorageServiceSettings extends ServiceSettings
|
||||
{
|
||||
/**
|
||||
* The storage service name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_name;
|
||||
|
||||
/**
|
||||
* A base64 representation.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_key;
|
||||
|
||||
/**
|
||||
* The endpoint for the blob service.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_blobEndpointUri;
|
||||
|
||||
/**
|
||||
* The endpoint for the queue service.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_queueEndpointUri;
|
||||
|
||||
/**
|
||||
* The endpoint for the table service.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_tableEndpointUri;
|
||||
|
||||
/**
|
||||
* @var StorageServiceSettings
|
||||
*/
|
||||
private static $_devStoreAccount;
|
||||
|
||||
/**
|
||||
* Validator for the UseDevelopmentStorage setting. Must be "true".
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_useDevelopmentStorageSetting;
|
||||
|
||||
/**
|
||||
* Validator for the DevelopmentStorageProxyUri setting. Must be a valid Uri.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_developmentStorageProxyUriSetting;
|
||||
|
||||
/**
|
||||
* Validator for the DefaultEndpointsProtocol setting. Must be either "http"
|
||||
* or "https".
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_defaultEndpointsProtocolSetting;
|
||||
|
||||
/**
|
||||
* Validator for the AccountName setting. No restrictions.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_accountNameSetting;
|
||||
|
||||
/**
|
||||
* Validator for the AccountKey setting. Must be a valid base64 string.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_accountKeySetting;
|
||||
|
||||
/**
|
||||
* Validator for the BlobEndpoint setting. Must be a valid Uri.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_blobEndpointSetting;
|
||||
|
||||
/**
|
||||
* Validator for the QueueEndpoint setting. Must be a valid Uri.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_queueEndpointSetting;
|
||||
|
||||
/**
|
||||
* Validator for the TableEndpoint setting. Must be a valid Uri.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_tableEndpointSetting;
|
||||
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
protected static $isInitialized = false;
|
||||
|
||||
/**
|
||||
* Holds the expected setting keys.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $validSettingKeys = array();
|
||||
|
||||
/**
|
||||
* Initializes static members of the class.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
protected static function init()
|
||||
{
|
||||
self::$_useDevelopmentStorageSetting = self::setting(
|
||||
Resources::USE_DEVELOPMENT_STORAGE_NAME,
|
||||
'true'
|
||||
);
|
||||
|
||||
self::$_developmentStorageProxyUriSetting = self::settingWithFunc(
|
||||
Resources::DEVELOPMENT_STORAGE_PROXY_URI_NAME,
|
||||
Validate::getIsValidUri()
|
||||
);
|
||||
|
||||
self::$_defaultEndpointsProtocolSetting = self::setting(
|
||||
Resources::DEFAULT_ENDPOINTS_PROTOCOL_NAME,
|
||||
'http', 'https'
|
||||
);
|
||||
|
||||
self::$_accountNameSetting = self::setting(Resources::ACCOUNT_NAME_NAME);
|
||||
|
||||
self::$_accountKeySetting = self::settingWithFunc(
|
||||
Resources::ACCOUNT_KEY_NAME,
|
||||
// base64_decode will return false if the $key is not in base64 format.
|
||||
function ($key) {
|
||||
$isValidBase64String = base64_decode($key, true);
|
||||
if ($isValidBase64String) {
|
||||
return true;
|
||||
} else {
|
||||
throw new \RuntimeException(
|
||||
sprintf(Resources::INVALID_ACCOUNT_KEY_FORMAT, $key) // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Error message to be escaped when caught and printed.
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
self::$_blobEndpointSetting = self::settingWithFunc(
|
||||
Resources::BLOB_ENDPOINT_NAME,
|
||||
Validate::getIsValidUri()
|
||||
);
|
||||
|
||||
self::$_queueEndpointSetting = self::settingWithFunc(
|
||||
Resources::QUEUE_ENDPOINT_NAME,
|
||||
Validate::getIsValidUri()
|
||||
);
|
||||
|
||||
self::$_tableEndpointSetting = self::settingWithFunc(
|
||||
Resources::TABLE_ENDPOINT_NAME,
|
||||
Validate::getIsValidUri()
|
||||
);
|
||||
|
||||
self::$validSettingKeys[] = Resources::USE_DEVELOPMENT_STORAGE_NAME;
|
||||
self::$validSettingKeys[] = Resources::DEVELOPMENT_STORAGE_PROXY_URI_NAME;
|
||||
self::$validSettingKeys[] = Resources::DEFAULT_ENDPOINTS_PROTOCOL_NAME;
|
||||
self::$validSettingKeys[] = Resources::ACCOUNT_NAME_NAME;
|
||||
self::$validSettingKeys[] = Resources::ACCOUNT_KEY_NAME;
|
||||
self::$validSettingKeys[] = Resources::BLOB_ENDPOINT_NAME;
|
||||
self::$validSettingKeys[] = Resources::QUEUE_ENDPOINT_NAME;
|
||||
self::$validSettingKeys[] = Resources::TABLE_ENDPOINT_NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new storage service settings instance.
|
||||
*
|
||||
* @param string $name The storage service name.
|
||||
* @param string $key The storage service key.
|
||||
* @param string $blobEndpointUri The sotrage service blob endpoint.
|
||||
* @param string $queueEndpointUri The sotrage service queue endpoint.
|
||||
* @param string $tableEndpointUri The sotrage service table endpoint.
|
||||
*/
|
||||
public function __construct(
|
||||
$name,
|
||||
$key,
|
||||
$blobEndpointUri,
|
||||
$queueEndpointUri,
|
||||
$tableEndpointUri
|
||||
) {
|
||||
$this->_name = $name;
|
||||
$this->_key = $key;
|
||||
$this->_blobEndpointUri = $blobEndpointUri;
|
||||
$this->_queueEndpointUri = $queueEndpointUri;
|
||||
$this->_tableEndpointUri = $tableEndpointUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a StorageServiceSettings with development storage credentials using
|
||||
* the specified proxy Uri.
|
||||
*
|
||||
* @param string $proxyUri The proxy endpoint to use.
|
||||
*
|
||||
* @return StorageServiceSettings
|
||||
*/
|
||||
private static function _getDevelopmentStorageAccount($proxyUri)
|
||||
{
|
||||
if (is_null($proxyUri)) {
|
||||
return self::developmentStorageAccount();
|
||||
}
|
||||
|
||||
$scheme = parse_url($proxyUri, PHP_URL_SCHEME);
|
||||
$host = parse_url($proxyUri, PHP_URL_HOST);
|
||||
$prefix = $scheme . "://" . $host;
|
||||
|
||||
return new StorageServiceSettings(
|
||||
Resources::DEV_STORE_NAME,
|
||||
Resources::DEV_STORE_KEY,
|
||||
$prefix . ':10000/devstoreaccount1/',
|
||||
$prefix . ':10001/devstoreaccount1/',
|
||||
$prefix . ':10002/devstoreaccount1/'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a StorageServiceSettings object that references the development storage
|
||||
* account.
|
||||
*
|
||||
* @return StorageServiceSettings
|
||||
*/
|
||||
public static function developmentStorageAccount()
|
||||
{
|
||||
if (is_null(self::$_devStoreAccount)) {
|
||||
self::$_devStoreAccount = self::_getDevelopmentStorageAccount(
|
||||
Resources::DEV_STORE_URI
|
||||
);
|
||||
}
|
||||
|
||||
return self::$_devStoreAccount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the default service endpoint using the specified protocol and account
|
||||
* name.
|
||||
*
|
||||
* @param array $settings The service settings.
|
||||
* @param string $dns The service DNS.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private static function _getDefaultServiceEndpoint($settings, $dns)
|
||||
{
|
||||
$scheme = Utilities::tryGetValueInsensitive(
|
||||
Resources::DEFAULT_ENDPOINTS_PROTOCOL_NAME,
|
||||
$settings
|
||||
);
|
||||
$accountName = Utilities::tryGetValueInsensitive(
|
||||
Resources::ACCOUNT_NAME_NAME,
|
||||
$settings
|
||||
);
|
||||
|
||||
return sprintf(Resources::SERVICE_URI_FORMAT, $scheme, $accountName, $dns);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates StorageServiceSettings object given endpoints uri.
|
||||
*
|
||||
* @param array $settings The service settings.
|
||||
* @param string $blobEndpointUri The blob endpoint uri.
|
||||
* @param string $queueEndpointUri The queue endpoint uri.
|
||||
* @param string $tableEndpointUri The table endpoint uri.
|
||||
*
|
||||
* @return \WindowsAzure\Common\Internal\StorageServiceSettings
|
||||
*/
|
||||
private static function _createStorageServiceSettings(
|
||||
$settings,
|
||||
$blobEndpointUri = null,
|
||||
$queueEndpointUri = null,
|
||||
$tableEndpointUri = null
|
||||
) {
|
||||
$blobEndpointUri = Utilities::tryGetValueInsensitive(
|
||||
Resources::BLOB_ENDPOINT_NAME,
|
||||
$settings,
|
||||
$blobEndpointUri
|
||||
);
|
||||
$queueEndpointUri = Utilities::tryGetValueInsensitive(
|
||||
Resources::QUEUE_ENDPOINT_NAME,
|
||||
$settings,
|
||||
$queueEndpointUri
|
||||
);
|
||||
$tableEndpointUri = Utilities::tryGetValueInsensitive(
|
||||
Resources::TABLE_ENDPOINT_NAME,
|
||||
$settings,
|
||||
$tableEndpointUri
|
||||
);
|
||||
$accountName = Utilities::tryGetValueInsensitive(
|
||||
Resources::ACCOUNT_NAME_NAME,
|
||||
$settings
|
||||
);
|
||||
$accountKey = Utilities::tryGetValueInsensitive(
|
||||
Resources::ACCOUNT_KEY_NAME,
|
||||
$settings
|
||||
);
|
||||
|
||||
return new StorageServiceSettings(
|
||||
$accountName,
|
||||
$accountKey,
|
||||
$blobEndpointUri,
|
||||
$queueEndpointUri,
|
||||
$tableEndpointUri
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a StorageServiceSettings object from the given connection string.
|
||||
*
|
||||
* @param string $connectionString The storage settings connection string.
|
||||
* @param string $endpoint Azure BLOB storage endpoint
|
||||
*
|
||||
* @return StorageServiceSettings
|
||||
*/
|
||||
public static function createFromConnectionString($connectionString, $endpoint = 'blob.core.windows.net')
|
||||
{
|
||||
$tokenizedSettings = self::parseAndValidateKeys($connectionString);
|
||||
|
||||
// Devstore case
|
||||
$matchedSpecs = self::matchedSpecification(
|
||||
$tokenizedSettings,
|
||||
self::allRequired(self::$_useDevelopmentStorageSetting),
|
||||
self::optional(self::$_developmentStorageProxyUriSetting)
|
||||
);
|
||||
if ($matchedSpecs) {
|
||||
$proxyUri = Utilities::tryGetValueInsensitive(
|
||||
Resources::DEVELOPMENT_STORAGE_PROXY_URI_NAME,
|
||||
$tokenizedSettings
|
||||
);
|
||||
|
||||
return self::_getDevelopmentStorageAccount($proxyUri);
|
||||
}
|
||||
|
||||
// Automatic case
|
||||
$matchedSpecs = self::matchedSpecification(
|
||||
$tokenizedSettings,
|
||||
self::allRequired(
|
||||
self::$_defaultEndpointsProtocolSetting,
|
||||
self::$_accountNameSetting,
|
||||
self::$_accountKeySetting
|
||||
),
|
||||
self::optional(
|
||||
self::$_blobEndpointSetting,
|
||||
self::$_queueEndpointSetting,
|
||||
self::$_tableEndpointSetting
|
||||
)
|
||||
);
|
||||
if ($matchedSpecs) {
|
||||
return self::_createStorageServiceSettings(
|
||||
$tokenizedSettings,
|
||||
self::_getDefaultServiceEndpoint(
|
||||
$tokenizedSettings,
|
||||
// Changed in library from UpdraftPlus for compatibility with German Azure
|
||||
$endpoint
|
||||
),
|
||||
self::_getDefaultServiceEndpoint(
|
||||
$tokenizedSettings,
|
||||
Resources::QUEUE_BASE_DNS_NAME
|
||||
),
|
||||
self::_getDefaultServiceEndpoint(
|
||||
$tokenizedSettings,
|
||||
Resources::TABLE_BASE_DNS_NAME
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// Explicit case
|
||||
$matchedSpecs = self::matchedSpecification(
|
||||
$tokenizedSettings,
|
||||
self::atLeastOne(
|
||||
self::$_blobEndpointSetting,
|
||||
self::$_queueEndpointSetting,
|
||||
self::$_tableEndpointSetting
|
||||
),
|
||||
self::allRequired(
|
||||
self::$_accountNameSetting,
|
||||
self::$_accountKeySetting
|
||||
)
|
||||
);
|
||||
if ($matchedSpecs) {
|
||||
return self::_createStorageServiceSettings($tokenizedSettings);
|
||||
}
|
||||
|
||||
self::noMatch($connectionString);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets storage service name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets storage service key.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getKey()
|
||||
{
|
||||
return $this->_key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets storage service blob endpoint uri.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getBlobEndpointUri()
|
||||
{
|
||||
return $this->_blobEndpointUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets storage service queue endpoint uri.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getQueueEndpointUri()
|
||||
{
|
||||
return $this->_queueEndpointUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets storage service table endpoint uri.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTableEndpointUri()
|
||||
{
|
||||
return $this->_tableEndpointUri;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,731 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
|
||||
/**
|
||||
* Utilities for the project
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class Utilities
|
||||
{
|
||||
/**
|
||||
* Returns the specified value of the $key passed from $array and in case that
|
||||
* this $key doesn't exist, the default value is returned.
|
||||
*
|
||||
* @param array $array The array to be used.
|
||||
* @param mix $key The array key.
|
||||
* @param mix $default The value to return if $key is not found in $array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return mix
|
||||
*/
|
||||
public static function tryGetValue($array, $key, $default = null)
|
||||
{
|
||||
return is_array($array) && array_key_exists($key, $array)
|
||||
? $array[$key]
|
||||
: $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a url scheme if there is no scheme.
|
||||
*
|
||||
* @param string $url The URL.
|
||||
* @param string $scheme The scheme. By default HTTP
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function tryAddUrlScheme($url, $scheme = 'http')
|
||||
{
|
||||
$urlScheme = parse_url($url, PHP_URL_SCHEME);
|
||||
|
||||
if (empty($urlScheme)) {
|
||||
$url = "$scheme://" . $url;
|
||||
}
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* tries to get nested array with index name $key from $array.
|
||||
*
|
||||
* Returns empty array object if the value is NULL.
|
||||
*
|
||||
* @param string $key The index name.
|
||||
* @param array $array The array object.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function tryGetArray($key, $array)
|
||||
{
|
||||
return Utilities::getArray(Utilities::tryGetValue($array, $key));
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the given key/value pair into array if the value doesn't satisfy empty().
|
||||
*
|
||||
* This function just validates that the given $array is actually array. If it's
|
||||
* NULL the function treats it as array.
|
||||
*
|
||||
* @param string $key The key.
|
||||
* @param string $value The value.
|
||||
* @param array &$array The array. If NULL will be used as array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function addIfNotEmpty($key, $value, &$array)
|
||||
{
|
||||
if (!is_null($array)) {
|
||||
Validate::isArray($array, 'array');
|
||||
}
|
||||
|
||||
if (!empty($value)) {
|
||||
$array[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the specified value of the key chain passed from $array and in case
|
||||
* that key chain doesn't exist, null is returned.
|
||||
*
|
||||
* @param array $array Array to be used.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return mix
|
||||
*/
|
||||
public static function tryGetKeysChainValue($array)
|
||||
{
|
||||
$arguments = func_get_args();
|
||||
$numArguments = func_num_args();
|
||||
|
||||
$currentArray = $array;
|
||||
for ($i = 1; $i < $numArguments; $i++) {
|
||||
if (is_array($currentArray)) {
|
||||
if (array_key_exists($arguments[$i], $currentArray)) {
|
||||
$currentArray = $currentArray[$arguments[$i]];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return $currentArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the passed $string starts with $prefix
|
||||
*
|
||||
* @param string $string word to seaech in
|
||||
* @param string $prefix prefix to be matched
|
||||
* @param boolean $ignoreCase true to ignore case during the comparison;
|
||||
* otherwise, false
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function startsWith($string, $prefix, $ignoreCase = false)
|
||||
{
|
||||
if ($ignoreCase) {
|
||||
$string = strtolower($string);
|
||||
$prefix = strtolower($prefix);
|
||||
}
|
||||
return ($prefix == substr($string, 0, strlen($prefix)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns grouped items from passed $var
|
||||
*
|
||||
* @param array $var item to group
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getArray($var)
|
||||
{
|
||||
if (is_null($var) || empty($var)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
foreach ($var as $value) {
|
||||
if ((gettype($value) == 'object')
|
||||
&& (get_class($value) == 'SimpleXMLElement')
|
||||
) {
|
||||
return (array) $var;
|
||||
} else if (!is_array($value)) {
|
||||
return array($var);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $var;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unserializes the passed $xml into array.
|
||||
*
|
||||
* @param string $xml XML to be parsed.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function unserialize($xml)
|
||||
{
|
||||
$sxml = new \SimpleXMLElement($xml);
|
||||
|
||||
return self::_sxml2arr($sxml);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a SimpleXML object to an Array recursively
|
||||
* ensuring all sub-elements are arrays as well.
|
||||
*
|
||||
* @param string $sxml SimpleXML object
|
||||
* @param array $arr Array into which to store results
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private static function _sxml2arr($sxml, $arr = null)
|
||||
{
|
||||
foreach ((array) $sxml as $key => $value) {
|
||||
if (is_object($value) || (is_array($value))) {
|
||||
$arr[$key] = self::_sxml2arr($value);
|
||||
} else {
|
||||
$arr[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializes given array into xml. The array indices must be string to use
|
||||
* them as XML tags.
|
||||
*
|
||||
* @param array $array object to serialize represented in array.
|
||||
* @param string $rootName name of the XML root element.
|
||||
* @param string $defaultTag default tag for non-tagged elements.
|
||||
* @param string $standalone adds 'standalone' header tag, values 'yes'/'no'
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function serialize($array, $rootName, $defaultTag = null,
|
||||
$standalone = null
|
||||
) {
|
||||
$xmlVersion = '1.0';
|
||||
$xmlEncoding = 'UTF-8';
|
||||
|
||||
if (!is_array($array)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$xmlw = new \XmlWriter();
|
||||
$xmlw->openMemory();
|
||||
$xmlw->startDocument($xmlVersion, $xmlEncoding, $standalone);
|
||||
|
||||
$xmlw->startElement($rootName);
|
||||
|
||||
self::_arr2xml($xmlw, $array, $defaultTag);
|
||||
|
||||
$xmlw->endElement();
|
||||
|
||||
return $xmlw->outputMemory(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes an array and produces XML based on it.
|
||||
*
|
||||
* @param XMLWriter $xmlw XMLWriter object that was previously instanted
|
||||
* and is used for creating the XML.
|
||||
* @param array $data Array to be converted to XML
|
||||
* @param string $defaultTag Default XML tag to be used if none specified.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private static function _arr2xml(\XMLWriter $xmlw, $data, $defaultTag = null)
|
||||
{
|
||||
foreach ($data as $key => $value) {
|
||||
if (strcmp($key, '@attributes') == 0) {
|
||||
foreach ($value as $attributeName => $attributeValue) {
|
||||
$xmlw->writeAttribute($attributeName, $attributeValue);
|
||||
}
|
||||
} else if (is_array($value)) {
|
||||
if (!is_int($key)) {
|
||||
if ($key != Resources::EMPTY_STRING) {
|
||||
$xmlw->startElement($key);
|
||||
} else {
|
||||
$xmlw->startElement($defaultTag);
|
||||
}
|
||||
}
|
||||
|
||||
self::_arr2xml($xmlw, $value);
|
||||
|
||||
if (!is_int($key)) {
|
||||
$xmlw->endElement();
|
||||
}
|
||||
continue;
|
||||
} else {
|
||||
$xmlw->writeElement($key, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts string into boolean value.
|
||||
*
|
||||
* @param string $obj boolean value in string format.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function toBoolean($obj)
|
||||
{
|
||||
return filter_var($obj, FILTER_VALIDATE_BOOLEAN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts string into boolean value.
|
||||
*
|
||||
* @param bool $obj boolean value to convert.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function booleanToString($obj)
|
||||
{
|
||||
return $obj ? 'true' : 'false';
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a given date string into \DateTime object
|
||||
*
|
||||
* @param string $date windows azure date ins string represntation.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return \DateTime
|
||||
*/
|
||||
public static function rfc1123ToDateTime($date)
|
||||
{
|
||||
$timeZone = new \DateTimeZone('GMT');
|
||||
$format = Resources::AZURE_DATE_FORMAT;
|
||||
|
||||
return \DateTime::createFromFormat($format, $date, $timeZone);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate ISO 8601 compliant date string in UTC time zone
|
||||
*
|
||||
* @param int $timestamp The unix timestamp to convert
|
||||
* (for DateTime check date_timestamp_get).
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function isoDate($timestamp = null)
|
||||
{
|
||||
$tz = date_default_timezone_get();
|
||||
date_default_timezone_set('UTC');
|
||||
|
||||
if (is_null($timestamp)) {
|
||||
$timestamp = time();
|
||||
}
|
||||
|
||||
$returnValue = str_replace(
|
||||
'+00:00', '.0000000Z', date('c', $timestamp)
|
||||
);
|
||||
date_default_timezone_set($tz);
|
||||
return $returnValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a DateTime object into an Edm.DaeTime value in UTC timezone,
|
||||
* represented as a string.
|
||||
*
|
||||
* @param \DateTime $value The datetime value.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function convertToEdmDateTime($value)
|
||||
{
|
||||
if (empty($value)) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
if (is_string($value)) {
|
||||
$value = self::convertToDateTime($value);
|
||||
}
|
||||
|
||||
Validate::isDate($value);
|
||||
|
||||
$cloned = clone $value;
|
||||
$cloned->setTimezone(new \DateTimeZone('UTC'));
|
||||
return str_replace('+0000', 'Z', $cloned->format(\DateTime::ISO8601));
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a string to a \DateTime object. Returns false on failure.
|
||||
*
|
||||
* @param string $value The string value to parse.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return \DateTime
|
||||
*/
|
||||
public static function convertToDateTime($value)
|
||||
{
|
||||
if ($value instanceof \DateTime) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
if (substr($value, -1) == 'Z') {
|
||||
$value = substr($value, 0, strlen($value) - 1);
|
||||
}
|
||||
|
||||
return new \DateTime($value, new \DateTimeZone('UTC'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts string to stream handle.
|
||||
*
|
||||
* @param type $string The string contents.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return resource
|
||||
*/
|
||||
public static function stringToStream($string)
|
||||
{
|
||||
return fopen('data://text/plain,' . urlencode($string), 'rb');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts an array based on given keys order.
|
||||
*
|
||||
* @param array $array The array to sort.
|
||||
* @param array $order The keys order array.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function orderArray($array, $order)
|
||||
{
|
||||
$ordered = array();
|
||||
|
||||
foreach ($order as $key) {
|
||||
if (array_key_exists($key, $array)) {
|
||||
$ordered[$key] = $array[$key];
|
||||
}
|
||||
}
|
||||
|
||||
return $ordered;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a value exists in an array. The comparison is done in a case
|
||||
* insensitive manner.
|
||||
*
|
||||
* @param string $needle The searched value.
|
||||
* @param array $haystack The array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function inArrayInsensitive($needle, $haystack)
|
||||
{
|
||||
return in_array(strtolower($needle), array_map('strtolower', $haystack));
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given key exists in the array. The comparison is done in a case
|
||||
* insensitive manner.
|
||||
*
|
||||
* @param string $key The value to check.
|
||||
* @param array $search The array with keys to check.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function arrayKeyExistsInsensitive($key, $search)
|
||||
{
|
||||
return array_key_exists(strtolower($key), array_change_key_case($search));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the specified value of the $key passed from $array and in case that
|
||||
* this $key doesn't exist, the default value is returned. The key matching is
|
||||
* done in a case insensitive manner.
|
||||
*
|
||||
* @param string $key The array key.
|
||||
* @param array $haystack The array to be used.
|
||||
* @param mix $default The value to return if $key is not found in $array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return mix
|
||||
*/
|
||||
public static function tryGetValueInsensitive($key, $haystack, $default = null)
|
||||
{
|
||||
$array = array_change_key_case($haystack);
|
||||
return Utilities::tryGetValue($array, strtolower($key), $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of a version 4 GUID, which uses random
|
||||
* numbers.There are 6 reserved bits, and the GUIDs have this format:
|
||||
* xxxxxxxx-xxxx-4xxx-[8|9|a|b]xxx-xxxxxxxxxxxx
|
||||
* where 'x' is a hexadecimal digit, 0-9a-f.
|
||||
*
|
||||
* See http://tools.ietf.org/html/rfc4122 for more information.
|
||||
*
|
||||
* Note: This function is available on all platforms, while the
|
||||
* com_create_guid() is only available for Windows.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return string A new GUID.
|
||||
*/
|
||||
public static function getGuid()
|
||||
{
|
||||
// @codingStandardsIgnoreStart
|
||||
|
||||
return sprintf(
|
||||
'%04x%04x-%04x-%04x-%02x%02x-%04x%04x%04x',
|
||||
mt_rand(0, 65535),
|
||||
mt_rand(0, 65535), // 32 bits for "time_low"
|
||||
mt_rand(0, 65535), // 16 bits for "time_mid"
|
||||
mt_rand(0, 4096) + 16384, // 16 bits for "time_hi_and_version", with
|
||||
// the most significant 4 bits being 0100
|
||||
// to indicate randomly generated version
|
||||
mt_rand(0, 64) + 128, // 8 bits for "clock_seq_hi", with
|
||||
// the most significant 2 bits being 10,
|
||||
// required by version 4 GUIDs.
|
||||
mt_rand(0, 256), // 8 bits for "clock_seq_low"
|
||||
mt_rand(0, 65535), // 16 bits for "node 0" and "node 1"
|
||||
mt_rand(0, 65535), // 16 bits for "node 2" and "node 3"
|
||||
mt_rand(0, 65535) // 16 bits for "node 4" and "node 5"
|
||||
);
|
||||
|
||||
// @codingStandardsIgnoreEnd
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a list of objects of type $class from the provided array using static
|
||||
* create method.
|
||||
*
|
||||
* @param array $parsed The object in array representation
|
||||
* @param string $class The class name. Must have static method create.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function createInstanceList($parsed, $class)
|
||||
{
|
||||
$list = array();
|
||||
|
||||
foreach ($parsed as $value) {
|
||||
// We don't use this SDK on PHP 5.2
|
||||
// @codingStandardsIgnoreLine
|
||||
$list[] = $class::create($value);
|
||||
}
|
||||
|
||||
return $list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes a string and return if it ends with the specified character/string.
|
||||
*
|
||||
* @param string $haystack The string to search in.
|
||||
* @param string $needle postfix to match.
|
||||
* @param boolean $ignoreCase Set true to ignore case during the comparison;
|
||||
* otherwise, false
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function endsWith($haystack, $needle, $ignoreCase = false)
|
||||
{
|
||||
if ($ignoreCase) {
|
||||
$haystack = strtolower($haystack);
|
||||
$needle = strtolower($needle);
|
||||
}
|
||||
$length = strlen($needle);
|
||||
if ($length == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return (substr($haystack, -$length) === $needle);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get id from entity object or string.
|
||||
* If entity is object than validate type and return $entity->$method()
|
||||
* If entity is string than return this string
|
||||
*
|
||||
* @param object|string $entity Entity with id property
|
||||
* @param string $type Entity type to validate
|
||||
* @param string $method Methods that gets id (getId by default)
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getEntityId($entity, $type, $method = 'getId')
|
||||
{
|
||||
if (is_string($entity)) {
|
||||
return $entity;
|
||||
} else {
|
||||
Validate::isA($entity, $type, 'entity');
|
||||
Validate::methodExists($entity, $method, $type);
|
||||
|
||||
return $entity->$method();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a pseudo-random string of bytes using a cryptographically strong
|
||||
* algorithm.
|
||||
*
|
||||
* @param int $length Length of the string in bytes
|
||||
*
|
||||
* @return string|boolean Generated string of bytes on success, or FALSE on
|
||||
* failure.
|
||||
*/
|
||||
public static function generateCryptoKey($length)
|
||||
{
|
||||
return openssl_random_pseudo_bytes($length);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Encrypts $data with CTR encryption
|
||||
*
|
||||
* @param string $data Data to be encrypted
|
||||
* @param string $key AES Encryption key
|
||||
* @param string $initializationVector Initialization vector
|
||||
*
|
||||
* We ignore it for standards purposes because the function is apparently nowhere called
|
||||
* @codingStandardsIgnoreStart
|
||||
*
|
||||
* @return string Encrypted data
|
||||
*/
|
||||
public static function ctrCrypt($data, $key, $initializationVector)
|
||||
{
|
||||
error_log("WindowsAzure\Common\Internal\Utilities::ctrCrypt called - code path thought to be impossible; linting needs re-enabling");
|
||||
|
||||
Validate::isString($data, 'data');
|
||||
Validate::isString($key, 'key');
|
||||
Validate::isString($initializationVector, 'initializationVector');
|
||||
|
||||
Validate::isTrue(
|
||||
(strlen($key) == 16 || strlen($key) == 24 || strlen($key) == 32),
|
||||
sprintf(Resources::INVALID_STRING_LENGTH, 'key', '16, 24, 32')
|
||||
);
|
||||
|
||||
Validate::isTrue(
|
||||
(strlen($initializationVector) == 16),
|
||||
sprintf(Resources::INVALID_STRING_LENGTH, 'initializationVector', '16')
|
||||
);
|
||||
|
||||
$blockCount = ceil(strlen($data) / 16);
|
||||
|
||||
$ctrData = '';
|
||||
for ($i = 0; $i < $blockCount; ++$i) {
|
||||
$ctrData .= $initializationVector;
|
||||
|
||||
// increment Initialization Vector
|
||||
$j = 15;
|
||||
do {
|
||||
$digit = ord($initializationVector[$j]) + 1;
|
||||
$initializationVector[$j] = chr($digit & 0xFF);
|
||||
|
||||
$j--;
|
||||
} while (($digit == 0x100) && ($j >= 0));
|
||||
}
|
||||
|
||||
$encryptCtrData = mcrypt_encrypt(
|
||||
MCRYPT_RIJNDAEL_128,
|
||||
$key,
|
||||
$ctrData,
|
||||
MCRYPT_MODE_ECB
|
||||
);
|
||||
|
||||
return $data ^ $encryptCtrData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert base 256 number to decimal number.
|
||||
*
|
||||
* @codingStandardsIgnoreEnd
|
||||
*
|
||||
* @param string $number Base 256 number
|
||||
*
|
||||
* @return string Decimal number
|
||||
*/
|
||||
public static function base256ToDec($number)
|
||||
{
|
||||
Validate::isString($number, 'number');
|
||||
|
||||
$result = 0;
|
||||
$base = 1;
|
||||
for ($i = strlen($number) - 1; $i >= 0; $i--) {
|
||||
$result = bcadd($result, bcmul(ord($number[$i]), $base));
|
||||
$base = bcmul($base, 256);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,398 @@
|
||||
<?php
|
||||
// phpcs:disable WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Error message to be escaped when caught and printed.
|
||||
|
||||
/**
|
||||
* LICENSE: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
|
||||
namespace WindowsAzure\Common\Internal;
|
||||
use WindowsAzure\Common\Internal\InvalidArgumentTypeException;
|
||||
use WindowsAzure\Common\Internal\Resources;
|
||||
|
||||
/**
|
||||
* Validates aganist a condition and throws an exception in case of failure.
|
||||
*
|
||||
* @category Microsoft
|
||||
* @package WindowsAzure\Common\Internal
|
||||
* @author Azure PHP SDK <azurephpsdk@microsoft.com>
|
||||
* @copyright 2012 Microsoft Corporation
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||||
* @version Release: 0.4.1_2015-03
|
||||
* @link https://github.com/windowsazure/azure-sdk-for-php
|
||||
*/
|
||||
class Validate
|
||||
{
|
||||
/**
|
||||
* Throws exception if the provided variable type is not array.
|
||||
*
|
||||
* @param mix $var The variable to check.
|
||||
* @param string $name The parameter name.
|
||||
*
|
||||
* @throws InvalidArgumentTypeException.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function isArray($var, $name)
|
||||
{
|
||||
if (!is_array($var)) {
|
||||
throw new InvalidArgumentTypeException(gettype(array()), $name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the provided variable type is not string.
|
||||
*
|
||||
* @param mix $var The variable to check.
|
||||
* @param string $name The parameter name.
|
||||
*
|
||||
* @throws InvalidArgumentTypeException
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function isString($var, $name)
|
||||
{
|
||||
try {
|
||||
(string)$var;
|
||||
} catch (\Exception $e) {
|
||||
throw new InvalidArgumentTypeException(gettype(''), $name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the provided variable type is not boolean.
|
||||
*
|
||||
* @param mix $var variable to check against.
|
||||
*
|
||||
* @throws InvalidArgumentTypeException
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function isBoolean($var)
|
||||
{
|
||||
(bool)$var;
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the provided variable is set to null.
|
||||
*
|
||||
* @param mix $var The variable to check.
|
||||
* @param string $name The parameter name.
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function notNullOrEmpty($var, $name)
|
||||
{
|
||||
if (is_null($var) || empty($var)) {
|
||||
throw new \InvalidArgumentException(
|
||||
sprintf(Resources::NULL_OR_EMPTY_MSG, $name)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the provided variable is not double.
|
||||
*
|
||||
* @param mix $var The variable to check.
|
||||
* @param string $name The parameter name.
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function isDouble($var, $name)
|
||||
{
|
||||
if (!is_numeric($var)) {
|
||||
throw new InvalidArgumentTypeException('double', $name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the provided variable type is not integer.
|
||||
*
|
||||
* @param mix $var The variable to check.
|
||||
* @param string $name The parameter name.
|
||||
*
|
||||
* @throws InvalidArgumentTypeException
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function isInteger($var, $name)
|
||||
{
|
||||
try {
|
||||
(int)$var;
|
||||
} catch (\Exception $e) {
|
||||
throw new InvalidArgumentTypeException(gettype(123), $name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the variable is an empty or null string.
|
||||
*
|
||||
* @param string $var value.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function isNullOrEmptyString($var)
|
||||
{
|
||||
try {
|
||||
(string)$var;
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (!isset($var) || trim($var)==='');
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the provided condition is not satisfied.
|
||||
*
|
||||
* @param bool $isSatisfied condition result.
|
||||
* @param string $failureMessage the exception message
|
||||
*
|
||||
* @throws \Exception
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function isTrue($isSatisfied, $failureMessage)
|
||||
{
|
||||
if (!$isSatisfied) {
|
||||
throw new \InvalidArgumentException($failureMessage);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the provided $date is not of type \DateTime
|
||||
*
|
||||
* @param mix $date variable to check against.
|
||||
*
|
||||
* @throws WindowsAzure\Common\Internal\InvalidArgumentTypeException
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function isDate($date)
|
||||
{
|
||||
if (gettype($date) != 'object' || get_class($date) != 'DateTime') {
|
||||
throw new InvalidArgumentTypeException('DateTime');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the provided variable is set to null.
|
||||
*
|
||||
* @param mix $var The variable to check.
|
||||
* @param string $name The parameter name.
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function notNull($var, $name)
|
||||
{
|
||||
if (is_null($var)) {
|
||||
throw new \InvalidArgumentException(sprintf(Resources::NULL_MSG, $name));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the object is not of the specified class type.
|
||||
*
|
||||
* @param mixed $objectInstance An object that requires class type validation.
|
||||
* @param mixed $classInstance The instance of the class the the
|
||||
* object instance should be.
|
||||
* @param string $name The name of the object.
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
public static function isInstanceOf($objectInstance, $classInstance, $name)
|
||||
{
|
||||
Validate::notNull($classInstance, 'classInstance');
|
||||
if (is_null($objectInstance)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$objectType = gettype($objectInstance);
|
||||
$classType = gettype($classInstance);
|
||||
|
||||
if ($objectType === $classType) {
|
||||
return true;
|
||||
} else {
|
||||
throw new \InvalidArgumentException(
|
||||
sprintf(
|
||||
Resources::INSTANCE_TYPE_VALIDATION_MSG,
|
||||
$name,
|
||||
$objectType,
|
||||
$classType
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a anonymous function that check if the given uri is valid or not.
|
||||
*
|
||||
* @return callable
|
||||
*/
|
||||
public static function getIsValidUri()
|
||||
{
|
||||
return function ($uri) {
|
||||
return Validate::isValidUri($uri);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the string is not of a valid uri.
|
||||
*
|
||||
* @param string $uri String to check.
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function isValidUri($uri)
|
||||
{
|
||||
$isValid = filter_var($uri, FILTER_VALIDATE_URL);
|
||||
|
||||
if ($isValid) {
|
||||
return true;
|
||||
} else {
|
||||
throw new \RuntimeException(
|
||||
sprintf(Resources::INVALID_CONFIG_URI, $uri)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the provided variable type is not object.
|
||||
*
|
||||
* @param mix $var The variable to check.
|
||||
* @param string $name The parameter name.
|
||||
*
|
||||
* @throws InvalidArgumentTypeException.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function isObject($var, $name)
|
||||
{
|
||||
if (!is_object($var)) {
|
||||
throw new InvalidArgumentTypeException('object', $name);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws exception if the object is not of the specified class type.
|
||||
*
|
||||
* @param mixed $objectInstance An object that requires class type validation.
|
||||
* @param string $class The class the object instance should be.
|
||||
* @param string $name The parameter name.
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function isA($objectInstance, $class, $name)
|
||||
{
|
||||
Validate::isString($class, 'class');
|
||||
Validate::notNull($objectInstance, 'objectInstance');
|
||||
Validate::isObject($objectInstance, 'objectInstance');
|
||||
|
||||
$objectType = get_class($objectInstance);
|
||||
|
||||
if (is_a($objectInstance, $class)) {
|
||||
return true;
|
||||
} else {
|
||||
throw new \InvalidArgumentException(
|
||||
sprintf(
|
||||
Resources::INSTANCE_TYPE_VALIDATION_MSG,
|
||||
$name,
|
||||
$objectType,
|
||||
$class
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate if method exists in object
|
||||
*
|
||||
* @param object $objectInstance An object that requires method existing
|
||||
* validation
|
||||
* @param string $method Method name
|
||||
* @param string $name The parameter name
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function methodExists($objectInstance, $method, $name)
|
||||
{
|
||||
Validate::isString($method, 'method');
|
||||
Validate::notNull($objectInstance, 'objectInstance');
|
||||
Validate::isObject($objectInstance, 'objectInstance');
|
||||
|
||||
if (method_exists($objectInstance, $method)) {
|
||||
return true;
|
||||
} else {
|
||||
throw new \InvalidArgumentException(
|
||||
sprintf(
|
||||
Resources::ERROR_METHOD_NOT_FOUND,
|
||||
$method,
|
||||
$name
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate if string is date formatted
|
||||
*
|
||||
* @param string $value Value to validate
|
||||
* @param string $name Name of parameter to insert in erro message
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function isDateString($value, $name)
|
||||
{
|
||||
Validate::isString($value, 'value');
|
||||
|
||||
try {
|
||||
new \DateTime($value);
|
||||
return true;
|
||||
}
|
||||
catch (\Exception $e) {
|
||||
throw new \InvalidArgumentException(
|
||||
sprintf(
|
||||
Resources::ERROR_INVALID_DATE_STRING,
|
||||
$name,
|
||||
$value
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user