X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=php_http_env.c;h=eef0c37aad541fb1d64ce933d13fd63a3ff2f19c;hb=c51b7204d895c33124de9799fdbe16eb7bb8158d;hp=239af9812a25141cfbfc1885f05150315d41b8bd;hpb=c225008cfbcf90259e4c97f240b1422ebce67c88;p=m6w6%2Fext-http diff --git a/php_http_env.c b/php_http_env.c index 239af98..eef0c37 100644 --- a/php_http_env.c +++ b/php_http_env.c @@ -37,12 +37,10 @@ PHP_RINIT_FUNCTION(http_env) sapi_post_entry *post_entry = NULL; if ((post_entry = zend_hash_find_ptr(&SG(known_post_content_types), key_str))) { - if (post_entry) { - SG(request_info).post_entry = post_entry; + SG(request_info).post_entry = post_entry; - if (post_entry->post_reader) { - post_entry->post_reader(); - } + if (post_entry->post_reader) { + post_entry->post_reader(); } if (sapi_module.default_post_reader) { @@ -53,9 +51,12 @@ PHP_RINIT_FUNCTION(http_env) /* * the rfc1867 handler is an awkward buddy + * FIXME: this leaks because php_auto_globals_create_files() + * as well as the rfc1867_handler call + * array_init(&PG(http_globals)[TRACK_VARS_FILES]) */ Z_TRY_ADDREF(PG(http_globals)[TRACK_VARS_FILES]); - zend_hash_str_update(&EG(symbol_table).ht, "_FILES", sizeof("_FILES"), &PG(http_globals)[TRACK_VARS_FILES]); + zend_hash_str_update(&EG(symbol_table).ht, "_FILES", lenof("_FILES"), &PG(http_globals)[TRACK_VARS_FILES]); } } zend_hash_destroy(¶ms); @@ -414,6 +415,9 @@ static void grab_header(void *data, void *arg) && !strncmp(header->header, args->name_str, args->name_len) ) { args->value_ptr = &header->header[args->name_len + 1]; + while (PHP_HTTP_IS_CTYPE(space, *args->value_ptr)) { + ++args->value_ptr; + } } } @@ -776,15 +780,15 @@ ZEND_END_ARG_INFO(); static PHP_METHOD(HttpEnv, setResponseHeader) { char *header_name_str; - int header_name_len; + size_t header_name_len; zval *header_value = NULL; - long code = 0; + zend_long code = 0; zend_bool replace_header = 1; if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "s|z!lb", &header_name_str, &header_name_len, &header_value, &code, &replace_header)) { return; } - RETURN_BOOL(SUCCESS == php_http_env_set_response_header_value(code, header_name_str, header_name_len, header_value, replace_header TSRMLS_CC)); + RETURN_BOOL(SUCCESS == php_http_env_set_response_header_value(code, header_name_str, header_name_len, header_value, replace_header)); } ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnv_setResponseCode, 0, 0, 1) @@ -813,6 +817,7 @@ static PHP_METHOD(HttpEnv, negotiateLanguage) return; } if (rs_array) { + ZVAL_DEREF(rs_array); zval_dtor(rs_array); array_init(rs_array); } @@ -833,6 +838,7 @@ static PHP_METHOD(HttpEnv, negotiateCharset) return; } if (rs_array) { + ZVAL_DEREF(rs_array); zval_dtor(rs_array); array_init(rs_array); } @@ -852,6 +858,7 @@ static PHP_METHOD(HttpEnv, negotiateEncoding) return; } if (rs_array) { + ZVAL_DEREF(rs_array); zval_dtor(rs_array); array_init(rs_array); } @@ -871,6 +878,7 @@ static PHP_METHOD(HttpEnv, negotiateContentType) return; } if (rs_array) { + ZVAL_DEREF(rs_array); zval_dtor(rs_array); array_init(rs_array); } @@ -894,8 +902,8 @@ static PHP_METHOD(HttpEnv, negotiate) return; } - if (rs_array) { + ZVAL_DEREF(rs_array); zval_dtor(rs_array); array_init(rs_array); } @@ -944,13 +952,22 @@ static SAPI_POST_HANDLER_FUNC(php_http_json_post_handler) if (json) { if (json->len) { - zval zjson; + zval tmp; + + ZVAL_NULL(&tmp); + php_json_decode(&tmp, json->val, json->len, 1, PG(max_input_nesting_level)); + + switch (Z_TYPE(tmp)) { + case IS_NULL: + break; + + case IS_ARRAY: + array_copy(Z_ARRVAL(tmp), Z_ARRVAL_P(zarg)); + zval_ptr_dtor(&tmp); + break; - ZVAL_NULL(&zjson); - php_json_decode(&zjson, json->val, json->len, 1, PG(max_input_nesting_level)); - if (Z_TYPE(zjson) != IS_NULL) { - zval_dtor(zarg); - ZVAL_COPY_VALUE(zarg, (&zjson)); + default: + ZVAL_COPY_VALUE(zarg, &tmp); } } zend_string_release(json);