cb8a53b65586afdd2a03d6ed71e430c6820421b3
[m6w6/ext-json_post] / php_json_post.c
1 /*
2 +--------------------------------------------------------------------+
3 | PECL :: json_post |
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2015, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
11 */
12
13
14 #ifdef HAVE_CONFIG_H
15 # include "config.h"
16 #endif
17
18 #include "php.h"
19 #include "php_ini.h"
20 #include "ext/standard/info.h"
21 #include "ext/json/php_json.h"
22 #include "php_json_post.h"
23 #include "SAPI.h"
24
25 ZEND_DECLARE_MODULE_GLOBALS(json_post);
26
27 PHP_INI_BEGIN()
28 STD_PHP_INI_ENTRY("json_post.flags", "1", PHP_INI_PERDIR, OnUpdateLong, flags, zend_json_post_globals, json_post_globals)
29 PHP_INI_END()
30
31 static void php_json_post_init_globals(zend_json_post_globals *json_post_globals)
32 {
33 #if PHP_VERSION_ID >= 50400
34 json_post_globals->flags = PHP_JSON_OBJECT_AS_ARRAY;
35 #else
36 json_post_globals->flags = 1;
37 #endif
38 }
39
40 PHP_MINFO_FUNCTION(json_post)
41 {
42 php_info_print_table_start();
43 php_info_print_table_header(2, "json_post support", "enabled");
44 php_info_print_table_end();
45
46 DISPLAY_INI_ENTRIES();
47 }
48
49 #if PHP_VERSION_ID >= 70000
50 static SAPI_POST_HANDLER_FUNC(php_json_post_handler)
51 {
52 zend_string *json = NULL;
53
54 if (SG(request_info).request_body) {
55 /* FG(stream_wrappers) not initialized yet, so we cannot use php://input */
56 php_stream_rewind(SG(request_info).request_body);
57 json = php_stream_copy_to_mem(SG(request_info).request_body, PHP_STREAM_COPY_ALL, 0);
58 }
59
60 if (json) {
61 if (json->len) {
62 zval tmp;
63
64 ZVAL_NULL(&tmp);
65
66 php_json_decode(&tmp, json->val, json->len, JSON_POST_G(flags), PG(max_input_nesting_level));
67
68 switch (Z_TYPE(tmp)) {
69 case IS_OBJECT:
70 case IS_ARRAY:
71 zval_dtor(arg);
72 ZVAL_COPY_VALUE(&PG(http_globals)[TRACK_VARS_POST], &tmp);
73 break;
74 default:
75 break;
76 }
77 }
78 zend_string_release(json);
79 }
80 }
81
82 #else
83
84 static SAPI_POST_HANDLER_FUNC(php_json_post_handler)
85 {
86 zval *zarg = arg;
87 char *json_str = NULL;
88 size_t json_len = 0;
89
90 # if PHP_VERSION_ID >= 50600
91 if (!SG(request_info).request_body) {
92 return;
93 }
94
95 /* FG(stream_wrappers) not initialized yet, so we cannot use php://input */
96 php_stream_rewind(SG(request_info).request_body);
97 json_len = php_stream_copy_to_mem(SG(request_info).request_body, &json_str, PHP_STREAM_COPY_ALL, 0);
98 # else
99 json_str = SG(request_info).raw_post_data;
100 json_len = SG(request_info).raw_post_data_length;
101 # endif
102
103 if (json_len) {
104 zval zjson;
105
106 INIT_ZVAL(zjson);
107
108 # if PHP_VERSION_ID >= 50400
109 php_json_decode_ex(&zjson, json_str, json_len, JSON_POST_G(flags), PG(max_input_nesting_level) TSRMLS_CC);
110 if (Z_TYPE(zjson) != IS_NULL) {
111 zval_dtor(zarg);
112 ZVAL_COPY_VALUE(zarg, (&zjson));
113 # else
114 php_json_decode(&zjson, json_str, json_len, (zend_bool)(JSON_POST_G(flags)&1), PG(max_input_nesting_level) TSRMLS_CC);
115 if (Z_TYPE(zjson) != IS_NULL) {
116 zval_dtor(zarg);
117 zarg->value = zjson.value;
118 Z_TYPE_P(zarg) = Z_TYPE(zjson);
119 # endif
120 }
121 }
122 # if PHP_VERSION_ID >= 50600
123 if (json_str) {
124 efree(json_str);
125 }
126 # endif
127 }
128
129 #endif
130
131 PHP_MINIT_FUNCTION(json_post)
132 {
133 sapi_post_entry entry = {NULL, 0, NULL, NULL};
134
135 entry.post_reader = sapi_read_standard_form_data;
136 entry.post_handler = php_json_post_handler;
137
138 entry.content_type = "text/json";
139 entry.content_type_len = sizeof("text/json")-1;
140 sapi_register_post_entry(&entry TSRMLS_CC);
141
142 ZEND_INIT_MODULE_GLOBALS(json_post, php_json_post_init_globals, NULL);
143 REGISTER_INI_ENTRIES();
144 return SUCCESS;
145 }
146
147 PHP_MSHUTDOWN_FUNCTION(json_post)
148 {
149 UNREGISTER_INI_ENTRIES();
150
151 return SUCCESS;
152 }
153
154 zend_function_entry json_post_functions[] = {
155 {0}
156 };
157
158 static zend_module_dep json_post_module_deps[] = {
159 ZEND_MOD_REQUIRED("json")
160 {NULL, NULL, NULL, 0}
161 };
162
163 zend_module_entry json_post_module_entry = {
164 STANDARD_MODULE_HEADER_EX,
165 NULL,
166 json_post_module_deps,
167 "json_post",
168 json_post_functions,
169 PHP_MINIT(json_post),
170 PHP_MSHUTDOWN(json_post),
171 NULL,
172 NULL,
173 PHP_MINFO(json_post),
174 PHP_JSON_POST_VERSION,
175 STANDARD_MODULE_PROPERTIES
176 };
177 /* }}} */
178
179 #ifdef COMPILE_DL_JSON_POST
180 ZEND_GET_MODULE(json_post)
181 #endif
182
183 /*
184 * Local variables:
185 * tab-width: 4
186 * c-basic-offset: 4
187 * End:
188 * vim600: noet sw=4 ts=4 fdm=marker
189 * vim<600: noet sw=4 ts=4
190 */