X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=src%2Fphp_http_env.c;h=9c88822e3db948ec3331e4d706084f22db7be391;hp=21bd89ab73d504a51a7c08ffe0a3dfec095bd7ca;hb=HEAD;hpb=0ccb6d6575f81affd97a78ba1a88641ad41b4b55 diff --git a/src/php_http_env.c b/src/php_http_env.c index 21bd89a..9c88822 100644 --- a/src/php_http_env.c +++ b/src/php_http_env.c @@ -15,6 +15,12 @@ PHP_RSHUTDOWN_FUNCTION(http_env) +{ + php_http_env_reset(); + return SUCCESS; +} + +void php_http_env_reset() { if (PHP_HTTP_G->env.request.headers) { zend_hash_destroy(PHP_HTTP_G->env.request.headers); @@ -24,13 +30,10 @@ PHP_RSHUTDOWN_FUNCTION(http_env) if (PHP_HTTP_G->env.request.body) { php_http_message_body_free(&PHP_HTTP_G->env.request.body); } - if (PHP_HTTP_G->env.server_var) { zval_ptr_dtor(PHP_HTTP_G->env.server_var); PHP_HTTP_G->env.server_var = NULL; } - - return SUCCESS; } void php_http_env_get_request_headers(HashTable *headers) @@ -414,10 +417,12 @@ ZEND_RESULT_CODE php_http_env_set_response_status_line(long code, php_http_versi { sapi_header_line h = {NULL, 0, 0}; ZEND_RESULT_CODE ret; + char *line; - h.line_len = spprintf(&h.line, 0, "HTTP/%u.%u %ld %s", v->major, v->minor, code, php_http_env_get_response_status_for_code(code)); + h.line_len = spprintf(&line, 0, "HTTP/%u.%u %ld %s", v->major, v->minor, code, php_http_env_get_response_status_for_code(code)); + h.line = line; ret = sapi_header_op(SAPI_HEADER_REPLACE, (void *) &h); - efree(h.line); + efree(line); return ret; } @@ -429,10 +434,9 @@ ZEND_RESULT_CODE php_http_env_set_response_protocol_version(php_http_version_t * ZEND_RESULT_CODE php_http_env_set_response_header(long http_code, const char *header_str, size_t header_len, zend_bool replace) { - sapi_header_line h = {estrndup(header_str, header_len), header_len, http_code}; + sapi_header_line h = {header_str, header_len, http_code}; ZEND_RESULT_CODE ret = sapi_header_op(replace ? SAPI_HEADER_REPLACE : SAPI_HEADER_ADD, (void *) &h); - efree(h.line); return ret; } @@ -440,14 +444,16 @@ ZEND_RESULT_CODE php_http_env_set_response_header_va(long http_code, zend_bool r { ZEND_RESULT_CODE ret = FAILURE; sapi_header_line h = {NULL, 0, http_code}; + char *line; - h.line_len = vspprintf(&h.line, 0, fmt, argv); + h.line_len = vspprintf(&line, 0, fmt, argv); + h.line = line; if (h.line) { if (h.line_len) { ret = sapi_header_op(replace ? SAPI_HEADER_REPLACE : SAPI_HEADER_ADD, (void *) &h); } - efree(h.line); + efree(line); } return ret; } @@ -496,17 +502,19 @@ ZEND_RESULT_CODE php_http_env_set_response_header_value(long http_code, const ch } else { sapi_header_line h; ZEND_RESULT_CODE ret; + char *line; if (name_len > INT_MAX) { return FAILURE; } h.response_code = http_code; - h.line_len = spprintf(&h.line, 0, "%.*s: %.*s", (int) name_len, name_str, data->len, data->val); + h.line_len = spprintf(&line, 0, "%s: %s", name_str, data->val); + h.line = line; ret = sapi_header_op(replace ? SAPI_HEADER_REPLACE : SAPI_HEADER_ADD, (void *) &h); zend_string_release(data); - PTR_FREE(h.line); + PTR_FREE(line); return ret; } @@ -774,6 +782,15 @@ static PHP_METHOD(HttpEnv, negotiate) } } +ZEND_BEGIN_ARG_INFO(ai_HttpEnv_reset, 0) +ZEND_END_ARG_INFO(); +static PHP_METHOD(HttpEnv, reset) +{ + zend_parse_parameters_none(); + php_http_env_reset(); +} + + static zend_function_entry php_http_env_methods[] = { PHP_ME(HttpEnv, getRequestHeader, ai_HttpEnv_getRequestHeader, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_ME(HttpEnv, getRequestBody, ai_HttpEnv_getRequestBody, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) @@ -792,6 +809,8 @@ static zend_function_entry php_http_env_methods[] = { PHP_ME(HttpEnv, negotiateCharset, ai_HttpEnv_negotiateCharset, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_ME(HttpEnv, negotiate, ai_HttpEnv_negotiate, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + PHP_ME(HttpEnv, reset, ai_HttpEnv_reset, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + EMPTY_FUNCTION_ENTRY };