summaryrefslogtreecommitdiff
path: root/main/SAPI.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>1999-05-25 21:14:54 +0000
committerZeev Suraski <zeev@php.net>1999-05-25 21:14:54 +0000
commit72f6e823f929cddc0a95fbfd489606b82188334d (patch)
tree7130b5829028531bbfbe9fafacd6036f57d21d9b /main/SAPI.c
parent7b98592282ad0de385411cbe2f6e1946fd5ff0dd (diff)
downloadphp-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.c53
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);
+}