aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/deps/picohttp.zig8
-rw-r--r--src/http_client.zig23
2 files changed, 26 insertions, 5 deletions
diff --git a/src/deps/picohttp.zig b/src/deps/picohttp.zig
index 7c081afc4..cdd26b710 100644
--- a/src/deps/picohttp.zig
+++ b/src/deps/picohttp.zig
@@ -116,6 +116,14 @@ pub const Response = struct {
headers: []const Header,
bytes_read: c_int = 0,
+ pub fn format(self: Response, comptime layout: []const u8, opts: fmt.FormatOptions, writer: anytype) !void {
+ try fmt.format(writer, "< {d} {s}\n", .{ self.status_code, self.status });
+ for (self.headers) |header| {
+ _ = try writer.write("< \t");
+ try fmt.format(writer, "{s}\n", .{header});
+ }
+ }
+
pub fn parseParts(buf: []const u8, src: []Header, offset: ?*usize) !Response {
var minor_version: c_int = undefined;
var status_code: c_int = undefined;
diff --git a/src/http_client.zig b/src/http_client.zig
index cbc2ddedb..34525e846 100644
--- a/src/http_client.zig
+++ b/src/http_client.zig
@@ -85,6 +85,8 @@ const content_length_header_hash = hashHeaderName("Content-Length");
const connection_header = picohttp.Header{ .name = "Connection", .value = "close" };
const accept_header = picohttp.Header{ .name = "Accept", .value = "*/*" };
const accept_header_hash = hashHeaderName("Accept");
+const user_agent_header = picohttp.Header{ .name = "User-Agent", .value = "Bun.js " ++ Global.package_json_version };
+const user_agent_header_hash = hashHeaderName("User-Agent");
pub fn headerStr(this: *const HTTPClient, ptr: Api.StringPointer) string {
return this.header_buf[ptr.offset..][0..ptr.length];
@@ -96,6 +98,7 @@ pub fn buildRequest(this: *const HTTPClient, body_len: usize) picohttp.Request {
var header_names = header_entries.items(.name);
var header_values = header_entries.items(.value);
+ var override_user_agent = false;
for (header_names) |head, i| {
const name = this.headerStr(head);
// Hash it as lowercase
@@ -108,12 +111,12 @@ pub fn buildRequest(this: *const HTTPClient, body_len: usize) picohttp.Request {
connection_header_hash,
content_length_header_hash,
accept_header_hash,
- => {
- continue;
- },
+ => continue,
else => {},
}
+ override_user_agent = override_user_agent or hash == user_agent_header_hash;
+
request_headers_buf[header_count] = picohttp.Header{
.name = name,
.value = this.headerStr(header_values[i]),
@@ -135,8 +138,14 @@ pub fn buildRequest(this: *const HTTPClient, body_len: usize) picohttp.Request {
header_count += 1;
}
- request_headers_buf[header_count] = connection_header;
- header_count += 1;
+ // request_headers_buf[header_count] = connection_header;
+ // header_count += 1;
+
+ if (!override_user_agent) {
+ request_headers_buf[header_count] = user_agent_header;
+ header_count += 1;
+ }
+
request_headers_buf[header_count] = accept_header;
header_count += 1;
@@ -360,6 +369,10 @@ pub fn sendHTTPS(this: *HTTPClient, body_str: []const u8, body_out_str: *Mutable
body_out_str.reset();
var content_length: u32 = 0;
for (response.headers) |header| {
+ if (this.verbose) {
+ Output.prettyErrorln("Response: {s}", .{response});
+ }
+
switch (hashHeaderName(header.name)) {
content_length_header_hash => {
content_length = std.fmt.parseInt(u32, header.value, 10) catch 0;