diff options
| author | Zeev Suraski <zeev@php.net> | 1999-05-25 21:14:54 +0000 |
|---|---|---|
| committer | Zeev Suraski <zeev@php.net> | 1999-05-25 21:14:54 +0000 |
| commit | 72f6e823f929cddc0a95fbfd489606b82188334d (patch) | |
| tree | 7130b5829028531bbfbe9fafacd6036f57d21d9b /main/SAPI.c | |
| parent | 7b98592282ad0de385411cbe2f6e1946fd5ff0dd (diff) | |
| download | php-git-72f6e823f929cddc0a95fbfd489606b82188334d.tar.gz | |
* Add generic POST content-type support. Only application/x-www-form-urlencoded
supported at this time, but the framework allows for any other types, including
runtime addition of types.
Diffstat (limited to 'main/SAPI.c')
| -rw-r--r-- | main/SAPI.c | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/main/SAPI.c b/main/SAPI.c index b3518736fd..e43e2dadac 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -28,6 +28,18 @@ #endif +static SAPI_POST_READER_FUNC(sapi_read_standard_form_data); + +#define DEFAULT_POST_CONTENT_TYPE "application/x-www-form-urlencoded" + +static sapi_post_content_type_reader supported_post_content_types[] = { + { DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data }, + { NULL, 0, NULL } +}; + + +static HashTable known_post_content_types; + SAPI_API void (*sapi_error)(int error_type, const char *message, ...); @@ -45,7 +57,14 @@ SAPI_API void (*sapi_error)(int error_type, const char *message, ...); SAPI_API void sapi_startup(sapi_module_struct *sf) { + sapi_post_content_type_reader *post_content_type_reader=supported_post_content_types; + sapi_module = *sf; + zend_hash_init(&known_post_content_types, 5, NULL, NULL, 1); + while (post_content_type_reader->content_type) { + sapi_register_post_reader(post_content_type_reader); + post_content_type_reader++; + } #ifdef ZTS sapi_globals_id = ts_allocate_id(sizeof(sapi_globals_struct), NULL, NULL); #endif @@ -63,6 +82,22 @@ static void sapi_free_header(sapi_header_struct *sapi_header) static void sapi_read_post_data(SLS_D) { + sapi_post_content_type_reader *post_content_type_reader; + uint content_type_length = strlen(SG(request_info).content_type); + char *content_type = estrndup(SG(request_info).content_type, content_type_length); + + zend_str_tolower(content_type, content_type_length); + + if (zend_hash_find(&known_post_content_types, content_type, content_type_length+1, (void **) &post_content_type_reader)==FAILURE) { + sapi_module.sapi_error(E_CORE_ERROR, "Unsupported content type: '%s'", content_type); + return; + } + post_content_type_reader->post_reader(SLS_C); +} + + +static SAPI_POST_READER_FUNC(sapi_read_standard_form_data) +{ int read_bytes, total_read_bytes=0; int allocated_bytes=SAPI_POST_BLOCK_SIZE+1; @@ -95,6 +130,13 @@ SAPI_API void sapi_activate(SLS_D) SG(headers_sent) = 0; SG(read_post_bytes) = 0; SG(request_info).post_data = NULL; + + if (SG(request_info).request_method && !strcmp(SG(request_info).request_method, "HEAD")) { + SG(request_info).headers_only = 1; + } else { + SG(request_info).headers_only = 0; + } + if (SG(server_context)) { if (SG(request_info).request_method && !strcmp(SG(request_info).request_method, "POST")) { @@ -102,11 +144,6 @@ SAPI_API void sapi_activate(SLS_D) } SG(request_info).cookie_data = sapi_module.read_cookies(SLS_C); } - if (SG(request_info).request_method && !strcmp(SG(request_info).request_method, "HEAD")) { - SG(request_info).headers_only = 1; - } else { - SG(request_info).headers_only = 0; - } } @@ -216,3 +253,9 @@ SAPI_API int sapi_send_headers() } return FAILURE; } + + +SAPI_API int sapi_register_post_reader(sapi_post_content_type_reader *post_content_type_reader) +{ + return zend_hash_add(&known_post_content_types, post_content_type_reader->content_type, post_content_type_reader->content_type_len+1, (void *) post_content_type_reader, sizeof(sapi_post_content_type_reader), NULL); +} |
