]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix xml ocs response for serializable objects 30417/head
authorKlaus <klaus@jsxc.org>
Mon, 27 Dec 2021 14:17:07 +0000 (15:17 +0100)
committerskjnldsv <skjnldsv@protonmail.com>
Fri, 23 Feb 2024 13:49:22 +0000 (14:49 +0100)
Signed-off-by: sualko <klaus@jsxc.org>
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
lib/private/AppFramework/OCS/BaseResponse.php
tests/lib/AppFramework/OCS/BaseResponseTest.php

index 3cfe8177ae78a1a995dd4f32d8787487eb682828..78bcc5586d31b03f24def9e873b75f7c70070383 100644 (file)
@@ -159,6 +159,10 @@ abstract class BaseResponse extends Response {
                                $writer->startElement($k);
                                $this->toXML($v, $writer);
                                $writer->endElement();
+                       } elseif ($v instanceof \JsonSerializable) {
+                               $writer->startElement($k);
+                               $this->toXML($v->jsonSerialize(), $writer);
+                               $writer->endElement();
                        } else {
                                $writer->writeElement($k, $v);
                        }
index a1e0c620574636aa8d022312f38371929eb16d9a..4857b573802d149e7825aaacc7151fcb0ddd7d33 100644 (file)
@@ -28,6 +28,17 @@ namespace Test\AppFramework\Middleware;
 
 use OC\AppFramework\OCS\BaseResponse;
 
+class ArrayValue implements \JsonSerializable {
+       private $array;
+       public function __construct(array $array) {
+               $this->array = $array;
+       }
+
+       public function jsonSerialize(): mixed {
+               return $this->array;
+       }
+}
+
 class BaseResponseTest extends \Test\TestCase {
        public function testToXml(): void {
                /** @var BaseResponse $response */
@@ -56,4 +67,32 @@ class BaseResponseTest extends \Test\TestCase {
                        $writer->outputMemory(true)
                );
        }
+       
+       public function testToXmlJsonSerializable(): void {
+               /** @var BaseResponse $response */
+               $response = $this->createMock(BaseResponse::class);
+
+               $writer = new \XMLWriter();
+               $writer->openMemory();
+               $writer->setIndent(false);
+               $writer->startDocument();
+
+               $data = [
+                       'hello' => 'hello',
+                       'information' => new ArrayValue([
+                               '@test' => 'some data',
+                               'someElement' => 'withAttribute',
+                       ]),
+                       'value without key',
+                       'object' => new \stdClass(),
+               ];
+
+               $this->invokePrivate($response, 'toXml', [$data, $writer]);
+               $writer->endDocument();
+
+               $this->assertEquals(
+                       "<?xml version=\"1.0\"?>\n<hello>hello</hello><information test=\"some data\"><someElement>withAttribute</someElement></information><element>value without key</element><object/>\n",
+                       $writer->outputMemory(true)
+               );
+       }
 }