From 56a8b31e4b117b0794f740c169e1d87aa191ea7f Mon Sep 17 00:00:00 2001 From: James Gilliland Date: Fri, 15 May 2020 11:17:51 -0500 Subject: [PATCH 1/2] Assert SoapFail can handle a structured detail --- tests/Monolog/Formatter/LineFormatterTest.php | 13 +++++++++++ .../Formatter/NormalizerFormatterTest.php | 22 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/tests/Monolog/Formatter/LineFormatterTest.php b/tests/Monolog/Formatter/LineFormatterTest.php index 1b115b9f..86d22d38 100644 --- a/tests/Monolog/Formatter/LineFormatterTest.php +++ b/tests/Monolog/Formatter/LineFormatterTest.php @@ -192,6 +192,19 @@ class LineFormatterTest extends \PHPUnit\Framework\TestCase $path = str_replace('\\/', '/', json_encode(__FILE__)); $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (SoapFault(code: 0 faultcode: foo faultactor: hello detail: world): bar at '.substr($path, 1, -1).':'.(__LINE__ - 8).')"} []'."\n", $message); + + $message = $formatter->format([ + 'level_name' => 'CRITICAL', + 'channel' => 'core', + 'context' => ['exception' => new \SoapFault('foo', 'bar', 'hello', (object) ['bar' => (object) ['biz' => 'baz'], 'foo' => 'world'])], + 'datetime' => new \DateTimeImmutable, + 'extra' => [], + 'message' => 'foobar', + ]); + + $path = str_replace('\\/', '/', json_encode(__FILE__)); + + $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (SoapFault(code: 0 faultcode: foo faultactor: hello detail: {\"bar\":{\"biz\":\"baz\"},\"foo\":\"world\"}): bar at '.substr($path, 1, -1).':'.(__LINE__ - 8).')"} []'."\n", $message); } public function testBatchFormat() diff --git a/tests/Monolog/Formatter/NormalizerFormatterTest.php b/tests/Monolog/Formatter/NormalizerFormatterTest.php index 9ea7f080..90dd835f 100644 --- a/tests/Monolog/Formatter/NormalizerFormatterTest.php +++ b/tests/Monolog/Formatter/NormalizerFormatterTest.php @@ -87,7 +87,7 @@ class NormalizerFormatterTest extends TestCase } $formatter = new NormalizerFormatter('Y-m-d'); - $e = new \SoapFault('foo', 'bar', 'hello', (object) ['foo' => 'world']); + $e = new \SoapFault('foo', 'bar', 'hello', 'world'); $formatted = $formatter->format([ 'exception' => $e, ]); @@ -105,6 +105,26 @@ class NormalizerFormatterTest extends TestCase 'detail' => 'world', ], ], $formatted); + + $formatter = new NormalizerFormatter('Y-m-d'); + $e = new \SoapFault('foo', 'bar', 'hello', (object) ['bar' => (object) ['biz' => 'baz'], 'foo' => 'world']); + $formatted = $formatter->format([ + 'exception' => $e, + ]); + + unset($formatted['exception']['trace']); + + $this->assertEquals([ + 'exception' => [ + 'class' => 'SoapFault', + 'message' => 'bar', + 'code' => 0, + 'file' => $e->getFile().':'.$e->getLine(), + 'faultcode' => 'foo', + 'faultactor' => 'hello', + 'detail' => '{"bar":{"biz":"baz"},"foo":"world"}', + ], + ], $formatted); } public function testFormatToStringExceptionHandle() From 2066ce89d03202a438d45f851f6ed44e482f245e Mon Sep 17 00:00:00 2001 From: James Gilliland Date: Fri, 15 May 2020 11:25:01 -0500 Subject: [PATCH 2/2] Fix SoapFault detail with nested object Fixes #1431 --- src/Monolog/Formatter/LineFormatter.php | 9 +++++++-- src/Monolog/Formatter/NormalizerFormatter.php | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Monolog/Formatter/LineFormatter.php b/src/Monolog/Formatter/LineFormatter.php index 9fe43193..0c342a54 100644 --- a/src/Monolog/Formatter/LineFormatter.php +++ b/src/Monolog/Formatter/LineFormatter.php @@ -180,8 +180,13 @@ class LineFormatter extends NormalizerFormatter $str .= ' faultactor: ' . $e->faultactor; } - if (isset($e->detail) && (is_string($e->detail) || is_object($e->detail) || is_array($e->detail))) { - $str .= ' detail: ' . (is_string($e->detail) ? $e->detail : reset($e->detail)); + if (isset($e->detail)) { + if (is_string($e->detail)) { + $str .= ' detail: ' . $e->detail; + } + elseif (is_object($e->detail) || is_array($e->detail)) { + $str .= ' detail: ' . Utils::jsonEncode($e->detail); + } } } $str .= '): ' . $e->getMessage() . ' at ' . $e->getFile() . ':' . $e->getLine() . ')'; diff --git a/src/Monolog/Formatter/NormalizerFormatter.php b/src/Monolog/Formatter/NormalizerFormatter.php index eb071329..7368ce04 100644 --- a/src/Monolog/Formatter/NormalizerFormatter.php +++ b/src/Monolog/Formatter/NormalizerFormatter.php @@ -202,8 +202,13 @@ class NormalizerFormatter implements FormatterInterface $data['faultactor'] = $e->faultactor; } - if (isset($e->detail) && (is_string($e->detail) || is_object($e->detail) || is_array($e->detail))) { - $data['detail'] = is_string($e->detail) ? $e->detail : reset($e->detail); + if (isset($e->detail)) { + if (is_string($e->detail)) { + $data['detail'] = $e->detail; + } + elseif (is_object($e->detail) || is_array($e->detail)) { + $data['detail'] = Utils::jsonEncode($e->detail); + } } }