aboutsummaryrefslogtreecommitdiff
path: root/src/Package/Fetch.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-08-07 17:50:07 -0700
committerAndrew Kelley <andrew@ziglang.org>2025-08-07 19:55:40 -0700
commitaf2ac24333a7de1abecc784cc1bc7e2ef005c873 (patch)
treea4d41b3b6bd092b9384a7cb2dac2bf50b61e4f4c /src/Package/Fetch.zig
parent5ce8e9325b7aa15cbcc77221fc7075b6c46619cc (diff)
downloadzig-af2ac24333a7de1abecc784cc1bc7e2ef005c873.tar.gz
zig-af2ac24333a7de1abecc784cc1bc7e2ef005c873.zip
Fetch: handle compressed git+http
Diffstat (limited to 'src/Package/Fetch.zig')
-rw-r--r--src/Package/Fetch.zig28
1 files changed, 17 insertions, 11 deletions
diff --git a/src/Package/Fetch.zig b/src/Package/Fetch.zig
index fd8c26f1e6..2a7cfbdcde 100644
--- a/src/Package/Fetch.zig
+++ b/src/Package/Fetch.zig
@@ -883,7 +883,9 @@ const Resource = union(enum) {
const HttpRequest = struct {
request: std.http.Client.Request,
response: std.http.Client.Response,
- buffer: []u8,
+ transfer_buffer: []u8,
+ decompress: std.http.Decompress,
+ decompress_buffer: []u8,
};
fn deinit(resource: *Resource) void {
@@ -892,7 +894,6 @@ const Resource = union(enum) {
.http_request => |*http_request| http_request.request.deinit(),
.git => |*git_resource| {
git_resource.fetch_stream.deinit();
- git_resource.session.deinit();
},
.dir => |*dir| dir.close(),
}
@@ -902,7 +903,11 @@ const Resource = union(enum) {
fn reader(resource: *Resource) *std.Io.Reader {
return switch (resource.*) {
.file => |*file_reader| return &file_reader.interface,
- .http_request => |*http_request| return http_request.response.reader(http_request.buffer),
+ .http_request => |*http_request| return http_request.response.readerDecompressing(
+ http_request.transfer_buffer,
+ &http_request.decompress,
+ http_request.decompress_buffer,
+ ),
.git => |*g| return &g.fetch_stream.reader,
.dir => unreachable,
};
@@ -971,7 +976,6 @@ const FileType = enum {
const init_resource_buffer_size = git.Packet.max_data_length;
fn initResource(f: *Fetch, uri: std.Uri, resource: *Resource, reader_buffer: []u8) RunError!void {
- const gpa = f.arena.child_allocator;
const arena = f.arena.allocator();
const eb = &f.error_bundle;
@@ -995,7 +999,9 @@ fn initResource(f: *Fetch, uri: std.Uri, resource: *Resource, reader_buffer: []u
.request = http_client.request(.GET, uri, .{}) catch |err|
return f.fail(f.location_tok, try eb.printString("unable to connect to server: {t}", .{err})),
.response = undefined,
- .buffer = reader_buffer,
+ .transfer_buffer = reader_buffer,
+ .decompress_buffer = &.{},
+ .decompress = undefined,
} };
const request = &resource.http_request.request;
errdefer request.deinit();
@@ -1019,6 +1025,7 @@ fn initResource(f: *Fetch, uri: std.Uri, resource: *Resource, reader_buffer: []u
.{ response.head.status, response.head.status.phrase() orelse "" },
));
+ resource.http_request.decompress_buffer = try arena.alloc(u8, response.head.content_encoding.minBufferCapacity());
return;
}
@@ -1027,13 +1034,12 @@ fn initResource(f: *Fetch, uri: std.Uri, resource: *Resource, reader_buffer: []u
{
var transport_uri = uri;
transport_uri.scheme = uri.scheme["git+".len..];
- var session = git.Session.init(gpa, http_client, transport_uri, reader_buffer) catch |err| {
- return f.fail(f.location_tok, try eb.printString(
- "unable to discover remote git server capabilities: {s}",
- .{@errorName(err)},
- ));
+ var session = git.Session.init(arena, http_client, transport_uri, reader_buffer) catch |err| {
+ return f.fail(
+ f.location_tok,
+ try eb.printString("unable to discover remote git server capabilities: {t}", .{err}),
+ );
};
- errdefer session.deinit();
const want_oid = want_oid: {
const want_ref =