From c1da06022306b64ff6fe023375c4e78cb2785b74 Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Sat, 9 Oct 2021 21:59:09 +0200 Subject: [PATCH] Make sure a {DAV:}prop is not empty Port https://github.com/sabre-io/xml/pull/158 to the prop parser to sabre/dav Signed-off-by: Daniel Kesselberg --- lib/DAV/Xml/Element/Response.php | 20 +++++++++++-- tests/Sabre/DAV/Xml/Element/ResponseTest.php | 31 ++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) 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'] + ); + } }