1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
<?php /** * Whoops - php errors for cool kids * @author Filipe Dobreira <http://github.com/filp> */
namespace Whoops\Handler;
use SimpleXMLElement; use Whoops\Exception\Formatter;
/** * Catches an exception and converts it to an XML * response. Additionally can also return exception * frames for consumption by an API. */ class XmlResponseHandler extends Handler { /** * @var bool */ private $returnFrames = false;
/** * @param bool|null $returnFrames * @return bool|$this */ public function addTraceToOutput($returnFrames = null) { if (func_num_args() == 0) { return $this->returnFrames; }
$this->returnFrames = (bool) $returnFrames; return $this; }
/** * @return int */ public function handle() { $response = array( 'error' => Formatter::formatExceptionAsDataArray( $this->getInspector(), $this->addTraceToOutput() ), );
echo $this->toXml($response);
return Handler::QUIT; }
/** * @param SimpleXMLElement $node Node to append data to, will be modified in place * @param array|Traversable $data * @return SimpleXMLElement The modified node, for chaining */ private static function addDataToNode(\SimpleXMLElement $node, $data) { assert('is_array($data) || $node instanceof Traversable');
foreach ($data as $key => $value) { if (is_numeric($key)) { // Convert the key to a valid string $key = "unknownNode_". (string) $key; }
// Delete any char not allowed in XML element names $key = preg_replace('/[^a-z0-9\-\_\.\:]/i', '', $key);
if (is_array($value)) { $child = $node->addChild($key); self::addDataToNode($child, $value); } else { $value = str_replace('&', '&', print_r($value, true)); $node->addChild($key, $value); } }
return $node; }
/** * The main function for converting to an XML document. * * @param array|Traversable $data * @return string XML */ private static function toXml($data) { assert('is_array($data) || $node instanceof Traversable');
$node = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><root />");
return self::addDataToNode($node, $data)->asXML(); } }
|