Browse Source

LibWeb: Support <form method=POST>

Use the new support for HTTP method and request body to implement basic
support for POST'ed forms. This is pretty cool! :^)
Andreas Kling 4 years ago
parent
commit
ceda137bf2
1 changed files with 18 additions and 4 deletions
  1. 18 4
      Libraries/LibWeb/HTML/HTMLFormElement.cpp

+ 18 - 4
Libraries/LibWeb/HTML/HTMLFormElement.cpp

@@ -50,8 +50,8 @@ void HTMLFormElement::submit(RefPtr<HTMLInputElement> submitter)
     }
 
     auto effective_method = method().to_lowercase();
-    if (effective_method != "get") {
-        if (effective_method == "post" || effective_method == "dialog") {
+    if (effective_method != "get" && effective_method != "post") {
+        if (effective_method == "dialog") {
             dbg() << "Unsupported form method '" << method() << "'";
             return;
         }
@@ -69,10 +69,24 @@ void HTMLFormElement::submit(RefPtr<HTMLInputElement> submitter)
         return IterationDecision::Continue;
     });
 
-    url.set_query(urlencode(parameters));
+    if (effective_method == "get") {
+        url.set_query(urlencode(parameters));
+    }
 
     // FIXME: We shouldn't let the form just do this willy-nilly.
-    document().frame()->page().load(url);
+
+    LoadRequest request;
+    request.set_url(url);
+
+    if (effective_method == "post") {
+        auto body = urlencode(parameters).to_byte_buffer();
+        request.set_method("POST");
+        request.set_header("Content-Type", "application/x-www-form-urlencoded");
+        request.set_header("Content-Length", String::number(body.size()));
+        request.set_body(body);
+    }
+
+    document().frame()->page().load(request);
 }
 
 }