diff --git a/Userland/Libraries/LibHTTP/HttpRequest.cpp b/Userland/Libraries/LibHTTP/HttpRequest.cpp index 41c85a0566..d8196f549d 100644 --- a/Userland/Libraries/LibHTTP/HttpRequest.cpp +++ b/Userland/Libraries/LibHTTP/HttpRequest.cpp @@ -62,17 +62,28 @@ ErrorOr 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(); }