Skip to content

Commit bef4677

Browse files
sualkoskjnldsv
authored andcommitted
fix xml ocs response for serializable objects
Signed-off-by: sualko <[email protected]>
1 parent fa773ec commit bef4677

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

lib/private/AppFramework/OCS/BaseResponse.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ protected function toXML(array $array, \XMLWriter $writer): void {
159159
$writer->startElement($k);
160160
$this->toXML($v, $writer);
161161
$writer->endElement();
162+
} elseif ($v instanceof \JsonSerializable) {
163+
$writer->startElement($k);
164+
$this->toXML($v->jsonSerialize(), $writer);
165+
$writer->endElement();
162166
} else {
163167
$writer->writeElement($k, $v);
164168
}

tests/lib/AppFramework/OCS/BaseResponseTest.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,17 @@
2828

2929
use OC\AppFramework\OCS\BaseResponse;
3030

31+
class ArrayValue implements \JsonSerializable {
32+
private $array;
33+
public function __construct(array $array) {
34+
$this->array = $array;
35+
}
36+
37+
public function jsonSerialize(): mixed {
38+
return $this->array;
39+
}
40+
}
41+
3142
class BaseResponseTest extends \Test\TestCase {
3243
public function testToXml(): void {
3344
/** @var BaseResponse $response */
@@ -56,4 +67,32 @@ public function testToXml(): void {
5667
$writer->outputMemory(true)
5768
);
5869
}
70+
71+
public function testToXmlJsonSerializable(): void {
72+
/** @var BaseResponse $response */
73+
$response = $this->createMock(BaseResponse::class);
74+
75+
$writer = new \XMLWriter();
76+
$writer->openMemory();
77+
$writer->setIndent(false);
78+
$writer->startDocument();
79+
80+
$data = [
81+
'hello' => 'hello',
82+
'information' => new ArrayValue([
83+
'@test' => 'some data',
84+
'someElement' => 'withAttribute',
85+
]),
86+
'value without key',
87+
'object' => new \stdClass(),
88+
];
89+
90+
$this->invokePrivate($response, 'toXml', [$data, $writer]);
91+
$writer->endDocument();
92+
93+
$this->assertEquals(
94+
"<?xml version=\"1.0\"?>\n<hello>hello</hello><information test=\"some data\"><someElement>withAttribute</someElement></information><element>value without key</element><object/>\n",
95+
$writer->outputMemory(true)
96+
);
97+
}
5998
}

0 commit comments

Comments
 (0)