Skip to content

Instantly share code, notes, and snippets.

@kimegede
Created February 3, 2015 07:56
Show Gist options
  • Save kimegede/e9cbc05614de03a8a93e to your computer and use it in GitHub Desktop.
Save kimegede/e9cbc05614de03a8a93e to your computer and use it in GitHub Desktop.
Fixing cast numbers in Crud v3 https://github.com/FriendsOfCake/crud/pull/245
From 09c35fd7ffbd874db1857bbcb55f0ba0a436672e Mon Sep 17 00:00:00 2001
From: Kim Egede Jakobsen <kimegede@gmail.com>
Date: Mon, 2 Feb 2015 23:00:30 +0100
Subject: [PATCH 1/2] Test showing casting string there will be changed to
infinity will fail when json_encoded()
---
.../Listener/ApiTransformationListenerTest.php | 43 ++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php
index 902fe22..63ca16a 100644
--- a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php
+++ b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php
@@ -1438,4 +1438,47 @@ class ApiTransformationListenerTest extends CrudTestCase {
$this->assertSame($expected, $result);
}
+
+/**
+ * Testing a huge integer with castNumbers & json_encode()
+ *
+ * @see http://php.net/manual/en/function.json-last-error.php (JSON_ERROR_INF_OR_NAN)
+ * @return void
+ */
+ public function testCastNumbersWithInfinity() {
+ $listener = $this
+ ->getMockBuilder('ApiTransformationListener')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $settings = array(
+ 'changeNesting' => false,
+ 'changeKeys' => false,
+ 'changeTime' => false,
+ 'castNumbers' => true,
+ 'keyMethods' => array(),
+ 'valueMethods' => array('_castNumbers'),
+ 'replaceMap' => array()
+ );
+
+ $this->setReflectionClassInstance($listener);
+ $this->setProtectedProperty('_settings', $settings, $listener);
+
+ $data = array(
+ 'CastNumber' => array('infinity' => '0113870020e12235'),
+ );
+
+ $expected = array(
+ 'CastNumber' => array(
+ 'infinity' => INF
+ )
+ );
+
From 09c35fd7ffbd874db1857bbcb55f0ba0a436672e Mon Sep 17 00:00:00 2001
From: Kim Egede Jakobsen <kimegede@gmail.com>
Date: Mon, 2 Feb 2015 23:00:30 +0100
Subject: [PATCH 1/2] Test showing casting string there will be changed to
infinity will fail when json_encoded()
---
.../Listener/ApiTransformationListenerTest.php | 43 ++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php
index 902fe22..63ca16a 100644
--- a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php
+++ b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php
@@ -1438,4 +1438,47 @@ class ApiTransformationListenerTest extends CrudTestCase {
$this->assertSame($expected, $result);
}
+
+/**
+ * Testing a huge integer with castNumbers & json_encode()
+ *
+ * @see http://php.net/manual/en/function.json-last-error.php (JSON_ERROR_INF_OR_NAN)
+ * @return void
+ */
+ public function testCastNumbersWithInfinity() {
+ $listener = $this
+ ->getMockBuilder('ApiTransformationListener')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $settings = array(
+ 'changeNesting' => false,
+ 'changeKeys' => false,
+ 'changeTime' => false,
+ 'castNumbers' => true,
+ 'keyMethods' => array(),
+ 'valueMethods' => array('_castNumbers'),
+ 'replaceMap' => array()
+ );
+
+ $this->setReflectionClassInstance($listener);
+ $this->setProtectedProperty('_settings', $settings, $listener);
+
+ $data = array(
+ 'CastNumber' => array('infinity' => '0113870020e12235'),
+ );
+
+ $expected = array(
+ 'CastNumber' => array(
+ 'infinity' => INF
+ )
+ );
+
+ $this->callProtectedMethod('_recurse', array(&$data), $listener);
+
+ $this->assertSame($expected, $data);
+
+ $this->assertFalse(json_encode($expected), 'json encoding INF failed');
+ $this->assertSame(JSON_ERROR_INF_OR_NAN, json_last_error(), 'json encoding INF failed');
+ }
}
--
1.8.3.2
From fafa20ee517b8fd9636d8ec0ca9dead3b8abbbf5 Mon Sep 17 00:00:00 2001
From: Kim Egede Jakobsen <kimegede@gmail.com>
Date: Mon, 2 Feb 2015 23:09:56 +0100
Subject: [PATCH 2/2] Validate numbers is below infinity, before json_encoding
it.
---
Controller/Crud/Listener/ApiTransformationListener.php | 6 +++++-
.../Case/Controller/Crud/Listener/ApiTransformationListenerTest.php | 5 ++---
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/Controller/Crud/Listener/ApiTransformationListener.php b/Controller/Crud/Listener/ApiTransformationListener.php
index 99605bc..4a5a861 100644
--- a/Controller/Crud/Listener/ApiTransformationListener.php
+++ b/Controller/Crud/Listener/ApiTransformationListener.php
@@ -302,7 +302,11 @@ class ApiTransformationListener extends CrudListener {
if (!is_numeric($variable)) {
return $variable;
}
- return $variable + 0;
+
+ $hintTyped = $variable + 0;
+
+ // Check if variable is below infinity
+ return ($hintTyped < INF) ? $hintTyped : $variable;
}
/**
diff --git a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php
index 63ca16a..6926495 100644
--- a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php
+++ b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php
@@ -1470,7 +1470,7 @@ class ApiTransformationListenerTest extends CrudTestCase {
$expected = array(
'CastNumber' => array(
- 'infinity' => INF
+ 'infinity' => '0113870020e12235'
)
);
@@ -1478,7 +1478,6 @@ class ApiTransformationListenerTest extends CrudTestCase {
$this->assertSame($expected, $data);
- $this->assertFalse(json_encode($expected), 'json encoding INF failed');
- $this->assertSame(JSON_ERROR_INF_OR_NAN, json_last_error(), 'json encoding INF failed');
+ $this->assertSame(json_encode($expected), json_encode($data), 'Infinity values does not break json encode');
}
}
--
1.8.3.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment