Bläddra i källkod

LibHTTP: Fix issues with HTTP POST request and requests with a body

The previous implementation created invalid HTTP requests in cases
where the request method was POST or when the request contained a
body. There were two bugs for these cases:

1) the 'Content-Type' header was sent twice
2) a stray CRLF was appended to the request
Uku Loskit 1 år sedan
förälder
incheckning
98ad5a7141
1 ändrade filer med 13 tillägg och 2 borttagningar
  1. 13 2
      Userland/Libraries/LibHTTP/HttpRequest.cpp

+ 13 - 2
Userland/Libraries/LibHTTP/HttpRequest.cpp

@@ -62,17 +62,28 @@ ErrorOr<ByteBuffer> HttpRequest::to_raw_request() const
     if (m_url.port().has_value())
         TRY(builder.try_appendff(":{}", *m_url.port()));
     TRY(builder.try_append("\r\n"sv));
+    // Start headers.
+    bool has_content_length = false;
     for (auto& header : m_headers) {
+        if (header.name.equals_ignoring_ascii_case("Content-Length"sv))
+            has_content_length = true;
         TRY(builder.try_append(header.name));
         TRY(builder.try_append(": "sv));
         TRY(builder.try_append(header.value));
         TRY(builder.try_append("\r\n"sv));
     }
     if (!m_body.is_empty() || method() == Method::POST) {
-        TRY(builder.try_appendff("Content-Length: {}\r\n\r\n", m_body.size()));
+        // Add Content-Length header if it's not already present.
+        if (!has_content_length) {
+            TRY(builder.try_appendff("Content-Length: {}\r\n", m_body.size()));
+        }
+        // Finish headers.
+        TRY(builder.try_append("\r\n"sv));
         TRY(builder.try_append((char const*)m_body.data(), m_body.size()));
+    } else {
+        // Finish headers.
+        TRY(builder.try_append("\r\n"sv));
     }
-    TRY(builder.try_append("\r\n"sv));
     return builder.to_byte_buffer();
 }