[Pkg-owncloud-commits] [php-sabredav] 63/66: Imported Upstream version 1.9.0~alpha2+dfsg
David Prévot
taffit at moszumanska.debian.org
Sat Jan 18 20:08:23 UTC 2014
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch master
in repository php-sabredav.
commit 83bbf3c21d08c311e13c991e9dedb8408d17f8ac
Merge: 9abd750 6fd90b3
Author: David Prévot <taffit at debian.org>
Date: Sat Jan 18 15:19:05 2014 -0400
Imported Upstream version 1.9.0~alpha2+dfsg
.travis.yml | 5 +
ChangeLog | 27 +-
LICENSE | 2 +-
build.xml | 4 +-
composer.json | 2 +-
composer.lock | 21 +-
examples/calendarserver.php | 31 +-
lib/Sabre/CalDAV/Backend/AbstractBackend.php | 2 +-
lib/Sabre/CalDAV/Backend/BackendInterface.php | 2 +-
lib/Sabre/CalDAV/Backend/NotificationSupport.php | 2 +-
lib/Sabre/CalDAV/Backend/PDO.php | 26 +-
lib/Sabre/CalDAV/Backend/SharingSupport.php | 2 +-
lib/Sabre/CalDAV/Backend/SubscriptionSupport.php | 2 +-
lib/Sabre/CalDAV/Backend/SyncSupport.php | 2 +-
lib/Sabre/CalDAV/Calendar.php | 2 +-
lib/Sabre/CalDAV/CalendarObject.php | 2 +-
lib/Sabre/CalDAV/CalendarQueryParser.php | 2 +-
lib/Sabre/CalDAV/CalendarQueryValidator.php | 2 +-
lib/Sabre/CalDAV/CalendarRootNode.php | 2 +-
.../CalDAV/Exception/InvalidComponentType.php | 2 +-
lib/Sabre/CalDAV/ICSExportPlugin.php | 2 +-
lib/Sabre/CalDAV/ICalendar.php | 2 +-
lib/Sabre/CalDAV/ICalendarObject.php | 2 +-
lib/Sabre/CalDAV/IShareableCalendar.php | 2 +-
lib/Sabre/CalDAV/ISharedCalendar.php | 2 +-
lib/Sabre/CalDAV/Notifications/Collection.php | 2 +-
lib/Sabre/CalDAV/Notifications/ICollection.php | 2 +-
lib/Sabre/CalDAV/Notifications/INode.php | 2 +-
.../CalDAV/Notifications/INotificationType.php | 2 +-
lib/Sabre/CalDAV/Notifications/Node.php | 2 +-
.../CalDAV/Notifications/Notification/Invite.php | 2 +-
.../Notifications/Notification/InviteReply.php | 2 +-
.../Notifications/Notification/SystemStatus.php | 2 +-
lib/Sabre/CalDAV/Plugin.php | 8 +-
lib/Sabre/CalDAV/Principal/Collection.php | 2 +-
lib/Sabre/CalDAV/Principal/IProxyRead.php | 2 +-
lib/Sabre/CalDAV/Principal/IProxyWrite.php | 2 +-
lib/Sabre/CalDAV/Principal/ProxyRead.php | 2 +-
lib/Sabre/CalDAV/Principal/ProxyWrite.php | 2 +-
lib/Sabre/CalDAV/Principal/User.php | 2 +-
lib/Sabre/CalDAV/Property/AllowedSharingModes.php | 2 +-
lib/Sabre/CalDAV/Property/Invite.php | 2 +-
.../CalDAV/Property/ScheduleCalendarTransp.php | 2 +-
.../Property/SupportedCalendarComponentSet.php | 2 +-
.../CalDAV/Property/SupportedCalendarData.php | 2 +-
.../CalDAV/Property/SupportedCollationSet.php | 2 +-
lib/Sabre/CalDAV/Schedule/IMip.php | 2 +-
lib/Sabre/CalDAV/Schedule/IOutbox.php | 2 +-
lib/Sabre/CalDAV/Schedule/Outbox.php | 2 +-
lib/Sabre/CalDAV/ShareableCalendar.php | 2 +-
lib/Sabre/CalDAV/SharedCalendar.php | 2 +-
lib/Sabre/CalDAV/SharingPlugin.php | 4 +-
lib/Sabre/CalDAV/Subscriptions/ISubscription.php | 2 +-
lib/Sabre/CalDAV/Subscriptions/Plugin.php | 2 +-
lib/Sabre/CalDAV/Subscriptions/Subscription.php | 2 +-
lib/Sabre/CalDAV/UserCalendars.php | 4 +-
lib/Sabre/CardDAV/AddressBook.php | 2 +-
lib/Sabre/CardDAV/AddressBookQueryParser.php | 2 +-
lib/Sabre/CardDAV/AddressBookRoot.php | 2 +-
lib/Sabre/CardDAV/Backend/AbstractBackend.php | 2 +-
lib/Sabre/CardDAV/Backend/BackendInterface.php | 2 +-
lib/Sabre/CardDAV/Backend/PDO.php | 8 +-
lib/Sabre/CardDAV/Backend/SyncSupport.php | 2 +-
lib/Sabre/CardDAV/Card.php | 2 +-
lib/Sabre/CardDAV/IAddressBook.php | 2 +-
lib/Sabre/CardDAV/ICard.php | 2 +-
lib/Sabre/CardDAV/IDirectory.php | 2 +-
lib/Sabre/CardDAV/Plugin.php | 2 +-
.../CardDAV/Property/SupportedAddressData.php | 2 +-
lib/Sabre/CardDAV/UserAddressBooks.php | 2 +-
lib/Sabre/CardDAV/VCFExportPlugin.php | 2 +-
lib/Sabre/DAV/Auth/Backend/AbstractBasic.php | 2 +-
lib/Sabre/DAV/Auth/Backend/AbstractDigest.php | 2 +-
lib/Sabre/DAV/Auth/Backend/Apache.php | 2 +-
lib/Sabre/DAV/Auth/Backend/BackendInterface.php | 2 +-
lib/Sabre/DAV/Auth/Backend/BasicCallBack.php | 2 +-
lib/Sabre/DAV/Auth/Backend/File.php | 2 +-
lib/Sabre/DAV/Auth/Backend/PDO.php | 14 +-
lib/Sabre/DAV/Auth/Plugin.php | 2 +-
lib/Sabre/DAV/Browser/GuessContentType.php | 2 +-
lib/Sabre/DAV/Browser/MapGetToPropFind.php | 2 +-
lib/Sabre/DAV/Browser/Plugin.php | 20 +-
lib/Sabre/DAV/Client.php | 6 +-
lib/Sabre/DAV/Collection.php | 2 +-
lib/Sabre/DAV/CorePlugin.php | 16 +-
lib/Sabre/DAV/Exception.php | 2 +-
lib/Sabre/DAV/Exception/BadRequest.php | 2 +-
lib/Sabre/DAV/Exception/Conflict.php | 2 +-
lib/Sabre/DAV/Exception/ConflictingLock.php | 3 +-
lib/Sabre/DAV/Exception/FileNotFound.php | 2 +-
lib/Sabre/DAV/Exception/Forbidden.php | 2 +-
lib/Sabre/DAV/Exception/InsufficientStorage.php | 2 +-
lib/Sabre/DAV/Exception/InvalidResourceType.php | 2 +-
lib/Sabre/DAV/Exception/InvalidSyncToken.php | 2 +-
.../DAV/Exception/LockTokenMatchesRequestUri.php | 2 +-
lib/Sabre/DAV/Exception/Locked.php | 2 +-
lib/Sabre/DAV/Exception/MethodNotAllowed.php | 2 +-
lib/Sabre/DAV/Exception/NotAuthenticated.php | 2 +-
lib/Sabre/DAV/Exception/NotFound.php | 2 +-
lib/Sabre/DAV/Exception/NotImplemented.php | 2 +-
lib/Sabre/DAV/Exception/PaymentRequired.php | 2 +-
lib/Sabre/DAV/Exception/PreconditionFailed.php | 2 +-
lib/Sabre/DAV/Exception/ReportNotSupported.php | 2 +-
.../DAV/Exception/RequestedRangeNotSatisfiable.php | 2 +-
lib/Sabre/DAV/Exception/ServiceUnavailable.php | 2 +-
lib/Sabre/DAV/Exception/TooMuchMatches.php | 2 +-
lib/Sabre/DAV/Exception/UnsupportedMediaType.php | 2 +-
lib/Sabre/DAV/FS/Directory.php | 2 +-
lib/Sabre/DAV/FS/File.php | 2 +-
lib/Sabre/DAV/FS/Node.php | 2 +-
lib/Sabre/DAV/FSExt/Directory.php | 2 +-
lib/Sabre/DAV/FSExt/File.php | 2 +-
lib/Sabre/DAV/FSExt/Node.php | 2 +-
lib/Sabre/DAV/File.php | 2 +-
lib/Sabre/DAV/ICollection.php | 2 +-
lib/Sabre/DAV/IExtendedCollection.php | 2 +-
lib/Sabre/DAV/IFile.php | 2 +-
lib/Sabre/DAV/IMultiGet.php | 2 +-
lib/Sabre/DAV/INode.php | 2 +-
lib/Sabre/DAV/IProperties.php | 2 +-
lib/Sabre/DAV/IQuota.php | 2 +-
lib/Sabre/DAV/Locks/Backend/AbstractBackend.php | 2 +-
lib/Sabre/DAV/Locks/Backend/BackendInterface.php | 2 +-
lib/Sabre/DAV/Locks/Backend/FS.php | 2 +-
lib/Sabre/DAV/Locks/Backend/File.php | 2 +-
lib/Sabre/DAV/Locks/Backend/PDO.php | 2 +-
lib/Sabre/DAV/Locks/LockInfo.php | 2 +-
lib/Sabre/DAV/Locks/Plugin.php | 6 +-
lib/Sabre/DAV/Mount/Plugin.php | 2 +-
lib/Sabre/DAV/Node.php | 2 +-
lib/Sabre/DAV/ObjectTree.php | 2 +-
lib/Sabre/DAV/PartialUpdate/IFile.php | 2 +-
lib/Sabre/DAV/PartialUpdate/Plugin.php | 4 +-
lib/Sabre/DAV/Property.php | 2 +-
lib/Sabre/DAV/Property/GetLastModified.php | 2 +-
lib/Sabre/DAV/Property/Href.php | 2 +-
lib/Sabre/DAV/Property/HrefList.php | 2 +-
lib/Sabre/DAV/Property/IHref.php | 2 +-
lib/Sabre/DAV/Property/LockDiscovery.php | 2 +-
lib/Sabre/DAV/Property/ResourceType.php | 2 +-
lib/Sabre/DAV/Property/Response.php | 2 +-
lib/Sabre/DAV/Property/ResponseList.php | 2 +-
lib/Sabre/DAV/Property/SupportedLock.php | 2 +-
lib/Sabre/DAV/Property/SupportedReportSet.php | 2 +-
lib/Sabre/DAV/PropertyInterface.php | 2 +-
lib/Sabre/DAV/Server.php | 52 +-
lib/Sabre/DAV/ServerPlugin.php | 2 +-
lib/Sabre/DAV/SimpleCollection.php | 2 +-
lib/Sabre/DAV/SimpleFile.php | 2 +-
lib/Sabre/DAV/StringUtil.php | 2 +-
lib/Sabre/DAV/Sync/ISyncCollection.php | 2 +-
lib/Sabre/DAV/Sync/Plugin.php | 4 +-
lib/Sabre/DAV/TemporaryFileFilterPlugin.php | 4 +-
lib/Sabre/DAV/Tree.php | 2 +-
lib/Sabre/DAV/Tree/Filesystem.php | 2 +-
lib/Sabre/DAV/URLUtil.php | 3 +-
lib/Sabre/DAV/UUIDUtil.php | 2 +-
lib/Sabre/DAV/Version.php | 4 +-
lib/Sabre/DAV/XMLUtil.php | 2 +-
lib/Sabre/DAVACL/AbstractPrincipalCollection.php | 2 +-
lib/Sabre/DAVACL/Exception/AceConflict.php | 2 +-
lib/Sabre/DAVACL/Exception/NeedPrivileges.php | 2 +-
lib/Sabre/DAVACL/Exception/NoAbstract.php | 2 +-
.../DAVACL/Exception/NotRecognizedPrincipal.php | 2 +-
.../DAVACL/Exception/NotSupportedPrivilege.php | 2 +-
lib/Sabre/DAVACL/IACL.php | 2 +-
lib/Sabre/DAVACL/IPrincipal.php | 2 +-
lib/Sabre/DAVACL/IPrincipalCollection.php | 2 +-
lib/Sabre/DAVACL/Plugin.php | 65 +-
lib/Sabre/DAVACL/Principal.php | 2 +-
.../DAVACL/PrincipalBackend/AbstractBackend.php | 2 +-
.../DAVACL/PrincipalBackend/BackendInterface.php | 2 +-
lib/Sabre/DAVACL/PrincipalBackend/PDO.php | 2 +-
lib/Sabre/DAVACL/PrincipalCollection.php | 2 +-
lib/Sabre/DAVACL/Property/Acl.php | 2 +-
lib/Sabre/DAVACL/Property/AclRestrictions.php | 2 +-
.../DAVACL/Property/CurrentUserPrivilegeSet.php | 2 +-
lib/Sabre/DAVACL/Property/Principal.php | 2 +-
.../DAVACL/Property/SupportedPrivilegeSet.php | 2 +-
lib/Sabre/autoload.php | 2 +-
.../CalDAV/Backend/MockSubscriptionSupport.php | 2 +-
.../CalDAV/ExpandEventsDTSTARTandDTENDTest.php | 4 +-
.../ExpandEventsDTSTARTandDTENDbyDayTest.php | 5 +-
.../Sabre/CalDAV/ExpandEventsDoubleEventsTest.php | 4 +-
tests/Sabre/CalDAV/FreeBusyReportTest.php | 6 +-
tests/Sabre/CalDAV/FreeBusyRequestTest.php | 26 +-
tests/Sabre/CalDAV/GetEventsByTimerangeTest.php | 5 +-
tests/Sabre/CalDAV/ICSExportPluginTest.php | 57 +-
tests/Sabre/CalDAV/Issue203Test.php | 5 +-
tests/Sabre/CalDAV/Issue205Test.php | 5 +-
tests/Sabre/CalDAV/Issue211Test.php | 5 +-
tests/Sabre/CalDAV/Issue220Test.php | 7 +-
tests/Sabre/CalDAV/Issue228Test.php | 4 +-
tests/Sabre/CalDAV/OutboxPostTest.php | 50 +-
tests/Sabre/CalDAV/PluginTest.php | 75 +-
tests/Sabre/CalDAV/Schedule/IMip/Mock.php | 6 +-
tests/Sabre/CalDAV/SharingPluginTest.php | 52 +-
tests/Sabre/CalDAV/ValidateICalTest.php | 53 +-
tests/Sabre/CardDAV/AbstractPluginTest.php | 2 +
tests/Sabre/CardDAV/AddressBookQueryTest.php | 16 +-
tests/Sabre/CardDAV/MultiGetTest.php | 4 +-
tests/Sabre/CardDAV/SogoStripContentTypeTest.php | 2 +-
tests/Sabre/CardDAV/VCFExportTest.php | 4 +-
tests/Sabre/CardDAV/ValidateVCardTest.php | 25 +-
tests/Sabre/DAV/AbstractServer.php | 3 +-
tests/Sabre/DAV/Auth/Backend/AbstractBasicTest.php | 4 +-
.../Sabre/DAV/Auth/Backend/AbstractDigestTest.php | 10 +-
tests/Sabre/DAV/Auth/Backend/ApacheTest.php | 2 +-
tests/Sabre/DAV/Auth/Backend/BasicCallBackTest.php | 4 +-
tests/Sabre/DAV/Auth/PluginTest.php | 5 +-
tests/Sabre/DAV/Browser/MapGetToPropFindTest.php | 4 +-
tests/Sabre/DAV/Browser/PluginTest.php | 20 +-
tests/Sabre/DAV/ClientTest.php | 947 ---------------------
tests/Sabre/DAV/FSExt/ServerTest.php | 36 +-
tests/Sabre/DAV/GetIfConditionsTest.php | 20 +-
tests/Sabre/DAV/HTTPPreferParsingTest.php | 20 +-
tests/Sabre/DAV/Issue33Test.php | 5 +-
tests/Sabre/DAV/Locks/MSWordTest.php | 13 +-
tests/Sabre/DAV/Locks/PluginTest.php | 157 ++--
tests/Sabre/DAV/Mount/PluginTest.php | 8 +-
tests/Sabre/DAV/PartialUpdate/PluginTest.php | 20 +-
.../Sabre/DAV/Property/SupportedReportSetTest.php | 6 +-
tests/Sabre/DAV/ServerCopyMoveTest.php | 41 +-
tests/Sabre/DAV/ServerEventsTest.php | 4 +-
tests/Sabre/DAV/ServerFinderBlockTest.php | 8 +-
tests/Sabre/DAV/ServerMKCOLTest.php | 52 +-
tests/Sabre/DAV/ServerPluginTest.php | 4 +-
tests/Sabre/DAV/ServerPreconditionTest.php | 44 +-
...psTest.php => ServerPropsInfiniteDepthTest.php} | 48 +-
tests/Sabre/DAV/ServerPropsTest.php | 8 +-
tests/Sabre/DAV/ServerRangeTest.php | 36 +-
tests/Sabre/DAV/ServerSimpleTest.php | 100 +--
tests/Sabre/DAV/Sync/MockSyncCollection.php | 2 +-
tests/Sabre/DAV/Sync/PluginTest.php | 52 +-
tests/Sabre/DAV/TemporaryFileFilterTest.php | 42 +-
tests/Sabre/DAV/URLUtilTest.php | 131 ---
tests/Sabre/DAVACL/ExpandPropertiesTest.php | 17 +-
tests/Sabre/DAVACL/PluginAdminTest.php | 10 +-
tests/Sabre/DAVACL/PrincipalPropertySearchTest.php | 17 +-
.../DAVACL/PrincipalSearchPropertySetTest.php | 13 +-
tests/Sabre/DAVServerTest.php | 7 +-
tests/Sabre/HTTP/ResponseMock.php | 11 +-
.../Sabre/HTTP/{ResponseMock.php => SapiMock.php} | 13 +-
tests/bootstrap.php | 5 +-
tests/composer.vobject3.json | 51 --
vendor/autoload.php | 2 +-
vendor/composer/ClassLoader.php | 186 +++-
vendor/composer/autoload_classmap.php | 1 +
vendor/composer/autoload_psr4.php | 9 +
vendor/composer/autoload_real.php | 11 +-
vendor/composer/installed.json | 115 +--
vendor/sabre/http/.travis.yml | 9 +-
vendor/sabre/http/ChangeLog | 27 +
vendor/sabre/http/LICENSE | 2 +-
vendor/sabre/http/README.md | 159 +++-
vendor/sabre/http/bin/EMPTY | 0
vendor/sabre/http/composer.json | 6 +
vendor/sabre/http/examples/asyncclient.php | 68 ++
vendor/sabre/http/examples/client.php | 11 +-
vendor/sabre/http/examples/reverseproxy.php | 10 +-
vendor/sabre/http/examples/stringify.php | 55 ++
vendor/sabre/http/lib/Sabre/HTTP/Auth/AWS.php | 2 +-
.../http/lib/Sabre/HTTP/Auth/AbstractAuth.php | 2 +-
vendor/sabre/http/lib/Sabre/HTTP/Auth/Basic.php | 2 +-
vendor/sabre/http/lib/Sabre/HTTP/Auth/Digest.php | 2 +-
vendor/sabre/http/lib/Sabre/HTTP/Client.php | 319 ++++++-
.../sabre/http/lib/Sabre/HTTP/ClientException.php | 2 +-
.../http/lib/Sabre/HTTP/ClientHttpException.php | 11 +-
vendor/sabre/http/lib/Sabre/HTTP/HttpException.php | 2 +-
vendor/sabre/http/lib/Sabre/HTTP/Message.php | 82 +-
.../http/lib/Sabre/HTTP/MessageDecoratorTrait.php | 42 +-
.../sabre/http/lib/Sabre/HTTP/MessageInterface.php | 37 +-
vendor/sabre/http/lib/Sabre/HTTP/Request.php | 146 +---
.../sabre/http/lib/Sabre/HTTP/RequestDecorator.php | 15 +-
.../sabre/http/lib/Sabre/HTTP/RequestInterface.php | 2 +-
vendor/sabre/http/lib/Sabre/HTTP/Response.php | 64 +-
.../http/lib/Sabre/HTTP/ResponseDecorator.php | 33 +-
.../http/lib/Sabre/HTTP/ResponseInterface.php | 23 +-
vendor/sabre/http/lib/Sabre/HTTP/Sapi.php | 169 ++++
vendor/sabre/http/lib/Sabre/HTTP/URLUtil.php | 6 +-
vendor/sabre/http/lib/Sabre/HTTP/Util.php | 17 +-
vendor/sabre/http/lib/Sabre/HTTP/Version.php | 4 +-
.../sabre/http/tests/Sabre/HTTP/Auth/BasicTest.php | 2 +-
vendor/sabre/http/tests/Sabre/HTTP/ClientTest.php | 532 ++++++------
.../http/tests/Sabre/HTTP/MessageDecoratorTest.php | 8 +-
vendor/sabre/http/tests/Sabre/HTTP/MessageTest.php | 35 +-
.../http/tests/Sabre/HTTP/RequestDecoratorTest.php | 10 +
vendor/sabre/http/tests/Sabre/HTTP/RequestTest.php | 96 +--
.../tests/Sabre/HTTP/ResponseDecoratorTest.php | 25 +-
.../sabre/http/tests/Sabre/HTTP/ResponseTest.php | 54 +-
vendor/sabre/http/tests/Sabre/HTTP/SapiTest.php | 117 +++
vendor/sabre/http/tests/Sabre/HTTP/URLUtilTest.php | 4 +-
292 files changed, 2690 insertions(+), 2923 deletions(-)
diff --cc composer.lock
index 9421f6c,0000000..7fd87d1
mode 100644,000000..100644
--- a/composer.lock
+++ b/composer.lock
@@@ -1,174 -1,0 +1,177 @@@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"
+ ],
- "hash": "3b1c58d4066b55af310fb2a65a911648",
++ "hash": "b80e105df2cfbffc35fa87892fa12a9b",
+ "packages": [
+ {
+ "name": "sabre/event",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-event.git",
+ "reference": "14f284eede050859e72ac41064df0eac25327190"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-event/zipball/14f284eede050859e72ac41064df0eac25327190",
+ "reference": "14f284eede050859e72ac41064df0eac25327190",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Sabre\\Event": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "evert at rooftopsolutions.nl",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The sabre/event library provides utilities for lightweight event-based programming",
+ "homepage": "https://github.com/fruux/sabre-event",
+ "keywords": [
+ "events"
+ ],
+ "time": "2013-07-19 12:46:56"
+ },
+ {
+ "name": "sabre/http",
- "version": "2.0.0alpha5",
++ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-http.git",
- "reference": "a9765fd1147f80433bd0958a036c9c446e15b6e6"
++ "reference": "36930a4c035ce1751834adc7f300dca620d27775"
+ },
+ "dist": {
+ "type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-http/zipball/a9765fd1147f80433bd0958a036c9c446e15b6e6",
- "reference": "a9765fd1147f80433bd0958a036c9c446e15b6e6",
++ "url": "https://api.github.com/repos/fruux/sabre-http/zipball/36930a4c035ce1751834adc7f300dca620d27775",
++ "reference": "36930a4c035ce1751834adc7f300dca620d27775",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.4",
+ "sabre/event": "~1.0.0"
+ },
++ "require-dev": {
++ "phpunit/phpunit": "*"
++ },
+ "suggest": {
+ "ext-curl": " to make http requests with the Client class"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Sabre\\HTTP": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "evert at rooftopsolutions.nl",
+ "homepage": "http://www.rooftopsolutions.nl/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The sabre/http library provides utilities for dealing with http requests and responses. ",
+ "homepage": "https://github.com/fruux/sabre-http",
+ "keywords": [
+ "http"
+ ],
- "time": "2013-11-07 21:20:41"
++ "time": "2014-01-09 23:23:46"
+ },
+ {
+ "name": "sabre/vobject",
+ "version": "3.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-vobject.git",
+ "reference": "961546d71c332ab34ad1c5bba7f372c08b388dcf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/961546d71c332ab34ad1c5bba7f372c08b388dcf",
+ "reference": "961546d71c332ab34ad1c5bba7f372c08b388dcf",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.3.1"
+ },
+ "bin": [
+ "bin/vobject"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Sabre\\VObject": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "evert at rooftopsolutions.nl",
+ "homepage": "http://www.rooftopsolutions.nl/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
+ "homepage": "https://github.com/fruux/sabre-vobject",
+ "keywords": [
+ "VObject",
+ "iCalendar",
+ "vCard"
+ ],
+ "time": "2013-10-02 15:59:03"
+ }
+ ],
+ "packages-dev": null,
+ "aliases": [
+
+ ],
+ "minimum-stability": "stable",
- "stability-flags": {
- "sabre/http": 15
- },
++ "stability-flags": [
++
++ ],
+ "platform": {
+ "php": ">=5.4.1",
+ "ext-dom": "*",
+ "ext-pcre": "*",
+ "ext-spl": "*",
+ "ext-simplexml": "*",
+ "ext-mbstring": "*",
+ "ext-ctype": "*",
+ "ext-date": "*",
+ "ext-iconv": "*",
+ "ext-libxml": "*"
+ },
+ "platform-dev": [
+
+ ]
+}
diff --cc vendor/autoload.php
index 91245fc,0000000..dee8af2
mode 100644,000000..100644
--- a/vendor/autoload.php
+++ b/vendor/autoload.php
@@@ -1,7 -1,0 +1,7 @@@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer' . '/autoload_real.php';
+
- return ComposerAutoloaderInit738aa2bfeb21a12ce36e0db127c66153::getLoader();
++return ComposerAutoloaderInitbdf76857b59f336300e91289e744ba46::getLoader();
diff --cc vendor/composer/ClassLoader.php
index 1db8d9a,0000000..f438e31
mode 100644,000000..100644
--- a/vendor/composer/ClassLoader.php
+++ b/vendor/composer/ClassLoader.php
@@@ -1,246 -1,0 +1,354 @@@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman at naderman.de>
+ * Jordi Boggiano <j.boggiano at seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0 class loader
+ *
+ * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien at symfony.com>
+ * @author Jordi Boggiano <j.boggiano at seld.be>
+ */
+class ClassLoader
+{
- private $prefixes = array();
- private $fallbackDirs = array();
++ // PSR-4
++ private $prefixLengthsPsr4 = array();
++ private $prefixDirsPsr4 = array();
++ private $fallbackDirsPsr4 = array();
++
++ // PSR-0
++ private $prefixesPsr0 = array();
++ private $fallbackDirsPsr0 = array();
++
+ private $useIncludePath = false;
+ private $classMap = array();
+
+ public function getPrefixes()
+ {
- return call_user_func_array('array_merge', $this->prefixes);
++ return call_user_func_array('array_merge', $this->prefixesPsr0);
++ }
++
++ public function getPrefixesPsr4()
++ {
++ return $this->prefixDirsPsr4;
+ }
+
+ public function getFallbackDirs()
+ {
- return $this->fallbackDirs;
++ return $this->fallbackDirsPsr0;
++ }
++
++ public function getFallbackDirsPsr4()
++ {
++ return $this->fallbackDirsPsr4;
+ }
+
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param array $classMap Class to filename map
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
- * Registers a set of classes, merging with any others previously set.
++ * Registers a set of PSR-0 directories for a given prefix, either
++ * appending or prepending to the ones previously set for this prefix.
+ *
- * @param string $prefix The classes prefix
- * @param array|string $paths The location(s) of the classes
- * @param bool $prepend Prepend the location(s)
++ * @param string $prefix The prefix
++ * @param array|string $paths The PSR-0 root directories
++ * @param bool $prepend Whether to prepend the directories
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
- $this->fallbackDirs = array_merge(
++ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
- $this->fallbackDirs
++ $this->fallbackDirsPsr0
+ );
+ } else {
- $this->fallbackDirs = array_merge(
- $this->fallbackDirs,
++ $this->fallbackDirsPsr0 = array_merge(
++ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
- if (!isset($this->prefixes[$first][$prefix])) {
- $this->prefixes[$first][$prefix] = (array) $paths;
++ if (!isset($this->prefixesPsr0[$first][$prefix])) {
++ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
- $this->prefixes[$first][$prefix] = array_merge(
++ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
- $this->prefixes[$first][$prefix]
++ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
- $this->prefixes[$first][$prefix] = array_merge(
- $this->prefixes[$first][$prefix],
++ $this->prefixesPsr0[$first][$prefix] = array_merge(
++ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
- * Registers a set of classes, replacing any others previously set.
++ * Registers a set of PSR-4 directories for a given namespace, either
++ * appending or prepending to the ones previously set for this namespace.
+ *
- * @param string $prefix The classes prefix
- * @param array|string $paths The location(s) of the classes
++ * @param string $prefix The prefix/namespace, with trailing '\\'
++ * @param array|string $paths The PSR-0 base directories
++ * @param bool $prepend Whether to prepend the directories
++ */
++ public function addPsr4($prefix, $paths, $prepend = false)
++ {
++ if (!$prefix) {
++ // Register directories for the root namespace.
++ if ($prepend) {
++ $this->fallbackDirsPsr4 = array_merge(
++ (array) $paths,
++ $this->fallbackDirsPsr4
++ );
++ } else {
++ $this->fallbackDirsPsr4 = array_merge(
++ $this->fallbackDirsPsr4,
++ (array) $paths
++ );
++ }
++ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
++ // Register directories for a new namespace.
++ $length = strlen($prefix);
++ if ('\\' !== $prefix[$length - 1]) {
++ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
++ }
++ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
++ $this->prefixDirsPsr4[$prefix] = (array) $paths;
++ } elseif ($prepend) {
++ // Prepend directories for an already registered namespace.
++ $this->prefixDirsPsr4[$prefix] = array_merge(
++ (array) $paths,
++ $this->prefixDirsPsr4[$prefix]
++ );
++ } else {
++ // Append directories for an already registered namespace.
++ $this->prefixDirsPsr4[$prefix] = array_merge(
++ $this->prefixDirsPsr4[$prefix],
++ (array) $paths
++ );
++ }
++ }
++
++ /**
++ * Registers a set of PSR-0 directories for a given prefix,
++ * replacing any others previously set for this prefix.
++ *
++ * @param string $prefix The prefix
++ * @param array|string $paths The PSR-0 base directories
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
- $this->fallbackDirs = (array) $paths;
++ $this->fallbackDirsPsr0 = (array) $paths;
++ } else {
++ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
++ }
++ }
+
- return;
++ /**
++ * Registers a set of PSR-4 directories for a given namespace,
++ * replacing any others previously set for this namespace.
++ *
++ * @param string $prefix The prefix/namespace, with trailing '\\'
++ * @param array|string $paths The PSR-4 base directories
++ */
++ public function setPsr4($prefix, $paths) {
++ if (!$prefix) {
++ $this->fallbackDirsPsr4 = (array) $paths;
++ } else {
++ $length = strlen($prefix);
++ if ('\\' !== $prefix[$length - 1]) {
++ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
++ }
++ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
++ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
- $this->prefixes[substr($prefix, 0, 1)][$prefix] = (array) $paths;
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return bool|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ include $file;
+
+ return true;
+ }
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ public function findFile($class)
+ {
+ // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
+ if ('\\' == $class[0]) {
+ $class = substr($class, 1);
+ }
+
++ // class map lookup
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+
++ // PSR-4 lookup
++ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . '.php';
++
++ $first = $class[0];
++ if (isset($this->prefixLengthsPsr4[$first])) {
++ foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
++ if (0 === strpos($class, $prefix)) {
++ foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
++ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
++ return $file;
++ }
++ }
++ }
++ }
++ }
++
++ // PSR-4 fallback dirs
++ foreach ($this->fallbackDirsPsr4 as $dir) {
++ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
++ return $file;
++ }
++ }
++
++ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
- $classPath = strtr(substr($class, 0, $pos), '\\', DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
- $className = substr($class, $pos + 1);
++ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
++ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
- $classPath = null;
- $className = $class;
++ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . '.php';
+ }
+
- $classPath .= strtr($className, '_', DIRECTORY_SEPARATOR) . '.php';
-
- $first = $class[0];
- if (isset($this->prefixes[$first])) {
- foreach ($this->prefixes[$first] as $prefix => $dirs) {
++ if (isset($this->prefixesPsr0[$first])) {
++ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
- if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) {
- return $dir . DIRECTORY_SEPARATOR . $classPath;
++ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
++ return $file;
+ }
+ }
+ }
+ }
+ }
+
- foreach ($this->fallbackDirs as $dir) {
- if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) {
- return $dir . DIRECTORY_SEPARATOR . $classPath;
++ // PSR-0 fallback dirs
++ foreach ($this->fallbackDirsPsr0 as $dir) {
++ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
++ return $file;
+ }
+ }
+
- if ($this->useIncludePath && $file = stream_resolve_include_path($classPath)) {
++ // PSR-0 include paths.
++ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+
++ // Remember that this class does not exist.
+ return $this->classMap[$class] = false;
+ }
+}
diff --cc vendor/composer/autoload_classmap.php
index 2acc66b,0000000..105b8cb
mode 100644,000000..100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@@ -1,256 -1,0 +1,257 @@@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+ 'Sabre\\CalDAV\\Backend\\AbstractBackend' => $baseDir . '/lib/Sabre/CalDAV/Backend/AbstractBackend.php',
+ 'Sabre\\CalDAV\\Backend\\BackendInterface' => $baseDir . '/lib/Sabre/CalDAV/Backend/BackendInterface.php',
+ 'Sabre\\CalDAV\\Backend\\NotificationSupport' => $baseDir . '/lib/Sabre/CalDAV/Backend/NotificationSupport.php',
+ 'Sabre\\CalDAV\\Backend\\PDO' => $baseDir . '/lib/Sabre/CalDAV/Backend/PDO.php',
+ 'Sabre\\CalDAV\\Backend\\SharingSupport' => $baseDir . '/lib/Sabre/CalDAV/Backend/SharingSupport.php',
+ 'Sabre\\CalDAV\\Backend\\SubscriptionSupport' => $baseDir . '/lib/Sabre/CalDAV/Backend/SubscriptionSupport.php',
+ 'Sabre\\CalDAV\\Backend\\SyncSupport' => $baseDir . '/lib/Sabre/CalDAV/Backend/SyncSupport.php',
+ 'Sabre\\CalDAV\\Calendar' => $baseDir . '/lib/Sabre/CalDAV/Calendar.php',
+ 'Sabre\\CalDAV\\CalendarObject' => $baseDir . '/lib/Sabre/CalDAV/CalendarObject.php',
+ 'Sabre\\CalDAV\\CalendarQueryParser' => $baseDir . '/lib/Sabre/CalDAV/CalendarQueryParser.php',
+ 'Sabre\\CalDAV\\CalendarQueryValidator' => $baseDir . '/lib/Sabre/CalDAV/CalendarQueryValidator.php',
+ 'Sabre\\CalDAV\\CalendarRootNode' => $baseDir . '/lib/Sabre/CalDAV/CalendarRootNode.php',
+ 'Sabre\\CalDAV\\Exception\\InvalidComponentType' => $baseDir . '/lib/Sabre/CalDAV/Exception/InvalidComponentType.php',
+ 'Sabre\\CalDAV\\ICSExportPlugin' => $baseDir . '/lib/Sabre/CalDAV/ICSExportPlugin.php',
+ 'Sabre\\CalDAV\\ICalendar' => $baseDir . '/lib/Sabre/CalDAV/ICalendar.php',
+ 'Sabre\\CalDAV\\ICalendarObject' => $baseDir . '/lib/Sabre/CalDAV/ICalendarObject.php',
+ 'Sabre\\CalDAV\\IShareableCalendar' => $baseDir . '/lib/Sabre/CalDAV/IShareableCalendar.php',
+ 'Sabre\\CalDAV\\ISharedCalendar' => $baseDir . '/lib/Sabre/CalDAV/ISharedCalendar.php',
+ 'Sabre\\CalDAV\\Notifications\\Collection' => $baseDir . '/lib/Sabre/CalDAV/Notifications/Collection.php',
+ 'Sabre\\CalDAV\\Notifications\\ICollection' => $baseDir . '/lib/Sabre/CalDAV/Notifications/ICollection.php',
+ 'Sabre\\CalDAV\\Notifications\\INode' => $baseDir . '/lib/Sabre/CalDAV/Notifications/INode.php',
+ 'Sabre\\CalDAV\\Notifications\\INotificationType' => $baseDir . '/lib/Sabre/CalDAV/Notifications/INotificationType.php',
+ 'Sabre\\CalDAV\\Notifications\\Node' => $baseDir . '/lib/Sabre/CalDAV/Notifications/Node.php',
+ 'Sabre\\CalDAV\\Notifications\\Notification\\Invite' => $baseDir . '/lib/Sabre/CalDAV/Notifications/Notification/Invite.php',
+ 'Sabre\\CalDAV\\Notifications\\Notification\\InviteReply' => $baseDir . '/lib/Sabre/CalDAV/Notifications/Notification/InviteReply.php',
+ 'Sabre\\CalDAV\\Notifications\\Notification\\SystemStatus' => $baseDir . '/lib/Sabre/CalDAV/Notifications/Notification/SystemStatus.php',
+ 'Sabre\\CalDAV\\Plugin' => $baseDir . '/lib/Sabre/CalDAV/Plugin.php',
+ 'Sabre\\CalDAV\\Principal\\Collection' => $baseDir . '/lib/Sabre/CalDAV/Principal/Collection.php',
+ 'Sabre\\CalDAV\\Principal\\IProxyRead' => $baseDir . '/lib/Sabre/CalDAV/Principal/IProxyRead.php',
+ 'Sabre\\CalDAV\\Principal\\IProxyWrite' => $baseDir . '/lib/Sabre/CalDAV/Principal/IProxyWrite.php',
+ 'Sabre\\CalDAV\\Principal\\ProxyRead' => $baseDir . '/lib/Sabre/CalDAV/Principal/ProxyRead.php',
+ 'Sabre\\CalDAV\\Principal\\ProxyWrite' => $baseDir . '/lib/Sabre/CalDAV/Principal/ProxyWrite.php',
+ 'Sabre\\CalDAV\\Principal\\User' => $baseDir . '/lib/Sabre/CalDAV/Principal/User.php',
+ 'Sabre\\CalDAV\\Property\\AllowedSharingModes' => $baseDir . '/lib/Sabre/CalDAV/Property/AllowedSharingModes.php',
+ 'Sabre\\CalDAV\\Property\\Invite' => $baseDir . '/lib/Sabre/CalDAV/Property/Invite.php',
+ 'Sabre\\CalDAV\\Property\\ScheduleCalendarTransp' => $baseDir . '/lib/Sabre/CalDAV/Property/ScheduleCalendarTransp.php',
+ 'Sabre\\CalDAV\\Property\\SupportedCalendarComponentSet' => $baseDir . '/lib/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php',
+ 'Sabre\\CalDAV\\Property\\SupportedCalendarData' => $baseDir . '/lib/Sabre/CalDAV/Property/SupportedCalendarData.php',
+ 'Sabre\\CalDAV\\Property\\SupportedCollationSet' => $baseDir . '/lib/Sabre/CalDAV/Property/SupportedCollationSet.php',
+ 'Sabre\\CalDAV\\Schedule\\IMip' => $baseDir . '/lib/Sabre/CalDAV/Schedule/IMip.php',
+ 'Sabre\\CalDAV\\Schedule\\IOutbox' => $baseDir . '/lib/Sabre/CalDAV/Schedule/IOutbox.php',
+ 'Sabre\\CalDAV\\Schedule\\Outbox' => $baseDir . '/lib/Sabre/CalDAV/Schedule/Outbox.php',
+ 'Sabre\\CalDAV\\ShareableCalendar' => $baseDir . '/lib/Sabre/CalDAV/ShareableCalendar.php',
+ 'Sabre\\CalDAV\\SharedCalendar' => $baseDir . '/lib/Sabre/CalDAV/SharedCalendar.php',
+ 'Sabre\\CalDAV\\SharingPlugin' => $baseDir . '/lib/Sabre/CalDAV/SharingPlugin.php',
+ 'Sabre\\CalDAV\\Subscriptions\\ISubscription' => $baseDir . '/lib/Sabre/CalDAV/Subscriptions/ISubscription.php',
+ 'Sabre\\CalDAV\\Subscriptions\\Plugin' => $baseDir . '/lib/Sabre/CalDAV/Subscriptions/Plugin.php',
+ 'Sabre\\CalDAV\\Subscriptions\\Subscription' => $baseDir . '/lib/Sabre/CalDAV/Subscriptions/Subscription.php',
+ 'Sabre\\CalDAV\\UserCalendars' => $baseDir . '/lib/Sabre/CalDAV/UserCalendars.php',
+ 'Sabre\\CardDAV\\AddressBook' => $baseDir . '/lib/Sabre/CardDAV/AddressBook.php',
+ 'Sabre\\CardDAV\\AddressBookQueryParser' => $baseDir . '/lib/Sabre/CardDAV/AddressBookQueryParser.php',
+ 'Sabre\\CardDAV\\AddressBookRoot' => $baseDir . '/lib/Sabre/CardDAV/AddressBookRoot.php',
+ 'Sabre\\CardDAV\\Backend\\AbstractBackend' => $baseDir . '/lib/Sabre/CardDAV/Backend/AbstractBackend.php',
+ 'Sabre\\CardDAV\\Backend\\BackendInterface' => $baseDir . '/lib/Sabre/CardDAV/Backend/BackendInterface.php',
+ 'Sabre\\CardDAV\\Backend\\PDO' => $baseDir . '/lib/Sabre/CardDAV/Backend/PDO.php',
+ 'Sabre\\CardDAV\\Backend\\SyncSupport' => $baseDir . '/lib/Sabre/CardDAV/Backend/SyncSupport.php',
+ 'Sabre\\CardDAV\\Card' => $baseDir . '/lib/Sabre/CardDAV/Card.php',
+ 'Sabre\\CardDAV\\IAddressBook' => $baseDir . '/lib/Sabre/CardDAV/IAddressBook.php',
+ 'Sabre\\CardDAV\\ICard' => $baseDir . '/lib/Sabre/CardDAV/ICard.php',
+ 'Sabre\\CardDAV\\IDirectory' => $baseDir . '/lib/Sabre/CardDAV/IDirectory.php',
+ 'Sabre\\CardDAV\\Plugin' => $baseDir . '/lib/Sabre/CardDAV/Plugin.php',
+ 'Sabre\\CardDAV\\Property\\SupportedAddressData' => $baseDir . '/lib/Sabre/CardDAV/Property/SupportedAddressData.php',
+ 'Sabre\\CardDAV\\UserAddressBooks' => $baseDir . '/lib/Sabre/CardDAV/UserAddressBooks.php',
+ 'Sabre\\CardDAV\\VCFExportPlugin' => $baseDir . '/lib/Sabre/CardDAV/VCFExportPlugin.php',
+ 'Sabre\\DAVACL\\AbstractPrincipalCollection' => $baseDir . '/lib/Sabre/DAVACL/AbstractPrincipalCollection.php',
+ 'Sabre\\DAVACL\\Exception\\AceConflict' => $baseDir . '/lib/Sabre/DAVACL/Exception/AceConflict.php',
+ 'Sabre\\DAVACL\\Exception\\NeedPrivileges' => $baseDir . '/lib/Sabre/DAVACL/Exception/NeedPrivileges.php',
+ 'Sabre\\DAVACL\\Exception\\NoAbstract' => $baseDir . '/lib/Sabre/DAVACL/Exception/NoAbstract.php',
+ 'Sabre\\DAVACL\\Exception\\NotRecognizedPrincipal' => $baseDir . '/lib/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php',
+ 'Sabre\\DAVACL\\Exception\\NotSupportedPrivilege' => $baseDir . '/lib/Sabre/DAVACL/Exception/NotSupportedPrivilege.php',
+ 'Sabre\\DAVACL\\IACL' => $baseDir . '/lib/Sabre/DAVACL/IACL.php',
+ 'Sabre\\DAVACL\\IPrincipal' => $baseDir . '/lib/Sabre/DAVACL/IPrincipal.php',
+ 'Sabre\\DAVACL\\IPrincipalCollection' => $baseDir . '/lib/Sabre/DAVACL/IPrincipalCollection.php',
+ 'Sabre\\DAVACL\\Plugin' => $baseDir . '/lib/Sabre/DAVACL/Plugin.php',
+ 'Sabre\\DAVACL\\Principal' => $baseDir . '/lib/Sabre/DAVACL/Principal.php',
+ 'Sabre\\DAVACL\\PrincipalBackend\\AbstractBackend' => $baseDir . '/lib/Sabre/DAVACL/PrincipalBackend/AbstractBackend.php',
+ 'Sabre\\DAVACL\\PrincipalBackend\\BackendInterface' => $baseDir . '/lib/Sabre/DAVACL/PrincipalBackend/BackendInterface.php',
+ 'Sabre\\DAVACL\\PrincipalBackend\\PDO' => $baseDir . '/lib/Sabre/DAVACL/PrincipalBackend/PDO.php',
+ 'Sabre\\DAVACL\\PrincipalCollection' => $baseDir . '/lib/Sabre/DAVACL/PrincipalCollection.php',
+ 'Sabre\\DAVACL\\Property\\Acl' => $baseDir . '/lib/Sabre/DAVACL/Property/Acl.php',
+ 'Sabre\\DAVACL\\Property\\AclRestrictions' => $baseDir . '/lib/Sabre/DAVACL/Property/AclRestrictions.php',
+ 'Sabre\\DAVACL\\Property\\CurrentUserPrivilegeSet' => $baseDir . '/lib/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php',
+ 'Sabre\\DAVACL\\Property\\Principal' => $baseDir . '/lib/Sabre/DAVACL/Property/Principal.php',
+ 'Sabre\\DAVACL\\Property\\SupportedPrivilegeSet' => $baseDir . '/lib/Sabre/DAVACL/Property/SupportedPrivilegeSet.php',
+ 'Sabre\\DAV\\Auth\\Backend\\AbstractBasic' => $baseDir . '/lib/Sabre/DAV/Auth/Backend/AbstractBasic.php',
+ 'Sabre\\DAV\\Auth\\Backend\\AbstractDigest' => $baseDir . '/lib/Sabre/DAV/Auth/Backend/AbstractDigest.php',
+ 'Sabre\\DAV\\Auth\\Backend\\Apache' => $baseDir . '/lib/Sabre/DAV/Auth/Backend/Apache.php',
+ 'Sabre\\DAV\\Auth\\Backend\\BackendInterface' => $baseDir . '/lib/Sabre/DAV/Auth/Backend/BackendInterface.php',
+ 'Sabre\\DAV\\Auth\\Backend\\BasicCallBack' => $baseDir . '/lib/Sabre/DAV/Auth/Backend/BasicCallBack.php',
+ 'Sabre\\DAV\\Auth\\Backend\\File' => $baseDir . '/lib/Sabre/DAV/Auth/Backend/File.php',
+ 'Sabre\\DAV\\Auth\\Backend\\PDO' => $baseDir . '/lib/Sabre/DAV/Auth/Backend/PDO.php',
+ 'Sabre\\DAV\\Auth\\Plugin' => $baseDir . '/lib/Sabre/DAV/Auth/Plugin.php',
+ 'Sabre\\DAV\\Browser\\GuessContentType' => $baseDir . '/lib/Sabre/DAV/Browser/GuessContentType.php',
+ 'Sabre\\DAV\\Browser\\MapGetToPropFind' => $baseDir . '/lib/Sabre/DAV/Browser/MapGetToPropFind.php',
+ 'Sabre\\DAV\\Browser\\Plugin' => $baseDir . '/lib/Sabre/DAV/Browser/Plugin.php',
+ 'Sabre\\DAV\\Client' => $baseDir . '/lib/Sabre/DAV/Client.php',
+ 'Sabre\\DAV\\Collection' => $baseDir . '/lib/Sabre/DAV/Collection.php',
+ 'Sabre\\DAV\\CorePlugin' => $baseDir . '/lib/Sabre/DAV/CorePlugin.php',
+ 'Sabre\\DAV\\Exception' => $baseDir . '/lib/Sabre/DAV/Exception.php',
+ 'Sabre\\DAV\\Exception\\BadRequest' => $baseDir . '/lib/Sabre/DAV/Exception/BadRequest.php',
+ 'Sabre\\DAV\\Exception\\Conflict' => $baseDir . '/lib/Sabre/DAV/Exception/Conflict.php',
+ 'Sabre\\DAV\\Exception\\ConflictingLock' => $baseDir . '/lib/Sabre/DAV/Exception/ConflictingLock.php',
+ 'Sabre\\DAV\\Exception\\FileNotFound' => $baseDir . '/lib/Sabre/DAV/Exception/FileNotFound.php',
+ 'Sabre\\DAV\\Exception\\Forbidden' => $baseDir . '/lib/Sabre/DAV/Exception/Forbidden.php',
+ 'Sabre\\DAV\\Exception\\InsufficientStorage' => $baseDir . '/lib/Sabre/DAV/Exception/InsufficientStorage.php',
+ 'Sabre\\DAV\\Exception\\InvalidResourceType' => $baseDir . '/lib/Sabre/DAV/Exception/InvalidResourceType.php',
+ 'Sabre\\DAV\\Exception\\InvalidSyncToken' => $baseDir . '/lib/Sabre/DAV/Exception/InvalidSyncToken.php',
+ 'Sabre\\DAV\\Exception\\LockTokenMatchesRequestUri' => $baseDir . '/lib/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php',
+ 'Sabre\\DAV\\Exception\\Locked' => $baseDir . '/lib/Sabre/DAV/Exception/Locked.php',
+ 'Sabre\\DAV\\Exception\\MethodNotAllowed' => $baseDir . '/lib/Sabre/DAV/Exception/MethodNotAllowed.php',
+ 'Sabre\\DAV\\Exception\\NotAuthenticated' => $baseDir . '/lib/Sabre/DAV/Exception/NotAuthenticated.php',
+ 'Sabre\\DAV\\Exception\\NotFound' => $baseDir . '/lib/Sabre/DAV/Exception/NotFound.php',
+ 'Sabre\\DAV\\Exception\\NotImplemented' => $baseDir . '/lib/Sabre/DAV/Exception/NotImplemented.php',
+ 'Sabre\\DAV\\Exception\\PaymentRequired' => $baseDir . '/lib/Sabre/DAV/Exception/PaymentRequired.php',
+ 'Sabre\\DAV\\Exception\\PreconditionFailed' => $baseDir . '/lib/Sabre/DAV/Exception/PreconditionFailed.php',
+ 'Sabre\\DAV\\Exception\\ReportNotSupported' => $baseDir . '/lib/Sabre/DAV/Exception/ReportNotSupported.php',
+ 'Sabre\\DAV\\Exception\\RequestedRangeNotSatisfiable' => $baseDir . '/lib/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php',
+ 'Sabre\\DAV\\Exception\\ServiceUnavailable' => $baseDir . '/lib/Sabre/DAV/Exception/ServiceUnavailable.php',
+ 'Sabre\\DAV\\Exception\\TooMuchMatches' => $baseDir . '/lib/Sabre/DAV/Exception/TooMuchMatches.php',
+ 'Sabre\\DAV\\Exception\\UnsupportedMediaType' => $baseDir . '/lib/Sabre/DAV/Exception/UnsupportedMediaType.php',
+ 'Sabre\\DAV\\FSExt\\Directory' => $baseDir . '/lib/Sabre/DAV/FSExt/Directory.php',
+ 'Sabre\\DAV\\FSExt\\File' => $baseDir . '/lib/Sabre/DAV/FSExt/File.php',
+ 'Sabre\\DAV\\FSExt\\Node' => $baseDir . '/lib/Sabre/DAV/FSExt/Node.php',
+ 'Sabre\\DAV\\FS\\Directory' => $baseDir . '/lib/Sabre/DAV/FS/Directory.php',
+ 'Sabre\\DAV\\FS\\File' => $baseDir . '/lib/Sabre/DAV/FS/File.php',
+ 'Sabre\\DAV\\FS\\Node' => $baseDir . '/lib/Sabre/DAV/FS/Node.php',
+ 'Sabre\\DAV\\File' => $baseDir . '/lib/Sabre/DAV/File.php',
+ 'Sabre\\DAV\\ICollection' => $baseDir . '/lib/Sabre/DAV/ICollection.php',
+ 'Sabre\\DAV\\IExtendedCollection' => $baseDir . '/lib/Sabre/DAV/IExtendedCollection.php',
+ 'Sabre\\DAV\\IFile' => $baseDir . '/lib/Sabre/DAV/IFile.php',
+ 'Sabre\\DAV\\IMultiGet' => $baseDir . '/lib/Sabre/DAV/IMultiGet.php',
+ 'Sabre\\DAV\\INode' => $baseDir . '/lib/Sabre/DAV/INode.php',
+ 'Sabre\\DAV\\IProperties' => $baseDir . '/lib/Sabre/DAV/IProperties.php',
+ 'Sabre\\DAV\\IQuota' => $baseDir . '/lib/Sabre/DAV/IQuota.php',
+ 'Sabre\\DAV\\Locks\\Backend\\AbstractBackend' => $baseDir . '/lib/Sabre/DAV/Locks/Backend/AbstractBackend.php',
+ 'Sabre\\DAV\\Locks\\Backend\\BackendInterface' => $baseDir . '/lib/Sabre/DAV/Locks/Backend/BackendInterface.php',
+ 'Sabre\\DAV\\Locks\\Backend\\FS' => $baseDir . '/lib/Sabre/DAV/Locks/Backend/FS.php',
+ 'Sabre\\DAV\\Locks\\Backend\\File' => $baseDir . '/lib/Sabre/DAV/Locks/Backend/File.php',
+ 'Sabre\\DAV\\Locks\\Backend\\PDO' => $baseDir . '/lib/Sabre/DAV/Locks/Backend/PDO.php',
+ 'Sabre\\DAV\\Locks\\LockInfo' => $baseDir . '/lib/Sabre/DAV/Locks/LockInfo.php',
+ 'Sabre\\DAV\\Locks\\Plugin' => $baseDir . '/lib/Sabre/DAV/Locks/Plugin.php',
+ 'Sabre\\DAV\\Mount\\Plugin' => $baseDir . '/lib/Sabre/DAV/Mount/Plugin.php',
+ 'Sabre\\DAV\\Node' => $baseDir . '/lib/Sabre/DAV/Node.php',
+ 'Sabre\\DAV\\ObjectTree' => $baseDir . '/lib/Sabre/DAV/ObjectTree.php',
+ 'Sabre\\DAV\\PartialUpdate\\IFile' => $baseDir . '/lib/Sabre/DAV/PartialUpdate/IFile.php',
+ 'Sabre\\DAV\\PartialUpdate\\Plugin' => $baseDir . '/lib/Sabre/DAV/PartialUpdate/Plugin.php',
+ 'Sabre\\DAV\\Property' => $baseDir . '/lib/Sabre/DAV/Property.php',
+ 'Sabre\\DAV\\PropertyInterface' => $baseDir . '/lib/Sabre/DAV/PropertyInterface.php',
+ 'Sabre\\DAV\\Property\\GetLastModified' => $baseDir . '/lib/Sabre/DAV/Property/GetLastModified.php',
+ 'Sabre\\DAV\\Property\\Href' => $baseDir . '/lib/Sabre/DAV/Property/Href.php',
+ 'Sabre\\DAV\\Property\\HrefList' => $baseDir . '/lib/Sabre/DAV/Property/HrefList.php',
+ 'Sabre\\DAV\\Property\\IHref' => $baseDir . '/lib/Sabre/DAV/Property/IHref.php',
+ 'Sabre\\DAV\\Property\\LockDiscovery' => $baseDir . '/lib/Sabre/DAV/Property/LockDiscovery.php',
+ 'Sabre\\DAV\\Property\\ResourceType' => $baseDir . '/lib/Sabre/DAV/Property/ResourceType.php',
+ 'Sabre\\DAV\\Property\\Response' => $baseDir . '/lib/Sabre/DAV/Property/Response.php',
+ 'Sabre\\DAV\\Property\\ResponseList' => $baseDir . '/lib/Sabre/DAV/Property/ResponseList.php',
+ 'Sabre\\DAV\\Property\\SupportedLock' => $baseDir . '/lib/Sabre/DAV/Property/SupportedLock.php',
+ 'Sabre\\DAV\\Property\\SupportedReportSet' => $baseDir . '/lib/Sabre/DAV/Property/SupportedReportSet.php',
+ 'Sabre\\DAV\\Server' => $baseDir . '/lib/Sabre/DAV/Server.php',
+ 'Sabre\\DAV\\ServerPlugin' => $baseDir . '/lib/Sabre/DAV/ServerPlugin.php',
+ 'Sabre\\DAV\\SimpleCollection' => $baseDir . '/lib/Sabre/DAV/SimpleCollection.php',
+ 'Sabre\\DAV\\SimpleFile' => $baseDir . '/lib/Sabre/DAV/SimpleFile.php',
+ 'Sabre\\DAV\\StringUtil' => $baseDir . '/lib/Sabre/DAV/StringUtil.php',
+ 'Sabre\\DAV\\Sync\\ISyncCollection' => $baseDir . '/lib/Sabre/DAV/Sync/ISyncCollection.php',
+ 'Sabre\\DAV\\Sync\\Plugin' => $baseDir . '/lib/Sabre/DAV/Sync/Plugin.php',
+ 'Sabre\\DAV\\TemporaryFileFilterPlugin' => $baseDir . '/lib/Sabre/DAV/TemporaryFileFilterPlugin.php',
+ 'Sabre\\DAV\\Tree' => $baseDir . '/lib/Sabre/DAV/Tree.php',
+ 'Sabre\\DAV\\Tree\\Filesystem' => $baseDir . '/lib/Sabre/DAV/Tree/Filesystem.php',
+ 'Sabre\\DAV\\URLUtil' => $baseDir . '/lib/Sabre/DAV/URLUtil.php',
+ 'Sabre\\DAV\\UUIDUtil' => $baseDir . '/lib/Sabre/DAV/UUIDUtil.php',
+ 'Sabre\\DAV\\Version' => $baseDir . '/lib/Sabre/DAV/Version.php',
+ 'Sabre\\DAV\\XMLUtil' => $baseDir . '/lib/Sabre/DAV/XMLUtil.php',
+ 'Sabre\\Event\\EventEmitter' => $vendorDir . '/sabre/event/lib/Sabre/Event/EventEmitter.php',
+ 'Sabre\\Event\\EventEmitterInterface' => $vendorDir . '/sabre/event/lib/Sabre/Event/EventEmitterInterface.php',
+ 'Sabre\\Event\\EventEmitterTrait' => $vendorDir . '/sabre/event/lib/Sabre/Event/EventEmitterTrait.php',
+ 'Sabre\\Event\\Version' => $vendorDir . '/sabre/event/lib/Sabre/Event/Version.php',
+ 'Sabre\\HTTP\\Auth\\AWS' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/Auth/AWS.php',
+ 'Sabre\\HTTP\\Auth\\AbstractAuth' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/Auth/AbstractAuth.php',
+ 'Sabre\\HTTP\\Auth\\Basic' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/Auth/Basic.php',
+ 'Sabre\\HTTP\\Auth\\Digest' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/Auth/Digest.php',
+ 'Sabre\\HTTP\\Client' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/Client.php',
+ 'Sabre\\HTTP\\ClientException' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/ClientException.php',
+ 'Sabre\\HTTP\\ClientHttpException' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/ClientHttpException.php',
+ 'Sabre\\HTTP\\HttpException' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/HttpException.php',
+ 'Sabre\\HTTP\\Message' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/Message.php',
+ 'Sabre\\HTTP\\MessageDecoratorTrait' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/MessageDecoratorTrait.php',
+ 'Sabre\\HTTP\\MessageInterface' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/MessageInterface.php',
+ 'Sabre\\HTTP\\Request' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/Request.php',
+ 'Sabre\\HTTP\\RequestDecorator' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/RequestDecorator.php',
+ 'Sabre\\HTTP\\RequestInterface' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/RequestInterface.php',
+ 'Sabre\\HTTP\\Response' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/Response.php',
+ 'Sabre\\HTTP\\ResponseDecorator' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/ResponseDecorator.php',
+ 'Sabre\\HTTP\\ResponseInterface' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/ResponseInterface.php',
++ 'Sabre\\HTTP\\Sapi' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/Sapi.php',
+ 'Sabre\\HTTP\\URLUtil' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/URLUtil.php',
+ 'Sabre\\HTTP\\Util' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/Util.php',
+ 'Sabre\\HTTP\\Version' => $vendorDir . '/sabre/http/lib/Sabre/HTTP/Version.php',
+ 'Sabre\\VObject\\Cli' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Cli.php',
+ 'Sabre\\VObject\\Component' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Component.php',
+ 'Sabre\\VObject\\Component\\VAlarm' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php',
+ 'Sabre\\VObject\\Component\\VCalendar' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php',
+ 'Sabre\\VObject\\Component\\VCard' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Component/VCard.php',
+ 'Sabre\\VObject\\Component\\VEvent' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php',
+ 'Sabre\\VObject\\Component\\VFreeBusy' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php',
+ 'Sabre\\VObject\\Component\\VJournal' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php',
+ 'Sabre\\VObject\\Component\\VTodo' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php',
+ 'Sabre\\VObject\\DateTimeParser' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php',
+ 'Sabre\\VObject\\Document' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Document.php',
+ 'Sabre\\VObject\\ElementList' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/ElementList.php',
+ 'Sabre\\VObject\\EofException' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/EofException.php',
+ 'Sabre\\VObject\\FreeBusyGenerator' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/FreeBusyGenerator.php',
+ 'Sabre\\VObject\\Node' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Node.php',
+ 'Sabre\\VObject\\Parameter' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Parameter.php',
+ 'Sabre\\VObject\\ParseException' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/ParseException.php',
+ 'Sabre\\VObject\\Parser\\Json' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Parser/Json.php',
+ 'Sabre\\VObject\\Parser\\MimeDir' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Parser/MimeDir.php',
+ 'Sabre\\VObject\\Parser\\Parser' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Parser/Parser.php',
+ 'Sabre\\VObject\\Property' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property.php',
+ 'Sabre\\VObject\\Property\\Binary' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/Binary.php',
+ 'Sabre\\VObject\\Property\\Boolean' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/Boolean.php',
+ 'Sabre\\VObject\\Property\\FlatText' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/FlatText.php',
+ 'Sabre\\VObject\\Property\\Float' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/Float.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\CalAddress' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/CalAddress.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Date' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Date.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\DateTime' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/DateTime.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Duration' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Duration.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Period' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Period.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Recur' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Recur.php',
+ 'Sabre\\VObject\\Property\\Integer' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/Integer.php',
+ 'Sabre\\VObject\\Property\\Text' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/Text.php',
+ 'Sabre\\VObject\\Property\\Time' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/Time.php',
+ 'Sabre\\VObject\\Property\\Unknown' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/Unknown.php',
+ 'Sabre\\VObject\\Property\\Uri' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/Uri.php',
+ 'Sabre\\VObject\\Property\\UtcOffset' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/UtcOffset.php',
+ 'Sabre\\VObject\\Property\\VCard\\Date' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/VCard/Date.php',
+ 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/VCard/DateAndOrTime.php',
+ 'Sabre\\VObject\\Property\\VCard\\DateTime' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/VCard/DateTime.php',
+ 'Sabre\\VObject\\Property\\VCard\\LanguageTag' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/VCard/LanguageTag.php',
+ 'Sabre\\VObject\\Property\\VCard\\TimeStamp' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Property/VCard/TimeStamp.php',
+ 'Sabre\\VObject\\Reader' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Reader.php',
+ 'Sabre\\VObject\\RecurrenceIterator' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php',
+ 'Sabre\\VObject\\Splitter\\ICalendar' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php',
+ 'Sabre\\VObject\\Splitter\\SplitterInterface' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php',
+ 'Sabre\\VObject\\Splitter\\VCard' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Splitter/VCard.php',
+ 'Sabre\\VObject\\StringUtil' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/StringUtil.php',
+ 'Sabre\\VObject\\TimeZoneUtil' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/TimeZoneUtil.php',
+ 'Sabre\\VObject\\VCardConverter' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/VCardConverter.php',
+ 'Sabre\\VObject\\Version' => $vendorDir . '/sabre/vobject/lib/Sabre/VObject/Version.php',
+);
diff --cc vendor/composer/autoload_psr4.php
index 0000000,0000000..b265c64
new file mode 100644
--- /dev/null
+++ b/vendor/composer/autoload_psr4.php
@@@ -1,0 -1,0 +1,9 @@@
++<?php
++
++// autoload_psr4.php @generated by Composer
++
++$vendorDir = dirname(dirname(__FILE__));
++$baseDir = dirname($vendorDir);
++
++return array(
++);
diff --cc vendor/composer/autoload_real.php
index 061ea6c,0000000..1e1b15e
mode 100644,000000..100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@@ -1,43 -1,0 +1,48 @@@
+<?php
+
+// autoload_real.php @generated by Composer
+
- class ComposerAutoloaderInit738aa2bfeb21a12ce36e0db127c66153
++class ComposerAutoloaderInitbdf76857b59f336300e91289e744ba46
+{
+ private static $loader;
+
+ public static function loadClassLoader($class)
+ {
+ if ('Composer\Autoload\ClassLoader' === $class) {
+ require __DIR__ . '/ClassLoader.php';
+ }
+ }
+
+ public static function getLoader()
+ {
+ if (null !== self::$loader) {
+ return self::$loader;
+ }
+
- spl_autoload_register(array('ComposerAutoloaderInit738aa2bfeb21a12ce36e0db127c66153', 'loadClassLoader'), true, true);
++ spl_autoload_register(array('ComposerAutoloaderInitbdf76857b59f336300e91289e744ba46', 'loadClassLoader'), true, true);
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader();
- spl_autoload_unregister(array('ComposerAutoloaderInit738aa2bfeb21a12ce36e0db127c66153', 'loadClassLoader'));
++ spl_autoload_unregister(array('ComposerAutoloaderInitbdf76857b59f336300e91289e744ba46', 'loadClassLoader'));
+
+ $vendorDir = dirname(__DIR__);
+ $baseDir = dirname($vendorDir);
+
+ $map = require __DIR__ . '/autoload_namespaces.php';
+ foreach ($map as $namespace => $path) {
+ $loader->set($namespace, $path);
+ }
+
++ $map = require __DIR__ . '/autoload_psr4.php';
++ foreach ($map as $namespace => $path) {
++ $loader->setPsr4($namespace, $path);
++ }
++
+ $classMap = require __DIR__ . '/autoload_classmap.php';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+
+ $loader->register(true);
+
+ return $loader;
+ }
+}
diff --cc vendor/composer/installed.json
index c3ba06f,0000000..b4f16d1
mode 100644,000000..100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@@ -1,150 -1,0 +1,153 @@@
+[
+ {
- "name": "sabre/event",
- "version": "1.0.0",
- "version_normalized": "1.0.0.0",
++ "name": "sabre/vobject",
++ "version": "3.1.3",
++ "version_normalized": "3.1.3.0",
+ "source": {
+ "type": "git",
- "url": "https://github.com/fruux/sabre-event.git",
- "reference": "14f284eede050859e72ac41064df0eac25327190"
++ "url": "https://github.com/fruux/sabre-vobject.git",
++ "reference": "961546d71c332ab34ad1c5bba7f372c08b388dcf"
+ },
+ "dist": {
+ "type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-event/zipball/14f284eede050859e72ac41064df0eac25327190",
- "reference": "14f284eede050859e72ac41064df0eac25327190",
++ "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/961546d71c332ab34ad1c5bba7f372c08b388dcf",
++ "reference": "961546d71c332ab34ad1c5bba7f372c08b388dcf",
+ "shasum": ""
+ },
+ "require": {
- "php": ">=5.4.1"
++ "ext-mbstring": "*",
++ "php": ">=5.3.1"
+ },
- "time": "2013-07-19 12:46:56",
++ "time": "2013-10-02 15:59:03",
++ "bin": [
++ "bin/vobject"
++ ],
+ "type": "library",
++ "extra": {
++ "branch-alias": {
++ "dev-master": "3.1.x-dev"
++ }
++ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
- "Sabre\\Event": "lib/"
++ "Sabre\\VObject": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "evert at rooftopsolutions.nl",
- "homepage": "http://evertpot.com/",
++ "homepage": "http://www.rooftopsolutions.nl/",
+ "role": "Developer"
+ }
+ ],
- "description": "The sabre/event library provides utilities for lightweight event-based programming",
- "homepage": "https://github.com/fruux/sabre-event",
++ "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
++ "homepage": "https://github.com/fruux/sabre-vobject",
+ "keywords": [
- "events"
++ "VObject",
++ "iCalendar",
++ "vCard"
+ ]
+ },
+ {
- "name": "sabre/http",
- "version": "2.0.0alpha5",
- "version_normalized": "2.0.0.0-alpha5",
++ "name": "sabre/event",
++ "version": "1.0.0",
++ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
- "url": "https://github.com/fruux/sabre-http.git",
- "reference": "a9765fd1147f80433bd0958a036c9c446e15b6e6"
++ "url": "https://github.com/fruux/sabre-event.git",
++ "reference": "14f284eede050859e72ac41064df0eac25327190"
+ },
+ "dist": {
+ "type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-http/zipball/a9765fd1147f80433bd0958a036c9c446e15b6e6",
- "reference": "a9765fd1147f80433bd0958a036c9c446e15b6e6",
++ "url": "https://api.github.com/repos/fruux/sabre-event/zipball/14f284eede050859e72ac41064df0eac25327190",
++ "reference": "14f284eede050859e72ac41064df0eac25327190",
+ "shasum": ""
+ },
+ "require": {
- "ext-mbstring": "*",
- "php": ">=5.4",
- "sabre/event": "~1.0.0"
- },
- "suggest": {
- "ext-curl": " to make http requests with the Client class"
++ "php": ">=5.4.1"
+ },
- "time": "2013-11-07 21:20:41",
++ "time": "2013-07-19 12:46:56",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
- "Sabre\\HTTP": "lib/"
++ "Sabre\\Event": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "evert at rooftopsolutions.nl",
- "homepage": "http://www.rooftopsolutions.nl/",
++ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
- "description": "The sabre/http library provides utilities for dealing with http requests and responses. ",
- "homepage": "https://github.com/fruux/sabre-http",
++ "description": "The sabre/event library provides utilities for lightweight event-based programming",
++ "homepage": "https://github.com/fruux/sabre-event",
+ "keywords": [
- "http"
++ "events"
+ ]
+ },
+ {
- "name": "sabre/vobject",
- "version": "3.1.3",
- "version_normalized": "3.1.3.0",
++ "name": "sabre/http",
++ "version": "2.0.1",
++ "version_normalized": "2.0.1.0",
+ "source": {
+ "type": "git",
- "url": "https://github.com/fruux/sabre-vobject.git",
- "reference": "961546d71c332ab34ad1c5bba7f372c08b388dcf"
++ "url": "https://github.com/fruux/sabre-http.git",
++ "reference": "36930a4c035ce1751834adc7f300dca620d27775"
+ },
+ "dist": {
+ "type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/961546d71c332ab34ad1c5bba7f372c08b388dcf",
- "reference": "961546d71c332ab34ad1c5bba7f372c08b388dcf",
++ "url": "https://api.github.com/repos/fruux/sabre-http/zipball/36930a4c035ce1751834adc7f300dca620d27775",
++ "reference": "36930a4c035ce1751834adc7f300dca620d27775",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
- "php": ">=5.3.1"
++ "php": ">=5.4",
++ "sabre/event": "~1.0.0"
+ },
- "time": "2013-10-02 15:59:03",
- "bin": [
- "bin/vobject"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.1.x-dev"
- }
++ "require-dev": {
++ "phpunit/phpunit": "*"
+ },
++ "suggest": {
++ "ext-curl": " to make http requests with the Client class"
++ },
++ "time": "2014-01-09 23:23:46",
++ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
- "Sabre\\VObject": "lib/"
++ "Sabre\\HTTP": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "evert at rooftopsolutions.nl",
+ "homepage": "http://www.rooftopsolutions.nl/",
+ "role": "Developer"
+ }
+ ],
- "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
- "homepage": "https://github.com/fruux/sabre-vobject",
++ "description": "The sabre/http library provides utilities for dealing with http requests and responses. ",
++ "homepage": "https://github.com/fruux/sabre-http",
+ "keywords": [
- "VObject",
- "iCalendar",
- "vCard"
++ "http"
+ ]
+ }
+]
diff --cc vendor/sabre/http/.travis.yml
index 46ed45d,0000000..e6cf116
mode 100644,000000..100644
--- a/vendor/sabre/http/.travis.yml
+++ b/vendor/sabre/http/.travis.yml
@@@ -1,8 -1,0 +1,13 @@@
+language: php
+php:
+ - 5.4
+ - 5.5
++ - hhvm
+
- script: phpunit --configuration tests/phpunit.xml
++matrix:
++ allow_failures:
++ - php: hhvm
+
- before_script: composer install
++script: ./bin/phpunit --configuration tests/phpunit.xml
++
++before_script: composer install --dev
diff --cc vendor/sabre/http/ChangeLog
index dadc880,0000000..df1c2a0
mode 100644,000000..100644
--- a/vendor/sabre/http/ChangeLog
+++ b/vendor/sabre/http/ChangeLog
@@@ -1,49 -1,0 +1,76 @@@
++2.0.1-stable (2014-01-09)
++ * Fixed: getBodyAsString on an empty body now works.
++ * Fixed: Version string
++
++2.0.0-stable (2014-01-08)
++ * Removed: Request::createFromPHPRequest. This is now handled by
++ Sapi::getRequest.
++
++2.0.0alpha6 (2014-01-03)
++ * Added: Asynchronous HTTP client. See examples/asyncclient.php.
++ * Fixed: Issue #4: Don't escape colon (:) when it's not needed.
++ * Fixed: Fixed a bug in the content negotation script.
++ * Fixed: Fallback for when CURLOPT_POSTREDIR is not defined (mainly for
++ hhvm).
++ * Added: The Request and Response object now have a __toString() method
++ that serializes the objects into a standard HTTP message. This is mainly
++ for debugging purposes.
++ * Changed: Added Response::getStatusText(). This method returns the
++ human-readable HTTP status message. This part has been removed from
++ Response::getStatus(), which now always returns just the status code as
++ an int.
++ * Changed: Response::send() is now Sapi::sendResponse($response).
++ * Changed: Request::createFromPHPRequest is now Sapi::getRequest().
++ * Changed: Message::getBodyAsStream and Message::getBodyAsString were
++ added. The existing Message::getBody changed it's behavior, so be
++ careful.
++
+2.0.0alpha5 (2013-11-07)
+ * Added: HTTP Status 451 Unavailable For Legal Reasons. Fight government
+ censorship!
+ * Added: Ability to catch and retry http requests in the client when a
+ curl error occurs.
+ * Changed: Request::getPath does not return the query part of the url, so
+ everything after the ? is stripped.
+ * Added: a reverse proxy example.
+
+2.0.0alpha4 (2013-08-07)
+ * Fixed: Doing a GET request with the client uses the last used HTTP
+ method instead.
+ * Added: HttpException
+ * Added: The Client class can now automatically emit exceptions when HTTP
+ errors occurred.
+
+2.0.0alpha3 (2013-07-24)
+ * Changed: Now depends on sabre/event package.
+ * Changed: setHeaders() now overwrites any existing http headers.
+ * Added: getQueryParameters to RequestInterface.
+ * Added: Util::negotiate.
+ * Added: RequestDecorator, ResponseDecorator.
+ * Added: A very simple HTTP client.
+ * Added: addHeaders() to append a list of new headers.
+ * Fixed: Not erroring on unknown HTTP status codes.
+ * Fixed: Throwing exceptions on invalid HTTP status codes (not 3 digits).
+ * Fixed: Much better README.md
+ * Changed: getBody() now uses a bitfield to specify what type to return.
+
+2.0.0alpha2 (2013-07-02)
+ * Added: Digest & AWS Authentication.
+ * Added: Message::getHttpVersion and Message::setHttpVersion.
+ * Added: Request::setRawServerArray, getRawServerValue.
+ * Added: Request::createFromPHPRequest
+ * Added: Response::send
+ * Added: Request::getQueryParameters
+ * Added: Utility for dealing with HTTP dates.
+ * Added: Request::setPostData and Request::getPostData.
+ * Added: Request::setAbsoluteUrl and Request::getAbsoluteUrl.
+ * Added: URLUtil, methods for calculation relative and base urls.
+ * Removed: Response::sendBody
+
+2.0.0alpha1 (2012-10-07)
+ * Fixed: Lots of small naming improvements
+ * Added: Introduction of Message, MessageInterface, Response,
+ ResponseInterface.
+
+Before 2.0.0, this package was built-into SabreDAV, where it first appeared in
+January 2009.
diff --cc vendor/sabre/http/LICENSE
index 5d03b7a,0000000..ea6f05f
mode 100644,000000..100644
--- a/vendor/sabre/http/LICENSE
+++ b/vendor/sabre/http/LICENSE
@@@ -1,27 -1,0 +1,27 @@@
- Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/)
++Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/)
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name Sabre nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
diff --cc vendor/sabre/http/README.md
index ab628c9,0000000..725e770
mode 100644,000000..100644
--- a/vendor/sabre/http/README.md
+++ b/vendor/sabre/http/README.md
@@@ -1,660 -1,0 +1,743 @@@
+sabre/http
+==========
+
+This library provides a toolkit to make working with the HTTP protocol easier.
+
+Most PHP scripts run within a HTTP request but accessing information about the
+HTTP request is cumbersome at least, mainly do to superglobals and the CGI
+standard.
+
+There's bad practices, inconsistencies and confusion. This library is
+effectively a wrapper around the following PHP constructs:
+
+For Input:
+
+* `$_GET`
+* `$_POST`
+* `$_SERVER`
+* `php://input` or `$HTTP_RAW_POST_DATA`.
+
+For output:
+
+* `php://output` or `echo`.
+* `header()`
+
+What this library provides, is a `Request` object, and a `Response` object.
+
+The objects are extendable and easily mockable.
+
+Installation
+------------
+
+Make sure you have [composer][1] installed. In your project directory, create,
+or edit a `composer.json` file, and make sure it contains something like this:
+
+
+```json
+{
+ "require" : {
- "sabre/http" : "2.0 at alpha"
++ "sabre/http" : "~2.0.0"
+ }
+}
+```
+
+After that, just hit `composer install` and you should be rolling.
+
+Quick history
+-------------
+
+This library came to existence in 2009, as a part of the [SabreDAV][2]
+project, which uses it heavily.
+
+It got split off into a separate library to make it easier to manage
+releases and hopefully giving it use outside of the scope of just SabreDAV.
+
+Although completely independently developed, this library has a LOT of
+overlap with [symfony's HttpFoundation][3].
+
+Said library does a lot more stuff and is significantly more popular,
+so if you are looking for something to fulfill this particular requirement,
+I'd recommend also considering [HttpFoundation][3].
+
+
+Getting started
+---------------
+
+First and foremost, this library wraps the superglobals. The easiest way to
+instantiate a request object is as follows:
+
+```php
+use Sabre\HTTP;
+
+include 'vendor/autoload.php';
+
- $request = HTTP\Request::createFromPHPRequest();
++$request = HTTP\Sapi::getRequest();
+```
+
+This line should only happen once in your entire application. Everywhere else
+you should pass this request object around using dependency injection.
+
+You should always typehint on it's interface:
+
+```php
+function handleRequest(HTTP\RequestInterface $request) {
+
+ // Do something with this request :)
+
+}
+```
+
+A response object you can just create as such:
+
+
+```php
+use Sabre\HTTP;
+
+include 'vendor/autoload.php';
+
+$response = new HTTP\Response();
+$response->setStatus(201); // created !
+$response->setHeader('X-Foo', 'bar');
+$response->setBody(
+ 'success!'
+);
+
+```
+
+After you fully constructed your response, you must call:
+
+```php
- $response->send();
++HTTP\Sapi::sendResponse($response);
+```
+
+This line should generally also appear once in your application (at the very
+end).
+
+
+Decorators
+----------
+
+It may be useful to extend the Request and Response objects in your
+application, if you for example would like them to carry a bit more
+information about the current request.
+
+For instance, you may want to add an `isLoggedIn()` method to the Request
+object.
+
+Simply extending Request and Response may pose some problems:
+
+1. You may want to extend the objects with new behavior differently, in
+ different subsystems of your application.
- 2. The `Request::createFromPHPRequest` factory always returns a instance of
++2. The `Sapi::getRequest` factory always returns a instance of
+ `Request` so you would have to override the factory method as well.
+3. By controlling the instantation and depend on specific `Request` and
+ `Response` instances in your library or application, you make it harder to
+ work with other applications which also use `sabre/http`.
+
+In short: it would be bad design. Instead, it's recommended to use the
+[decorator pattern][6] to add new behavior where you need it. sabre/http
+provides helper classes to quickly do this.
+
+Example:
+
+```php
+use Sabre\HTTP;
+
+class MyRequest extends HTTP\RequestDecorator {
+
+ function isLoggedIn() {
+
+ return true;
+
+ }
+
+}
+```
+
+Our application assumes that the true `Request` object was instantiated
+somewhere else, by some other subsystem. This could simply be a call like
- `$request = Request::createFromPHPRequest()` at the top of your application,
++`$request = Sapi::getRequest()` at the top of your application,
+but could also be somewhere in a unittest.
+
+All we know in the current subsystem, is that we received a `$request` and
+that it implements `Sabre\HTTP\RequestInterface`. To decorate this object,
+all we need to do is:
+
+```php
+$request = new MyRequest($request);
+```
+
+And that's it, we now have an `isLoggedIn` method, without having to mess
+with the core instances.
+
+
+Client
+------
+
+This package also contains a simple wrapper around [cURL][4], which will allow
+you to write simple clients, using the `Request` and `Response` objects you're
+already familiar with.
+
+It's by no means a replacement for something like [guzzle][7], but it provides
+a simple and lightweight api for making the occasional API call.
+
+### Usage
+
+```php
+use Sabre\HTTP;
+
+$request = new HTTP\Request('GET', 'http://example.org/');
+$request->setHeader('X-Foo', 'Bar');
+
+$client = new HTTP\Client();
+$response = $client->send($request);
+
- echo $response->getBody();
++echo $response->getBodyAsString();
+```
+
+The client emits 3 event using [sabre/event][5]. `beforeRequest`,
+`afterRequest` and `error`.
+
+```php
+$client = new HTTP\Client();
+$client->on('beforeRequest', function($request) {
+
+ // You could use beforeRequest to for example inject a few extra headers.
+ // into the Request object.
+
+});
+
+$client->on('afterRequest', function($request, $response) {
+
+ // The afterRequest event could be a good time to do some logging, or
+ // do some rewriting in the response.
+
+});
+
+$client->on('error', function($request, $response, &$retry, $retryCount) {
+
+ // The error event is triggered for every response with a HTTP code higher
+ // than 399.
+
+});
+
+$client->on('error:401', function($request, $response, &$retry, $retryCount) {
+
+ // You can also listen for specific error codes. This example shows how
+ // to inject HTTP authentication headers if a 401 was returned.
+
+ if ($retryCount > 1) {
+ // We're only going to retry exactly once.
+ }
+
+ $request->setHeader('Authorization', 'Basic xxxxxxxxxx');
+ $retry = true;
+
+});
+```
+
++### Asynchronous requests
++
++The Client also supports doing asynchronous requests. This is especially handy
++if you need to perform a number of requests, that are allowed to be executed
++in parallel.
++
++The underlying system for this is simply [curl's multi request handler][8],
++but this provides a much nicer API to handle this.
++
++Sample usage:
++
++```php
++
++use Sabre\HTTP;
++
++$request = new Request('GET', 'http://localhost/');
++$client = new Client();
++
++// Executing 1000 requests
++for ($i = 0; $i < 1000; $i++) {
++ $client->sendAsync(
++ $request,
++ function(ResponseInterface $response) {
++ // Success handler
++ },
++ function($error) {
++ // Error handler
++ }
++ );
++}
++
++// Wait for all requests to get a result.
++$client->wait();
++
++```
++
++Check out examples/asyncclient.php for more information.
++
++Writing a reverse proxy
++-----------------------
++
++With all these tools combined, it becomes very easy to write a simple reverse
++http proxy.
++
++```php
++use
++ Sabre\HTTP\Sapi,
++ Sabre\HTTP\Client;
++
++// The url we're proxying to.
++$remoteUrl = 'http://example.org/';
++
++// The url we're proxying from. Please note that this must be a relative url,
++// and basically acts as the base url.
++//
++// If youre $remoteUrl doesn't end with a slash, this one probably shouldn't
++// either.
++$myBaseUrl = '/reverseproxy.php';
++// $myBaseUrl = '/~evert/sabre/http/examples/reverseproxy.php/';
++
++$request = Sapi::getRequest();
++$request->setBaseUrl($myBaseUrl);
++
++$subRequest = clone $request;
++
++// Removing the Host header.
++$subRequest->removeHeader('Host');
++
++// Rewriting the url.
++$subRequest->setUrl($remoteUrl . $request->getPath());
++
++$client = new Client();
++
++// Sends the HTTP request to the server
++$response = $client->send($subRequest);
++
++// Sends the response back to the client that connected to the proxy.
++Sapi::sendResponse($response);
++```
++
++
+The Request and Response API's
+------------------------------
+
+### Request
+
+```php
+
+/**
+ * Creates the request object
+ *
+ * @param string $method
+ * @param string $url
+ * @param array $headers
+ * @param resource $body
+ */
+public function __construct($method = null, $url = null, array $headers = null, $body = null);
+
+/**
+ * Returns the current HTTP method
+ *
+ * @return string
+ */
+function getMethod();
+
+/**
+ * Sets the HTTP method
+ *
+ * @param string $method
+ * @return void
+ */
+function setMethod($method);
+
+/**
+ * Returns the request url.
+ *
+ * @return string
+ */
+function getUrl();
+
+/**
+ * Sets the request url.
+ *
+ * @param string $url
+ * @return void
+ */
+function setUrl($url);
+
+/**
+ * Returns the absolute url.
+ *
+ * @return string
+ */
+function getAbsoluteUrl();
+
+/**
+ * Sets the absolute url.
+ *
+ * @param string $url
+ * @return void
+ */
+function setAbsoluteUrl($url);
+
+/**
+ * Returns the current base url.
+ *
+ * @return string
+ */
+function getBaseUrl();
+
+/**
+ * Sets a base url.
+ *
+ * This url is used for relative path calculations.
+ *
+ * The base url should default to /
+ *
+ * @param string $url
+ * @return void
+ */
+function setBaseUrl($url);
+
+/**
+ * Returns the relative path.
+ *
+ * This is being calculated using the base url. This path will not start
+ * with a slash, so it will always return something like
+ * 'example/path.html'.
+ *
+ * If the full path is equal to the base url, this method will return an
+ * empty string.
+ *
+ * This method will also urldecode the path, and if the url was incoded as
+ * ISO-8859-1, it will convert it to UTF-8.
+ *
+ * If the path is outside of the base url, a LogicException will be thrown.
+ *
+ * @return string
+ */
+function getPath();
+
+/**
+ * Returns the list of query parameters.
+ *
+ * This is equivalent to PHP's $_GET superglobal.
+ *
+ * @return array
+ */
+function getQueryParameters();
+
+/**
+ * Returns the POST data.
+ *
+ * This is equivalent to PHP's $_POST superglobal.
+ *
+ * @return array
+ */
+function getPostData();
+
+/**
+ * Sets the post data.
+ *
+ * This is equivalent to PHP's $_POST superglobal.
+ *
+ * This would not have been needed, if POST data was accessible as
+ * php://input, but unfortunately we need to special case it.
+ *
+ * @param array $postData
+ * @return void
+ */
+function setPostData(array $postData);
+
+/**
+ * Returns an item from the _SERVER array.
+ *
+ * If the value does not exist in the array, null is returned.
+ *
+ * @param string $valueName
+ * @return string|null
+ */
+function getRawServerValue($valueName);
+
+/**
+ * Sets the _SERVER array.
+ *
+ * @param array $data
+ * @return void
+ */
+function setRawServerData(array $data);
+
+/**
- * This static method will create a new Request object, based on the
- * current PHP request.
++ * Returns the body as a readable stream resource.
+ *
- * @param resource $body
- * @return Request
++ * Note that the stream may not be rewindable, and therefore may only be
++ * read once.
++ *
++ * @return resource
+ */
- static public function createFromPHPRequest();
++function getBodyAsStream();
+
+/**
- * This static method will create a new Request object, based on a PHP
- * $_SERVER array.
++ * Returns the body as a string.
+ *
- * @param array $serverArray
- * @param resource $body
- * @return Request
++ * Note that because the underlying data may be based on a stream, this
++ * method could only work correctly the first time.
++ *
++ * @return string
+ */
- static public function createFromServerArray(array $serverArray);
++function getBodyAsString();
+
+/**
- * Returns the message body, as a stream.
- *
- * Note that streams are usually 'read once' and depending on the stream,
- * they can not always be rewinded.
++ * Returns the message body, as it's internal representation.
+ *
- * If you plan to read the body here, but need it later as well; be
- * prepared to duplicate the stream and set it again.
++ * This could be either a string or a stream.
+ *
- * @param int $returnType
- * @throws InvalidArgumentException when no valid $returnType is given.
+ * @return resource|string
+ */
- function getBody($returnType = self::BODY_STREAM);
++function getBody();
+
+/**
+ * Updates the body resource with a new stream.
+ *
+ * @param resource $body
+ * @return void
+ */
+function setBody($body);
+
+/**
+ * Returns all the HTTP headers as an array.
+ *
+ * @return array
+ */
+function getHeaders();
+
+/**
+ * Returns a specific HTTP header, based on it's name.
+ *
+ * The name must be treated as case-insensitive.
+ *
+ * If the header does not exist, this method must return null.
+ *
+ * @param string $name
+ * @return string|null
+ */
+function getHeader($name);
+
+/**
+ * Updates a HTTP header.
+ *
+ * The case-sensitity of the name value must be retained as-is.
+ *
+ * @param string $name
+ * @param string $value
+ * @return void
+ */
+function setHeader($name, $value);
+
+/**
+ * Resets HTTP headers
+ *
+ * This method overwrites all existing HTTP headers
+ *
+ * @param array $headers
+ * @return void
+ */
+function setHeaders(array $headers);
+
+/**
+ * Adds a new set of HTTP headers.
+ *
+ * Any header specified in the array that already exists will be
+ * overwritten, but any other existing headers will be retained.
+ *
+ * @param array $headers
+ * @return void
+ */
+function addHeaders(array $headers);
+
+/**
+ * Removes a HTTP header.
+ *
+ * The specified header name must be treated as case-insenstive.
+ * This method should return true if the header was successfully deleted,
+ * and false if the header did not exist.
+ *
+ * @return bool
+ */
+function removeHeader($name);
+
+/**
+ * Sets the HTTP version.
+ *
+ * Should be 1.0 or 1.1.
+ *
+ * @param string $version
+ * @return void
+ */
+function setHttpVersion($version);
+
+/**
+ * Returns the HTTP version.
+ *
+ * @return string
+ */
+function getHttpVersion();
+```
+
+### Response
+
+```php
+/**
+ * Returns the current HTTP status.
+ *
+ * This is the status-code as well as the human readable string.
+ *
+ * @return string
+ */
+function getStatus();
+
+/**
+ * Sets the HTTP status code.
+ *
+ * This can be either the full HTTP status code with human readable string,
+ * for example: "403 I can't let you do that, Dave".
+ *
+ * Or just the code, in which case the appropriate default message will be
+ * added.
+ *
+ * @param string|int $status
+ * @throws \InvalidArgumentExeption
+ * @return void
+ */
+function setStatus($status);
+
+/**
- * Sends the HTTP response back to a HTTP client.
++ * Returns the body as a readable stream resource.
+ *
- * This calls php's header() function and streams the body to php://output.
++ * Note that the stream may not be rewindable, and therefore may only be
++ * read once.
+ *
- * @return void
++ * @return resource
+ */
- function send();
++function getBodyAsStream();
+
+/**
- * Returns the message body, as a stream.
++ * Returns the body as a string.
++ *
++ * Note that because the underlying data may be based on a stream, this
++ * method could only work correctly the first time.
+ *
- * Note that streams are usually 'read once' and depending on the stream,
- * they can not always be rewinded.
++ * @return string
++ */
++function getBodyAsString();
++
++/**
++ * Returns the message body, as it's internal representation.
+ *
- * If you plan to read the body here, but need it later as well; be
- * prepared to duplicate the stream and set it again.
++ * This could be either a string or a stream.
+ *
- * @param int $returnType
- * @throws InvalidArgumentException when no valid $returnType is given.
+ * @return resource|string
+ */
- function getBody($returnType = self::BODY_STREAM);
++function getBody();
++
+
+/**
+ * Updates the body resource with a new stream.
+ *
+ * @param resource $body
+ * @return void
+ */
+function setBody($body);
+
+/**
+ * Returns all the HTTP headers as an array.
+ *
+ * @return array
+ */
+function getHeaders();
+
+/**
+ * Returns a specific HTTP header, based on it's name.
+ *
+ * The name must be treated as case-insensitive.
+ *
+ * If the header does not exist, this method must return null.
+ *
+ * @param string $name
+ * @return string|null
+ */
+function getHeader($name);
+
+/**
+ * Updates a HTTP header.
+ *
+ * The case-sensitity of the name value must be retained as-is.
+ *
+ * @param string $name
+ * @param string $value
+ * @return void
+ */
+function setHeader($name, $value);
+
+/**
+ * Resets HTTP headers
+ *
+ * This method overwrites all existing HTTP headers
+ *
+ * @param array $headers
+ * @return void
+ */
+function setHeaders(array $headers);
+
+/**
+ * Adds a new set of HTTP headers.
+ *
+ * Any header specified in the array that already exists will be
+ * overwritten, but any other existing headers will be retained.
+ *
+ * @param array $headers
+ * @return void
+ */
+function addHeaders(array $headers);
+
+/**
+ * Removes a HTTP header.
+ *
+ * The specified header name must be treated as case-insenstive.
+ * This method should return true if the header was successfully deleted,
+ * and false if the header did not exist.
+ *
+ * @return bool
+ */
+function removeHeader($name);
+
+/**
+ * Sets the HTTP version.
+ *
+ * Should be 1.0 or 1.1.
+ *
+ * @param string $version
+ * @return void
+ */
+function setHttpVersion($version);
+
+/**
+ * Returns the HTTP version.
+ *
+ * @return string
+ */
+function getHttpVersion();
+```
+
+Made at fruux
+-------------
+
+This library is being developed by [fruux](https://fruux.com/). Drop us a line for commercial services or enterprise support.
+
+[1]: http://getcomposer.org/
+[2]: http://code.google.com/p/sabredav
+[3]: https://github.com/symfony/HttpFoundation
+[4]: http://uk3.php.net/curl
+[5]: https://github.com/fruux/sabre-event
+[6]: http://en.wikipedia.org/wiki/Decorator_pattern
+[7]: http://guzzlephp.org/
++[8]: http://www.php.net/manual/en/function.curl-multi-init.php
diff --cc vendor/sabre/http/bin/EMPTY
index 0000000,0000000..e69de29
new file mode 100644
--- /dev/null
+++ b/vendor/sabre/http/bin/EMPTY
diff --cc vendor/sabre/http/composer.json
index fc66210,0000000..6d315c4
mode 100644,000000..100644
--- a/vendor/sabre/http/composer.json
+++ b/vendor/sabre/http/composer.json
@@@ -1,32 -1,0 +1,38 @@@
+{
+ "name": "sabre/http",
+ "description" : "The sabre/http library provides utilities for dealing with http requests and responses. ",
+ "keywords" : [ "HTTP" ],
+ "homepage" : "https://github.com/fruux/sabre-http",
+ "license" : "BSD-3-Clause",
+ "require" : {
+ "php" : ">=5.4",
+ "ext-mbstring" : "*",
+ "sabre/event" : "~1.0.0"
+ },
++ "require-dev" : {
++ "phpunit/phpunit" : "*"
++ },
+ "suggest" : {
+ "ext-curl" : " to make http requests with the Client class"
+ },
+ "authors" : [
+ {
+ "name" : "Evert Pot",
+ "email" : "evert at rooftopsolutions.nl",
+ "homepage" : "http://www.rooftopsolutions.nl/",
+ "role" : "Developer"
+ }
+ ],
+ "support" : {
+ "forum" : "https://groups.google.com/group/sabredav-discuss",
+ "source" : "https://github.com/fruux/sabre-http"
+ },
+ "autoload" : {
+ "psr-0" : {
+ "Sabre\\HTTP" : "lib/"
+ }
++ },
++ "config" : {
++ "bin-dir" : "bin/"
+ }
+}
diff --cc vendor/sabre/http/examples/asyncclient.php
index 0000000,0000000..5c18871
new file mode 100644
--- /dev/null
+++ b/vendor/sabre/http/examples/asyncclient.php
@@@ -1,0 -1,0 +1,68 @@@
++<?php
++
++/**
++ * This example demonstrates the ability for clients to work asynchronously.
++ *
++ * By default up to 10 requests will be executed in paralel. HTTP connections
++ * are re-used and DNS is cached, all thanks to the power of curl.
++ *
++ * @copyright Copyright (C) 2009-2014 fruux GmbH. All rights reserved.
++ * @author Evert Pot (http://evertpot.com/)
++ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
++ */
++
++use
++ Sabre\HTTP\Request,
++ Sabre\HTTP\Client;
++
++
++// Find the autoloader
++$paths = [
++ __DIR__ . '/../vendor/autoload.php',
++ __DIR__ . '/../../../autoload.php',
++ __DIR__ . '/vendor/autoload.php',
++
++];
++
++foreach($paths as $path) {
++ if (file_exists($path)) {
++ include $path;
++ break;
++ }
++}
++
++// This is the request we're repeating a 1000 times.
++$request = new Request('GET', 'http://localhost/');
++$client = new Client();
++
++for($i = 0; $i < 1000; $i++) {
++
++ echo "$i sending\n";
++ $client->sendAsync(
++ $request,
++
++ // This is the 'success' callback
++ function($response) use ($i) {
++ echo "$i -> " . $response->getStatus() . "\n";
++ },
++
++ // This is the 'error' callback. It is called for general connection
++ // problems (such as not being able to connect to a host, dns errors,
++ // etc.) and also cases where a response was returned, but it had a
++ // status code of 400 or higher.
++ function($error) use ($i) {
++
++ if ($error['status'] === Client::STATUS_CURLERROR) {
++ // Curl errors
++ echo "$i -> curl error: " . $error['curl_errmsg'] . "\n";
++ } else {
++ // HTTP errors
++ echo "$i -> " . $error['response']->getStatus() . "\n";
++ }
++ }
++ );
++}
++
++// After everything is done, we call 'wait'. This causes the client to wait for
++// all outstanding http requests to complete.
++$client->wait();
diff --cc vendor/sabre/http/examples/client.php
index aba9bdc,0000000..6237e46
mode 100644,000000..100644
--- a/vendor/sabre/http/examples/client.php
+++ b/vendor/sabre/http/examples/client.php
@@@ -1,42 -1,0 +1,41 @@@
+<?php
+
+/**
+ * This example shows how to make a HTTP request with the Request and Response
+ * objects.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH. All rights reserved.
++ * @copyright Copyright (C) 2009-2014 fruux GmbH. All rights reserved.
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+
+use
+ Sabre\HTTP\Request,
+ Sabre\HTTP\Client;
+
+
+// Find the autoloader
+$paths = [
+ __DIR__ . '/../vendor/autoload.php',
+ __DIR__ . '/../../../autoload.php',
+ __DIR__ . '/vendor/autoload.php',
+
+];
+
+foreach($paths as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
+
+// Constructing the request.
-
- $request = new Request('GET', 'http://feeds.feedburner.com/bijsterespoor');
++$request = new Request('GET', 'http://localhost/');
+
+$client = new Client();
+//$client->addCurlSetting(CURLOPT_PROXY,'localhost:8888');
+$response = $client->send($request);
+
- echo "Response: " . $response->getStatus() . "\n";
- echo "Headers:\n";
- print_r($response->getHeaders());
++echo "Response:\n";
++
++echo (string)$response;
diff --cc vendor/sabre/http/examples/reverseproxy.php
index 3f278b9,0000000..4fe17c2
mode 100644,000000..100644
--- a/vendor/sabre/http/examples/reverseproxy.php
+++ b/vendor/sabre/http/examples/reverseproxy.php
@@@ -1,51 -1,0 +1,51 @@@
+<?php
+
+// The url we're proxying to.
+$remoteUrl = 'http://example.org/';
+
- // The url we're proxying from. Please note that this must be a relative url,
++// The url we're proxying from. Please note that this must be a relative url,
+// and basically acts as the base url.
+//
- // If youre $remoteUrl doesn't end with a slash, this one probably shouldn't
++// If your $remoteUrl doesn't end with a slash, this one probably shouldn't
+// either.
+$myBaseUrl = '/reverseproxy.php';
+// $myBaseUrl = '/~evert/sabre/http/examples/reverseproxy.php/';
+
+use
- Sabre\HTTP\Request,
++ Sabre\HTTP\Sapi,
+ Sabre\HTTP\Client;
+
+// Find the autoloader
+$paths = [
+ __DIR__ . '/../vendor/autoload.php',
+ __DIR__ . '/../../../autoload.php',
+ __DIR__ . '/vendor/autoload.php',
+
+];
+
+foreach($paths as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
+
+
- $request = Request::createFromPHPRequest();
++$request = Sapi::getRequest();
+$request->setBaseUrl($myBaseUrl);
+
+$subRequest = clone $request;
+
+// Removing the Host header.
+$subRequest->removeHeader('Host');
+
+// Rewriting the url.
+$subRequest->setUrl($remoteUrl . $request->getPath());
+
+$client = new Client();
+
+// Sends the HTTP request to the server
+$response = $client->send($subRequest);
+
+// Sends the response back to the client that connected to the proxy.
- $response->send();
++Sapi::sendResponse($response);
diff --cc vendor/sabre/http/examples/stringify.php
index 0000000,0000000..32c256d
new file mode 100644
--- /dev/null
+++ b/vendor/sabre/http/examples/stringify.php
@@@ -1,0 -1,0 +1,55 @@@
++<?php
++
++/**
++ * This simple example shows the capability of Request and Response objects to
++ * serialize themselves as strings.
++ *
++ * This is mainly useful for debugging purposes.
++ *
++ * @copyright Copyright (C) 2009-2014 fruux GmbH. All rights reserved.
++ * @author Evert Pot (http://evertpot.com/)
++ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
++ */
++
++use
++ Sabre\HTTP\Request,
++ Sabre\HTTP\Response,
++ Sabre\HTTP\Client;
++
++
++// Find the autoloader
++$paths = [
++ __DIR__ . '/../vendor/autoload.php',
++ __DIR__ . '/../../../autoload.php',
++ __DIR__ . '/vendor/autoload.php',
++
++];
++foreach($paths as $path) {
++ if (file_exists($path)) {
++ include $path;
++ break;
++ }
++}
++
++$request = new Request('POST', '/foo');
++$request->setHeaders([
++ 'Host' => 'example.org',
++ 'Content-Type' => 'application/json'
++ ]);
++
++$request->setBody(json_encode(['foo' => 'bar']));
++
++echo $request;
++echo "\r\n\r\n";
++
++$response = new Response(424);
++$response->setHeaders([
++ 'Content-Type' => 'text/plain',
++ 'Connection' => 'close',
++ ]);
++
++$response->setBody("ABORT! ABORT!");
++
++echo $response;
++
++echo "\r\n";
diff --cc vendor/sabre/http/lib/Sabre/HTTP/Auth/AWS.php
index bf6f021,0000000..a7b27bb
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/Auth/AWS.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/Auth/AWS.php
@@@ -1,229 -1,0 +1,229 @@@
+<?php
+
+namespace Sabre\HTTP\Auth;
+
+use Sabre\HTTP\Util;
+
+/**
+ * HTTP AWS Authentication handler
+ *
+ * Use this class to leverage amazon's AWS authentication header
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AWS extends AbstractAuth {
+
+ /**
+ * The signature supplied by the HTTP client
+ *
+ * @var string
+ */
+ private $signature = null;
+
+ /**
+ * The accesskey supplied by the HTTP client
+ *
+ * @var string
+ */
+ private $accessKey = null;
+
+ /**
+ * An error code, if any
+ *
+ * This value will be filled with one of the ERR_* constants
+ *
+ * @var int
+ */
+ public $errorCode = 0;
+
+ const ERR_NOAWSHEADER = 1;
+ const ERR_MD5CHECKSUMWRONG = 2;
+ const ERR_INVALIDDATEFORMAT = 3;
+ const ERR_REQUESTTIMESKEWED = 4;
+ const ERR_INVALIDSIGNATURE = 5;
+
+ /**
+ * Gathers all information from the headers
+ *
+ * This method needs to be called prior to anything else.
+ *
+ * @return bool
+ */
+ public function init() {
+
+ $authHeader = $this->request->getHeader('Authorization');
+ $authHeader = explode(' ',$authHeader);
+
+ if ($authHeader[0]!='AWS' || !isset($authHeader[1])) {
+ $this->errorCode = self::ERR_NOAWSHEADER;
+ return false;
+ }
+
+ list($this->accessKey,$this->signature) = explode(':',$authHeader[1]);
+
+ return true;
+
+ }
+
+ /**
+ * Returns the username for the request
+ *
+ * @return string
+ */
+ public function getAccessKey() {
+
+ return $this->accessKey;
+
+ }
+
+ /**
+ * Validates the signature based on the secretKey
+ *
+ * @param string $secretKey
+ * @return bool
+ */
+ public function validate($secretKey) {
+
+ $contentMD5 = $this->request->getHeader('Content-MD5');
+
+ if ($contentMD5) {
+ // We need to validate the integrity of the request
+ $body = $this->request->getBody(true);
+ $this->request->setBody($body,true);
+
+ if ($contentMD5!=base64_encode(md5($body,true))) {
+ // content-md5 header did not match md5 signature of body
+ $this->errorCode = self::ERR_MD5CHECKSUMWRONG;
+ return false;
+ }
+
+ }
+
+ if (!$requestDate = $this->request->getHeader('x-amz-date'))
+ $requestDate = $this->request->getHeader('Date');
+
+ if (!$this->validateRFC2616Date($requestDate))
+ return false;
+
+ $amzHeaders = $this->getAmzHeaders();
+
+ $signature = base64_encode(
+ $this->hmacsha1($secretKey,
+ $this->request->getMethod() . "\n" .
+ $contentMD5 . "\n" .
+ $this->request->getHeader('Content-type') . "\n" .
+ $requestDate . "\n" .
+ $amzHeaders .
+ $this->request->getUrl()
+ )
+ );
+
+ if ($this->signature != $signature) {
+
+ $this->errorCode = self::ERR_INVALIDSIGNATURE;
+ return false;
+
+ }
+
+ return true;
+
+ }
+
+
+ /**
+ * Returns an HTTP 401 header, forcing login
+ *
+ * This should be called when username and password are incorrect, or not supplied at all
+ *
+ * @return void
+ */
+ public function requireLogin() {
+
+ $this->response->setHeader('WWW-Authenticate','AWS');
+ $this->response->setStatus(401);
+
+ }
+
+ /**
+ * Makes sure the supplied value is a valid RFC2616 date.
+ *
+ * If we would just use strtotime to get a valid timestamp, we have no way of checking if a
+ * user just supplied the word 'now' for the date header.
+ *
+ * This function also makes sure the Date header is within 15 minutes of the operating
+ * system date, to prevent replay attacks.
+ *
+ * @param string $dateHeader
+ * @return bool
+ */
+ protected function validateRFC2616Date($dateHeader) {
+
+ $date = Util::parseHTTPDate($dateHeader);
+
+ // Unknown format
+ if (!$date) {
+ $this->errorCode = self::ERR_INVALIDDATEFORMAT;
+ return false;
+ }
+
+ $min = new \DateTime('-15 minutes');
+ $max = new \DateTime('+15 minutes');
+
+ // We allow 15 minutes around the current date/time
+ if ($date > $max || $date < $min) {
+ $this->errorCode = self::ERR_REQUESTTIMESKEWED;
+ return false;
+ }
+
+ return $date;
+
+ }
+
+ /**
+ * Returns a list of AMZ headers
+ *
+ * @return string
+ */
+ protected function getAmzHeaders() {
+
+ $amzHeaders = array();
+ $headers = $this->request->getHeaders();
+ foreach($headers as $headerName => $headerValue) {
+ if (strpos(strtolower($headerName),'x-amz-')===0) {
+ $amzHeaders[strtolower($headerName)] = str_replace(array("\r\n"),array(' '),$headerValue) . "\n";
+ }
+ }
+ ksort($amzHeaders);
+
+ $headerStr = '';
+ foreach($amzHeaders as $h=>$v) {
+ $headerStr.=$h.':'.$v;
+ }
+
+ return $headerStr;
+
+ }
+
+ /**
+ * Generates an HMAC-SHA1 signature
+ *
+ * @param string $key
+ * @param string $message
+ * @return string
+ */
+ private function hmacsha1($key, $message) {
+
+ $blocksize=64;
+ if (strlen($key)>$blocksize)
+ $key=pack('H*', sha1($key));
+ $key=str_pad($key,$blocksize,chr(0x00));
+ $ipad=str_repeat(chr(0x36),$blocksize);
+ $opad=str_repeat(chr(0x5c),$blocksize);
+ $hmac = pack('H*',sha1(($key^$opad).pack('H*',sha1(($key^$ipad).$message))));
+ return $hmac;
+
+ }
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/Auth/AbstractAuth.php
index 5f12af1,0000000..618ffe7
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/Auth/AbstractAuth.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/Auth/AbstractAuth.php
@@@ -1,74 -1,0 +1,74 @@@
+<?php
+
+namespace Sabre\HTTP\Auth;
+
+use
+ Sabre\HTTP\RequestInterface,
+ Sabre\HTTP\ResponseInterface;
+
+/**
+ * HTTP Authentication base class.
+ *
+ * This class provides some common functionality for the various base classes.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractAuth {
+
+ /**
+ * Authentication realm
+ *
+ * @var string
+ */
+ protected $realm;
+
+ /**
+ * Request object
+ *
+ * @var RequestInterface
+ */
+ protected $request;
+
+ /**
+ * Response object
+ *
+ * @var ResponseInterface
+ */
+ protected $response;
+
+ /**
+ * Creates the object
+ *
+ * @param string $realm
+ * @return void
+ */
+ public function __construct($realm = 'SabreTooth', RequestInterface $request, ResponseInterface $response) {
+
+ $this->realm = $realm;
+ $this->request = $request;
+ $this->response = $response;
+
+ }
+
+ /**
+ * This method sends the needed HTTP header and statuscode (401) to force
+ * the user to login.
+ *
+ * @return void
+ */
+ abstract public function requireLogin();
+
+ /**
+ * Returns the HTTP realm
+ *
+ * @return string
+ */
+ public function getRealm() {
+
+ return $this->realm;
+
+ }
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/Auth/Basic.php
index 96e0199,0000000..d885fd9
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/Auth/Basic.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/Auth/Basic.php
@@@ -1,61 -1,0 +1,61 @@@
+<?php
+
+namespace Sabre\HTTP\Auth;
+
+use
+ Sabre\HTTP\RequestInterface,
+ Sabre\HTTP\ResponseInterface;
+
+/**
+ * HTTP Basic authentication utility.
+ *
+ * This class helps you setup basic auth. The process is fairly simple:
+ *
+ * 1. Instantiate the class.
+ * 2. Call getCredentials (this will return null or a user/pass pair)
+ * 3. If you didn't get valid credentials, call 'requireLogin'
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Basic extends AbstractAuth {
+
+ /**
+ * This method returns a numeric array with a username and password as the
+ * only elements.
+ *
+ * If no credentials were found, this method returns null.
+ *
+ * @return null|array
+ */
+ public function getCredentials() {
+
+ $auth = $this->request->getHeader('Authorization');
+
+ if (!$auth) {
+ return null;
+ }
+
+ if (strtolower(substr($auth,0,6))!=='basic ') {
+ return null;
+ }
+
+ return explode(':',base64_decode(substr($auth, 6)), 2);
+
+ }
+
+ /**
+ * This method sends the needed HTTP header and statuscode (401) to force
+ * the user to login.
+ *
+ * @return void
+ */
+ public function requireLogin() {
+
+ $this->response->setHeader('WWW-Authenticate','Basic realm="' . $this->realm . '"');
+ $this->response->setStatus(401);
+
+ }
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/Auth/Digest.php
index 96bcba9,0000000..2f091bf
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/Auth/Digest.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/Auth/Digest.php
@@@ -1,226 -1,0 +1,226 @@@
+<?php
+
+namespace Sabre\HTTP\Auth;
+
+use
+ Sabre\HTTP\RequestInterface,
+ Sabre\HTTP\ResponseInterface;
+
+/**
+ * HTTP Digest Authentication handler
+ *
+ * Use this class for easy http digest authentication.
+ * Instructions:
+ *
+ * 1. Create the object
+ * 2. Call the setRealm() method with the realm you plan to use
+ * 3. Call the init method function.
+ * 4. Call the getUserName() function. This function may return false if no
+ * authentication information was supplied. Based on the username you
+ * should check your internal database for either the associated password,
+ * or the so-called A1 hash of the digest.
+ * 5. Call either validatePassword() or validateA1(). This will return true
+ * or false.
+ * 6. To make sure an authentication prompt is displayed, call the
+ * requireLogin() method.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Digest extends AbstractAuth {
+
+ /**
+ * These constants are used in setQOP();
+ */
+ const QOP_AUTH = 1;
+ const QOP_AUTHINT = 2;
+
+ protected $nonce;
+ protected $opaque;
+ protected $digestParts;
+ protected $A1;
+ protected $qop = self::QOP_AUTH;
+
+ /**
+ * Initializes the object
+ */
+ public function __construct($realm = 'SabreTooth', RequestInterface $request, ResponseInterface $response) {
+
+ $this->nonce = uniqid();
+ $this->opaque = md5($this->realm);
+ parent::__construct($realm, $request, $response);
+
+ }
+
+ /**
+ * Gathers all information from the headers
+ *
+ * This method needs to be called prior to anything else.
+ *
+ * @return void
+ */
+ public function init() {
+
+ $digest = $this->getDigest();
+ $this->digestParts = $this->parseDigest($digest);
+
+ }
+
+ /**
+ * Sets the quality of protection value.
+ *
+ * Possible values are:
+ * Sabre\HTTP\DigestAuth::QOP_AUTH
+ * Sabre\HTTP\DigestAuth::QOP_AUTHINT
+ *
+ * Multiple values can be specified using logical OR.
+ *
+ * QOP_AUTHINT ensures integrity of the request body, but this is not
+ * supported by most HTTP clients. QOP_AUTHINT also requires the entire
+ * request body to be md5'ed, which can put strains on CPU and memory.
+ *
+ * @param int $qop
+ * @return void
+ */
+ public function setQOP($qop) {
+
+ $this->qop = $qop;
+
+ }
+
+ /**
+ * Validates the user.
+ *
+ * The A1 parameter should be md5($username . ':' . $realm . ':' . $password);
+ *
+ * @param string $A1
+ * @return bool
+ */
+ public function validateA1($A1) {
+
+ $this->A1 = $A1;
+ return $this->validate();
+
+ }
+
+ /**
+ * Validates authentication through a password. The actual password must be provided here.
+ * It is strongly recommended not store the password in plain-text and use validateA1 instead.
+ *
+ * @param string $password
+ * @return bool
+ */
+ public function validatePassword($password) {
+
+ $this->A1 = md5($this->digestParts['username'] . ':' . $this->realm . ':' . $password);
+ return $this->validate();
+
+ }
+
+ /**
+ * Returns the username for the request
+ *
+ * @return string
+ */
+ public function getUsername() {
+
+ return $this->digestParts['username'];
+
+ }
+
+ /**
+ * Validates the digest challenge
+ *
+ * @return bool
+ */
+ protected function validate() {
+
+ $A2 = $this->request->getMethod() . ':' . $this->digestParts['uri'];
+
+ if ($this->digestParts['qop']=='auth-int') {
+ // Making sure we support this qop value
+ if (!($this->qop & self::QOP_AUTHINT)) return false;
+ // We need to add an md5 of the entire request body to the A2 part of the hash
+ $body = $this->request->getBody($asString = true);
+ $this->request->setBody($body);
+ $A2 .= ':' . md5($body);
+ } else {
+
+ // We need to make sure we support this qop value
+ if (!($this->qop & self::QOP_AUTH)) return false;
+ }
+
+ $A2 = md5($A2);
+
+ $validResponse = md5("{$this->A1}:{$this->digestParts['nonce']}:{$this->digestParts['nc']}:{$this->digestParts['cnonce']}:{$this->digestParts['qop']}:{$A2}");
+
+ return $this->digestParts['response']==$validResponse;
+
+
+ }
+
+ /**
+ * Returns an HTTP 401 header, forcing login
+ *
+ * This should be called when username and password are incorrect, or not supplied at all
+ *
+ * @return void
+ */
+ public function requireLogin() {
+
+ $qop = '';
+ switch($this->qop) {
+ case self::QOP_AUTH : $qop = 'auth'; break;
+ case self::QOP_AUTHINT : $qop = 'auth-int'; break;
+ case self::QOP_AUTH | self::QOP_AUTHINT : $qop = 'auth,auth-int'; break;
+ }
+
+ $this->response->setHeader('WWW-Authenticate','Digest realm="' . $this->realm . '",qop="'.$qop.'",nonce="' . $this->nonce . '",opaque="' . $this->opaque . '"');
+ $this->response->setStatus(401);
+
+ }
+
+
+ /**
+ * This method returns the full digest string.
+ *
+ * It should be compatibile with mod_php format and other webservers.
+ *
+ * If the header could not be found, null will be returned
+ *
+ * @return mixed
+ */
+ public function getDigest() {
+
+ return $this->request->getHeader('Authorization');
+
+ }
+
+
+ /**
+ * Parses the different pieces of the digest string into an array.
+ *
+ * This method returns false if an incomplete digest was supplied
+ *
+ * @param string $digest
+ * @return mixed
+ */
+ protected function parseDigest($digest) {
+
+ // protect against missing data
+ $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
+ $data = array();
+
+ preg_match_all('@(\w+)=(?:(?:")([^"]+)"|([^\s,$]+))@', $digest, $matches, PREG_SET_ORDER);
+
+ foreach ($matches as $m) {
+ $data[$m[1]] = $m[2] ? $m[2] : $m[3];
+ unset($needed_parts[$m[1]]);
+ }
+
+ return $needed_parts ? false : $data;
+
+ }
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/Client.php
index 74a40c1,0000000..5b5672c
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/Client.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/Client.php
@@@ -1,290 -1,0 +1,549 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+use
+ Sabre\Event\EventEmitter;
+
+/**
+ * A rudimentary HTTP client.
+ *
+ * This object wraps PHP's curl extension and provides an easy way to send it a
+ * Request object, and return a Response object.
+ *
+ * This is by no means intended as the next best HTTP client, but it does the
+ * job and provides a simple integration with the rest of sabre/http.
+ *
+ * This client emits the following events:
+ * beforeRequest(RequestInterface $request)
+ * afterRequest(RequestInterface $request, ResponseInterface $response)
+ * error(RequestInterface $request, ResponseInterface $response, bool &$retry, int $retryCount)
+ *
+ * The beforeRequest event allows you to do some last minute changes to the
+ * request before it's done, such as adding authentication headers.
+ *
+ * The afterRequest event will be emitted after the request is completed
+ * succesfully.
+ *
+ * If a HTTP error is returned (status code higher than 399) the error event is
+ * triggered. It's possible using this event to retry the request, by setting
+ * retry to true.
+ *
+ * The amount of times a request has retried is passed as $retryCount, which
+ * can be used to avoid retrying indefinitely. The first time the event is
+ * called, this will be 0.
+ *
+ * It's also possible to intercept specific http errors, by subscribing to for
+ * example 'error:401'.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH. All rights reserved.
++ * @copyright Copyright (C) 2009-2014 fruux GmbH. All rights reserved.
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Client extends EventEmitter {
+
+ /**
+ * List of curl settings
+ *
+ * @var array
+ */
+ protected $curlSettings = [];
+
+ /**
+ * Wether or not exceptions should be thrown when a HTTP error is returned.
+ *
+ * @var bool
+ */
+ protected $throwExceptions = false;
+
+ /**
+ * Initializes the client.
+ *
+ * @return void
+ */
+ public function __construct() {
+
++ // hhvm compatibility.
++ if (!defined('CURLOPT_POSTREDIR')) {
++ define('CURLOPT_POSTREDIR', 161);
++ }
++
+ $this->curlSettings = [
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_HEADER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_POSTREDIR => 3,
+ ];
+
+ }
+
+ /**
+ * Sends a request to a HTTP server, and returns a response.
+ *
+ * @param RequestInterface $request
+ * @return ResponseInterface
+ */
+ public function send(RequestInterface $request) {
+
+ $this->emit('beforeRequest', [$request]);
+
+ $retryCount = 0;
+
+ do {
+
+ $retry = false;
+
+ try {
+ $response = $this->doRequest($request);
+
+ $code = (int)$response->getStatus();
+
+ // This was a HTTP error
- if ($code > 399) {
++ if ($code >= 400) {
+
+ $this->emit('error', [$request, $response, &$retry, $retryCount]);
+ $this->emit('error:' . $code, [$request, $response, &$retry, $retryCount]);
+
+ }
+
+ } catch (ClientException $e) {
+ $this->emit('exception', [$request, $e, &$retry, $retryCount]);
+
+ // If retry was still set to false, it means no event handler
+ // dealt with the problem. In this case we just re-throw the
+ // exception.
+ if (!$retry) {
+ throw $e;
+ }
+ }
+ if ($retry) {
+ $retryCount++;
+ }
+
+ } while ($retry);
+
+ $this->emit('afterRequest', [$request, $response]);
+
+ if ($this->throwExceptions && $code > 399) {
+ throw new ClientHttpException($response);
+ }
+
+ return $response;
+
+ }
+
+ /**
++ * Sends a HTTP request asynchronously.
++ *
++ * Due to the nature of PHP, you must from time to time poll to see if any
++ * new responses came in.
++ *
++ * After calling sendAsync, you must therefore occasionally call the poll()
++ * method, or wait().
++ *
++ * @param RequestInterface $request
++ * @param callable $success
++ * @param callable $error
++ * @return void
++ */
++ public function sendAsync(RequestInterface $request, callable $success = null, callable $error = null) {
++
++ $this->emit('beforeRequest', [$request]);
++ $this->sendAsyncInternal($request, $success, $error);
++ $this->poll();
++
++ }
++
++
++ /**
++ * This method checks if any http requests have gotten results, and if so,
++ * call the appropriate success or error handlers.
++ *
++ * This method will return true if there are still requests waiting to
++ * return, and false if all the work is done.
++ *
++ * @return bool
++ */
++ public function poll() {
++
++ // nothing to do?
++ if(!$this->curlMultiMap) {
++ return false;
++ }
++
++ do {
++ $r = curl_multi_exec(
++ $this->curlMultiHandle,
++ $stillRunning
++ );
++ } while ($r === CURLM_CALL_MULTI_PERFORM);
++
++ do {
++
++ messageQueue:
++
++ $status = curl_multi_info_read(
++ $this->curlMultiHandle,
++ $messagesInQueue
++ );
++ if ($status && $status['msg'] === CURLMSG_DONE) {
++
++ $resourceId = intval($status['handle']);
++ list(
++ $request,
++ $successCallback,
++ $errorCallback,
++ $retryCount,
++ ) = $this->curlMultiMap[$resourceId];
++
++ unset($this->curlMultiMap[$resourceId]);
++
++ $curlResult = $this->parseCurlResult(curl_multi_getcontent($status['handle']), $status['handle']);
++
++ $retry = false;
++
++ if ($curlResult['status'] === self::STATUS_CURLERROR) {
++
++ $e = new ClientException($curlResult['curl_errmsg'], $curlResult['curl_errno']);
++ $this->emit('exception', [$request, $e, &$retry, $retryCount]);
++ if ($retry) {
++ $retryCount++;
++ $this->sendASyncInternal($request, $successCallback, $errorCallback, $retryCount);
++ goto messageQueue;
++ }
++ $curlResult['request'] = $request;
++ if ($errorCallback) {
++ $errorCallback($curlResult);
++ }
++
++ } elseif ($curlResult['status'] === self::STATUS_HTTPERROR) {
++
++ $this->emit('error', [$request, $curlResult['response'], &$retry, $retryCount]);
++ $this->emit('error:' . $curlResult['http_code'], [$request, $curlResult['response'], &$retry, $retryCount]);
++
++ if ($retry) {
++ $retryCount++;
++ $this->sendASyncInternal($request, $successCallback, $errorCallback, $retryCount);
++ goto messageQueue;
++ }
++ $curlResult['request'] = $request;
++ if ($errorCallback) {
++ $errorCallback($curlResult);
++ }
++ } else {
++ $this->emit('afterRequest', [$request, $curlResult['response']]);
++ if ($successCallback) {
++ $successCallback($curlResult['response']);
++ }
++ }
++ }
++ } while ($messagesInQueue > 0);
++
++ return $stillRunning;
++
++ }
++
++ /**
++ * Processes every HTTP request in the queue, and waits till they are all
++ * completed.
++ *
++ * @return void
++ */
++ public function wait() {
++
++ do {
++ curl_multi_select($this->curlMultiHandle);
++ $stillRunning = $this->poll();
++ } while ($stillRunning);
++
++ }
++
++ /**
+ * If this is set to true, the Client will automatically throw exceptions
+ * upon http errors.
+ *
++ * This means that if a response came back with a status code of 400 or
++ * higher, we will throw a ClientHttpException.
++ *
++ * This only works for the send() method. Throwing exceptions for
++ * sendAsync() is not supported.
++ *
+ * @param bool $throwExceptions
+ * @return void
+ */
+ public function setThrowExceptions($throwExceptions) {
+
+ $this->throwExceptions = $throwExceptions;
+
+ }
+
+ /**
+ * Adds a CURL setting.
+ *
++ * These settings will be included in every HTTP request.
++ *
+ * @param int $name
+ * @param mixed $value
+ * @return void
+ */
+ public function addCurlSetting($name, $value) {
+
+ $this->curlSettings[$name] = $value;
+
+ }
+
+ /**
+ * This method is responsible for performing a single request.
+ *
+ * @param RequestInterface $request
+ * @return ResponseInterface
+ */
+ protected function doRequest(RequestInterface $request) {
+
++ $settings = $this->createCurlSettingsArray($request);
++
++ if (!$this->curlHandle) {
++ $this->curlHandle = curl_init();
++ }
++
++ curl_setopt_array($this->curlHandle, $settings);
++ $response = $this->curlExec($this->curlHandle);
++
++ $response = $this->parseCurlResult($response, $this->curlHandle);
++
++ if ($response['status'] === self::STATUS_CURLERROR) {
++ throw new ClientException($response['curl_errmsg'], $response['curl_errno']);
++ }
++
++ return $response['response'];
++
++ }
++
++ /**
++ * Cached curl handle.
++ *
++ * By keeping this resource around for the lifetime of this object, things
++ * like persistent connections are possible.
++ *
++ * @var resource
++ */
++ private $curlHandle;
++
++ /**
++ * Handler for curl_multi requests.
++ *
++ * The first time sendAsync is used, this will be created.
++ *
++ * @var resource
++ */
++ private $curlMultiHandle;
++
++ /**
++ * Has a list of curl handles, as well as their associated success and
++ * error callbacks.
++ *
++ * @var array
++ */
++ private $curlMultiMap = [];
++
++ /**
++ * Turns a RequestInterface object into an array with settings that can be
++ * fed to curl_setopt
++ *
++ * @param RequestInterface $request
++ * @return array
++ */
++ protected function createCurlSettingsArray(RequestInterface $request) {
++
+ $settings = $this->curlSettings;
+
+ switch($request->getMethod()) {
+ case 'HEAD' :
+ $settings[CURLOPT_NOBODY] = true;
+ $settings[CURLOPT_CUSTOMREQUEST] = 'HEAD';
+ $settings[CURLOPT_POSTFIELDS] = '';
+ $settings[CURLOPT_PUT] = false;
+ break;
+ case 'GET' :
+ $settings[CURLOPT_CUSTOMREQUEST] = 'GET';
+ $settings[CURLOPT_POSTFIELDS] = '';
+ $settings[CURLOPT_PUT] = false;
+ break;
+ default :
- $body = $request->getBody(MessageInterface::BODY_RAW);
++ $body = $request->getBody();
+ if (is_resource($body)) {
+ // This needs to be set to PUT, regardless of the actual
+ // method used. Without it, INFILE will be ignored for some
+ // reason.
+ $settings[CURLOPT_PUT] = true;
+ $settings[CURLOPT_INFILE] = $request->getBody();
+ } else {
+ // Else, it's a string.
+ $settings[CURLOPT_POSTFIELDS] = $body;
+ }
+ $settings[CURLOPT_CUSTOMREQUEST] = $request->getMethod();
+ break;
+
+ }
+
+ $nHeaders = [];
+ foreach($request->getHeaders() as $key=>$value) {
+
+ $nHeaders[] = $key . ': ' . $value;
+
+ }
+ $settings[CURLOPT_HTTPHEADER] = $nHeaders;
+ $settings[CURLOPT_URL] = $request->getUrl();
+
++ return $settings;
++
++ }
++
++ const STATUS_SUCCESS = 0;
++ const STATUS_CURLERROR = 1;
++ const STATUS_HTTPERROR = 2;
++
++ /**
++ * Parses the result of a curl call in a format that's a bit more
++ * convenient to work with.
++ *
++ * The method returns an array with the following elements:
++ * * status - one of the 3 STATUS constants.
++ * * curl_errno - A curl error number. Only set if status is
++ * STATUS_CURLERROR.
++ * * curl_errmsg - A current error message. Only set if status is
++ * STATUS_CURLERROR.
++ * * response - Response object. Only set if status is STATUS_SUCCESS, or
++ * STATUS_HTTPERROR.
++ * * http_code - HTTP status code, as an int. Only set if Only set if
++ * status is STATUS_SUCCESS, or STATUS_HTTPERROR
++ *
++ * @param string $response
++ * @param resource $curlHandle
++ * @return Response
++ */
++ protected function parseCurlResult($response, $curlHandle) {
++
+ list(
- $response,
+ $curlInfo,
+ $curlErrNo,
- $curlError
- ) = $this->curlRequest($settings);
++ $curlErrMsg
++ ) = $this->curlStuff($curlHandle);
+
+ if ($curlErrNo) {
- throw new ClientException($curlError, $curlErrNo);
++ return [
++ 'status' => self::STATUS_CURLERROR,
++ 'curl_errno' => $curlErrNo,
++ 'curl_errmsg' => $curlErrMsg,
++ ];
+ }
+
+ $headerBlob = substr($response, 0, $curlInfo['header_size']);
+ $responseBody = substr($response, $curlInfo['header_size']);
+
+ unset($response);
+
+ // In the case of 100 Continue, or redirects we'll have multiple lists
++ //
+ // of headers for each separate HTTP response. We can easily split this
+ // because they are separated by \r\n\r\n
+ $headerBlob = explode("\r\n\r\n", trim($headerBlob, "\r\n"));
+
+ // We only care about the last set of headers
+ $headerBlob = $headerBlob[count($headerBlob)-1];
+
+ // Splitting headers
+ $headerBlob = explode("\r\n", $headerBlob);
+
+ $headers = array();
+ foreach($headerBlob as $header) {
+ $parts = explode(':', $header, 2);
+ if (count($parts)==2) {
+ $headers[trim($parts[0])] = trim($parts[1]);
+ }
+ }
+
+ $response = new Response();
+ $response->setStatus($curlInfo['http_code']);
+ $response->setHeaders($headers);
+ $response->setBody($responseBody);
+
++ $httpCode = intval($response->getStatus());
+
- return $response;
++ return [
++ 'status' => $httpCode >= 400 ? self::STATUS_HTTPERROR : self::STATUS_SUCCESS,
++ 'response' => $response,
++ 'http_code' => $httpCode,
++ ];
+
+ }
+
-
+ /**
- * Cached curl handle.
++ * Sends a asynchrous http request.
+ *
- * By keeping this resource around for the lifetime of this object, things
- * like persistent connections are possible.
++ * We keep this in a separate method, so we can call it without triggering
++ * the beforeRequest event and don't do the poll().
+ *
- * @var resource
++ * @param RequestInterface $request
++ * @param callable $success
++ * @param callable $error
++ * @param int $retryCount
+ */
- private $curlHandle;
++ protected function sendAsyncInternal(RequestInterface $request, callable $success, callable $error, $retryCount = 0) {
++
++ if (!$this->curlMultiHandle) {
++ $this->curlMultiHandle = curl_multi_init();
++ }
++ $curl = curl_init();
++ curl_setopt_array(
++ $curl,
++ $this->createCurlSettingsArray($request)
++ );
++ curl_multi_add_handle($this->curlMultiHandle, $curl);
++ $this->curlMultiMap[intval($curl)] = [
++ $request,
++ $success,
++ $error,
++ $retryCount
++ ];
++
++ }
++
++ // @codeCoverageIgnoreStart
+
+ /**
- * Wrapper for all curl functions.
++ * Calls curl_exec
+ *
- * The only reason this was split out in a separate method, is so it
- * becomes easier to unittest.
++ * This method exists so it can easily be overridden and mocked.
+ *
- * @param string $url
- * @param array $settings
- * @return array
++ * @param resource $curlHandle
++ * @return string
++
+ */
- // @codeCoverageIgnoreStart
- protected function curlRequest($settings) {
++ protected function curlExec($curlHandle) {
+
- if (!$this->curlHandle) {
- $this->curlHandle = curl_init();
- }
++ return curl_exec($curlHandle);
+
- curl_setopt_array($this->curlHandle, $settings);
++ }
++
++ /**
++ * Returns a bunch of information about a curl request.
++ *
++ * This method exists so it can easily be overridden and mocked.
++ *
++ * @param resource $curlHandle
++ * @return array
++ */
++ protected function curlStuff($curlHandle) {
+
+ return [
- curl_exec($this->curlHandle),
- curl_getinfo($this->curlHandle),
- curl_errno($this->curlHandle),
- curl_error($this->curlHandle)
++ curl_getinfo($curlHandle),
++ curl_errno($curlHandle),
++ curl_error($curlHandle),
+ ];
+
+ }
+ // @codeCoverageIgnoreEnd
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/ClientException.php
index aab3106,0000000..fd203ad
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/ClientException.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/ClientException.php
@@@ -1,15 -1,0 +1,15 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * This exception may be emitted by the HTTP\Client class, in case there was a
+ * problem emitting the request.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH. All rights reserved.
++ * @copyright Copyright (C) 2009-2014 fruux GmbH. All rights reserved.
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ClientException extends \Exception {
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/ClientHttpException.php
index 89062bc,0000000..ccb9029
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/ClientHttpException.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/ClientHttpException.php
@@@ -1,63 -1,0 +1,58 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * This exception represents a HTTP error coming from the Client.
+ *
+ * By default the Client will not emit these, this has to be explicitly enabled
+ * with the setThrowExceptions method.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH. All rights reserved.
++ * @copyright Copyright (C) 2009-2014 fruux GmbH. All rights reserved.
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ClientHttpException extends \Exception implements HttpException {
+
+ /**
+ * Response object
+ *
+ * @var ResponseInterface
+ */
+ protected $response;
+
+ /**
+ * Constructor
+ *
+ * @param ResponseInterface $response
+ */
+ public function __construct(ResponseInterface $response) {
+
+ $this->response = $response;
-
- list($httpCode, $humanReadable) = explode(' ', $response->getStatus(), 2);
- parent::__construct($humanReadable, $httpCode);
++ parent::__construct($response->getStatusText(), $response->getStatus());
+
+ }
+
+ /**
+ * The http status code for the error.
+ *
- * This may either be just the number, or a number and a human-readable
- * message, separated by a space.
- *
- * @return string|null
++ * @return int
+ */
+ public function getHttpStatus() {
+
+ return $this->response->getStatus();
+
+ }
+
+ /**
+ * Returns the full response object.
+ *
+ * @return ResponseInterface
+ */
+ public function getResponse() {
+
+ return $this->response;
+
+ }
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/HttpException.php
index c928f62,0000000..7cbe9b1
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/HttpException.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/HttpException.php
@@@ -1,30 -1,0 +1,30 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * An exception representing a HTTP error.
+ *
+ * This can be used as a generic exception in your application, if you'd like
+ * to map HTTP errors to exceptions.
+ *
+ * If you'd like to use this, create a new exception class, extending Exception
+ * and implementing this interface.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH. All rights reserved.
++ * @copyright Copyright (C) 2009-2014 fruux GmbH. All rights reserved.
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface HttpException {
+
+ /**
+ * The http status code for the error.
+ *
+ * This may either be just the number, or a number and a human-readable
+ * message, separated by a space.
+ *
+ * @return string|null
+ */
+ public function getHttpStatus();
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/Message.php
index 800fb2c,0000000..81168ae
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/Message.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/Message.php
@@@ -1,219 -1,0 +1,229 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * This is the abstract base class for both the Request and Response objects.
+ *
+ * This object contains a few simple methods that are shared by both.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Message implements MessageInterface {
+
+ /**
+ * Request body
+ *
+ * This should be a stream resource
+ *
+ * @var resource
+ */
+ protected $body;
+
+ /**
+ * Contains the list of HTTP headers
+ *
+ * @var array
+ */
+ protected $headers = [];
+
+ /**
+ * HTTP message version (1.0 or 1.1)
+ *
+ * @var string
+ */
+ protected $httpVersion = '1.1';
+
+ /**
- * Returns the message body, as a stream.
++ * Returns the body as a readable stream resource.
+ *
- * Note that streams are usually 'read once' and depending on the stream,
- * they can not always be rewinded.
++ * Note that the stream may not be rewindable, and therefore may only be
++ * read once.
+ *
- * If you plan to read the body here, but need it later as well; be
- * prepared to duplicate the stream and set it again.
- *
- * @param int $returnType
- * @throws InvalidArgumentException when no valid $returnType is given.
- * @return resource|string
++ * @return resource
+ */
- public function getBody($returnType = self::BODY_STREAM) {
-
- if (!$this->body) {
- $this->body = '';
++ public function getBodyAsStream() {
++
++ $body = $this->getBody();
++ if (is_string($body) || is_null($body)) {
++ $stream = fopen('php://temp', 'r+');
++ fwrite($stream, $body);
++ rewind($stream);
++ return $stream;
++ } else {
++ return $body;
+ }
+
- switch($returnType) {
- case self::BODY_STREAM :
- if (is_string($this->body)) {
- $stream = fopen('php://temp', 'r+');
- fwrite($stream, $this->body);
- rewind($stream);
- return $stream;
- } else {
- return $this->body;
- }
- /* No break */
- case self::BODY_STRING :
- if (is_string($this->body)) {
- return $this->body;
- } else {
- return stream_get_contents($this->body);
- }
- /* No break */
- case self::BODY_RAW :
- return $this->body;
- /* No break */
++ }
++
++ /**
++ * Returns the body as a string.
++ *
++ * Note that because the underlying data may be based on a stream, this
++ * method could only work correctly the first time.
++ *
++ * @return string
++ */
++ public function getBodyAsString() {
++
++ $body = $this->getBody();
++ if (is_string($body)) {
++ return $body;
++ } elseif (is_null($body)) {
++ return '';
++ } else {
++ return stream_get_contents($body);
+ }
+
- throw new \InvalidArgumentException('Uknown value for ' . $returnType);
++ }
++
++ /**
++ * Returns the message body, as it's internal representation.
++ *
++ * This could be either a string or a stream.
++ *
++ * @return resource|string
++ */
++ public function getBody() {
++
++ return $this->body;
+
+ }
+
+ /**
+ * Replaces the body resource with a new stream or string.
+ *
+ * @param resource $body
+ */
+ public function setBody($body) {
+
+ $this->body = $body;
+
+ }
+
+ /**
+ * Returns all the HTTP headers as an array.
+ *
+ * @return array
+ */
+ public function getHeaders() {
+
+ return $this->headers;
+
+ }
+
+ /**
+ * Returns a specific HTTP header, based on it's name.
+ *
+ * The name must be treated as case-insensitive.
+ *
+ * If the header does not exist, this method must return null.
+ *
+ * @param string $name
+ * @return string|null
+ */
+ public function getHeader($name) {
+
+ foreach($this->headers as $key=>$value) {
+ if (strtolower($key)===strtolower($name)) {
+ return $value;
+ }
+ }
+
+ return null;
+
+ }
+
+ /**
+ * Sets a new set of HTTP headers.
+ *
+ * This method should append the new headers, not wipe out the existing
+ * ones.
+ *
+ * @param array $headers
+ * @return void
+ */
+ public function setHeaders(array $headers) {
+
+ $this->headers = $headers;
+
+ }
+
+ /**
+ * Adds a new set of HTTP headers.
+ *
+ * Any header specified in the array that already exists will be
+ * overwritten, but any other existing headers will be retained.
+ *
+ * @param array $headers
+ * @return void
+ */
+ public function addHeaders(array $headers) {
+
+ $this->headers = array_merge($this->headers, $headers);
+
+ }
+
+ /**
+ * Updates a HTTP header.
+ *
+ * The case-sensitity of the name value must be retained as-is.
+ *
+ * @param string $name
+ * @param string $value
+ * @return void
+ */
+ public function setHeader($name, $value) {
+
+ $this->headers[$name] = $value;
+
+ }
+
+ /**
+ * Removes a HTTP header.
+ *
+ * The specified header name must be treated as case-insenstive.
+ * This method should return true if the header was successfully deleted,
+ * and false if the header did not exist.
+ *
+ * @return bool
+ */
+ public function removeHeader($name) {
+
+ foreach($this->headers as $key=>$value) {
+ if (strtolower($key)===strtolower($name)) {
+ unset($this->headers[$key]);
+ return true;
+ }
+ }
+ return false;
+
+ }
+
+ /**
+ * Sets the HTTP version.
+ *
+ * Should be 1.0 or 1.1.
+ *
+ * @param string $version
+ * @return void
+ */
+ public function setHttpVersion($version) {
+
+ $this->httpVersion = $version;
+
+ }
+
+ /**
+ * Returns the HTTP version.
+ *
+ * @return string
+ */
+ public function getHttpVersion() {
+
+ return $this->httpVersion;
+
+ }
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/MessageDecoratorTrait.php
index 61e2e4d,0000000..8e4fffd
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/MessageDecoratorTrait.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/MessageDecoratorTrait.php
@@@ -1,170 -1,0 +1,192 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * This trait contains a bunch of methods, shared by both the RequestDecorator
+ * and the ResponseDecorator.
+ *
+ * Didn't seem needed to create a full class for this, so we're just
+ * implementing it as a trait.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+trait MessageDecoratorTrait {
+
+ /**
+ * The inner request object.
+ *
+ * All method calls will be forwarded here.
+ *
+ * @var MessageInterface
+ */
+ protected $inner;
+
+ /**
- * Returns the message body, as a stream.
++ * Returns the body as a readable stream resource.
+ *
- * Note that streams are usually 'read once' and depending on the stream,
- * they can not always be rewinded.
++ * Note that the stream may not be rewindable, and therefore may only be
++ * read once.
+ *
- * If you plan to read the body here, but need it later as well; be
- * prepared to duplicate the stream and set it again.
++ * @return resource
++ */
++ public function getBodyAsStream() {
++
++ return $this->inner->getBodyAsStream();
++
++ }
++
++ /**
++ * Returns the body as a string.
++ *
++ * Note that because the underlying data may be based on a stream, this
++ * method could only work correctly the first time.
++ *
++ * @return string
++ */
++ public function getBodyAsString() {
++
++ return $this->inner->getBodyAsString();
++
++ }
++
++ /**
++ * Returns the message body, as it's internal representation.
++ *
++ * This could be either a string or a stream.
+ *
- * @param int $returnType
- * @throws InvalidArgumentException when no valid $returnType is given.
+ * @return resource|string
+ */
- public function getBody($returnType = self::BODY_STREAM) {
++ public function getBody() {
+
- return $this->inner->getBody($returnType);
++ return $this->inner->getBody();
+
+ }
+
+ /**
+ * Updates the body resource with a new stream.
+ *
+ * @param resource $body
+ * @return void
+ */
+ public function setBody($body) {
+
+ $this->inner->setBody($body);
+
+ }
+
+ /**
+ * Returns all the HTTP headers as an array.
+ *
+ * @return array
+ */
+ public function getHeaders() {
+
+ return $this->inner->getHeaders();
+
+ }
+
+ /**
+ * Returns a specific HTTP header, based on it's name.
+ *
+ * The name must be treated as case-insensitive.
+ *
+ * If the header does not exist, this method must return null.
+ *
+ * @param string $name
+ * @return string|null
+ */
+ public function getHeader($name) {
+
+ return $this->inner->getHeader($name);
+
+ }
+
+ /**
+ * Updates a HTTP header.
+ *
+ * The case-sensitity of the name value must be retained as-is.
+ *
+ * @param string $name
+ * @param string $value
+ * @return void
+ */
+ public function setHeader($name, $value) {
+
+ $this->inner->setHeader($name, $value);
+
+ }
+
+ /**
+ * Resets HTTP headers
+ *
+ * This method overwrites all existing HTTP headers
+ *
+ * @param array $headers
+ * @return void
+ */
+ public function setHeaders(array $headers) {
+
+ $this->inner->setHeaders($headers);
+
+ }
+
+ /**
+ * Adds a new set of HTTP headers.
+ *
+ * Any header specified in the array that already exists will be
+ * overwritten, but any other existing headers will be retained.
+ *
+ * @param array $headers
+ * @return void
+ */
+ public function addHeaders(array $headers) {
+
+ $this->inner->addHeaders($headers);
+
+ }
+
+
+ /**
+ * Removes a HTTP header.
+ *
+ * The specified header name must be treated as case-insenstive.
+ * This method should return true if the header was successfully deleted,
+ * and false if the header did not exist.
+ *
+ * @return bool
+ */
+ public function removeHeader($name) {
+
+ $this->inner->removeHeader($name);
+
+ }
+
+ /**
+ * Sets the HTTP version.
+ *
+ * Should be 1.0 or 1.1.
+ *
+ * @param string $version
+ * @return void
+ */
+ public function setHttpVersion($version) {
+
+ $this->inner->setHttpVersion($version);
+
+ }
+
+ /**
+ * Returns the HTTP version.
+ *
+ * @return string
+ */
+ public function getHttpVersion() {
+
+ return $this->inner->getHttpVersion();
+
+ }
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/MessageInterface.php
index a27e90a,0000000..8e24c82
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/MessageInterface.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/MessageInterface.php
@@@ -1,138 -1,0 +1,131 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * The MessageInterface is the base interface that's used by both
+ * the RequestInterface and ResponseInterface.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface MessageInterface {
+
+ /**
- * Used in getBody.
++ * Returns the body as a readable stream resource.
+ *
- * Returns the message body as a PHP stream.
- */
- const BODY_STREAM = 0;
-
- /**
- * Used in getBody.
++ * Note that the stream may not be rewindable, and therefore may only be
++ * read once.
+ *
- * Returns the message body as a string.
++ * @return resource
+ */
- const BODY_STRING = 1;
++ function getBodyAsStream();
+
+ /**
- * Used in getBody.
++ * Returns the body as a string.
+ *
- * Returns the body in the format it was originally encoded in.
++ * Note that because the underlying data may be based on a stream, this
++ * method could only work correctly the first time.
++ *
++ * @return string
+ */
- const BODY_RAW = 2;
++ function getBodyAsString();
+
+ /**
- * Returns the message body, as a stream.
- *
- * Note that streams are usually 'read once' and depending on the stream,
- * they can not always be rewinded.
++ * Returns the message body, as it's internal representation.
+ *
- * If you plan to read the body here, but need it later as well; be
- * prepared to duplicate the stream and set it again.
++ * This could be either a string or a stream.
+ *
- * @param int $returnType
- * @throws InvalidArgumentException when no valid $returnType is given.
+ * @return resource|string
+ */
- function getBody($returnType = self::BODY_STREAM);
++ function getBody();
+
+ /**
+ * Updates the body resource with a new stream.
+ *
+ * @param resource $body
+ * @return void
+ */
+ function setBody($body);
+
+ /**
+ * Returns all the HTTP headers as an array.
+ *
+ * @return array
+ */
+ function getHeaders();
+
+ /**
+ * Returns a specific HTTP header, based on it's name.
+ *
+ * The name must be treated as case-insensitive.
+ *
+ * If the header does not exist, this method must return null.
+ *
+ * @param string $name
+ * @return string|null
+ */
+ function getHeader($name);
+
+ /**
+ * Updates a HTTP header.
+ *
+ * The case-sensitity of the name value must be retained as-is.
+ *
+ * @param string $name
+ * @param string $value
+ * @return void
+ */
+ function setHeader($name, $value);
+
+ /**
+ * Resets HTTP headers
+ *
+ * This method overwrites all existing HTTP headers
+ *
+ * @param array $headers
+ * @return void
+ */
+ function setHeaders(array $headers);
+
+ /**
+ * Adds a new set of HTTP headers.
+ *
+ * Any header specified in the array that already exists will be
+ * overwritten, but any other existing headers will be retained.
+ *
+ * @param array $headers
+ * @return void
+ */
+ function addHeaders(array $headers);
+
+ /**
+ * Removes a HTTP header.
+ *
+ * The specified header name must be treated as case-insenstive.
+ * This method should return true if the header was successfully deleted,
+ * and false if the header did not exist.
+ *
+ * @return bool
+ */
+ function removeHeader($name);
+
+ /**
+ * Sets the HTTP version.
+ *
+ * Should be 1.0 or 1.1.
+ *
+ * @param string $version
+ * @return void
+ */
+ function setHttpVersion($version);
+
+ /**
+ * Returns the HTTP version.
+ *
+ * @return string
+ */
+ function getHttpVersion();
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/Request.php
index eb3b8c6,0000000..c3ef0d2
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/Request.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/Request.php
@@@ -1,400 -1,0 +1,300 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * The Request class represents a single HTTP request.
+ *
- * You can either simply construct the object from scratch, or if you would
- * like to create the request from the $_SERVER array, use the
- * createFromServerArray static method.
++ * You can either simply construct the object from scratch, or if you need
++ * access to the current HTTP request, use Sapi::getRequest.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Request extends Message implements RequestInterface {
+
+ /**
+ * HTTP Method
+ *
+ * @var string
+ */
+ protected $method;
+
+ /**
+ * Request Url
+ *
+ * @var string
+ */
+ protected $url;
+
+ /**
+ * Creates the request object
+ *
+ * @param string $method
+ * @param string $url
+ * @param array $headers
+ * @param resource $body
+ */
+ public function __construct($method = null, $url = null, array $headers = null, $body = null) {
+
+ if (!is_null($method)) $this->setMethod($method);
+ if (!is_null($url)) $this->setUrl($url);
+ if (!is_null($headers)) $this->setHeaders($headers);
+ if (!is_null($body)) $this->setBody($body);
+
+ }
+
+ /**
- * This static method will create a new Request object, based on the
- * current PHP request.
- *
- * @param resource $body
- * @return Request
- */
- static public function createFromPHPRequest() {
-
- $r = self::createFromServerArray($_SERVER);
- $r->setBody(fopen('php://input','r'));
- $r->setPostData($_POST);
- return $r;
-
- }
-
- /**
- * This static method will create a new Request object, based on a PHP
- * $_SERVER array.
- *
- * @param array $serverArray
- * @param resource $body
- * @return Request
- */
- static public function createFromServerArray(array $serverArray) {
-
- $headers = array();
- $method = null;
- $url = null;
- $httpVersion = '1.1';
-
- $protocol = 'http';
- $hostName = 'localhost';
-
- foreach($serverArray as $key=>$value) {
-
- switch($key) {
-
- case 'SERVER_PROTOCOL' :
- if ($value==='HTTP/1.0') {
- $httpVersion = '1.0';
- }
- break;
- case 'REQUEST_METHOD' :
- $method = $value;
- break;
- case 'REQUEST_URI' :
- $url = $value;
- break;
-
- // These sometimes should up without a HTTP_ prefix
- case 'CONTENT_TYPE' :
- $headers['Content-Type'] = $value;
- break;
- case 'CONTENT_LENGTH' :
- $headers['Content-Length'] = $value;
- break;
-
- // mod_php on apache will put credentials in these variables.
- // (fast)cgi does not usually do this, however.
- case 'PHP_AUTH_USER' :
- if (isset($serverArray['PHP_AUTH_PW'])) {
- $headers['Authorization'] = 'Basic ' . base64_encode($value . ':' . $serverArray['PHP_AUTH_PW']);
- }
- break;
-
- // Similarly, mod_php may also screw around with digest auth.
- case 'PHP_AUTH_DIGEST' :
- $headers['Authorization'] = 'Digest ' . $value;
- break;
-
- // Apache may prefix the HTTP_AUTHORIZATION header with
- // REDIRECT_, if mod_rewrite was used.
- case 'REDIRECT_HTTP_AUTHORIZATION' :
- $headers['Authorization'] = $value;
- break;
-
- case 'HTTP_HOST' :
- $hostName = $value;
- $headers['Host'] = $value;
- break;
-
- case 'HTTPS' :
- if (!empty($value) && $value!=='off') {
- $protocol = 'https';
- }
- break;
-
- default :
- if (substr($key,0,5)==='HTTP_') {
- // It's a HTTP header
-
- // Normalizing it to be prettier
- $header = strtolower(substr($key,5));
-
- // Transforming dashes into spaces, and uppercasing
- // every first letter.
- $header = ucwords(str_replace('_', ' ', $header));
-
- // Turning spaces into dashes.
- $header = str_replace(' ', '-', $header);
- $headers[$header] = $value;
-
- }
- break;
-
-
- }
-
- }
-
- $r = new self($method, $url, $headers);
- $r->setHttpVersion($httpVersion);
- $r->setRawServerData($serverArray);
- $r->setAbsoluteUrl($protocol . '://' . $hostName . $url);
- return $r;
-
- }
-
- /**
+ * Returns the current HTTP method
+ *
+ * @return string
+ */
+ public function getMethod() {
+
+ return $this->method;
+
+ }
+
+ /**
+ * Sets the HTTP method
+ *
+ * @param string $method
+ * @return void
+ */
+ public function setMethod($method) {
+
+ $this->method = $method;
+
+ }
+
+ /**
+ * Returns the request url.
+ *
+ * @return string
+ */
+ public function getUrl() {
+
+ return $this->url;
+
+ }
+
+ /**
+ * Sets the request url.
+ *
+ * @param string $url
+ * @return void
+ */
+ public function setUrl($url) {
+
+ $this->url = $url;
+
+ }
+
+ /**
+ * Returns the list of query parameters.
+ *
+ * This is equivalent to PHP's $_GET superglobal.
+ *
+ * @return array
+ */
+ public function getQueryParameters() {
+
+ $url = $this->getUrl();
+ if (($index = strpos($url,'?'))===false) {
+ return [];
+ } else {
+ parse_str(substr($url, $index+1), $queryParams);
+ return $queryParams;
+ }
+
+ }
+
+ /**
+ * Sets the absolute url.
+ *
+ * @param string $url
+ * @return void
+ */
+ public function setAbsoluteUrl($url) {
+
+ $this->absoluteUrl = $url;
+
+ }
+
+ /**
+ * Returns the absolute url.
+ *
+ * @return string
+ */
+ public function getAbsoluteUrl() {
+
+ return $this->absoluteUrl;
+
+ }
+
+ /**
+ * Base url
+ *
+ * @var string
+ */
+ protected $baseUrl = '/';
+
+ /**
+ * Sets a base url.
+ *
+ * This url is used for relative path calculations.
+ *
+ * @param string $url
+ * @return void
+ */
+ public function setBaseUrl($url) {
+
+ $this->baseUrl = $url;
+
+ }
+
+ /**
+ * Returns the current base url.
+ *
+ * @return string
+ */
+ public function getBaseUrl() {
+
+ return $this->baseUrl;
+
+ }
+
+ /**
+ * Returns the relative path.
+ *
+ * This is being calculated using the base url. This path will not start
+ * with a slash, so it will always return something like
+ * 'example/path.html'.
+ *
+ * If the full path is equal to the base url, this method will return an
+ * empty string.
+ *
+ * This method will also urldecode the path, and if the url was incoded as
+ * ISO-8859-1, it will convert it to UTF-8.
+ *
+ * If the path is outside of the base url, a LogicException will be thrown.
+ *
+ * @return string
+ */
+ public function getPath() {
+
+ // Removing duplicated slashes.
+ $uri = str_replace('//','/',$this->getUrl());
+
+ if (strpos($uri,$this->getBaseUrl())===0) {
+
+ // We're not interested in the query part (everything after the ?).
+ list($uri) = explode('?', $uri);
+ return trim(URLUtil::decodePath(substr($uri,strlen($this->getBaseUrl()))),'/');
+
+ // A special case, if the baseUri was accessed without a trailing
+ // slash, we'll accept it as well.
+ } elseif ($uri.'/' === $this->getBaseUrl()) {
+
+ return '';
+
+ } else {
+
+ throw new \LogicException('Requested uri (' . $this->getUrl() . ') is out of base uri (' . $this->getBaseUrl() . ')');
+
+ }
+ }
+
+ /**
+ * Equivalent of PHP's $_POST.
+ *
+ * @var array
+ */
+ protected $postData = [];
+
+ /**
+ * Sets the post data.
+ *
+ * This is equivalent to PHP's $_POST superglobal.
+ *
+ * This would not have been needed, if POST data was accessible as
+ * php://input, but unfortunately we need to special case it.
+ *
+ * @param array $postData
+ * @return void
+ */
+ public function setPostData(array $postData) {
+
+ $this->postData = $postData;
+
+ }
+
+ /**
+ * Returns the POST data.
+ *
+ * This is equivalent to PHP's $_POST superglobal.
+ *
+ * @return array
+ */
+ public function getPostData() {
+
+ return $this->postData;
+
+ }
+
+ /**
+ * An array containing the raw _SERVER array.
+ *
+ * @var array
+ */
+ protected $rawServerData;
+
+ /**
+ * Returns an item from the _SERVER array.
+ *
+ * If the value does not exist in the array, null is returned.
+ *
+ * @param string $valueName
+ * @return string|null
+ */
+ public function getRawServerValue($valueName) {
+
+ if (isset($this->rawServerData[$valueName])) {
+ return $this->rawServerData[$valueName];
+ }
+
+ }
+
+ /**
+ * Sets the _SERVER array.
+ *
+ * @param array $data
+ * @return void
+ */
+ public function setRawServerData(array $data) {
+
+ $this->rawServerData = $data;
+
+ }
++
++ /**
++ * Serializes the request object as a string.
++ *
++ * This is useful for debugging purposes.
++ *
++ * @return string
++ */
++ public function __toString() {
++
++ $str = $this->getMethod() . ' ' . $this->getUrl() . ' HTTP/' . $this->getHTTPVersion() . "\r\n";
++ foreach($this->getHeaders() as $key=>$value) {
++ $str.= $key . ": " . $value . "\r\n";
++ }
++ $str.="\r\n";
++ $str.=$this->getBodyAsString();
++ return $str;
++
++ }
++
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/RequestDecorator.php
index 71afd97,0000000..e1be54d
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/RequestDecorator.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/RequestDecorator.php
@@@ -1,218 -1,0 +1,231 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * Request Decorator
+ *
+ * This helper class allows you to easily create decorators for the Request
+ * object.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH. All rights reserved.
++ * @copyright Copyright (C) 2009-2014 fruux GmbH. All rights reserved.
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class RequestDecorator implements RequestInterface {
+
+ use MessageDecoratorTrait;
+
+ /**
+ * Constructor.
+ *
+ * @param RequestInterface $inner
+ */
+ public function __construct(RequestInterface $inner) {
+
+ $this->inner = $inner;
+
+ }
+
+ /**
+ * Returns the current HTTP method
+ *
+ * @return string
+ */
+ public function getMethod() {
+
+ return $this->inner->getMethod();
+
+ }
+
+ /**
+ * Sets the HTTP method
+ *
+ * @param string $method
+ * @return void
+ */
+ public function setMethod($method) {
+
+ $this->inner->setMethod($method);
+
+ }
+
+ /**
+ * Returns the request url.
+ *
+ * @return string
+ */
+ public function getUrl() {
+
+ return $this->inner->getUrl();
+
+ }
+
+ /**
+ * Sets the request url.
+ *
+ * @param string $url
+ * @return void
+ */
+ public function setUrl($url) {
+
+ $this->inner->setUrl($url);
+
+ }
+
+ /**
+ * Returns the absolute url.
+ *
+ * @return string
+ */
+ public function getAbsoluteUrl() {
+
+ return $this->inner->getAbsoluteUrl();
+
+ }
+
+ /**
+ * Sets the absolute url.
+ *
+ * @param string $url
+ * @return void
+ */
+ public function setAbsoluteUrl($url) {
+
+ $this->inner->setAbsoluteUrl($url);
+
+ }
+
+ /**
+ * Returns the current base url.
+ *
+ * @return string
+ */
+ public function getBaseUrl() {
+
+ return $this->inner->getBaseUrl();
+
+ }
+
+ /**
+ * Sets a base url.
+ *
+ * This url is used for relative path calculations.
+ *
+ * The base url should default to /
+ *
+ * @param string $url
+ * @return void
+ */
+ public function setBaseUrl($url) {
+
+ $this->inner->setBaseUrl($url);
+
+ }
+
+ /**
+ * Returns the relative path.
+ *
+ * This is being calculated using the base url. This path will not start
+ * with a slash, so it will always return something like
+ * 'example/path.html'.
+ *
+ * If the full path is equal to the base url, this method will return an
+ * empty string.
+ *
+ * This method will also urldecode the path, and if the url was incoded as
+ * ISO-8859-1, it will convert it to UTF-8.
+ *
+ * If the path is outside of the base url, a LogicException will be thrown.
+ *
+ * @return string
+ */
+ public function getPath() {
+
+ return $this->inner->getPath();
+
+ }
+
+ /**
+ * Returns the list of query parameters.
+ *
+ * This is equivalent to PHP's $_GET superglobal.
+ *
+ * @return array
+ */
+ public function getQueryParameters() {
+
+ return $this->inner->getQueryParameters();
+
+ }
+
+ /**
+ * Returns the POST data.
+ *
+ * This is equivalent to PHP's $_POST superglobal.
+ *
+ * @return array
+ */
+ public function getPostData() {
+
+ return $this->inner->getPostData();
+
+ }
+
+ /**
+ * Sets the post data.
+ *
+ * This is equivalent to PHP's $_POST superglobal.
+ *
+ * This would not have been needed, if POST data was accessible as
+ * php://input, but unfortunately we need to special case it.
+ *
+ * @param array $postData
+ * @return void
+ */
+ public function setPostData(array $postData) {
+
+ $this->inner->setPostData($postData);
+
+ }
+
+
+ /**
+ * Returns an item from the _SERVER array.
+ *
+ * If the value does not exist in the array, null is returned.
+ *
+ * @param string $valueName
+ * @return string|null
+ */
+ public function getRawServerValue($valueName) {
+
+ return $this->inner->getRawServerValue($valueName);
+
+ }
+
+ /**
+ * Sets the _SERVER array.
+ *
+ * @param array $data
+ * @return void
+ */
+ public function setRawServerData(array $data) {
+
+ $this->inner->setRawServerData($data);
+
+ }
++
++ /**
++ * Serializes the request object as a string.
++ *
++ * This is useful for debugging purposes.
++ *
++ * @return string
++ */
++ public function __toString() {
++
++ return $this->inner->__toString();
++
++ }
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/RequestInterface.php
index aef9e39,0000000..f73a09f
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/RequestInterface.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/RequestInterface.php
@@@ -1,147 -1,0 +1,147 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * The RequestInterface represents a HTTP request.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface RequestInterface extends MessageInterface {
+
+ /**
+ * Returns the current HTTP method
+ *
+ * @return string
+ */
+ function getMethod();
+
+ /**
+ * Sets the HTTP method
+ *
+ * @param string $method
+ * @return void
+ */
+ function setMethod($method);
+
+ /**
+ * Returns the request url.
+ *
+ * @return string
+ */
+ function getUrl();
+
+ /**
+ * Sets the request url.
+ *
+ * @param string $url
+ * @return void
+ */
+ function setUrl($url);
+
+ /**
+ * Returns the absolute url.
+ *
+ * @return string
+ */
+ function getAbsoluteUrl();
+
+ /**
+ * Sets the absolute url.
+ *
+ * @param string $url
+ * @return void
+ */
+ function setAbsoluteUrl($url);
+
+ /**
+ * Returns the current base url.
+ *
+ * @return string
+ */
+ function getBaseUrl();
+
+ /**
+ * Sets a base url.
+ *
+ * This url is used for relative path calculations.
+ *
+ * The base url should default to /
+ *
+ * @param string $url
+ * @return void
+ */
+ function setBaseUrl($url);
+
+ /**
+ * Returns the relative path.
+ *
+ * This is being calculated using the base url. This path will not start
+ * with a slash, so it will always return something like
+ * 'example/path.html'.
+ *
+ * If the full path is equal to the base url, this method will return an
+ * empty string.
+ *
+ * This method will also urldecode the path, and if the url was incoded as
+ * ISO-8859-1, it will convert it to UTF-8.
+ *
+ * If the path is outside of the base url, a LogicException will be thrown.
+ *
+ * @return string
+ */
+ function getPath();
+
+ /**
+ * Returns the list of query parameters.
+ *
+ * This is equivalent to PHP's $_GET superglobal.
+ *
+ * @return array
+ */
+ function getQueryParameters();
+
+ /**
+ * Returns the POST data.
+ *
+ * This is equivalent to PHP's $_POST superglobal.
+ *
+ * @return array
+ */
+ function getPostData();
+
+ /**
+ * Sets the post data.
+ *
+ * This is equivalent to PHP's $_POST superglobal.
+ *
+ * This would not have been needed, if POST data was accessible as
+ * php://input, but unfortunately we need to special case it.
+ *
+ * @param array $postData
+ * @return void
+ */
+ function setPostData(array $postData);
+
+ /**
+ * Returns an item from the _SERVER array.
+ *
+ * If the value does not exist in the array, null is returned.
+ *
+ * @param string $valueName
+ * @return string|null
+ */
+ function getRawServerValue($valueName);
+
+ /**
+ * Sets the _SERVER array.
+ *
+ * @param array $data
+ * @return void
+ */
+ function setRawServerData(array $data);
+
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/Response.php
index f4c41e6,0000000..dee9fa8
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/Response.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/Response.php
@@@ -1,167 -1,0 +1,191 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * This class represents a single HTTP response.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Response extends Message implements ResponseInterface {
+
+ /**
+ * This is the list of currently registered HTTP status codes.
+ *
+ * @var array
+ */
+ static public $statusCodes = [
+ 100 => 'Continue',
+ 101 => 'Switching Protocols',
+ 102 => 'Processing',
+ 200 => 'OK',
+ 201 => 'Created',
+ 202 => 'Accepted',
+ 203 => 'Non-Authorative Information',
+ 204 => 'No Content',
+ 205 => 'Reset Content',
+ 206 => 'Partial Content',
+ 207 => 'Multi-Status', // RFC 4918
+ 208 => 'Already Reported', // RFC 5842
+ 226 => 'IM Used', // RFC 3229
+ 300 => 'Multiple Choices',
+ 301 => 'Moved Permanently',
+ 302 => 'Found',
+ 303 => 'See Other',
+ 304 => 'Not Modified',
+ 305 => 'Use Proxy',
+ 306 => 'Reserved',
+ 307 => 'Temporary Redirect',
+ 400 => 'Bad request',
+ 401 => 'Unauthorized',
+ 402 => 'Payment Required',
+ 403 => 'Forbidden',
+ 404 => 'Not Found',
+ 405 => 'Method Not Allowed',
+ 406 => 'Not Acceptable',
+ 407 => 'Proxy Authentication Required',
+ 408 => 'Request Timeout',
+ 409 => 'Conflict',
+ 410 => 'Gone',
+ 411 => 'Length Required',
+ 412 => 'Precondition failed',
+ 413 => 'Request Entity Too Large',
+ 414 => 'Request-URI Too Long',
+ 415 => 'Unsupported Media Type',
+ 416 => 'Requested Range Not Satisfiable',
+ 417 => 'Expectation Failed',
+ 418 => 'I\'m a teapot', // RFC 2324
+ 422 => 'Unprocessable Entity', // RFC 4918
+ 423 => 'Locked', // RFC 4918
+ 424 => 'Failed Dependency', // RFC 4918
+ 426 => 'Upgrade required',
+ 428 => 'Precondition required', // RFC 6585
+ 429 => 'Too Many Requests', // RFC 6585
+ 431 => 'Request Header Fields Too Large', // RFC 6585
+ 451 => 'Unavailable For Legal Reasons', // draft-tbray-http-legally-restricted-status
+ 500 => 'Internal Server Error',
+ 501 => 'Not Implemented',
+ 502 => 'Bad Gateway',
+ 503 => 'Service Unavailable',
+ 504 => 'Gateway Timeout',
+ 505 => 'HTTP Version not supported',
+ 506 => 'Variant Also Negotiates',
+ 507 => 'Insufficient Storage', // RFC 4918
+ 508 => 'Loop Detected', // RFC 5842
+ 509 => 'Bandwidth Limit Exceeded', // non-standard
+ 510 => 'Not extended',
+ 511 => 'Network Authentication Required', // RFC 6585
+ ];
+
+ /**
+ * HTTP status code
+ *
- * @var string
++ * @var int
+ */
+ protected $status;
+
+ /**
++ * HTTP status text
++ *
++ * @var string
++ */
++ protected $statusText;
++
++ /**
+ * Creates the response object
+ *
+ * @param string|int $status
+ * @param array $headers
+ * @param resource $body
+ * @return void
+ */
+ public function __construct($status = null, array $headers = null, $body = null) {
+
+ if (!is_null($status)) $this->setStatus($status);
+ if (!is_null($headers)) $this->setHeaders($headers);
+ if (!is_null($body)) $this->setBody($body);
+
+ }
+
+
+ /**
- * Returns the current HTTP status.
++ * Returns the current HTTP status code.
+ *
- * This is the status-code as well as the human readable string.
- *
- * @return string
++ * @return int
+ */
+ public function getStatus() {
+
+ return $this->status;
+
+ }
+
+ /**
++ * Returns the human-readable status string.
++ *
++ * In the case of a 200, this may for example be 'OK'.
++ *
++ * @return string
++ */
++ public function getStatusText() {
++
++ return $this->statusText;
++
++ }
++
++ /**
+ * Sets the HTTP status code.
+ *
+ * This can be either the full HTTP status code with human readable string,
+ * for example: "403 I can't let you do that, Dave".
+ *
+ * Or just the code, in which case the appropriate default message will be
+ * added.
+ *
+ * @param string|int $status
+ * @throws \InvalidArgumentExeption
+ * @return void
+ */
+ public function setStatus($status) {
+
+ if (ctype_digit($status) || is_int($status)) {
+
- $statusMessage = isset(self::$statusCodes[$status])?self::$statusCodes[$status]:'Unknown';
- $status = $status . ' ' . $statusMessage;
++ $statusCode = $status;
++ $statusText = isset(self::$statusCodes[$status])?self::$statusCodes[$status]:'Unknown';
+
++ } else {
++ list(
++ $statusCode,
++ $statusText
++ ) = explode(' ', $status, 2);
+ }
- if ((int)$status < 100 || (int)$status>999) {
++ if ($statusCode < 100 || $statusCode > 999) {
+ throw new \InvalidArgumentException('The HTTP status code must be exactly 3 digits');
+ }
+
- $this->status = $status;
++ $this->status = $statusCode;
++ $this->statusText = $statusText;
+
+ }
+
+ /**
- * Sends the HTTP response back to a HTTP client.
++ * Serializes the response object as a string.
+ *
- * This calls php's header() function and streams the body to php://output.
++ * This is useful for debugging purposes.
+ *
- * @return void
++ * @return string
+ */
- public function send() {
-
- header('HTTP/' . $this->httpVersion . ' ' . $this->status);
- foreach($this->headers as $key=>$value) {
-
- header($key . ': ' . $value);
++ public function __toString() {
+
++ $str = 'HTTP/' . $this->httpVersion . ' ' . $this->getStatus() . ' ' . $this->getStatusText() . "\r\n";
++ foreach($this->getHeaders() as $key=>$value) {
++ $str.= $key . ": " . $value . "\r\n";
+ }
- file_put_contents('php://output', $this->body);
++ $str.="\r\n";
++ $str.=$this->getBodyAsString();
++ return $str;
+
+ }
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/ResponseDecorator.php
index 8686f37,0000000..165c41d
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/ResponseDecorator.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/ResponseDecorator.php
@@@ -1,73 -1,0 +1,84 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * Response Decorator
+ *
+ * This helper class allows you to easily create decorators for the Response
+ * object.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH. All rights reserved.
++ * @copyright Copyright (C) 2009-2014 fruux GmbH. All rights reserved.
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ResponseDecorator implements ResponseInterface {
+
+ use MessageDecoratorTrait;
+
+ /**
+ * Constructor.
+ *
+ * @param ResponseInterface $inner
+ */
+ public function __construct(ResponseInterface $inner) {
+
+ $this->inner = $inner;
+
+ }
++
+ /**
- * Returns the current HTTP status.
- *
- * This is the status-code as well as the human readable string.
++ * Returns the current HTTP status code.
+ *
- * @return string
++ * @return int
+ */
+ public function getStatus() {
+
+ return $this->inner->getStatus();
+
+ }
+
++
++ /**
++ * Returns the human-readable status string.
++ *
++ * In the case of a 200, this may for example be 'OK'.
++ *
++ * @return string
++ */
++ public function getStatusText() {
++
++ return $this->inner->getStatusText();
++
++ }
+ /**
+ * Sets the HTTP status code.
+ *
+ * This can be either the full HTTP status code with human readable string,
+ * for example: "403 I can't let you do that, Dave".
+ *
+ * Or just the code, in which case the appropriate default message will be
+ * added.
+ *
+ * @param string|int $status
+ * @return void
+ */
+ public function setStatus($status) {
+
+ $this->inner->setStatus($status);
+
+ }
+
+ /**
- * Sends the HTTP response back to a HTTP client.
++ * Serializes the request object as a string.
+ *
- * This calls php's header() function and streams the body to php://output.
++ * This is useful for debugging purposes.
+ *
- * @return void
++ * @return string
+ */
- public function send() {
++ public function __toString() {
+
- $this->inner->send();
++ return $this->inner->__toString();
+
+ }
-
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/ResponseInterface.php
index 1451d93,0000000..0bf1101
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/ResponseInterface.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/ResponseInterface.php
@@@ -1,48 -1,0 +1,45 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * This interface represents a HTTP response.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ResponseInterface extends MessageInterface {
+
++ /**
++ * Returns the current HTTP status code.
++ *
++ * @return int
++ */
++ function getStatus();
+
+ /**
- * Returns the current HTTP status.
++ * Returns the human-readable status string.
+ *
- * This is the status-code as well as the human readable string.
++ * In the case of a 200, this may for example be 'OK'.
+ *
+ * @return string
+ */
- function getStatus();
++ function getStatusText();
+
+ /**
+ * Sets the HTTP status code.
+ *
+ * This can be either the full HTTP status code with human readable string,
+ * for example: "403 I can't let you do that, Dave".
+ *
+ * Or just the code, in which case the appropriate default message will be
+ * added.
+ *
+ * @param string|int $status
+ * @throws \InvalidArgumentExeption
+ * @return void
+ */
+ function setStatus($status);
+
- /**
- * Sends the HTTP response back to a HTTP client.
- *
- * This calls php's header() function and streams the body to php://output.
- *
- * @return void
- */
- function send();
-
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/Sapi.php
index 0000000,0000000..416f183
new file mode 100644
--- /dev/null
+++ b/vendor/sabre/http/lib/Sabre/HTTP/Sapi.php
@@@ -1,0 -1,0 +1,169 @@@
++<?php
++
++namespace Sabre\HTTP;
++
++/**
++ * PHP SAPI
++ *
++ * This object is responsible for:
++ * 1. Constructing a Request object based on the current HTTP request sent to
++ * the PHP process.
++ * 2. Sending the Response object back to the client.
++ *
++ * It could be said that this object provides a mapping between the Request and
++ * Response objects, and php's:
++ *
++ * * $_SERVER
++ * * $_POST
++ * * $_FILES
++ * * php://input
++ * * echo()
++ * * header()
++ * * php://output
++ *
++ * You can choose to either call all these methods statically, but you can also
++ * instantiate this as an object to allow for polymorhpism.
++ *
++ * @copyright Copyright (C) 2007-2014 fruux GmbH. All rights reserved.
++ * @author Evert Pot (http://evertpot.com/)
++ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
++ */
++class Sapi {
++
++ /**
++ * This static method will create a new Request object, based on the
++ * current PHP request.
++ *
++ * @param resource $body
++ * @return Request
++ */
++ static function getRequest() {
++
++ $r = self::createFromServerArray($_SERVER);
++ $r->setBody(fopen('php://input','r'));
++ $r->setPostData($_POST);
++ return $r;
++
++ }
++
++ /**
++ * Sends the HTTP response back to a HTTP client.
++ *
++ * This calls php's header() function and streams the body to php://output.
++ *
++ * @return void
++ */
++ static function sendResponse(ResponseInterface $response) {
++
++ header('HTTP/' . $response->getHttpVersion() . ' ' . $response->getStatus() . ' ' . $response->getStatusText());
++ foreach($response->getHeaders() as $key=>$value) {
++
++ header($key . ': ' . $value);
++
++ }
++ file_put_contents('php://output', $response->getBody());
++
++ }
++
++ /**
++ * This static method will create a new Request object, based on a PHP
++ * $_SERVER array.
++ *
++ * @return Request
++ */
++ static function createFromServerArray(array $serverArray) {
++
++ $headers = array();
++ $method = null;
++ $url = null;
++ $httpVersion = '1.1';
++
++ $protocol = 'http';
++ $hostName = 'localhost';
++
++ foreach($serverArray as $key=>$value) {
++
++ switch($key) {
++
++ case 'SERVER_PROTOCOL' :
++ if ($value==='HTTP/1.0') {
++ $httpVersion = '1.0';
++ }
++ break;
++ case 'REQUEST_METHOD' :
++ $method = $value;
++ break;
++ case 'REQUEST_URI' :
++ $url = $value;
++ break;
++
++ // These sometimes should up without a HTTP_ prefix
++ case 'CONTENT_TYPE' :
++ $headers['Content-Type'] = $value;
++ break;
++ case 'CONTENT_LENGTH' :
++ $headers['Content-Length'] = $value;
++ break;
++
++ // mod_php on apache will put credentials in these variables.
++ // (fast)cgi does not usually do this, however.
++ case 'PHP_AUTH_USER' :
++ if (isset($serverArray['PHP_AUTH_PW'])) {
++ $headers['Authorization'] = 'Basic ' . base64_encode($value . ':' . $serverArray['PHP_AUTH_PW']);
++ }
++ break;
++
++ // Similarly, mod_php may also screw around with digest auth.
++ case 'PHP_AUTH_DIGEST' :
++ $headers['Authorization'] = 'Digest ' . $value;
++ break;
++
++ // Apache may prefix the HTTP_AUTHORIZATION header with
++ // REDIRECT_, if mod_rewrite was used.
++ case 'REDIRECT_HTTP_AUTHORIZATION' :
++ $headers['Authorization'] = $value;
++ break;
++
++ case 'HTTP_HOST' :
++ $hostName = $value;
++ $headers['Host'] = $value;
++ break;
++
++ case 'HTTPS' :
++ if (!empty($value) && $value!=='off') {
++ $protocol = 'https';
++ }
++ break;
++
++ default :
++ if (substr($key,0,5)==='HTTP_') {
++ // It's a HTTP header
++
++ // Normalizing it to be prettier
++ $header = strtolower(substr($key,5));
++
++ // Transforming dashes into spaces, and uppercasing
++ // every first letter.
++ $header = ucwords(str_replace('_', ' ', $header));
++
++ // Turning spaces into dashes.
++ $header = str_replace(' ', '-', $header);
++ $headers[$header] = $value;
++
++ }
++ break;
++
++
++ }
++
++ }
++
++ $r = new Request($method, $url, $headers);
++ $r->setHttpVersion($httpVersion);
++ $r->setRawServerData($serverArray);
++ $r->setAbsoluteUrl($protocol . '://' . $hostName . $url);
++ return $r;
++
++ }
++
++}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/URLUtil.php
index 9f11c8a,0000000..1ee3926
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/URLUtil.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/URLUtil.php
@@@ -1,121 -1,0 +1,121 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * URL utility class
+ *
+ * This class provides methods to deal with encoding and decoding url (percent encoded) strings.
+ *
+ * It was not possible to use PHP's built-in methods for this, because some clients don't like
+ * encoding of certain characters.
+ *
+ * Specifically, it was found that GVFS (gnome's webdav client) does not like encoding of ( and
+ * ). Since these are reserved, but don't have a reserved meaning in url, these characters are
+ * kept as-is.
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class URLUtil {
+
+ /**
+ * Encodes the path of a url.
+ *
+ * slashes (/) are treated as path-separators.
+ *
+ * @param string $path
+ * @return string
+ */
+ static function encodePath($path) {
+
- return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\)\/])/',function($match) {
++ return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\)\/:])/',function($match) {
+
+ return '%'.sprintf('%02x',ord($match[0]));
+
+ }, $path);
+
+ }
+
+ /**
+ * Encodes a 1 segment of a path
+ *
+ * Slashes are considered part of the name, and are encoded as %2f
+ *
+ * @param string $pathSegment
+ * @return string
+ */
+ static function encodePathSegment($pathSegment) {
+
- return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\)])/',function($match) {
++ return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\):])/',function($match) {
+
+ return '%'.sprintf('%02x',ord($match[0]));
+
+ }, $pathSegment);
+ }
+
+ /**
+ * Decodes a url-encoded path
+ *
+ * @param string $path
+ * @return string
+ */
+ static function decodePath($path) {
+
+ return self::decodePathSegment($path);
+
+ }
+
+ /**
+ * Decodes a url-encoded path segment
+ *
+ * @param string $path
+ * @return string
+ */
+ static function decodePathSegment($path) {
+
+ $path = rawurldecode($path);
+ $encoding = mb_detect_encoding($path, array('UTF-8','ISO-8859-1'));
+
+ switch($encoding) {
+
+ case 'ISO-8859-1' :
+ $path = utf8_encode($path);
+
+ }
+
+ return $path;
+
+ }
+
+ /**
+ * Returns the 'dirname' and 'basename' for a path.
+ *
+ * The reason there is a custom function for this purpose, is because
+ * basename() is locale aware (behaviour changes if C locale or a UTF-8 locale is used)
+ * and we need a method that just operates on UTF-8 characters.
+ *
+ * In addition basename and dirname are platform aware, and will treat backslash (\) as a
+ * directory separator on windows.
+ *
+ * This method returns the 2 components as an array.
+ *
+ * If there is no dirname, it will return an empty string. Any / appearing at the end of the
+ * string is stripped off.
+ *
+ * @param string $path
+ * @return array
+ */
+ static function splitPath($path) {
+
+ $matches = array();
+ if(preg_match('/^(?:(?:(.*)(?:\/+))?([^\/]+))(?:\/?)$/u',$path,$matches)) {
+ return array($matches[1],$matches[2]);
+ } else {
+ return array(null,null);
+ }
+
+ }
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/Util.php
index 8c732ab,0000000..7e41039
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/Util.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/Util.php
@@@ -1,176 -1,0 +1,177 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP utility methods
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @author Paul Voegler
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Util {
+
+ /**
+ * Parses a RFC2616-compatible date string
+ *
+ * This method returns false if the date is invalid
+ *
+ * @param string $dateHeader
+ * @return bool|DateTime
+ */
+ static function parseHTTPDate($dateHeader) {
+
+ //RFC 2616 section 3.3.1 Full Date
+ //Only the format is checked, valid ranges are checked by strtotime below
+ $month = '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)';
+ $weekday = '(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)';
+ $wkday = '(Mon|Tue|Wed|Thu|Fri|Sat|Sun)';
+ $time = '[0-2]\d(\:[0-5]\d){2}';
+ $date3 = $month . ' ([1-3]\d| \d)';
+ $date2 = '[0-3]\d\-' . $month . '\-\d\d';
+ //4-digit year cannot begin with 0 - unix timestamp begins in 1970
+ $date1 = '[0-3]\d ' . $month . ' [1-9]\d{3}';
+
+ //ANSI C's asctime() format
+ //4-digit year cannot begin with 0 - unix timestamp begins in 1970
+ $asctime_date = $wkday . ' ' . $date3 . ' ' . $time . ' [1-9]\d{3}';
+ //RFC 850, obsoleted by RFC 1036
+ $rfc850_date = $weekday . ', ' . $date2 . ' ' . $time . ' GMT';
+ //RFC 822, updated by RFC 1123
+ $rfc1123_date = $wkday . ', ' . $date1 . ' ' . $time . ' GMT';
+ //allowed date formats by RFC 2616
+ $HTTP_date = "($rfc1123_date|$rfc850_date|$asctime_date)";
+
+ //allow for space around the string and strip it
+ $dateHeader = trim($dateHeader, ' ');
+ if (!preg_match('/^' . $HTTP_date . '$/', $dateHeader))
+ return false;
+
+ //append implicit GMT timezone to ANSI C time format
+ if (strpos($dateHeader, ' GMT') === false)
+ $dateHeader .= ' GMT';
+
+
+ $realDate = strtotime($dateHeader);
+ //strtotime can return -1 or false in case of error
+ if ($realDate !== false && $realDate >= 0)
+ return new \DateTime('@' . $realDate, new \DateTimeZone('UTC'));
+
+ }
+
+ /**
+ * Transforms a DateTime object to HTTP's most common date format.
+ *
+ * We're serializing it as the RFC 1123 date, which, for HTTP must be
+ * specified as GMT.
+ *
+ * @param \DateTime $dateTime
+ * @return string
+ */
+ static function toHTTPDate(\DateTime $dateTime) {
+
+ // We need to clone it, as we don't want to affect the existing
+ // DateTime.
+ $dateTime = clone $dateTime;
+ $dateTime->setTimeZone(new \DateTimeZone('GMT'));
+ return $dateTime->format('D, d M Y H:i:s \G\M\T');
+
+ }
+
+ /**
+ * This method can be used to aid with content negotiation.
+ *
+ * It takes 2 arguments, the $acceptHeaderValue, which may come from Accept,
+ * Accept-Language, Accept-Charset, Accept-Encoding, and an array of items
+ * that the server can support.
+ *
+ * The result of this function will be the 'best possible option'. If no
+ * best possible option could be found, null is returned.
+ *
+ * When it's null you can according to the spec either return a default, or
+ * you can choose to emit 406 Not Acceptable.
+ *
+ * The method also accepts sending 'null' for the $acceptHeaderValue,
+ * implying that no accept header was sent.
+ *
+ * @param string|null $acceptHeader
+ * @param array $availableOptions
+ * @return string|null
+ */
+ static function negotiate($acceptHeaderValue, array $availableOptions) {
+
+ if (!$acceptHeaderValue) {
+ // Grabbing the first in the list.
+ return reset($availableOptions);
+ }
+
+ $proposals = explode(',' , $acceptHeaderValue);
+
+ /**
+ * This function loops through every element, and creates a new array
+ * with 3 elements per item:
+ * 1. mimeType
+ * 2. quality (contents of q= parameter)
+ * 3. index (the original order in the array)
+ */
+ array_walk(
+ $proposals,
+
+ function(&$value, $key) {
+
+ $parts = explode(';', $value);
+ $mimeType = trim($parts[0]);
+ if (isset($parts[1]) && substr(trim($parts[1]),0,2)==='q=') {
+ $quality = substr(trim($parts[1]),2);
+ } else {
+ $quality = 1;
+ }
+
+ $value = [$mimeType, $quality, $key];
+
+ }
+ );
+
+ /**
+ * This sorts the array based on quality first, and key-index second.
+ */
+ usort(
+ $proposals,
+
+ function($a, $b) {
+
- // Comparing quality
- $result = $a[1] - $b[1];
- if ($result === 0) {
- // Comparing original index
- $result = $a[2] - $b[2];
++ // If quality is identical, we compare the original index.
++ if ($a[1]===$b[1]) {
++ // Indexes are ints, so we can just subtract
++ return $a[2] - $b[2];
++ } else {
++ // Quality are floats, so we need to make sure we're
++ // returning the correct integers.
++ return $a[1] > $b[1]?-1:1;
+ }
+
- return $result;
-
+ }
+
+ );
+
+ // Now we're left with a correctly ordered Accept: header, so we can
+ // compare it to the available mimetypes.
+ foreach($proposals as $proposal) {
+
+ // If it's */* it means 'anything will wdo'
+ if ($proposal[0] === '*/*') {
+ return reset($availableOptions);
+ }
+
+ foreach($availableOptions as $availableItem) {
+ if ($availableItem===$proposal[0]) {
+ return $availableItem;
+ }
+ }
+
+ }
+
+ }
+
+}
diff --cc vendor/sabre/http/lib/Sabre/HTTP/Version.php
index 1948334,0000000..c9c1863
mode 100644,000000..100644
--- a/vendor/sabre/http/lib/Sabre/HTTP/Version.php
+++ b/vendor/sabre/http/lib/Sabre/HTTP/Version.php
@@@ -1,19 -1,0 +1,19 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * This class contains the version number for the HTTP package
+ *
- * @copyright Copyright (C) 2009-2013 fruux GmbH (https://fruux.com/).
++ * @copyright Copyright (C) 2009-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
- const VERSION = '2.0.0alpha5';
++ const VERSION = '2.0.1';
+
+}
diff --cc vendor/sabre/http/tests/Sabre/HTTP/Auth/BasicTest.php
index 88457a0,0000000..49e6d86
mode 100644,000000..100644
--- a/vendor/sabre/http/tests/Sabre/HTTP/Auth/BasicTest.php
+++ b/vendor/sabre/http/tests/Sabre/HTTP/Auth/BasicTest.php
@@@ -1,57 -1,0 +1,57 @@@
+<?php
+
+namespace Sabre\HTTP\Auth;
+
+use Sabre\HTTP\Request;
+use Sabre\HTTP\Response;
+
+class BasicTest extends \PHPUnit_Framework_TestCase {
+
+ function testGetCredentials() {
+
+ $request = new Request('GET','/',array(
+ 'Authorization' => 'Basic ' . base64_encode('user:pass:bla')
+ ));
+
+ $basic = new Basic('Dagger', $request, new Response());
+
+ $this->assertEquals(array(
+ 'user',
+ 'pass:bla',
+ ), $basic->getCredentials($request));
+
+ }
+
+ function testGetCredentialsNoheader() {
+
+ $request = new Request('GET','/',array());
+ $basic = new Basic('Dagger', $request, new Response());
+
+ $this->assertNull($basic->getCredentials($request));
+
+ }
+
+ function testGetCredentialsNotBasic() {
+
+ $request = new Request('GET','/',array(
+ 'Authorization' => 'QBasic ' . base64_encode('user:pass:bla')
+ ));
+ $basic = new Basic('Dagger', $request, new Response());
+
+ $this->assertNull($basic->getCredentials($request));
+
+ }
+
+ function testRequireLogin() {
+
+ $response = new Response();
+ $basic = new Basic('Dagger', new Request(), $response);
+
+ $basic->requireLogin();
+
+ $this->assertEquals('Basic realm="Dagger"', $response->getHeader('WWW-Authenticate'));
- $this->assertEquals('401 Unauthorized', $response->getStatus());
++ $this->assertEquals(401, $response->getStatus());
+
+ }
+
+}
diff --cc vendor/sabre/http/tests/Sabre/HTTP/ClientTest.php
index 7918c00,0000000..56e66a4
mode 100644,000000..100644
--- a/vendor/sabre/http/tests/Sabre/HTTP/ClientTest.php
+++ b/vendor/sabre/http/tests/Sabre/HTTP/ClientTest.php
@@@ -1,454 -1,0 +1,406 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+class ClientTest extends \PHPUnit_Framework_TestCase {
+
+ protected $client;
+
- function testSendGet() {
++ function testCreateCurlSettingsArrayGET() {
+
+ $client = new ClientMock();
++ $client->addCurlSetting(CURLOPT_POSTREDIR, 0);
+
- $client->on('curl', function($settings, &$result) {
++ $request = new Request('GET','http://example.org/', ['X-Foo' => 'bar']);
+
- $this->assertEquals([
++ $this->assertEquals(
++ [
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HEADER => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_POSTREDIR => 0,
+ CURLOPT_HTTPHEADER => ['X-Foo: bar'],
+ CURLOPT_URL => 'http://example.org/',
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_POSTFIELDS => null,
+ CURLOPT_PUT => false,
- ], $settings);
-
- $returnHeaders = [
- "HTTP/1.1 200 OK",
- "X-Zim: Gir",
- ];
-
- $returnHeaders = implode("\r\n", $returnHeaders) . "\r\n\r\n";
-
- $returnBody = "hi!";
-
- $result = [
- $returnHeaders . $returnBody,
- [
- 'header_size' => strlen($returnHeaders),
- 'http_code' => 200,
- ],
- 0,
- '',
- ];
-
-
- });
-
- $client->addCurlSetting(CURLOPT_POSTREDIR, 0);
-
- $request = new Request('GET','http://example.org/', ['X-Foo' => 'bar']);
- $response = $client->send($request);
-
- $this->assertEquals(
- '200 OK',
- $response->getStatus()
- );
-
- $this->assertEquals(
- 'Gir',
- $response->getHeader('X-Zim')
- );
-
- $this->assertEquals(
- 'hi!',
- $response->getBody(Message::BODY_STRING)
++ ],
++ $client->createCurlSettingsArray($request)
+ );
+
+ }
+
- function testSendHead() {
++ function testCreateCurlSettingsArrayHEAD() {
+
+ $client = new ClientMock();
++ $request = new Request('HEAD','http://example.org/', ['X-Foo' => 'bar']);
+
- $client->on('curl', function($settings, &$result) {
-
- $this->assertEquals([
++ $this->assertEquals(
++ [
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HEADER => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_POSTREDIR => 3,
+ CURLOPT_NOBODY => true,
+ CURLOPT_CUSTOMREQUEST => 'HEAD',
+ CURLOPT_HTTPHEADER => ['X-Foo: bar'],
+ CURLOPT_URL => 'http://example.org/',
+ CURLOPT_POSTFIELDS => null,
+ CURLOPT_PUT => false,
- ], $settings);
-
- $returnHeaders = [
- "HTTP/1.1 200 OK",
- "X-Zim: Gir",
- ];
-
- $returnHeaders = implode("\r\n", $returnHeaders) . "\r\n\r\n";
-
- $returnBody = "hi!";
-
- $result = [
- $returnHeaders . $returnBody,
- [
- 'header_size' => strlen($returnHeaders),
- 'http_code' => 200,
- ],
- 0,
- '',
- ];
-
-
- });
- $request = new Request('HEAD','http://example.org/', ['X-Foo' => 'bar']);
- $response = $client->send($request);
-
- $this->assertEquals(
- '200 OK',
- $response->getStatus()
- );
-
- $this->assertEquals(
- 'Gir',
- $response->getHeader('X-Zim')
- );
-
- $this->assertEquals(
- 'hi!',
- $response->getBody(Message::BODY_STRING)
++ ],
++ $client->createCurlSettingsArray($request)
+ );
+
+ }
+
- function testSendPUTStream() {
++ function testCreateCurlSettingsArrayPUTStream() {
+
+ $client = new ClientMock();
+
- $h = null;
-
- $client->on('curl', function($settings, &$result) use (&$h) {
++ $h = fopen('php://memory', 'r+');
++ fwrite($h, 'booh');
++ $request = new Request('PUT','http://example.org/', ['X-Foo' => 'bar'], $h);
+
- $this->assertEquals([
++ $this->assertEquals(
++ [
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HEADER => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_POSTREDIR => 3,
+ CURLOPT_PUT => true,
+ CURLOPT_INFILE => $h,
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_HTTPHEADER => ['X-Foo: bar'],
+ CURLOPT_URL => 'http://example.org/',
- ], $settings);
-
- $returnHeaders = [
- "HTTP/1.1 200 OK",
- "X-Zim: Gir",
- ];
-
- $returnHeaders = implode("\r\n", $returnHeaders) . "\r\n\r\n";
-
- $returnBody = "hi!";
-
- $result = [
- $returnHeaders . $returnBody,
- [
- 'header_size' => strlen($returnHeaders),
- 'http_code' => 200,
- ],
- 0,
- '',
- ];
-
-
- });
-
- $h = fopen('php://memory', 'r+');
- fwrite($h, 'booh');
-
- $request = new Request('PUT','http://example.org/', ['X-Foo' => 'bar'], $h);
- $response = $client->send($request);
-
- $this->assertEquals(
- '200 OK',
- $response->getStatus()
- );
-
- $this->assertEquals(
- 'Gir',
- $response->getHeader('X-Zim')
- );
-
- $this->assertEquals(
- 'hi!',
- $response->getBody(Message::BODY_STRING)
++ ],
++ $client->createCurlSettingsArray($request)
+ );
+
+ }
+
- function testSendPUTString() {
++ function testCreateCurlSettingsArrayPUTString() {
+
+ $client = new ClientMock();
++ $request = new Request('PUT','http://example.org/', ['X-Foo' => 'bar'], 'boo');
+
- $client->on('curl', function($settings, &$result) {
-
- $this->assertEquals([
++ $this->assertEquals(
++ [
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HEADER => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_POSTREDIR => 3,
+ CURLOPT_POSTFIELDS => 'boo',
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_HTTPHEADER => ['X-Foo: bar'],
+ CURLOPT_URL => 'http://example.org/',
- ], $settings);
-
- $returnHeaders = [
- "HTTP/1.1 200 OK",
- "X-Zim: Gir",
- ];
-
- $returnHeaders = implode("\r\n", $returnHeaders) . "\r\n\r\n";
++ ],
++ $client->createCurlSettingsArray($request)
++ );
+
- $returnBody = "hi!";
++ }
+
- $result = [
- $returnHeaders . $returnBody,
- [
- 'header_size' => strlen($returnHeaders),
- 'http_code' => 200,
- ],
- 0,
- '',
- ];
++ function testSend() {
+
++ $client = new ClientMock();
++ $request = new Request('GET', 'http://example.org/');
+
++ $client->on('doRequest', function($request, &$response) {
++ $response = new Response(200);
+ });
+
- $request = new Request('PUT','http://example.org/', ['X-Foo' => 'bar'], 'boo');
+ $response = $client->send($request);
+
- $this->assertEquals(
- '200 OK',
- $response->getStatus()
- );
-
- $this->assertEquals(
- 'Gir',
- $response->getHeader('X-Zim')
- );
-
- $this->assertEquals(
- 'hi!',
- $response->getBody(Message::BODY_STRING)
- );
++ $this->assertEquals(200, $response->getStatus());
+
+ }
+
- /**
- * @expectedException \Sabre\HTTP\ClientException
- */
- function testCurlError() {
++ function testSendClientError() {
+
+ $client = new ClientMock();
++ $request = new Request('GET', 'http://example.org/');
++
++ $client->on('doRequest', function($request, &$response) {
++ throw new ClientException('aaah',1);
++ });
++ $called = false;
++ $client->on('exception', function() use (&$called) {
++ $called = true;
++ });
+
- $client->on('curl', function($settings, &$result) {
++ try {
++ $client->send($request);
++ $this->fail('send() should have thrown an exception');
++ } catch (ClientException $e) {
+
- $result = [
- '',
- [
- 'header_size' => 0,
- 'http_code' => 200,
- ],
- 1,
- 'Error',
- ];
++ }
++ $this->assertTrue($called);
+
++ }
++
++ function testSendHttpError() {
++
++ $client = new ClientMock();
++ $request = new Request('GET', 'http://example.org/');
+
++ $client->on('doRequest', function($request, &$response) {
++ $response = new Response(404);
++ });
++ $called = 0;
++ $client->on('error', function() use (&$called) {
++ $called++;
++ });
++ $client->on('error:404', function() use (&$called) {
++ $called++;
+ });
+
- $request = new Request('PUT','http://example.org/', ['X-Foo' => 'bar'], 'boo');
+ $client->send($request);
++ $this->assertEquals(2,$called);
+
+ }
+
- function testCurlErrorRetry() {
++ function testSendRetry() {
+
+ $client = new ClientMock();
++ $request = new Request('GET', 'http://example.org/');
+
- $client->on('curl', function($settings, &$result) {
++ $called = 0;
++ $client->on('doRequest', function($request, &$response) use (&$called) {
++ $called++;
++ if ($called < 3) {
++ $response = new Response(404);
++ } else {
++ $response = new Response(200);
++ }
++ });
+
- $result = [
- '',
- [
- 'header_size' => 0,
- 'http_code' => 200,
- ],
- 1,
- 'Error',
- ];
++ $errorCalled = 0;
++ $client->on('error', function($request, $response, &$retry, $retryCount) use (&$errorCalled) {
++
++ $errorCalled++;
++ $retry = true;
+
+ });
+
- $hits = 0;
++ $response = $client->send($request);
++ $this->assertEquals(3,$called);
++ $this->assertEquals(2,$errorCalled);
++ $this->assertEquals(200, $response->getStatus());
+
- $client->on('exception', function(Request $request, ClientException $e, &$retry, $retryCount) use (&$hits) {
++ }
+
- $hits++;
- if ($retryCount < 1) {
- $retry = true;
- }
++ function testHttpErrorException() {
++
++ $client = new ClientMock();
++ $client->setThrowExceptions(true);
++ $request = new Request('GET', 'http://example.org/');
+
++ $client->on('doRequest', function($request, &$response) {
++ $response = new Response(404);
+ });
+
- $caught = false;
+ try {
- $request = new Request('PUT','http://example.org/', ['X-Foo' => 'bar'], 'boo');
+ $client->send($request);
- } catch (ClientException $e) {
- $caught = true;
++ $this->fail('An exception should have been thrown');
++ } catch (ClientHttpException $e) {
++ $this->assertEquals(404, $e->getHttpStatus());
++ $this->assertInstanceOf('Sabre\HTTP\Response', $e->getResponse());
+ }
+
- $this->assertTrue($caught);
- $this->assertEquals(2, $hits);
-
+ }
+
- function testSendRetryAfterError() {
++ function testParseCurlResult() {
+
+ $client = new ClientMock();
++ $client->on('curlStuff', function(&$return) {
+
- $foo = 0;
-
- $client->on('curl', function($settings, &$result) use (&$foo) {
-
- $foo++;
- if ($foo === 1) {
- $returnCode = '400 Bad request';
- } else {
- $returnCode = '200 OK';
- }
-
- $returnHeaders = [
- "HTTP/1.1 " . $returnCode,
- "X-Zim: Gir",
- ];
-
- $returnHeaders = implode("\r\n", $returnHeaders) . "\r\n\r\n";
-
- $returnBody = "hi!";
-
- $result = [
- $returnHeaders . $returnBody,
++ $return = [
+ [
- 'header_size' => strlen($returnHeaders),
- 'http_code' => (int)$returnCode,
++ 'header_size' => 33,
++ 'http_code' => 200,
+ ],
+ 0,
+ '',
+ ];
+
-
+ });
+
- $request = new Request('PUT','http://example.org/', ['X-Foo' => 'bar'], 'boo');
- $response = $client->send($request);
++ $body = "HTTP/1.1 200 OK\r\nHeader1:Val1\r\n\r\nFoo";
++ $result = $client->parseCurlResult($body, 'foobar');
+
- $this->assertEquals(
- '400 Bad request',
- $response->getStatus()
- );
- $this->assertEquals(1, $foo);
++ $this->assertEquals(Client::STATUS_SUCCESS, $result['status']);
++ $this->assertEquals(200, $result['http_code']);
++ $this->assertEquals(200, $result['response']->getStatus());
++ $this->assertEquals(['Header1' => 'Val1'], $result['response']->getHeaders());
++ $this->assertEquals('Foo', $result['response']->getBodyAsString());
+
- // Doing this again, but retrying this time.
- $foo = 0;
- $client->on('error:400', function($request, $response, &$retry, $retryCount) {
- if ($retryCount === 0) $retry = true;
- });
++ }
+
- $response = $client->send($request);
++ function testParseCurlError() {
+
- $this->assertEquals(
- '200 OK',
- $response->getStatus()
- );
- $this->assertEquals(2, $foo);
++ $client = new ClientMock();
++ $client->on('curlStuff', function(&$return) {
+
- }
++ $return = [
++ [],
++ 1,
++ 'Curl error',
++ ];
+
- function testThrowExceptions() {
++ });
+
- $client = new ClientMock();
++ $body = "HTTP/1.1 200 OK\r\nHeader1:Val1\r\n\r\nFoo";
++ $result = $client->parseCurlResult($body, 'foobar');
+
- $foo = 0;
++ $this->assertEquals(Client::STATUS_CURLERROR, $result['status']);
++ $this->assertEquals(1, $result['curl_errno']);
++ $this->assertEquals('Curl error', $result['curl_errmsg']);
+
- $client->on('curl', function($settings, &$result) use (&$foo) {
++ }
+
- $foo++;
- if ($foo === 1) {
- $returnCode = '400 Bad request';
- } else {
- $returnCode = '200 OK';
- }
++ function testDoRequest() {
+
- $returnHeaders = [
- "HTTP/1.1 " . $returnCode,
- "X-Zim: Gir",
- ];
++ $client = new ClientMock();
++ $request = new Request('GET', 'http://example.org/');
++ $client->on('curlExec', function(&$return) {
+
- $returnHeaders = implode("\r\n", $returnHeaders) . "\r\n\r\n";
++ $return = "HTTP/1.1 200 OK\r\nHeader1:Val1\r\n\r\nFoo";
+
- $returnBody = "hi!";
++ });
++ $client->on('curlStuff', function(&$return) {
+
- $result = [
- $returnHeaders . $returnBody,
++ $return = [
+ [
- 'header_size' => strlen($returnHeaders),
- 'http_code' => (int)$returnCode,
++ 'header_size' => 33,
++ 'http_code' => 200,
+ ],
+ 0,
+ '',
+ ];
+
-
+ });
++ $response = $client->doRequest($request);
++ $this->assertEquals(200, $response->getStatus());
++ $this->assertEquals(['Header1' => 'Val1'], $response->getHeaders());
++ $this->assertEquals('Foo', $response->getBodyAsString());
+
- $client->setThrowExceptions(true);
++ }
+
- try {
- $request = new Request('PUT','http://example.org/', ['X-Foo' => 'bar'], 'boo');
- $response = $client->send($request);
- $this->fail('We expected an exception to be thrown, so this should be unreachable');
- } catch (ClientHttpException $e) {
++ function testDoRequestCurlError() {
++
++ $client = new ClientMock();
++ $request = new Request('GET', 'http://example.org/');
++ $client->on('curlExec', function(&$return) {
+
- $this->assertEquals('400 Bad request', $e->getHttpStatus());
- $this->assertEquals('Gir', $e->getResponse()->getHeader('X-Zim'));
++ $return = "";
+
- }
++ });
++ $client->on('curlStuff', function(&$return) {
+
++ $return = [
++ [],
++ 1,
++ 'Curl error',
++ ];
++
++ });
++
++ try {
++ $response = $client->doRequest($request);
++ $this->fail('This should have thrown an exception');
++ } catch (ClientException $e) {
++ $this->assertEquals(1, $e->getCode());
++ $this->assertEquals('Curl error', $e->getMessage());
++ }
+
+ }
+
+}
+
+class ClientMock extends Client {
+
- function curlRequest($settings) {
++ /**
++ * Making this method public.
++ */
++ public function createCurlSettingsArray(RequestInterface $request) {
+
- $this->emit('curl', [$settings, &$result]);
- return $result;
++ return parent::createCurlSettingsArray($request);
++
++ }
++ /**
++ * Making this method public.
++ */
++ public function parseCurlResult($response, $curlHandle) {
++
++ return parent::parseCurlResult($response, $curlHandle);
++
++ }
++
++ /**
++ * This method is responsible for performing a single request.
++ *
++ * @param RequestInterface $request
++ * @return ResponseInterface
++ */
++ public function doRequest(RequestInterface $request) {
++
++ $response = null;
++ $this->emit('doRequest', [$request, &$response]);
++
++ // If nothing modified $response, we're using the default behavior.
++ if (is_null($response)) {
++ return parent::doRequest($request);
++ } else {
++ return $response;
++ }
++
++ }
++
++ /**
++ * Returns a bunch of information about a curl request.
++ *
++ * This method exists so it can easily be overridden and mocked.
++ *
++ * @param resource $curlHandle
++ * @return array
++ */
++ protected function curlStuff($curlHandle) {
++
++ $return = null;
++ $this->emit('curlStuff', [&$return]);
++
++ // If nothing modified $return, we're using the default behavior.
++ if (is_null($return)) {
++ return parent::curlStufF($curlHandle);
++ } else {
++ return $return;
++ }
++
++ }
++
++ /**
++ * Calls curl_exec
++ *
++ * This method exists so it can easily be overridden and mocked.
++ *
++ * @param resource $curlHandle
++ * @return string
++ */
++ protected function curlExec($curlHandle) {
++
++ $return = null;
++ $this->emit('curlExec', [&$return]);
++
++ // If nothing modified $return, we're using the default behavior.
++ if (is_null($return)) {
++ return parent::curlExec($curlHandle);
++ } else {
++ return $return;
++ }
+
+ }
+
+}
diff --cc vendor/sabre/http/tests/Sabre/HTTP/MessageDecoratorTest.php
index 4ab44cb,0000000..bbf08a6
mode 100644,000000..100644
--- a/vendor/sabre/http/tests/Sabre/HTTP/MessageDecoratorTest.php
+++ b/vendor/sabre/http/tests/Sabre/HTTP/MessageDecoratorTest.php
@@@ -1,71 -1,0 +1,75 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+class MessageDecoratorTest extends \PHPUnit_Framework_TestCase {
+
+ protected $inner;
+ protected $outer;
+
+ function setUp() {
+
+ $this->inner = new Request();
+ $this->outer = new RequestDecorator($this->inner);
+
+ }
+
+ function testBody() {
+
+ $this->outer->setBody('foo');
- $this->assertEquals('foo', stream_get_contents($this->inner->getBody()));
- $this->assertEquals('foo', stream_get_contents($this->outer->getBody()));
++ $this->assertEquals('foo', stream_get_contents($this->inner->getBodyAsStream()));
++ $this->assertEquals('foo', stream_get_contents($this->outer->getBodyAsStream()));
++ $this->assertEquals('foo', $this->inner->getBodyAsString());
++ $this->assertEquals('foo', $this->outer->getBodyAsString());
++ $this->assertEquals('foo', $this->inner->getBody());
++ $this->assertEquals('foo', $this->outer->getBody());
+
+ }
+
+ function testHeaders() {
+
+ $this->outer->setHeaders([
+ 'a' => 'b',
+ ]);
+
+ $this->assertEquals(['a' => 'b'], $this->inner->getHeaders());
+ $this->assertEquals(['a' => 'b'], $this->outer->getHeaders());
+
+ $this->outer->setHeaders([
+ 'c' => 'd',
+ ]);
+
+ $this->assertEquals(['c' => 'd'], $this->inner->getHeaders());
+ $this->assertEquals(['c' => 'd'], $this->outer->getHeaders());
+
+ $this->outer->addHeaders([
+ 'e' => 'f',
+ ]);
+
+ $this->assertEquals(['c' => 'd', 'e' => 'f'], $this->inner->getHeaders());
+ $this->assertEquals(['c' => 'd', 'e' => 'f'], $this->outer->getHeaders());
+ }
+
+ function testHeader() {
+
+ $this->outer->setHeader('a', 'c');
+
+ $this->assertEquals('c', $this->inner->getHeader('A'));
+ $this->assertEquals('c', $this->outer->getHeader('A'));
+
+ $this->outer->removeHeader('a');
+
+ $this->assertNull($this->inner->getHeader('A'));
+ $this->assertNull($this->outer->getHeader('A'));
+ }
+
+ function testHttpVersion() {
+
+ $this->outer->setHttpVersion('1.0');
+
+ $this->assertEquals('1.0', $this->inner->getHttpVersion());
+ $this->assertEquals('1.0', $this->outer->getHttpVersion());
+
+ }
+
+}
diff --cc vendor/sabre/http/tests/Sabre/HTTP/MessageTest.php
index eaed3c7,0000000..0897dce
mode 100644,000000..100644
--- a/vendor/sabre/http/tests/Sabre/HTTP/MessageTest.php
+++ b/vendor/sabre/http/tests/Sabre/HTTP/MessageTest.php
@@@ -1,132 -1,0 +1,131 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+class MessageTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $message = new MessageMock();
+ $this->assertInstanceOf('Sabre\HTTP\Message', $message);
+
+ }
+
+ function testStreamBody() {
+
+ $body = 'foo';
+ $h = fopen('php://memory', 'r+');
+ fwrite($h, $body);
+ rewind($h);
+
+ $message = new MessageMock();
+ $message->setBody($h);
+
- $this->assertEquals($body, $message->getBody(Message::BODY_STRING));
++ $this->assertEquals($body, $message->getBodyAsString());
+ rewind($h);
- $this->assertEquals($body, stream_get_contents($message->getBody()));
++ $this->assertEquals($body, stream_get_contents($message->getBodyAsStream()));
+ rewind($h);
- $this->assertEquals($body, stream_get_contents($message->getBody(Message::BODY_RAW)));
++ $this->assertEquals($body, stream_get_contents($message->getBody()));
+
+ }
+
+ function testStringBody() {
+
+ $body = 'foo';
+
+ $message = new MessageMock();
+ $message->setBody($body);
+
- $this->assertEquals($body, $message->getBody(Message::BODY_STRING));
- $this->assertEquals($body, stream_get_contents($message->getBody()));
- $this->assertEquals($body, $message->getBody(Message::BODY_RAW));
++ $this->assertEquals($body, $message->getBodyAsString());
++ $this->assertEquals($body, stream_get_contents($message->getBodyAsStream()));
++ $this->assertEquals($body, $message->getBody());
+
+ }
+
+
- function testGetEmptyBody() {
++ function testGetEmptyBodyStream() {
+
+ $message = new MessageMock();
- $body = $message->getBody();
++ $body = $message->getBodyAsStream();
+
+ $this->assertEquals('', stream_get_contents($body));
+
+ }
+
++ function testGetEmptyBodyString() {
++
++ $message = new MessageMock();
++ $body = $message->getBodyAsString();
++
++ $this->assertEquals('', $body);
++
++ }
++
+ function testHeaders() {
+
+ $message = new MessageMock();
+ $message->setHeader('X-Foo', 'bar');
+
+ // Testing caselessness
+ $this->assertEquals('bar', $message->getHeader('X-Foo'));
+ $this->assertEquals('bar', $message->getHeader('x-fOO'));
+
+ $this->assertTrue(
+ $message->removeHeader('X-FOO')
+ );
+ $this->assertNull($message->getHeader('X-Foo'));
+ $this->assertFalse(
+ $message->removeHeader('X-FOO')
+ );
+
+ }
+
+ function testSendBody() {
+
+ $message = new MessageMock();
+
+ // String
+ $message->setBody('foo');
+
+ // Stream
+ $h = fopen('php://memory','r+');
+ fwrite($h,'bar');
+ rewind($h);
+ $message->setBody($h);
+
+ $body = $message->getBody();
+ rewind($body);
+
+ $this->assertEquals('bar', stream_get_contents($body));
+
+ }
+
+ function testSetHeaders() {
+
+ $message = new MessageMock();
+ $message->setHeaders([
+ 'a' => 'b',
+ ]);
+ $message->setHeaders([
+ 'c' => 'd',
+ ]);
+ $this->assertNull($message->getHeader('a'));
+
+ }
+
+ function testAddHeaders() {
+
+ $message = new MessageMock();
+ $message->addHeaders([
+ 'a' => 'b',
+ ]);
+ $message->addHeaders([
+ 'c' => 'd',
+ ]);
+ $this->assertEquals('b', $message->getHeader('a'));
+
+ }
+
- /**
- * @expectedException InvalidArgumentException
- */
- function testGetBodyInvalid() {
-
- $message = new MessageMock();
- $message->getBody(-1);
-
- }
-
+}
+
+class MessageMock extends Message { }
diff --cc vendor/sabre/http/tests/Sabre/HTTP/RequestDecoratorTest.php
index 3f6305b,0000000..9f1c03c
mode 100644,000000..100644
--- a/vendor/sabre/http/tests/Sabre/HTTP/RequestDecoratorTest.php
+++ b/vendor/sabre/http/tests/Sabre/HTTP/RequestDecoratorTest.php
@@@ -1,102 -1,0 +1,112 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+class RequestDecoratorTest extends \PHPUnit_Framework_TestCase {
+
+ protected $inner;
+ protected $outer;
+
+ function setUp() {
+
+ $this->inner = new Request();
+ $this->outer = new RequestDecorator($this->inner);
+
+ }
+
+ function testMethod() {
+
+ $this->outer->setMethod('FOO');
+ $this->assertEquals('FOO', $this->inner->getMethod());
+ $this->assertEquals('FOO', $this->outer->getMethod());
+
+ }
+
+ function testUrl() {
+
+ $this->outer->setUrl('/foo');
+ $this->assertEquals('/foo', $this->inner->getUrl());
+ $this->assertEquals('/foo', $this->outer->getUrl());
+
+ }
+
+ function testAbsoluteUrl() {
+
+ $this->outer->setAbsoluteUrl('http://example.org/foo');
+ $this->assertEquals('http://example.org/foo', $this->inner->getAbsoluteUrl());
+ $this->assertEquals('http://example.org/foo', $this->outer->getAbsoluteUrl());
+
+ }
+
+ function testBaseUrl() {
+
+ $this->outer->setBaseUrl('/foo');
+ $this->assertEquals('/foo', $this->inner->getBaseUrl());
+ $this->assertEquals('/foo', $this->outer->getBaseUrl());
+
+ }
+
+ function testPath() {
+
+ $this->outer->setBaseUrl('/foo');
+ $this->outer->setUrl('/foo/bar');
+ $this->assertEquals('bar', $this->inner->getPath());
+ $this->assertEquals('bar', $this->outer->getPath());
+
+ }
+
+ function testQueryParams() {
+
+ $this->outer->setUrl('/foo?a=b&c=d&e');
+ $expected = [
+ 'a' => 'b',
+ 'c' => 'd',
+ 'e' => null,
+ ];
+
+ $this->assertEquals($expected, $this->inner->getQueryParameters());
+ $this->assertEquals($expected, $this->outer->getQueryParameters());
+
+ }
+
+ function testPostData() {
+
+ $postData = [
+ 'a' => 'b',
+ 'c' => 'd',
+ 'e' => null,
+ ];
+
+ $this->outer->setPostData($postData);
+ $this->assertEquals($postData, $this->inner->getPostData());
+ $this->assertEquals($postData, $this->outer->getPostData());
+
+ }
+
+
+ function testServerData() {
+
+ $serverData = [
+ 'HTTPS' => 'On',
+ ];
+
+ $this->outer->setRawServerData($serverData);
+ $this->assertEquals('On', $this->inner->getRawServerValue('HTTPS'));
+ $this->assertEquals('On', $this->outer->getRawServerValue('HTTPS'));
+
+ $this->assertNull($this->inner->getRawServerValue('FOO'));
+ $this->assertNull($this->outer->getRawServerValue('FOO'));
+ }
+
++ function testToString() {
++
++ $this->inner->setMethod('POST');
++ $this->inner->setUrl('/foo/bar/');
++ $this->inner->setBody('foo');
++ $this->inner->setHeader('foo','bar');
++
++ $this->assertEquals((string)$this->inner, (string)$this->outer);
++
++ }
+
+}
diff --cc vendor/sabre/http/tests/Sabre/HTTP/RequestTest.php
index 3bf2afa,0000000..f86cd74
mode 100644,000000..100644
--- a/vendor/sabre/http/tests/Sabre/HTTP/RequestTest.php
+++ b/vendor/sabre/http/tests/Sabre/HTTP/RequestTest.php
@@@ -1,201 -1,0 +1,141 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+class RequestTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $request = new Request('GET', '/foo', array(
+ 'User-Agent' => 'Evert',
+ ));
+ $this->assertEquals('GET', $request->getMethod());
+ $this->assertEquals('/foo', $request->getUrl());
+ $this->assertEquals(array(
+ 'User-Agent' => 'Evert',
+ ), $request->getHeaders());
+
+ }
+
- function testConstructFromServerArray() {
-
- $request = Request::createFromServerArray(array(
- 'REQUEST_URI' => '/foo',
- 'REQUEST_METHOD' => 'GET',
- 'HTTP_USER_AGENT' => 'Evert',
- 'CONTENT_TYPE' => 'text/xml',
- 'CONTENT_LENGTH' => '400',
- 'SERVER_PROTOCOL' => 'HTTP/1.0',
- ));
-
- $this->assertEquals('GET', $request->getMethod());
- $this->assertEquals('/foo', $request->getUrl());
- $this->assertEquals(array(
- 'User-Agent' => 'Evert',
- 'Content-Type' => 'text/xml',
- 'Content-Length' => '400',
- ), $request->getHeaders());
-
- $this->assertEquals('1.0', $request->getHttpVersion());
-
- $this->assertEquals('400', $request->getRawServerValue('CONTENT_LENGTH'));
- $this->assertNull($request->getRawServerValue('FOO'));
-
- }
-
- function testConstructPHPAuth() {
-
- $request = Request::createFromServerArray(array(
- 'REQUEST_URI' => '/foo',
- 'REQUEST_METHOD' => 'GET',
- 'PHP_AUTH_USER' => 'user',
- 'PHP_AUTH_PW' => 'pass',
- ));
-
- $this->assertEquals('GET', $request->getMethod());
- $this->assertEquals('/foo', $request->getUrl());
- $this->assertEquals(array(
- 'Authorization' => 'Basic ' . base64_encode('user:pass'),
- ), $request->getHeaders());
-
- }
-
- function testConstructPHPAuthDigest() {
-
- $request = Request::createFromServerArray(array(
- 'REQUEST_URI' => '/foo',
- 'REQUEST_METHOD' => 'GET',
- 'PHP_AUTH_DIGEST' => 'blabla',
- ));
-
- $this->assertEquals('GET', $request->getMethod());
- $this->assertEquals('/foo', $request->getUrl());
- $this->assertEquals(array(
- 'Authorization' => 'Digest blabla',
- ), $request->getHeaders());
-
- }
-
- function testConstructRedirectAuth() {
-
- $request = Request::createFromServerArray(array(
- 'REQUEST_URI' => '/foo',
- 'REQUEST_METHOD' => 'GET',
- 'REDIRECT_HTTP_AUTHORIZATION' => 'Basic bla',
- ));
-
- $this->assertEquals('GET', $request->getMethod());
- $this->assertEquals('/foo', $request->getUrl());
- $this->assertEquals(array(
- 'Authorization' => 'Basic bla',
- ), $request->getHeaders());
-
- }
-
+ function testGetQueryParameters() {
+
+ $request = new Request('GET', '/foo?a=b&c&d=e');
+ $this->assertEquals([
+ 'a' => 'b',
+ 'c' => null,
+ 'd' => 'e',
+ ], $request->getQueryParameters());
+
+ }
+
+ function testGetQueryParametersNoData() {
+
+ $request = new Request('GET', '/foo');
+ $this->assertEquals([], $request->getQueryParameters());
+
+ }
+
+ /**
+ * @backupGlobals
+ */
+ function testCreateFromPHPRequest() {
+
+ $_SERVER['REQUEST_METHOD'] = 'PUT';
+
- $request = Request::createFromPHPRequest();
++ $request = Sapi::getRequest();
+ $this->assertEquals('PUT', $request->getMethod());
+
+ }
+
+ function testGetAbsoluteUrl() {
+
+ $s = [
+ 'HTTP_HOST' => 'sabredav.org',
+ 'REQUEST_URI' => '/foo'
+ ];
+
- $r = Request::createFromServerArray($s);
++ $r = Sapi::createFromServerArray($s);
+
+ $this->assertEquals('http://sabredav.org/foo', $r->getAbsoluteUrl());
+
+ $s = [
+ 'HTTP_HOST' => 'sabredav.org',
+ 'REQUEST_URI' => '/foo',
+ 'HTTPS' => 'on',
+ ];
+
- $r = Request::createFromServerArray($s);
++ $r = Sapi::createFromServerArray($s);
+
+ $this->assertEquals('https://sabredav.org/foo', $r->getAbsoluteUrl());
+
+ }
+
+ function testGetPostData() {
+
+ $post = [
+ 'bla' => 'foo',
+ ];
+ $r = new Request();
+ $r->setPostData($post);
+ $this->assertEquals($post, $r->getPostData());
+
+ }
+
+ function testGetPath() {
+
+ $request = new Request();
+ $request->setBaseUrl('/foo');
+ $request->setUrl('/foo/bar/');
+
+ $this->assertEquals('bar', $request->getPath());
+
+ }
+
+ function testGetPathStrippedQuery() {
+
+ $request = new Request();
+ $request->setBaseUrl('/foo');
+ $request->setUrl('/foo/bar/?a=b');
+
+ $this->assertEquals('bar', $request->getPath());
+
+ }
+
+ function testGetPathMissingSlash() {
+
+ $request = new Request();
+ $request->setBaseUrl('/foo/');
+ $request->setUrl('/foo');
+
+ $this->assertEquals('', $request->getPath());
+
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ function testGetPathOutsideBaseUrl() {
+
+ $request = new Request();
+ $request->setBaseUrl('/foo/');
+ $request->setUrl('/bar/');
+
+ $request->getPath();
+
+ }
++
++ function testToString() {
++
++ $request = new Request('PUT', '/foo/bar', ['Content-Type' => 'text/xml']);
++ $request->setBody('foo');
++
++ $expected = <<<HI
++PUT /foo/bar HTTP/1.1\r
++Content-Type: text/xml\r
++\r
++foo
++HI;
++ $this->assertEquals($expected, (string)$request);
++
++ }
+}
diff --cc vendor/sabre/http/tests/Sabre/HTTP/ResponseDecoratorTest.php
index edf797f,0000000..0a1b18d
mode 100644,000000..100644
--- a/vendor/sabre/http/tests/Sabre/HTTP/ResponseDecoratorTest.php
+++ b/vendor/sabre/http/tests/Sabre/HTTP/ResponseDecoratorTest.php
@@@ -1,40 -1,0 +1,37 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+class ResponseDecoratorTest extends \PHPUnit_Framework_TestCase {
+
+ protected $inner;
+ protected $outer;
+
+ function setUp() {
+
+ $this->inner = new Response();
+ $this->outer = new ResponseDecorator($this->inner);
+
+ }
+
- /**
- * @runInSeparateProcess
- */
- function testSend() {
-
- $this->inner->setBody('foo');
-
- ob_start();
- $this->outer->send();
++ function testStatus() {
+
- $this->assertEquals('foo', ob_get_clean());
++ $this->outer->setStatus(201);
++ $this->assertEquals(201, $this->inner->getStatus());
++ $this->assertEquals(201, $this->outer->getStatus());
++ $this->assertEquals('Created', $this->inner->getStatusText());
++ $this->assertEquals('Created', $this->outer->getStatusText());
+
+ }
+
++ function testToString() {
+
- function testStatus() {
++ $this->inner->setStatus(201);
++ $this->inner->setBody('foo');
++ $this->inner->setHeader('foo','bar');
+
- $this->outer->setStatus(201);
- $this->assertEquals('201 Created', $this->inner->getStatus());
- $this->assertEquals('201 Created', $this->outer->getStatus());
++ $this->assertEquals((string)$this->inner, (string)$this->outer);
+
+ }
+
+}
diff --cc vendor/sabre/http/tests/Sabre/HTTP/ResponseTest.php
index 11d0978,0000000..117551b
mode 100644,000000..100644
--- a/vendor/sabre/http/tests/Sabre/HTTP/ResponseTest.php
+++ b/vendor/sabre/http/tests/Sabre/HTTP/ResponseTest.php
@@@ -1,58 -1,0 +1,48 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+class ResponseTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $response = new Response(200, ['Content-Type' => 'text/xml']);
- $this->assertEquals('200 OK', $response->getStatus());
++ $this->assertEquals(200, $response->getStatus());
++ $this->assertEquals('OK', $response->getStatusText());
+
+ }
+
- /**
- * @runInSeparateProcess
- *
- * Unfortunately we have no way of testing if the HTTP response code got
- * changed.
- */
- function testSend() {
-
- if (!function_exists('xdebug_get_headers')) {
- $this->markTestSkipped('XDebug needs to be installed for this test to run');
- }
-
- $response = new Response(204, ['Content-Type', 'text/xml']);
- $response->setBody('foo');
-
- ob_start();
-
- $response->send();
- $headers = xdebug_get_headers();
-
- $result = ob_get_clean();
- header_remove();
++ function testSetStatus() {
+
- $this->assertEquals(
- [
- "0: Content-Type",
- "1: text/xml",
- ],
- $headers
- );
-
- $this->assertEquals('foo', $result);
++ $response = new Response();
++ $response->setStatus('402 Where\'s my money?');
++ $this->assertEquals(402, $response->getStatus());
++ $this->assertEquals('Where\'s my money?', $response->getStatusText());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testInvalidStatus() {
+
+ $response = new Response(1000);
+
+ }
+
++ function testToString() {
++
++ $response = new Response(200, ['Content-Type' => 'text/xml']);
++ $response->setBody('foo');
++
++ $expected = <<<HI
++HTTP/1.1 200 OK\r
++Content-Type: text/xml\r
++\r
++foo
++HI;
++ $this->assertEquals($expected, (string)$response);
++
++ }
++
+}
diff --cc vendor/sabre/http/tests/Sabre/HTTP/SapiTest.php
index 0000000,0000000..6e3aa3e
new file mode 100644
--- /dev/null
+++ b/vendor/sabre/http/tests/Sabre/HTTP/SapiTest.php
@@@ -1,0 -1,0 +1,117 @@@
++<?php
++
++namespace Sabre\HTTP;
++
++class SapiTest extends \PHPUnit_Framework_TestCase {
++
++ function testConstructFromServerArray() {
++
++ $request = Sapi::createFromServerArray(array(
++ 'REQUEST_URI' => '/foo',
++ 'REQUEST_METHOD' => 'GET',
++ 'HTTP_USER_AGENT' => 'Evert',
++ 'CONTENT_TYPE' => 'text/xml',
++ 'CONTENT_LENGTH' => '400',
++ 'SERVER_PROTOCOL' => 'HTTP/1.0',
++ ));
++
++ $this->assertEquals('GET', $request->getMethod());
++ $this->assertEquals('/foo', $request->getUrl());
++ $this->assertEquals(array(
++ 'User-Agent' => 'Evert',
++ 'Content-Type' => 'text/xml',
++ 'Content-Length' => '400',
++ ), $request->getHeaders());
++
++ $this->assertEquals('1.0', $request->getHttpVersion());
++
++ $this->assertEquals('400', $request->getRawServerValue('CONTENT_LENGTH'));
++ $this->assertNull($request->getRawServerValue('FOO'));
++
++ }
++
++ function testConstructPHPAuth() {
++
++ $request = Sapi::createFromServerArray(array(
++ 'REQUEST_URI' => '/foo',
++ 'REQUEST_METHOD' => 'GET',
++ 'PHP_AUTH_USER' => 'user',
++ 'PHP_AUTH_PW' => 'pass',
++ ));
++
++ $this->assertEquals('GET', $request->getMethod());
++ $this->assertEquals('/foo', $request->getUrl());
++ $this->assertEquals(array(
++ 'Authorization' => 'Basic ' . base64_encode('user:pass'),
++ ), $request->getHeaders());
++
++ }
++
++ function testConstructPHPAuthDigest() {
++
++ $request = Sapi::createFromServerArray(array(
++ 'REQUEST_URI' => '/foo',
++ 'REQUEST_METHOD' => 'GET',
++ 'PHP_AUTH_DIGEST' => 'blabla',
++ ));
++
++ $this->assertEquals('GET', $request->getMethod());
++ $this->assertEquals('/foo', $request->getUrl());
++ $this->assertEquals(array(
++ 'Authorization' => 'Digest blabla',
++ ), $request->getHeaders());
++
++ }
++
++ function testConstructRedirectAuth() {
++
++ $request = Sapi::createFromServerArray(array(
++ 'REQUEST_URI' => '/foo',
++ 'REQUEST_METHOD' => 'GET',
++ 'REDIRECT_HTTP_AUTHORIZATION' => 'Basic bla',
++ ));
++
++ $this->assertEquals('GET', $request->getMethod());
++ $this->assertEquals('/foo', $request->getUrl());
++ $this->assertEquals(array(
++ 'Authorization' => 'Basic bla',
++ ), $request->getHeaders());
++
++ }
++
++ /**
++ * @runInSeparateProcess
++ *
++ * Unfortunately we have no way of testing if the HTTP response code got
++ * changed.
++ */
++ function testSend() {
++
++ if (!function_exists('xdebug_get_headers')) {
++ $this->markTestSkipped('XDebug needs to be installed for this test to run');
++ }
++
++ $response = new Response(204, ['Content-Type', 'text/xml']);
++ $response->setBody('foo');
++
++ ob_start();
++
++ Sapi::sendResponse($response);
++ $headers = xdebug_get_headers();
++
++ $result = ob_get_clean();
++ header_remove();
++
++ $this->assertEquals(
++ [
++ "0: Content-Type",
++ "1: text/xml",
++ ],
++ $headers
++ );
++
++ $this->assertEquals('foo', $result);
++
++ }
++
++}
diff --cc vendor/sabre/http/tests/Sabre/HTTP/URLUtilTest.php
index 5749701,0000000..a3d4511
mode 100644,000000..100644
--- a/vendor/sabre/http/tests/Sabre/HTTP/URLUtilTest.php
+++ b/vendor/sabre/http/tests/Sabre/HTTP/URLUtilTest.php
@@@ -1,131 -1,0 +1,131 @@@
+<?php
+
+namespace Sabre\HTTP;
+
+class URLUtilTest extends \PHPUnit_Framework_TestCase{
+
+ function testEncodePath() {
+
+ $str = '';
+ for($i=0;$i<128;$i++) $str.=chr($i);
+
+ $newStr = URLUtil::encodePath($str);
+
+ $this->assertEquals(
+ '%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f'.
+ '%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f'.
+ '%20%21%22%23%24%25%26%27()%2a%2b%2c-./'.
- '0123456789%3a%3b%3c%3d%3e%3f'.
++ '0123456789:%3b%3c%3d%3e%3f'.
+ '%40ABCDEFGHIJKLMNO' .
+ 'PQRSTUVWXYZ%5b%5c%5d%5e_' .
+ '%60abcdefghijklmno' .
+ 'pqrstuvwxyz%7b%7c%7d~%7f',
+ $newStr);
+
+ $this->assertEquals($str,URLUtil::decodePath($newStr));
+
+ }
+
+ function testEncodePathSegment() {
+
+ $str = '';
+ for($i=0;$i<128;$i++) $str.=chr($i);
+
+ $newStr = URLUtil::encodePathSegment($str);
+
+ // Note: almost exactly the same as the last test, with the
+ // exception of the encoding of / (ascii code 2f)
+ $this->assertEquals(
+ '%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f'.
+ '%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f'.
+ '%20%21%22%23%24%25%26%27()%2a%2b%2c-.%2f'.
- '0123456789%3a%3b%3c%3d%3e%3f'.
++ '0123456789:%3b%3c%3d%3e%3f'.
+ '%40ABCDEFGHIJKLMNO' .
+ 'PQRSTUVWXYZ%5b%5c%5d%5e_' .
+ '%60abcdefghijklmno' .
+ 'pqrstuvwxyz%7b%7c%7d~%7f',
+ $newStr);
+
+ $this->assertEquals($str,URLUtil::decodePathSegment($newStr));
+
+ }
+
+ function testDecode() {
+
+ $str = 'Hello%20Test+Test2.txt';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals('Hello Test+Test2.txt',$newStr);
+
+ }
+
+ /**
+ * @depends testDecode
+ */
+ function testDecodeUmlaut() {
+
+ $str = 'Hello%C3%BC.txt';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals("Hello\xC3\xBC.txt",$newStr);
+
+ }
+
+ /**
+ * @depends testDecodeUmlaut
+ */
+ function testDecodeUmlautLatin1() {
+
+ $str = 'Hello%FC.txt';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals("Hello\xC3\xBC.txt",$newStr);
+
+ }
+
+ /**
+ * This testcase was sent by a bug reporter
+ *
+ * @depends testDecode
+ */
+ function testDecodeAccentsWindows7() {
+
+ $str = '/webdav/%C3%A0fo%C3%B3';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals(strtolower($str),URLUtil::encodePath($newStr));
+
+ }
+
+ function testSplitPath() {
+
+ $strings = array(
+
+ // input // expected result
+ '/foo/bar' => array('/foo','bar'),
+ '/foo/bar/' => array('/foo','bar'),
+ 'foo/bar/' => array('foo','bar'),
+ 'foo/bar' => array('foo','bar'),
+ 'foo/bar/baz' => array('foo/bar','baz'),
+ 'foo/bar/baz/' => array('foo/bar','baz'),
+ 'foo' => array('','foo'),
+ 'foo/' => array('','foo'),
+ '/foo/' => array('','foo'),
+ '/foo' => array('','foo'),
+ '' => array(null,null),
+
+ // UTF-8
+ "/\xC3\xA0fo\xC3\xB3/bar" => array("/\xC3\xA0fo\xC3\xB3",'bar'),
+ "/\xC3\xA0foo/b\xC3\xBCr/" => array("/\xC3\xA0foo","b\xC3\xBCr"),
+ "foo/\xC3\xA0\xC3\xBCr" => array("foo","\xC3\xA0\xC3\xBCr"),
+
+ );
+
+ foreach($strings as $input => $expected) {
+
+ $output = URLUtil::splitPath($input);
+ $this->assertEquals($expected, $output, 'The expected output for \'' . $input . '\' was incorrect');
+
+
+ }
+
+
+ }
+
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/php-sabredav.git
More information about the Pkg-owncloud-commits
mailing list