diff options
author | Mario <mario@mariovavti.com> | 2024-03-22 08:37:29 +0000 |
---|---|---|
committer | Mario <mario@mariovavti.com> | 2024-03-22 08:37:29 +0000 |
commit | 1aeb05628b6a2a069c46980efbe628362c9e3e74 (patch) | |
tree | e9aed15d0cd74e0c23dcb05c7be8fe9541efdf36 /vendor/mmccook/php-json-canonicalization-scheme/src | |
parent | 5b7387459cf4de8f7354d81cb0392c4225714d94 (diff) | |
parent | b464fae3bf22585888c5f3def8eded76fd48ed16 (diff) | |
download | volse-hubzilla-1aeb05628b6a2a069c46980efbe628362c9e3e74.tar.gz volse-hubzilla-1aeb05628b6a2a069c46980efbe628362c9e3e74.tar.bz2 volse-hubzilla-1aeb05628b6a2a069c46980efbe628362c9e3e74.zip |
Merge branch '9.0RC'9.0
Diffstat (limited to 'vendor/mmccook/php-json-canonicalization-scheme/src')
4 files changed, 156 insertions, 0 deletions
diff --git a/vendor/mmccook/php-json-canonicalization-scheme/src/JsonCanonicalizator.php b/vendor/mmccook/php-json-canonicalization-scheme/src/JsonCanonicalizator.php new file mode 100644 index 000000000..6a3c82959 --- /dev/null +++ b/vendor/mmccook/php-json-canonicalization-scheme/src/JsonCanonicalizator.php @@ -0,0 +1,79 @@ +<?php + +namespace Mmccook\JsonCanonicalizator; + +class JsonCanonicalizator implements JsonCanonicalizatorInterface +{ + public const JSON_FLAGS = \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES; + + /** + * @param $data + * @param bool $asHex + * @return string + */ + public function canonicalize($data, bool $asHex = false): string + { + ob_start(); + + $this->serialize($data); + + $result = ob_get_clean(); + + return $asHex ? Utils::asHex($result) : $result; + } + + private function serialize($item) + { + if (is_float($item)) { + echo Utils::es6NumberFormat($item); + + return; + } + + if (null === $item || is_scalar($item)) { + echo json_encode($item, self::JSON_FLAGS); + + return; + } + + if (is_array($item) && ! Utils::isAssoc($item)) { + echo '['; + $next = false; + foreach ($item as $element) { + if ($next) { + echo ','; + } + $next = true; + $this->serialize($element); + } + echo ']'; + + return; + } + + if (is_object($item)) { + $item = (array)$item; + } + + uksort($item, function (string $a, string $b) { + $a = mb_convert_encoding($a, 'UTF-16BE'); + $b = mb_convert_encoding($b, 'UTF-16BE'); + + return strcmp($a, $b); + }); + + echo '{'; + $next = false; + foreach ($item as $key => $value) { + //var_dump($key, $value); + if ($next) { + echo ','; + } + $next = true; + $outKey = json_encode((string)$key, self::JSON_FLAGS); + echo $outKey, ':', $this->serialize($value); + } + echo '}'; + + } +} diff --git a/vendor/mmccook/php-json-canonicalization-scheme/src/JsonCanonicalizatorFactory.php b/vendor/mmccook/php-json-canonicalization-scheme/src/JsonCanonicalizatorFactory.php new file mode 100644 index 000000000..68b1c50c9 --- /dev/null +++ b/vendor/mmccook/php-json-canonicalization-scheme/src/JsonCanonicalizatorFactory.php @@ -0,0 +1,13 @@ +<?php + +declare(strict_types=1); + +namespace Mmccook\JsonCanonicalizator; + +class JsonCanonicalizatorFactory +{ + public static function getInstance(): JsonCanonicalizator + { + return new JsonCanonicalizator(); + } +} diff --git a/vendor/mmccook/php-json-canonicalization-scheme/src/JsonCanonicalizatorInterface.php b/vendor/mmccook/php-json-canonicalization-scheme/src/JsonCanonicalizatorInterface.php new file mode 100644 index 000000000..73b25c086 --- /dev/null +++ b/vendor/mmccook/php-json-canonicalization-scheme/src/JsonCanonicalizatorInterface.php @@ -0,0 +1,10 @@ +<?php + +declare(strict_types=1); + +namespace Mmccook\JsonCanonicalizator; + +interface JsonCanonicalizatorInterface +{ + public function canonicalize($data, bool $asHex): string; +} diff --git a/vendor/mmccook/php-json-canonicalization-scheme/src/Utils.php b/vendor/mmccook/php-json-canonicalization-scheme/src/Utils.php new file mode 100644 index 000000000..755ba3320 --- /dev/null +++ b/vendor/mmccook/php-json-canonicalization-scheme/src/Utils.php @@ -0,0 +1,54 @@ +<?php + +namespace Mmccook\JsonCanonicalizator; + +class Utils +{ + /** + * @param array $array + * @return bool + */ + public static function isAssoc(array $array): bool + { + $keys = array_keys($array); + + return array_keys($keys) !== $keys; + } + + public static function asHex(string $data): string + { + return rtrim(chunk_split(bin2hex($data), 2, ' ')); + } + + public static function es6NumberFormat(float $number): string + { + + if (is_nan($number) || is_infinite($number)) { + throw new \RuntimeException("can't use Nan or Infinity in json"); + } + + if (0.0 === $number) { + return '0'; + } + + $sign = ''; + if ($number < 0) { + $sign = '-'; + $number = -$number; + } + + if ($number < 1e+21 && $number >= 1e-6) { + $formatted = sprintf('%F', $number); + $formatted = rtrim($formatted, '0'); // first remove all zeros at the end + $formatted = rtrim($formatted, '.'); // If the string now ends with a decimal point, then remove it, too. + } else { + $formatted = sprintf('%e', $number); + $parts = explode('e', $formatted); + $parts[0] = rtrim($parts[0], '0'); + $parts[0] = rtrim($parts[0], '.'); + $formatted = implode('e', $parts); + } + + return $sign . $formatted; + } +} |