diff -ruN nextcloud/3rdparty/sabre/uri/lib-dist/functions.php nextcloud/3rdparty/sabre/uri/lib/functions.php
--- nextcloud/3rdparty/sabre/uri/lib-dist/functions.php	2016-09-28 09:30:26.000000000 -0400
+++ nextcloud/3rdparty/sabre/uri/lib/functions.php	2017-08-13 14:01:09.211048892 -0400
@@ -193,8 +193,13 @@
         $uri
     );
 
+    $result = parse_url($uri);
+    if (!$result) {
+        $result = _parse_fallback($uri);
+    }
+ 
     return
-        parse_url($uri) + [
+        $result + [
             'scheme'   => null,
             'host'     => null,
             'path'     => null,
@@ -280,3 +285,90 @@
     return [null,null];
 
 }
+
+/**
+ * This function is another implementation of parse_url, except this one is
+ * fully written in PHP.
+ *
+ * The reason is that the PHP bug team is not willing to admit that there are
+ * bugs in the parse_url implementation.
+ *
+ * This function is only called if the main parse method fails. It's pretty
+ * crude and probably slow, so the original parse_url is usually preferred.
+ *
+ * @param string $uri
+ * @return array
+ */
+
+function _parse_fallback($uri) {
+
+    // Normally a URI must be ASCII, however. However, often it's not and
+    // parse_url might corrupt these strings.
+    //
+    // For that reason we take any non-ascii characters from the uri and
+    // uriencode them first.
+    $uri = preg_replace_callback(
+        '/[^[:ascii:]]/u',
+        function($matches) {
+            return rawurlencode($matches[0]);
+        },
+        $uri
+    );
+
+    $result = [
+        'scheme'   => null,
+        'host'     => null,
+        'port'     => null,
+        'user'     => null,
+        'path'     => null,
+        'fragment' => null,
+        'query'    => null,
+    ];
+
+    if (preg_match('% ^([A-Za-z][A-Za-z0-9+-\.]+): %x', $uri, $matches)) {
+
+        $result['scheme'] = $matches[1];
+        // Take what's left.
+        $uri = substr($uri, strlen($result['scheme']) + 1);
+
+    }
+
+    // Taking off a fragment part
+    if (strpos($uri, '#')) {
+        list($uri, $result['fragment']) = explode('#', $uri, 2);
+    }
+    // Taking off the query part
+    if (strpos($uri, '?')) {
+        list($uri, $result['query']) = explode('?', $uri, 2);
+    }
+
+    if (substr($uri, 0, 3) === '///') {
+      // The triple slash uris are a bit unusual, but we have special handling
+      // for them.
+      $result['path'] = substr($uri, 2);
+      $result['host'] = '';
+    } elseif (substr($uri, 0, 2) === '//') {
+        // Uris that have an authority part.
+        $regex = '
+          %^
+            //
+            (?: (?<user> [^:@]+) (: (?<pass> [^@]+)) @)?
+            (?<host> ( [^:/]* | \[ [^\]]+ \] ))
+            (?: : (?<port> [0-9]+))?
+            (?<path> / .*)?
+          $%x
+        ';
+        if (!preg_match($regex, $uri, $matches)) {
+            throw new InvalidUriException('Invalid, or could not parse URI');
+        }
+        if ($matches['host']) $result['host'] = $matches['host'];
+        if ($matches['port']) $result['port'] = (int)$matches['port'];
+        if (isset($matches['path'])) $result['path'] = $matches['path'];
+        if ($matches['user']) $result['user'] = $matches['user'];
+        if ($matches['pass']) $result['pass'] = $matches['pass'];
+    } else {
+        $result['path'] = $uri;
+    }
+
+    return $result;
+}
diff -ruN nextcloud/3rdparty/sabre/uri/lib-dist/InvalidUriException.php nextcloud/3rdparty/sabre/uri/lib/InvalidUriException.php
--- nextcloud/3rdparty/sabre/uri/lib-dist/InvalidUriException.php	1969-12-31 19:00:00.000000000 -0500
+++ nextcloud/3rdparty/sabre/uri/lib/InvalidUriException.php	2017-08-13 13:33:07.523035787 -0400
@@ -0,0 +1,17 @@
+<?php declare (strict_types=1);
+
+namespace Sabre\Uri;
+
+/**
+ * Invalid Uri
+ *
+ * This is thrown when an attempt was made to use Sabre\Uri parse a uri that
+ * it could not.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (https://evertpot.com/)
+ * @license http://sabre.io/license/
+ */
+class InvalidUriException extends \Exception {
+
+}
