From f3946ef17be42042781098e917aec687f658252e Mon Sep 17 00:00:00 2001 From: Daniel Gruno Date: Fri, 22 Jun 2012 06:45:17 +0000 Subject: [PATCH] backport from trunk: Update (fix) the POST data retrieval example. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1352780 13f79535-47bb-0310-9956-ffa450edef68 --- docs/manual/developer/modguide.xml | 71 ++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/docs/manual/developer/modguide.xml b/docs/manual/developer/modguide.xml index 2ce132b68a..d7f50b188c 100644 --- a/docs/manual/developer/modguide.xml +++ b/docs/manual/developer/modguide.xml @@ -548,11 +548,14 @@ POST data is four simple lines: -apr_table_t *GET; -apr_array_header_t *POST; - -ap_args_to_table(r, &GET); -ap_parse_form_data(r, NULL, &POST, -1, 8192); +apr_table_t *GET; +apr_array_header_t*POST; + + + +ap_args_to_table(r, &GET); + +ap_parse_form_data(r, NULL, &POST, -1, 8192); @@ -1569,34 +1572,56 @@ or check out the rest of our documentation for further tips.
Some useful snippets of code -
Retrieve a variable from POST form data +
Retrieve variables from POST form data -const char *read_post_value(const apr_array_header_t *fields, const char *key) -{ - /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - int i; - apr_table_entry_t *e = 0; - /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - e = (apr_table_entry_t *) fields->elts; - for(i = 0; i < fields->nelts; i++) { - if(!strcmp(e[i].key, key)) return e[i].val; +typedef struct { + const char* key; + const char* value; +} keyValuePair; + +keyValuePair* readPost(request_req* r) { + apr_array_header_t *pairs = NULL; + apr_off_t len; + apr_size_t size; + int res; + int i = 0; + char *buffer; + keyValuePair* kvp; + + res = ap_parse_form_data(r, NULL, &pairs, -1, HUGE_STRING_LEN); + if (res != OK || !pairs) return NULL; /* Return NULL if we failed or if there are is no POST data */ + kvp = apr_pcalloc(r->pool, sizeof(keyValuePair) * (pairs->nelts + 1)); + while (pairs && !apr_is_empty_array(pairs)) { + ap_form_pair_t *pair = (ap_form_pair_t *) apr_array_pop(pairs); + i++; + apr_brigade_length(pair->value, 1, &len); + size = (apr_size_t) len; + buffer = apr_palloc(r->pool, size + 1); + apr_brigade_flatten(pair->value, buffer, &size); + buffer[len] = 0; + kvp[i]->key = apr_pstrdup(r->pool, pair->name); + kvp[i]->value = buffer; } - return 0; + return kvp; } + static int example_handler(request_req *r) { /*~~~~~~~~~~~~~~~~~~~~~~*/ - apr_array_header_t *POST; - const char *value; - /*~~~~~~~~~~~~~~~~~~~~~~*/ - ap_parse_form_data(r, NULL, &POST, -1, 8192); - value = read_post_value(POST, "valueA"); - if (!value) value = "(undefined)"; - ap_rprintf(r, "The value of valueA is: %s", value); + keyValuePair* formData; + /*~~~~~~~~~~~~~~~~~~~~~~*/ + + formData = readPost(); + if (formData) { + int i; + for (i = 0; formData[i]; i++) { + ap_rprintf(r, "%s == %s\n", formData[i]->key, formData[i]->value); + } + } return OK; } -- 2.40.0