aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-10-05 17:45:32 -0700
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-10-05 17:45:32 -0700
commit9507cd8ed6ec1f7575a850333f73f006309feac8 (patch)
treeff37ce4fa7b3f32fe469eff2371fac7e4431581e
parentdfe74cb5c485f14793499d05539aac17f50822d9 (diff)
downloadbun-9507cd8ed6ec1f7575a850333f73f006309feac8.tar.gz
bun-9507cd8ed6ec1f7575a850333f73f006309feac8.tar.zst
bun-9507cd8ed6ec1f7575a850333f73f006309feac8.zip
[fetch] Fix bug with HTTP request bodies
-rw-r--r--src/http_client.zig18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/http_client.zig b/src/http_client.zig
index fd7088ff4..111656492 100644
--- a/src/http_client.zig
+++ b/src/http_client.zig
@@ -49,6 +49,7 @@ pub fn init(allocator: *std.mem.Allocator, method: Method, url: URL, header_entr
threadlocal var response_headers_buf: [256]picohttp.Header = undefined;
threadlocal var request_headers_buf: [256]picohttp.Header = undefined;
+threadlocal var request_content_len_buf: [64]u8 = undefined;
threadlocal var header_name_hashes: [256]u64 = undefined;
// threadlocal var resolver_cache
const tcp = std.x.net.tcp;
@@ -157,8 +158,8 @@ pub fn buildRequest(this: *const HTTPClient, body_len: usize) picohttp.Request {
if (body_len > 0) {
request_headers_buf[header_count] = picohttp.Header{
- .name = host_header_name,
- .value = this.url.hostname,
+ .name = content_length_header_name,
+ .value = std.fmt.bufPrint(&request_content_len_buf, "{d}", .{body_len}) catch "0",
};
header_count += 1;
}
@@ -231,13 +232,20 @@ pub fn sendHTTP(this: *HTTPClient, body: []const u8, body_out_str: *MutableStrin
}
var client_reader = client.reader(SOCKET_FLAGS);
- var req_buf_len = try client_reader.readAll(&http_req_buf);
- var request_buffer = http_req_buf[0..req_buf_len];
+
var response: picohttp.Response = undefined;
{
+ var req_buf_len: usize = 0;
+ var req_buf_read: usize = std.math.maxInt(usize);
+
var response_length: usize = 0;
- restart: while (true) {
+ restart: while (req_buf_read != 0) {
+ req_buf_read = try client_reader.read(&http_req_buf);
+ req_buf_len += req_buf_read;
+
+ var request_buffer = http_req_buf[0..req_buf_len];
+
response = picohttp.Response.parseParts(request_buffer, &response_headers_buf, &response_length) catch |err| {
switch (err) {
error.ShortRead => {