From e6e63017f07ef1830f1e9d3818120ed0a5593d32 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Tue, 4 Jun 2019 20:42:06 +0200 Subject: [PATCH] [HttpFoundation] work around PHP 7.3 bug related to json_encode() --- .../Console/Descriptor/JsonDescriptor.php | 6 ++++++ .../Component/Console/Descriptor/JsonDescriptor.php | 9 ++++++++- .../Component/Form/Console/Descriptor/JsonDescriptor.php | 6 ++++++ src/Symfony/Component/HttpFoundation/JsonResponse.php | 5 +++++ src/Symfony/Component/Serializer/Encoder/JsonEncode.php | 5 +++++ .../Component/Translation/Dumper/JsonFileDumper.php | 5 +++++ 6 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php index 6b05612ff5..2e00fc2262 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php @@ -185,6 +185,12 @@ class JsonDescriptor extends Descriptor private function writeData(array $data, array $options) { $flags = isset($options['json_encoding']) ? $options['json_encoding'] : 0; + + if (\PHP_VERSION_ID >= 70300 && (JSON_THROW_ON_ERROR & $flags)) { + // Work around https://bugs.php.net/77997 + json_encode(null); + } + $this->write(json_encode($data, $flags | JSON_PRETTY_PRINT)."\n"); } diff --git a/src/Symfony/Component/Console/Descriptor/JsonDescriptor.php b/src/Symfony/Component/Console/Descriptor/JsonDescriptor.php index 197b843d4b..529fb82c40 100644 --- a/src/Symfony/Component/Console/Descriptor/JsonDescriptor.php +++ b/src/Symfony/Component/Console/Descriptor/JsonDescriptor.php @@ -97,7 +97,14 @@ class JsonDescriptor extends Descriptor */ private function writeData(array $data, array $options) { - $this->write(json_encode($data, isset($options['json_encoding']) ? $options['json_encoding'] : 0)); + $flags = isset($options['json_encoding']) ? $options['json_encoding'] : 0; + + if (\PHP_VERSION_ID >= 70300 && (JSON_THROW_ON_ERROR & $flags)) { + // Work around https://bugs.php.net/77997 + json_encode(null); + } + + $this->write(json_encode($data, $flags)); } /** diff --git a/src/Symfony/Component/Form/Console/Descriptor/JsonDescriptor.php b/src/Symfony/Component/Form/Console/Descriptor/JsonDescriptor.php index ab518dbfee..00a5425866 100644 --- a/src/Symfony/Component/Form/Console/Descriptor/JsonDescriptor.php +++ b/src/Symfony/Component/Form/Console/Descriptor/JsonDescriptor.php @@ -82,6 +82,12 @@ class JsonDescriptor extends Descriptor private function writeData(array $data, array $options) { $flags = isset($options['json_encoding']) ? $options['json_encoding'] : 0; + + if (\PHP_VERSION_ID >= 70300 && (JSON_THROW_ON_ERROR & $flags)) { + // Work around https://bugs.php.net/77997 + json_encode(null); + } + $this->output->write(json_encode($data, $flags | JSON_PRETTY_PRINT)."\n"); } diff --git a/src/Symfony/Component/HttpFoundation/JsonResponse.php b/src/Symfony/Component/HttpFoundation/JsonResponse.php index 6fb32ee41b..52f55f7486 100644 --- a/src/Symfony/Component/HttpFoundation/JsonResponse.php +++ b/src/Symfony/Component/HttpFoundation/JsonResponse.php @@ -153,6 +153,11 @@ class JsonResponse extends Response restore_error_handler(); } } else { + if (\PHP_VERSION_ID >= 70300 && (JSON_THROW_ON_ERROR & $this->encodingOptions)) { + // Work around https://bugs.php.net/77997 + json_encode(null); + } + try { $data = json_encode($data, $this->encodingOptions); } catch (\Exception $e) { diff --git a/src/Symfony/Component/Serializer/Encoder/JsonEncode.php b/src/Symfony/Component/Serializer/Encoder/JsonEncode.php index 9b07d709b8..e5b48757dd 100644 --- a/src/Symfony/Component/Serializer/Encoder/JsonEncode.php +++ b/src/Symfony/Component/Serializer/Encoder/JsonEncode.php @@ -36,6 +36,11 @@ class JsonEncode implements EncoderInterface { $context = $this->resolveContext($context); + if (\PHP_VERSION_ID >= 70300 && (JSON_THROW_ON_ERROR & $context['json_encode_options'])) { + // Work around https://bugs.php.net/77997 + json_encode(null); + } + $encodedJson = json_encode($data, $context['json_encode_options']); if (JSON_ERROR_NONE !== json_last_error() && (false === $encodedJson || !($context['json_encode_options'] & JSON_PARTIAL_OUTPUT_ON_ERROR))) { diff --git a/src/Symfony/Component/Translation/Dumper/JsonFileDumper.php b/src/Symfony/Component/Translation/Dumper/JsonFileDumper.php index 3ee446dc73..2a8d23d477 100644 --- a/src/Symfony/Component/Translation/Dumper/JsonFileDumper.php +++ b/src/Symfony/Component/Translation/Dumper/JsonFileDumper.php @@ -31,6 +31,11 @@ class JsonFileDumper extends FileDumper $flags = \defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0; } + if (\PHP_VERSION_ID >= 70300 && (JSON_THROW_ON_ERROR & $flags)) { + // Work around https://bugs.php.net/77997 + json_encode(null); + } + return json_encode($messages->all($domain), $flags); }