- if (SG(request_info).raw_post_data) {
- zval *zarg = arg;
- zval_dtor(zarg);
- ZVAL_NULL(zarg);
- php_json_decode(zarg, SG(request_info).raw_post_data, SG(request_info).raw_post_data_length, 1, PG(max_input_nesting_level) TSRMLS_CC);
- if (Z_TYPE_P(zarg) == IS_NULL) {
- array_init(zarg);
+ zval *zarg = arg;
+ char *json_str = NULL;
+ size_t json_len = 0;
+
+#if PHP_VERSION_ID >= 50600
+ if (SG(request_info).request_body) {
+ /* FG(stream_wrappers) not initialized yet, so we cannot use php://input */
+ php_stream_rewind(SG(request_info).request_body);
+ json_len = php_stream_copy_to_mem(SG(request_info).request_body, &json_str, PHP_STREAM_COPY_ALL, 0);
+ }
+#else
+ json_str = SG(request_info).raw_post_data;
+ json_len = SG(request_info).raw_post_data_length;
+#endif
+
+ if (json_len) {
+ zval zjson;
+
+ INIT_ZVAL(zjson);
+ php_json_decode(&zjson, json_str, json_len, 1, PG(max_input_nesting_level) TSRMLS_CC);
+ if (Z_TYPE(zjson) != IS_NULL) {
+ zval_dtor(zarg);
+ ZVAL_COPY_VALUE(zarg, (&zjson));