diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-08-07 17:50:07 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-08-07 19:55:40 -0700 |
| commit | af2ac24333a7de1abecc784cc1bc7e2ef005c873 (patch) | |
| tree | a4d41b3b6bd092b9384a7cb2dac2bf50b61e4f4c /src/Package/Fetch.zig | |
| parent | 5ce8e9325b7aa15cbcc77221fc7075b6c46619cc (diff) | |
| download | zig-af2ac24333a7de1abecc784cc1bc7e2ef005c873.tar.gz zig-af2ac24333a7de1abecc784cc1bc7e2ef005c873.zip | |
Fetch: handle compressed git+http
Diffstat (limited to 'src/Package/Fetch.zig')
| -rw-r--r-- | src/Package/Fetch.zig | 28 |
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 = |
