| /* Copyright 2000-2004 The Apache Software Foundation |
| ** |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| */ |
| |
| #include "apache_request.h" |
| #include "apache_cookie.h" |
| |
| module MODULE_VAR_EXPORT testapreq_module; |
| |
| static void util_start_html(request_rec *r, char *title) |
| { |
| ap_rputs("<HTML>\n", r); |
| ap_rputs("<HEADER>\n", r); |
| ap_rprintf(r, "<TITLE>%s</TITLE>\n", title); |
| ap_rputs("</HEADER>\n", r); |
| ap_rputs("<BODY>\n", r); |
| } |
| |
| static void util_end_html(request_rec *r) |
| { |
| ap_rputs("</BODY></HTML>\n", r); |
| } |
| |
| static void util_start_form(request_rec *r, char *type) |
| { |
| ap_rprintf(r, "<FORM METHOD=\"POST\" ENCTYPE=\"%s\">\n", |
| type ? type : DEFAULT_ENCTYPE); |
| } |
| |
| static void util_end_form(request_rec *r) |
| { |
| ap_rputs("</FORM>\n", r); |
| } |
| |
| static void util_submit(request_rec *r, char *name) |
| { |
| ap_rprintf(r, "<INPUT TYPE=\"submit\" NAME=\"%s\">\n", |
| name ? name : ".submit"); |
| } |
| |
| static void util_textfield(request_rec *r, char *key, char *val) |
| { |
| ap_rprintf(r, "<INPUT TYPE=\"text\" NAME=\"%s\" VALUE=\"%s\">\n", key, val); |
| } |
| |
| static void util_filefield(request_rec *r, char *key, char *val) |
| { |
| ap_rprintf(r, "<INPUT TYPE=\"file\" NAME=\"%s\" VALUE=\"%s\">\n", key, val); |
| } |
| |
| static int util_isa_default(char *wanted, char **list) |
| { |
| int i; |
| for(i=0; list[i]; i++) { |
| if(strEQ(wanted, list[i])) |
| return 1; |
| } |
| return 0; |
| } |
| |
| static void util_checkbox_group(request_rec *r, char *name, char **values, char **defaults) |
| { |
| int i; |
| for (i=0; values[i]; i++) { |
| ap_rprintf(r, |
| "<INPUT TYPE=\"checkbox\" NAME=\"%s\" VALUE=\"%s\" %s>%s\n", |
| name, values[i], |
| util_isa_default(values[i], defaults) ? |
| "CHECKED" : "", values[i]); |
| } |
| } |
| |
| static void util_popup_menu(request_rec *r, char *name, char **values) |
| { |
| int i; |
| ap_rprintf(r, "<SELECT NAME=\"%s\">\n", name); |
| for (i=0; values[i]; i++) |
| ap_rprintf(r, "<OPTION VALUE=\"%s\">%s\n", values[i], values[i]); |
| ap_rputs("</SELECT>\n", r); |
| } |
| |
| #define P_SEP ap_rputs("<P>", r) |
| |
| static char *checkbox_combo[] = { |
| "eenie","meenie","minie","moe",NULL |
| }; |
| |
| static char *checkbox_combo_defaults[] = { |
| "eenie","minie",NULL |
| }; |
| |
| static char *popup_menu_colors[] = { |
| "red","green","blue","chartreuse",NULL |
| }; |
| |
| /* |
| * <Location /apreq-form-test> |
| * SetHandler apreq-form |
| * </Location> |
| */ |
| static int form_handler(request_rec *r) { |
| ApacheRequest *req = ApacheRequest_new(r); |
| int status = ApacheRequest_parse(req); |
| |
| if (status != OK) { |
| return status; |
| } |
| |
| r->content_type = "text/html"; |
| ap_send_http_header(r); |
| |
| util_start_html(r, "Hello"); |
| util_start_form(r, NULL); |
| ap_rputs("What's your name? ", r); |
| util_textfield(r, "name", ""); |
| P_SEP; |
| ap_rputs("What's the combination?", r); |
| P_SEP; |
| util_checkbox_group(r, "words", |
| checkbox_combo, checkbox_combo_defaults); |
| P_SEP; |
| ap_rputs("What's your favorite color? ", r); |
| util_popup_menu(r, "color", popup_menu_colors); |
| P_SEP; |
| util_submit(r, NULL); |
| util_end_form(r); |
| P_SEP; |
| |
| if(r->method_number == M_POST) { |
| ap_rprintf(r, "Your name is: %s", |
| ApacheRequest_param(req, "name")); |
| P_SEP; |
| ap_rprintf(r, "The keywords are: %s", |
| ApacheRequest_params_as_string(req, "words")); |
| P_SEP; |
| ap_rprintf(r, "Your favorite color is: %s", |
| ApacheRequest_param(req, "color")); |
| } |
| |
| util_end_html(r); |
| return OK; |
| } |
| |
| static int upload_handler(request_rec *r) { |
| ApacheRequest *req = ApacheRequest_new(r); |
| int status = ApacheRequest_parse(req); |
| |
| if (status != OK) { |
| return status; |
| } |
| |
| r->content_type = "text/html"; |
| ap_send_http_header(r); |
| |
| util_start_html(r, "Upload test"); |
| util_start_form(r, "multipart/form-data"); |
| ap_rputs("Select File: ", r); |
| util_filefield(r, "filename", ""); |
| P_SEP; |
| util_submit(r, NULL); |
| util_end_form(r); |
| |
| if(r->method_number == M_POST) { |
| char buf[IOBUFSIZE]; |
| ap_rprintf(r, "Filename: %s (%d)", |
| ApacheRequest_param(req, "filename"), |
| (int)req->upload->size); |
| P_SEP; |
| while(fgets(buf, sizeof(buf), req->upload->fp)) { |
| ap_rputs(buf, r); |
| } |
| } |
| |
| util_end_html(r); |
| return OK; |
| } |
| |
| static int cookie_handler(request_rec *r) { |
| ApacheCookieJar *cookies = ApacheCookie_parse(r, NULL); |
| |
| r->content_type = "text/html"; |
| |
| if (ApacheCookieJarItems(cookies)) { |
| int i; |
| |
| ap_send_http_header(r); |
| util_start_html(r, "Cookie test"); |
| for (i=0; i<ApacheCookieJarItems(cookies); i++) { |
| ApacheCookie *c = ApacheCookieJarFetch(cookies, i); |
| ap_rprintf(r, "%s => %s\n", |
| c->name, ApacheCookie_as_string(c)); |
| P_SEP; |
| } |
| } |
| else { |
| ApacheCookie *apc = ApacheCookie_new(r, |
| "-name", "test", |
| "-value", "foo", |
| NULL); |
| ApacheCookie_expires(apc, "+1m"); |
| ApacheCookie_bake(apc); |
| ap_send_http_header(r); |
| util_start_html(r, "Cookie test"); |
| ap_rputs("No cookies in the jar", r); |
| } |
| util_end_html(r); |
| return OK; |
| } |
| |
| static handler_rec testapreq_handlers[] = |
| { |
| {"apreq-form", form_handler}, |
| {"apreq-upload", upload_handler}, |
| {"apreq-cookie", cookie_handler}, |
| {NULL} |
| }; |
| |
| module MODULE_VAR_EXPORT testapreq_module = |
| { |
| STANDARD_MODULE_STUFF, |
| NULL, /* module initializer */ |
| NULL, /* per-directory config creator */ |
| NULL, /* dir config merger */ |
| NULL, /* server config creator */ |
| NULL, /* server config merger */ |
| NULL, /* command table */ |
| testapreq_handlers, /* [7] content handlers */ |
| NULL, /* [2] URI-to-filename translation */ |
| NULL, /* [5] check/validate user_id */ |
| NULL, /* [6] check user_id is valid *here* */ |
| NULL, /* [4] check access by host address */ |
| NULL, /* [7] MIME type checker/setter */ |
| NULL, /* [8] fixups */ |
| NULL, /* [9] logger */ |
| NULL, /* [3] header parser */ |
| NULL, /* process initialization */ |
| NULL, /* process exit/cleanup */ |
| NULL /* [1] post read_request handling */ |
| }; |