1 | <?php |
||
2 | |||
3 | namespace XoopsModules\Wggithub\Github; |
||
4 | |||
5 | |||
6 | /** |
||
7 | * Just helpers. |
||
8 | * |
||
9 | * The JSON encode/decode methods are stolen from Nette Utils (https://github.com/nette/utils). |
||
10 | * |
||
11 | * @author David Grudl |
||
12 | * @author Miloslav Hůla (https://github.com/milo) |
||
13 | */ |
||
14 | class Helpers |
||
15 | { |
||
16 | private static $jsonMessages = [ |
||
17 | JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded', |
||
18 | JSON_ERROR_STATE_MISMATCH => 'Syntax error, malformed JSON', |
||
19 | JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', |
||
20 | JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON', |
||
21 | JSON_ERROR_UTF8 => 'Invalid UTF-8 sequence', |
||
22 | ]; |
||
23 | |||
24 | |||
25 | /** @var Http\IClient */ |
||
26 | private static $client; |
||
27 | |||
28 | |||
29 | /** |
||
30 | * @param mixed |
||
31 | * @return string |
||
32 | * |
||
33 | * @throws JsonException |
||
34 | */ |
||
35 | public static function jsonEncode($value) |
||
36 | { |
||
37 | if (PHP_VERSION_ID < 50500) { |
||
38 | set_error_handler(function($severity, $message) { // needed to receive 'recursion detected' error |
||
39 | restore_error_handler(); |
||
40 | throw new JsonException($message); |
||
41 | }); |
||
42 | } |
||
43 | |||
44 | $json = \json_encode($value, JSON_UNESCAPED_UNICODE); |
||
45 | |||
46 | if (PHP_VERSION_ID < 50500) { |
||
47 | restore_error_handler(); |
||
48 | } |
||
49 | |||
50 | if ($error = json_last_error()) { |
||
51 | $message = isset(static::$jsonMessages[$error]) |
||
0 ignored issues
–
show
Bug
introduced
by
![]() |
|||
52 | ? static::$jsonMessages[$error] |
||
53 | : (PHP_VERSION_ID >= 50500 ? json_last_error_msg() : 'Unknown error'); |
||
54 | |||
55 | throw new JsonException($message, $error); |
||
56 | } |
||
57 | |||
58 | $json = \str_replace(["\xe2\x80\xa8", "\xe2\x80\xa9"], ['\u2028', '\u2029'], $json); |
||
59 | return $json; |
||
60 | } |
||
61 | |||
62 | |||
63 | /** |
||
64 | * @param $json |
||
65 | * @param bool $assoc |
||
66 | * @return string |
||
67 | * |
||
68 | */ |
||
69 | public static function jsonDecode($json, $assoc = false) |
||
70 | { |
||
71 | $json = (string) $json; |
||
72 | if (!\preg_match('##u', $json)) { |
||
73 | throw new JsonException('Invalid UTF-8 sequence', 5); // PECL JSON-C |
||
74 | } |
||
75 | |||
76 | $value = \json_decode($json, $assoc, 512, (\defined('JSON_C_VERSION') && PHP_INT_SIZE > 4) ? 0 : JSON_BIGINT_AS_STRING); |
||
77 | |||
78 | if ($value === NULL && $json !== '' && strcasecmp($json, 'null')) { // '' does not clear json_last_error() |
||
79 | $error = json_last_error(); |
||
80 | throw new JsonException(isset(static::$jsonMessages[$error]) ? static::$jsonMessages[$error] : 'Unknown error', $error); |
||
0 ignored issues
–
show
|
|||
81 | } |
||
82 | return $value; |
||
83 | } |
||
84 | |||
85 | |||
86 | /** |
||
87 | * @param bool |
||
88 | * @return Http\IClient |
||
89 | */ |
||
90 | public static function createDefaultClient($newInstance = FALSE) |
||
91 | { |
||
92 | if (self::$client === NULL || $newInstance) { |
||
93 | self::$client = \extension_loaded('curl') |
||
94 | ? new Http\CurlClient |
||
95 | : new Http\StreamClient; |
||
96 | } |
||
97 | |||
98 | return self::$client; |
||
99 | } |
||
100 | |||
101 | } |
||
102 |