#if PHP_VERSION_ID >= 70000
+struct apfd {
+ zval post;
+ zval files;
+};
+
#define APFD_SG(t) &PG(http_globals)[t]
static inline sapi_post_entry *apfd_get_post_entry(const char *ct_str, size_t ct_len)
{
return zend_hash_str_find_ptr(&SG(known_post_content_types), ct_str, ct_len);
}
-static inline zval *apfd_backup_files(void)
+static inline void apfd_backup(struct apfd *apfd)
{
if (SG(rfc1867_uploaded_files)) {
destroy_uploaded_files_hash();
}
- return NULL;
+
+ zval_ptr_dtor(APFD_SG(TRACK_VARS_POST));
+ array_init(&apfd->post);
+ ZVAL_COPY_VALUE(APFD_SG(TRACK_VARS_POST), &apfd->post);
+
+ zval_ptr_dtor(APFD_SG(TRACK_VARS_FILES));
+ array_init(&apfd->files);
+ ZVAL_COPY_VALUE(APFD_SG(TRACK_VARS_FILES), &apfd->files);
}
-static inline void apfd_update_files(zval *files)
+static inline void apfd_update(struct apfd *apfd)
{
- Z_TRY_ADDREF_P(APFD_SG(TRACK_VARS_FILES));
+ zend_hash_str_update(&EG(symbol_table), "_POST", sizeof("_POST")-1, APFD_SG(TRACK_VARS_POST));
+ Z_TRY_ADDREF_P(APFD_SG(TRACK_VARS_POST));
+
zend_hash_str_update(&EG(symbol_table), "_FILES", sizeof("_FILES")-1, APFD_SG(TRACK_VARS_FILES));
+ Z_TRY_ADDREF_P(APFD_SG(TRACK_VARS_FILES));
}
#else
+struct apfd {
+ zval *post;
+ zval *files;
+};
+
#define APFD_SG(t) PG(http_globals)[t]
static inline sapi_post_entry *apfd_get_post_entry(const char *ct_str, size_t ct_len TSRMLS_DC)
{
return NULL;
}
-static inline zval *apfd_backup_files(TSRMLS_D)
+static inline void apfd_backup(struct apfd *apfd TSRMLS_DC)
{
- return APFD_SG(TRACK_VARS_FILES);
+ apfd->post = APFD_SG(TRACK_VARS_POST);
+ apfd->files = APFD_SG(TRACK_VARS_FILES);
}
-static inline void apfd_update_files(zval *files TSRMLS_DC)
+static inline void apfd_update(struct apfd *apfd TSRMLS_DC)
{
- if (files != APFD_SG(TRACK_VARS_FILES) && APFD_SG(TRACK_VARS_FILES)) {
+ if (apfd->files != APFD_SG(TRACK_VARS_FILES) && APFD_SG(TRACK_VARS_FILES)) {
Z_ADDREF_P(APFD_SG(TRACK_VARS_FILES));
zend_hash_update(&EG(symbol_table), "_FILES", sizeof("_FILES"), &APFD_SG(TRACK_VARS_FILES), sizeof(zval *), NULL);
- if (files) {
- zval_ptr_dtor(&files);
+ if (apfd->files) {
+ zval_ptr_dtor(&apfd->files);
}
}
}
PHP_RINIT_FUNCTION(apfd)
{
+#ifndef TSRMLS_C
+# define TSRMLS_C
+# define TSRMLS_CC
+#endif
+ sapi_request_info *req = &SG(request_info);
+
/* populate form data on non-POST requests */
- if (SG(request_info).request_method && strcasecmp(SG(request_info).request_method, "POST") && SG(request_info).content_type && *SG(request_info).content_type) {
- char *ct_str = zend_str_tolower_dup(SG(request_info).content_type, strlen(SG(request_info).content_type));
- size_t ct_end = strcspn(ct_str, ";, ");
+ if (req->request_method && strcasecmp(req->request_method, "POST") && req->content_type && *req->content_type) {
+ char *ct_str, *ct_dup = estrdup(req->content_type);
+ size_t ct_end = strcspn(ct_dup, ";, ");
sapi_post_entry *post_entry = NULL;
- char delim;
- SG(request_info).content_type_dup = ct_str;
+ req->content_type_dup = ct_dup;
- delim = ct_str[ct_end];
- ct_str[ct_end] = '\0';
+ ct_str = zend_str_tolower_dup(ct_dup, ct_end);
if ((post_entry = apfd_get_post_entry(ct_str, ct_end TSRMLS_CC))) {
- zval *files = apfd_backup_files(TSRMLS_C);
+ struct apfd apfd;
- ct_str[ct_end] = delim;
+ apfd_backup(&apfd TSRMLS_CC);
- if (post_entry) {
- SG(request_info).post_entry = post_entry;
+ req->post_entry = post_entry;
- if (post_entry->post_reader) {
- post_entry->post_reader(TSRMLS_C);
- }
+ if (post_entry->post_reader) {
+ post_entry->post_reader(TSRMLS_C);
}
if (sapi_module.default_post_reader) {
sapi_handle_post(APFD_SG(TRACK_VARS_POST) TSRMLS_CC);
- /*
- * the rfc1867 handler is an awkward buddy
- */
- apfd_update_files(files TSRMLS_CC);
+ apfd_update(&apfd TSRMLS_CC);
}
+ efree(ct_str);
- if (SG(request_info).content_type_dup) {
- efree(SG(request_info).content_type_dup);
- SG(request_info).content_type_dup = NULL;
+ if (req->content_type_dup) {
+ efree(req->content_type_dup);
+ req->content_type_dup = NULL;
}
}