summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2011-02-25 19:57:23 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2011-02-25 19:57:23 +0000
commitb1a2212a95b9ecc324da1fad679b596286a04bbe (patch)
treebf564872b004188927e3eb06c424a366e4955d80
parentec39ae69d625dd5d9e768d7fedf464d8e2808022 (diff)
downloadnetsurf-b1a2212a95b9ecc324da1fad679b596286a04bbe.tar.gz
netsurf-b1a2212a95b9ecc324da1fad679b596286a04bbe.tar.bz2
Fix bug #3140968: form submission with the GET method must replace the query segment of the action URL.
svn path=/trunk/netsurf/; revision=11800
-rw-r--r--render/form.c101
1 files changed, 55 insertions, 46 deletions
diff --git a/render/form.c b/render/form.c
index 3bf5bf550..fd16b8bab 100644
--- a/render/form.c
+++ b/render/form.c
@@ -332,7 +332,7 @@ bool form_successful_controls(struct form *form,
char *charset;
last_success = &sentinel;
- sentinel.next = 0;
+ sentinel.next = NULL;
charset = form_acceptable_charset(form);
if (!charset)
@@ -1463,63 +1463,72 @@ void form_radio_set(hlcache_handle *content,
void form_submit(hlcache_handle *h, struct browser_window *target,
struct form *form, struct form_control *submit_button)
{
- char *data = 0, *url = 0;
+ char *data = NULL, *url = NULL;
struct fetch_multipart_data *success;
+ struct url_components components;
+ url_func_result res;
- assert(form);
+ assert(form != NULL);
assert(content_get_type(h) == CONTENT_HTML);
- if (!form_successful_controls(form, submit_button, &success)) {
+ if (form_successful_controls(form, submit_button, &success) == false) {
warn_user("NoMemory", 0);
return;
}
switch (form->method) {
- case method_GET:
- data = form_url_encode(form, success);
- if (!data) {
- fetch_multipart_data_destroy(success);
- warn_user("NoMemory", 0);
- return;
- }
- url = calloc(1, strlen(form->action) +
- strlen(data) + 2);
- if (!url) {
- fetch_multipart_data_destroy(success);
- free(data);
- warn_user("NoMemory", 0);
- return;
- }
- if (form->action[strlen(form->action)-1] == '?') {
- sprintf(url, "%s%s", form->action, data);
- }
- else {
- sprintf(url, "%s?%s", form->action, data);
- }
- browser_window_go(target, url, content_get_url(h),
- true);
- break;
+ case method_GET:
+ data = form_url_encode(form, success);
+ if (data == NULL) {
+ fetch_multipart_data_destroy(success);
+ warn_user("NoMemory", 0);
+ return;
+ }
- case method_POST_URLENC:
- data = form_url_encode(form, success);
- if (!data) {
- fetch_multipart_data_destroy(success);
- warn_user("NoMemory", 0);
- return;
- }
- browser_window_go_post(target, form->action, data, 0,
- true, content_get_url(h),
- false, true, 0);
- break;
+ /* Decompose action */
+ res = url_get_components(form->action, &components);
+ if (res != URL_FUNC_OK) {
+ free(data);
+ fetch_multipart_data_destroy(success);
+ warn_user("NoMemory", 0);
+ return;
+ }
- case method_POST_MULTIPART:
- browser_window_go_post(target, form->action, 0,
- success, true, content_get_url(h),
- false, true, 0);
- break;
+ /* Replace query segment */
+ components.query = data;
- default:
- assert(0);
+ /* Construct submit url */
+ url = url_reform_components(&components);
+ if (url == NULL) {
+ free(data);
+ fetch_multipart_data_destroy(success);
+ warn_user("NoMemory", 0);
+ return;
+ }
+
+ url_destroy_components(&components);
+
+ browser_window_go(target, url, content_get_url(h), true);
+ break;
+
+ case method_POST_URLENC:
+ data = form_url_encode(form, success);
+ if (data == NULL) {
+ fetch_multipart_data_destroy(success);
+ warn_user("NoMemory", 0);
+ return;
+ }
+
+ browser_window_go_post(target, form->action, data, 0,
+ true, content_get_url(h),
+ false, true, 0);
+ break;
+
+ case method_POST_MULTIPART:
+ browser_window_go_post(target, form->action, 0,
+ success, true, content_get_url(h),
+ false, true, 0);
+ break;
}
fetch_multipart_data_destroy(success);