From fcac54eb379156bf49b206997ba500b3ea2a50fd Mon Sep 17 00:00:00 2001 From: Maxcastel Date: Fri, 23 Oct 2026 15:14:54 +0200 Subject: [PATCH 1/4] fix(metadata): allow an empty args element in XML --- src/Metadata/Extractor/ResourceExtractorTrait.php | 2 +- src/Metadata/Extractor/schema/resources.xsd | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Metadata/Extractor/ResourceExtractorTrait.php b/src/Metadata/Extractor/ResourceExtractorTrait.php index 871ea17dcce..997d868f8d9 100644 --- a/src/Metadata/Extractor/ResourceExtractorTrait.php +++ b/src/Metadata/Extractor/ResourceExtractorTrait.php @@ -80,7 +80,7 @@ private function phpize(\SimpleXMLElement|array|null $resource, string $key, str private function buildArgs(\SimpleXMLElement $resource): ?array { - if (!isset($resource->args->arg)) { + if (!isset($resource->args)) { return null; } diff --git a/src/Metadata/Extractor/schema/resources.xsd b/src/Metadata/Extractor/schema/resources.xsd index 295dd495993..abcfc513809 100644 --- a/src/Metadata/Extractor/schema/resources.xsd +++ b/src/Metadata/Extractor/schema/resources.xsd @@ -79,8 +79,8 @@ - - + + From 4e3cf3410639c48482ea115c8d17960abec1bf58 Mon Sep 17 00:00:00 2001 From: Maxcastel Date: Fri, 23 Oct 2026 15:14:57 +0200 Subject: [PATCH 2/4] fix(metadata): read every link and header in XML --- src/Metadata/Extractor/XmlResourceExtractor.php | 8 ++++---- src/Metadata/Extractor/schema/resources.xsd | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Metadata/Extractor/XmlResourceExtractor.php b/src/Metadata/Extractor/XmlResourceExtractor.php index bc382f2553c..51b18071a87 100644 --- a/src/Metadata/Extractor/XmlResourceExtractor.php +++ b/src/Metadata/Extractor/XmlResourceExtractor.php @@ -509,8 +509,8 @@ private function buildLinks(\SimpleXMLElement $resource): ?array } $links = []; - foreach ($resource->links as $link) { - $links[] = new Link(rel: (string) $link->link->attributes()->rel, href: (string) $link->link->attributes()->href); + foreach ($resource->links->link as $link) { + $links[] = new Link(rel: (string) $link->attributes()->rel, href: (string) $link->attributes()->href); } return $links; @@ -526,8 +526,8 @@ private function buildHeaders(\SimpleXMLElement $resource): ?array } $headers = []; - foreach ($resource->headers as $header) { - $headers[(string) $header->header->attributes()->key] = (string) $header->header->attributes()->value; + foreach ($resource->headers->header as $header) { + $headers[(string) $header->attributes()->key] = (string) $header->attributes()->value; } return $headers; diff --git a/src/Metadata/Extractor/schema/resources.xsd b/src/Metadata/Extractor/schema/resources.xsd index abcfc513809..8597411beab 100644 --- a/src/Metadata/Extractor/schema/resources.xsd +++ b/src/Metadata/Extractor/schema/resources.xsd @@ -420,7 +420,7 @@ - + @@ -433,7 +433,7 @@ - + From 222bd07a5aac3ef32cb91defbecad8e2b04bffcf Mon Sep 17 00:00:00 2001 From: Maxcastel Date: Fri, 23 Oct 2026 15:14:57 +0200 Subject: [PATCH 3/4] fix(metadata): accept openapi on XML resources and zero or negative integers --- src/Metadata/Extractor/schema/resources.xsd | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Metadata/Extractor/schema/resources.xsd b/src/Metadata/Extractor/schema/resources.xsd index 8597411beab..b5bb6d1fa91 100644 --- a/src/Metadata/Extractor/schema/resources.xsd +++ b/src/Metadata/Extractor/schema/resources.xsd @@ -23,6 +23,7 @@ + @@ -45,7 +46,7 @@ - + @@ -73,7 +74,7 @@ - + @@ -513,8 +514,8 @@ - - + + From e15ebe70a3b3ebb03786d0ced00d1159a91945e8 Mon Sep 17 00:00:00 2001 From: Maxcastel Date: Fri, 23 Oct 2026 15:14:57 +0200 Subject: [PATCH 4/4] test(metadata): cover the relaxed XML schema --- .../Tests/Extractor/XmlExtractorTest.php | 12 +++++++++ .../Extractor/xml/less_strict_schema.xml | 25 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/Metadata/Tests/Extractor/xml/less_strict_schema.xml diff --git a/src/Metadata/Tests/Extractor/XmlExtractorTest.php b/src/Metadata/Tests/Extractor/XmlExtractorTest.php index 1c1e8545de8..f245385294d 100644 --- a/src/Metadata/Tests/Extractor/XmlExtractorTest.php +++ b/src/Metadata/Tests/Extractor/XmlExtractorTest.php @@ -478,6 +478,18 @@ public static function getInvalidPaths(): array ]; } + public function testLessStrictSchema(): void + { + $resource = (new XmlResourceExtractor([__DIR__.'/xml/less_strict_schema.xml']))->getResources()[Comment::class][0]; + + $this->assertFalse($resource['openapi']); + $this->assertSame(0, $resource['paginationItemsPerPage']); + $this->assertSame(['https://example.com/a', 'https://example.com/b'], array_map(static fn ($link) => $link->getHref(), $resource['links'])); + $this->assertSame(['X-A' => 'a', 'X-B' => 'b'], $resource['headers']); + $this->assertSame(-1, $resource['operations'][0]['priority']); + $this->assertSame([], $resource['graphQlOperations'][0]['args']); + } + /** * Tests issue #8175: two XML operations sharing an explicit name silently * dropped one another. The factory must reject the duplicate up front. diff --git a/src/Metadata/Tests/Extractor/xml/less_strict_schema.xml b/src/Metadata/Tests/Extractor/xml/less_strict_schema.xml new file mode 100644 index 00000000000..682e82ab311 --- /dev/null +++ b/src/Metadata/Tests/Extractor/xml/less_strict_schema.xml @@ -0,0 +1,25 @@ + + + + + + + + + +
+
+ + + + + + + + + + +