[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