X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_env.c;h=2fb6e33915fa1eb453fd1fc791bcc43502e4a187;hp=6a7f17d3450283c8988673cc7c19638d887bcfbd;hb=6cc24086f57aa1e8f4d6a2c12361635e7c24f60f;hpb=32580f1d50d0481c9069b65ef30d0acd59ada3bb diff --git a/php_http_env.c b/php_http_env.c index 6a7f17d..2fb6e33 100644 --- a/php_http_env.c +++ b/php_http_env.c @@ -4,18 +4,79 @@ +--------------------------------------------------------------------+ | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the conditions mentioned | - | in the accompanying LICENSE file are met. | + | in the accomp395anying LICENSE file are met. | +--------------------------------------------------------------------+ | Copyright (c) 2004-2011, Michael Wallner | +--------------------------------------------------------------------+ */ #include "php_http_api.h" +#include "php_variables.h" PHP_RINIT_FUNCTION(http_env) { PHP_HTTP_G->env.request.time = sapi_get_request_time(TSRMLS_C); + /* 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) { + uint ct_len = strlen(SG(request_info).content_type); + char *ct_str = estrndup(SG(request_info).content_type, ct_len); + php_http_params_opts_t opts; + HashTable params; + + php_http_params_opts_default_get(&opts); + opts.input.str = ct_str; + opts.input.len = ct_len; + + SG(request_info).content_type_dup = ct_str; + + ZEND_INIT_SYMTABLE(¶ms); + if (php_http_params_parse(¶ms, &opts TSRMLS_CC)) { + zval **zct; + char *key_str; + uint key_len; + ulong key_num; + + if (HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(¶ms, &key_str, &key_len, &key_num, 0, NULL)) { + sapi_post_entry *post_entry = NULL; + + if (SUCCESS == zend_hash_find(&SG(known_post_content_types), key_str, key_len, (void *) &post_entry)) { + zval *files = PG(http_globals)[TRACK_VARS_FILES]; + + zend_is_auto_global(ZEND_STRL("_POST") TSRMLS_CC); + + if (post_entry) { + SG(request_info).post_entry = post_entry; + + if (post_entry->post_reader) { + post_entry->post_reader(TSRMLS_C); + } + } + + if (sapi_module.default_post_reader) { + sapi_module.default_post_reader(TSRMLS_C); + } + + sapi_handle_post(PG(http_globals)[TRACK_VARS_POST] TSRMLS_CC); + + /* + * the rfc1867 handler is an awkward buddy + */ + if (files != PG(http_globals)[TRACK_VARS_FILES] && PG(http_globals)[TRACK_VARS_FILES]) { + Z_ADDREF_P(PG(http_globals)[TRACK_VARS_FILES]); + zend_hash_update(&EG(symbol_table), "_FILES", sizeof("_FILES"), &PG(http_globals)[TRACK_VARS_FILES], sizeof(zval *), NULL); + if (files) { + zval_ptr_dtor(&files); + } + } + } + } + zend_hash_destroy(¶ms); + } + } + + STR_SET(SG(request_info).content_type_dup, NULL); + return SUCCESS; } @@ -52,7 +113,7 @@ PHP_HTTP_API void php_http_env_get_request_headers(HashTable *headers TSRMLS_DC) if (SUCCESS == zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void *) &hsv) && Z_TYPE_PP(hsv) == IS_ARRAY) { FOREACH_KEY(pos, *hsv, key) { - if (key.type == HASH_KEY_IS_STRING && key.len > 6 && !strncmp(key.str, "HTTP_", 5)) { + if (key.type == HASH_KEY_IS_STRING && key.len > 6 && *key.str == 'H' && !strncmp(key.str, "HTTP_", 5)) { key.len -= 5; key.str = php_http_pretty_key(estrndup(key.str + 5, key.len - 1), key.len - 1, 1, 1); @@ -60,6 +121,14 @@ PHP_HTTP_API void php_http_env_get_request_headers(HashTable *headers TSRMLS_DC) Z_ADDREF_P(*header); zend_symtable_update(PHP_HTTP_G->env.request.headers, key.str, key.len, (void *) header, sizeof(zval *), NULL); + efree(key.str); + } else if (key.type == HASH_KEY_IS_STRING && key.len > 9 && *key.str == 'C' && !strncmp(key.str, "CONTENT_", 8)) { + key.str = php_http_pretty_key(estrndup(key.str, key.len - 1), key.len - 1, 1, 1); + + zend_hash_get_current_data_ex(Z_ARRVAL_PP(hsv), (void *) &header, &pos); + Z_ADDREF_P(*header); + zend_symtable_update(PHP_HTTP_G->env.request.headers, key.str, key.len, (void *) header, sizeof(zval *), NULL); + efree(key.str); } } @@ -360,7 +429,7 @@ PHP_HTTP_API char *php_http_env_get_response_header(const char *name_str, size_t char *val = NULL; HashTable headers; - zend_hash_init(&headers, 0, NULL, NULL, 0); + zend_hash_init(&headers, 0, NULL, ZVAL_PTR_DTOR, 0); if (SUCCESS == php_http_env_get_response_headers(&headers TSRMLS_CC)) { zval **zvalue; char *key = php_http_pretty_key(estrndup(name_str, name_len), name_len, 1, 1); @@ -392,7 +461,7 @@ PHP_HTTP_API STATUS php_http_env_set_response_code(long http_code TSRMLS_DC) PHP_HTTP_API STATUS php_http_env_set_response_status_line(long code, php_http_version_t *v TSRMLS_DC) { - sapi_header_line h = {0}; + sapi_header_line h = {NULL, 0, 0}; STATUS ret; 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)); @@ -661,7 +730,7 @@ PHP_METHOD(HttpEnv, getRequestBody) php_http_message_body_t *body = php_http_env_get_request_body(TSRMLS_C); if (SUCCESS == php_http_new(&ov, class_entry, (php_http_new_t) php_http_message_body_object_new_ex, php_http_message_body_class_entry, php_http_message_body_copy(body, NULL, 0), NULL TSRMLS_CC)) { - RETURN_OBJVAL(ov, 0); + RETVAL_OBJVAL(ov, 0); } } } end_error_handling();