From a2f15ce0b2ff1f3176dd453a55d05f673e507da2 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Thu, 14 Aug 2025 18:26:01 +0800 Subject: [PATCH 1/2] Remove unecessary content type parse getResponseHeader takes header index --- src/http/Client.zig | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/src/http/Client.zig b/src/http/Client.zig index 1e426f6f..cfd93fba 100644 --- a/src/http/Client.zig +++ b/src/http/Client.zig @@ -641,20 +641,6 @@ pub const Transfer = struct { return buf_len; } - var hdr = &transfer.response_header.?; - - if (hdr._content_type_len == 0) { - const CONTENT_TYPE_LEN = "content-type:".len; - if (header.len > CONTENT_TYPE_LEN) { - if (std.ascii.eqlIgnoreCase(header[0..CONTENT_TYPE_LEN], "content-type:")) { - const value = std.mem.trimLeft(u8, header[CONTENT_TYPE_LEN..], " "); - const len = @min(value.len, hdr._content_type.len); - hdr._content_type_len = len; - @memcpy(hdr._content_type[0..len], value[0..len]); - } - } - } - { const SET_COOKIE_LEN = "set-cookie:".len; if (header.len > SET_COOKIE_LEN) { @@ -668,7 +654,8 @@ pub const Transfer = struct { } if (buf_len == 2) { - if (getResponseHeader(easy, "content-type")) |value| { + if (getResponseHeader(easy, "content-type", 0)) |value| { + var hdr = &transfer.response_header.?; const len = @min(value.len, hdr._content_type.len); hdr._content_type_len = len; @memcpy(hdr._content_type[0..len], value[0..len]); @@ -761,9 +748,9 @@ const HeaderIterator = struct { } }; -fn getResponseHeader(easy: *c.CURL, name: [:0]const u8) ?[]const u8 { +fn getResponseHeader(easy: *c.CURL, name: [:0]const u8, index: usize) ?[]const u8 { var hdr: [*c]c.curl_header = null; - const result = c.curl_easy_header(easy, name, 0, c.CURLH_HEADER, -1, &hdr); + const result = c.curl_easy_header(easy, name, index, c.CURLH_HEADER, -1, &hdr); if (result == c.CURLE_OK) { return std.mem.span(hdr.*.value); } From 5b2806a78401370fe0794ff1ea0c291c4c9823b3 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Thu, 14 Aug 2025 18:57:57 +0800 Subject: [PATCH 2/2] expose response header amount --- src/http/Client.zig | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/http/Client.zig b/src/http/Client.zig index cfd93fba..8b308c3b 100644 --- a/src/http/Client.zig +++ b/src/http/Client.zig @@ -654,8 +654,9 @@ pub const Transfer = struct { } if (buf_len == 2) { - if (getResponseHeader(easy, "content-type", 0)) |value| { + if (getResponseHeader(easy, "content-type", 0)) |ct| { var hdr = &transfer.response_header.?; + const value = ct.value; const len = @min(value.len, hdr._content_type.len); hdr._content_type_len = len; @memcpy(hdr._content_type[0..len], value[0..len]); @@ -748,11 +749,19 @@ const HeaderIterator = struct { } }; -fn getResponseHeader(easy: *c.CURL, name: [:0]const u8, index: usize) ?[]const u8 { +const ResponseHeader = struct { + value: []const u8, + amount: usize, +}; + +fn getResponseHeader(easy: *c.CURL, name: [:0]const u8, index: usize) ?ResponseHeader { var hdr: [*c]c.curl_header = null; const result = c.curl_easy_header(easy, name, index, c.CURLH_HEADER, -1, &hdr); if (result == c.CURLE_OK) { - return std.mem.span(hdr.*.value); + return .{ + .amount = hdr.*.amount, + .value = std.mem.span(hdr.*.value), + }; } if (result == c.CURLE_FAILED_INIT) {