diff --git a/lib/DAV/Xml/Element/Response.php b/lib/DAV/Xml/Element/Response.php index 45c161fa4f..d06ffd2523 100644 --- a/lib/DAV/Xml/Element/Response.php +++ b/lib/DAV/Xml/Element/Response.php @@ -181,13 +181,27 @@ public static function xmlDeserialize(Reader $reader) // child-elements implies 'no value' in {DAV:}prop, so we want to skip // deserializers and just set null for those. $reader->elementMap['{DAV:}prop'] = function (Reader $reader) { - if ($reader->isEmptyElement) { - $reader->next(); + // If there's no children, we don't do anything. + if ($reader->isEmptyElement) { + $reader->next(); + + return []; + } + + if (!$reader->read()) { + $reader->next(); + + return []; + } + + if (Reader::END_ELEMENT === $reader->nodeType) { + $reader->next(); + + return []; + } + + $values = []; - return []; - } - $values = []; - $reader->read(); do { if (Reader::ELEMENT === $reader->nodeType) { $clark = $reader->getClark(); @@ -199,9 +213,12 @@ public static function xmlDeserialize(Reader $reader) $values[$clark] = $reader->parseCurrentElement()['value']; } } else { - $reader->read(); + if (!$reader->read()) { + break; + } } } while (Reader::END_ELEMENT !== $reader->nodeType); + $reader->read(); return $values; diff --git a/tests/Sabre/DAV/Xml/Element/ResponseTest.php b/tests/Sabre/DAV/Xml/Element/ResponseTest.php index 9e198088d0..080dc7de23 100644 --- a/tests/Sabre/DAV/Xml/Element/ResponseTest.php +++ b/tests/Sabre/DAV/Xml/Element/ResponseTest.php @@ -301,4 +301,35 @@ public function testDeserializeComplexPropertyEmpty() $result['value'] ); } + + public function testDeserializeNoProperties() + { + $xml = ' + + /uri + + + HTTP/1.1 200 OK + + + + + + HTTP/1.1 404 OK + + +'; + + $result = $this->parse($xml, [ + '{DAV:}response' => Response::class, + ]); + $this->assertEquals( + new Response('/uri', [ + '404' => [ + '{DAV:}foo' => null, + ], + ]), + $result['value'] + ); + } }