summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/vendor/automattic/jetpack-sync/src/class-json-deflate-array-codec.php')
-rw-r--r--plugins/jetpack/vendor/automattic/jetpack-sync/src/class-json-deflate-array-codec.php136
1 files changed, 136 insertions, 0 deletions
diff --git a/plugins/jetpack/vendor/automattic/jetpack-sync/src/class-json-deflate-array-codec.php b/plugins/jetpack/vendor/automattic/jetpack-sync/src/class-json-deflate-array-codec.php
new file mode 100644
index 00000000..f13e5dcb
--- /dev/null
+++ b/plugins/jetpack/vendor/automattic/jetpack-sync/src/class-json-deflate-array-codec.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * An implementation of Automattic\Jetpack\Sync\Codec_Interface that uses gzip's DEFLATE
+ * algorithm to compress objects serialized using json_encode.
+ *
+ * @package automattic/jetpack-sync
+ */
+
+namespace Automattic\Jetpack\Sync;
+
+use Automattic\Jetpack\Sync\Codec_Interface;
+
+/**
+ * An implementation of Automattic\Jetpack\Sync\Codec_Interface that uses gzip's DEFLATE
+ * algorithm to compress objects serialized using json_encode
+ */
+class JSON_Deflate_Array_Codec implements Codec_Interface {
+ const CODEC_NAME = 'deflate-json-array';
+
+ /**
+ * Return the name of the codec.
+ *
+ * @return string
+ */
+ public function name() {
+ return self::CODEC_NAME;
+ }
+
+ /**
+ * Encodes an object.
+ *
+ * @param object $object Item to encode.
+ * @return string
+ */
+ public function encode( $object ) {
+ return base64_encode( gzdeflate( $this->json_serialize( $object ) ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
+ }
+
+ /**
+ * Decode compressed serialized value.
+ *
+ * @param string $input Item to decode.
+ * @return array|mixed|object
+ */
+ public function decode( $input ) {
+ return $this->json_unserialize( gzinflate( base64_decode( $input ) ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
+ }
+
+ /**
+ * Serialize JSON
+ *
+ * @see https://gist.github.com/muhqu/820694
+ *
+ * @param string $any Value to serialize and wrap.
+ *
+ * @return false|string
+ */
+ protected function json_serialize( $any ) {
+ if ( function_exists( 'jetpack_json_wrap' ) ) {
+ return wp_json_encode( jetpack_json_wrap( $any ) );
+ }
+ // This prevents fatal error when updating pre 6.0 via the cli command.
+ return wp_json_encode( $this->json_wrap( $any ) );
+ }
+
+ /**
+ * Unserialize JSON
+ *
+ * @param string $str JSON string.
+ * @return array|object Unwrapped JSON.
+ */
+ protected function json_unserialize( $str ) {
+ return $this->json_unwrap( json_decode( $str, true ) );
+ }
+
+ /**
+ * Wraps JSON
+ *
+ * @param object|array $any Wrapping value.
+ * @param array $seen_nodes Seen nodes.
+ * @return array
+ */
+ private function json_wrap( &$any, $seen_nodes = array() ) {
+ if ( is_object( $any ) ) {
+ $input = get_object_vars( $any );
+ $input['__o'] = 1;
+ } else {
+ $input = &$any;
+ }
+
+ if ( is_array( $input ) ) {
+ $seen_nodes[] = &$any;
+
+ $return = array();
+
+ foreach ( $input as $k => &$v ) {
+ if ( ( is_array( $v ) || is_object( $v ) ) ) {
+ if ( in_array( $v, $seen_nodes, true ) ) {
+ continue;
+ }
+ $return[ $k ] = $this->json_wrap( $v, $seen_nodes );
+ } else {
+ $return[ $k ] = $v;
+ }
+ }
+
+ return $return;
+ }
+
+ return $any;
+ }
+
+ /**
+ * Unwraps a json_decode return.
+ *
+ * @param array|object $any json_decode object.
+ * @return array|object
+ */
+ private function json_unwrap( $any ) {
+ if ( is_array( $any ) ) {
+ foreach ( $any as $k => $v ) {
+ if ( '__o' === $k ) {
+ continue;
+ }
+ $any[ $k ] = $this->json_unwrap( $v );
+ }
+
+ if ( isset( $any['__o'] ) ) {
+ unset( $any['__o'] );
+ $any = (object) $any;
+ }
+ }
+
+ return $any;
+ }
+}