diff --git a/lib/DAV/Xml/Element/Response.php b/lib/DAV/Xml/Element/Response.php index 434d27d401..79f06a09bf 100644 --- a/lib/DAV/Xml/Element/Response.php +++ b/lib/DAV/Xml/Element/Response.php @@ -186,8 +186,21 @@ public static function xmlDeserialize(Reader $reader) return []; } + + if (!$reader->read()) { + $reader->next(); + + return []; + } + + if (Reader::END_ELEMENT === $reader->nodeType) { + $reader->next(); + + return []; + } + $values = []; - $reader->read(); + do { if (Reader::ELEMENT === $reader->nodeType) { $clark = $reader->getClark(); @@ -199,9 +212,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'] + ); + } }