fix: preserve serialized object payloads
This commit is contained in:
@@ -32,7 +32,7 @@ final class MetadataUrlTransformer {
|
|||||||
if ( $this->looksSerialized( $value ) ) {
|
if ( $this->looksSerialized( $value ) ) {
|
||||||
$unserialized = $this->unserializeValue( $value );
|
$unserialized = $this->unserializeValue( $value );
|
||||||
|
|
||||||
if ( ! $unserialized['valid'] || is_object( $unserialized['value'] ) ) {
|
if ( ! $unserialized['valid'] || $this->containsObject( $unserialized['value'] ) ) {
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,4 +118,25 @@ final class MetadataUrlTransformer {
|
|||||||
|
|
||||||
return '' !== $trimmed && in_array( $trimmed[0], array( '{', '[' ), true );
|
return '' !== $trimmed && in_array( $trimmed[0], array( '{', '[' ), true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $value Value to inspect.
|
||||||
|
*/
|
||||||
|
private function containsObject( $value ): bool {
|
||||||
|
if ( is_object( $value ) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! is_array( $value ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ( $value as $item ) {
|
||||||
|
if ( $this->containsObject( $item ) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,6 +100,13 @@ class MetadataUrlTransformerTest extends TestCase {
|
|||||||
self::assertSame( $value, $transformer->transformValue( $value, $this->mappings() ) );
|
self::assertSame( $value, $transformer->transformValue( $value, $this->mappings() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function test_it_leaves_serialized_payloads_with_nested_objects_unchanged(): void {
|
||||||
|
$transformer = new MetadataUrlTransformer( new UrlTransformer() );
|
||||||
|
$value = 'a:2:{s:3:"url";s:28:"https://example.test/inside";s:6:"object";O:8:"stdClass":0:{}}';
|
||||||
|
|
||||||
|
self::assertSame( $value, $transformer->transformValue( $value, $this->mappings() ) );
|
||||||
|
}
|
||||||
|
|
||||||
public function test_it_leaves_invalid_json_strings_unchanged(): void {
|
public function test_it_leaves_invalid_json_strings_unchanged(): void {
|
||||||
$transformer = new MetadataUrlTransformer( new UrlTransformer() );
|
$transformer = new MetadataUrlTransformer( new UrlTransformer() );
|
||||||
$value = '{"url":"https://example.test/missing"';
|
$value = '{"url":"https://example.test/missing"';
|
||||||
|
|||||||
Reference in New Issue
Block a user