aboutsummaryrefslogtreecommitdiff
path: root/src/Package/Fetch
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2024-02-23 17:41:38 -0800
committerGitHub <noreply@github.com>2024-02-23 17:41:38 -0800
commitcfce81f7d5f11ab93b2d5fd26df41edf967f333b (patch)
tree11e52ad0a44620f4a4519683abd945146c11b312 /src/Package/Fetch
parent7230b68b350b16c637e84f3ff224be24d23214ce (diff)
parent653d4158cdcb20be82ff525e122277064e6acb92 (diff)
downloadzig-cfce81f7d5f11ab93b2d5fd26df41edf967f333b.tar.gz
zig-cfce81f7d5f11ab93b2d5fd26df41edf967f333b.zip
Merge pull request #18955 from ziglang/std.http.Server
take std.http in a different direction
Diffstat (limited to 'src/Package/Fetch')
-rw-r--r--src/Package/Fetch/git.zig56
1 files changed, 33 insertions, 23 deletions
diff --git a/src/Package/Fetch/git.zig b/src/Package/Fetch/git.zig
index ee8f1ba543..dc0c844d1d 100644
--- a/src/Package/Fetch/git.zig
+++ b/src/Package/Fetch/git.zig
@@ -494,8 +494,9 @@ pub const Session = struct {
session: *Session,
allocator: Allocator,
redirect_uri: *[]u8,
+ http_headers_buffer: []u8,
) !void {
- var capability_iterator = try session.getCapabilities(allocator, redirect_uri);
+ var capability_iterator = try session.getCapabilities(allocator, redirect_uri, http_headers_buffer);
defer capability_iterator.deinit();
while (try capability_iterator.next()) |capability| {
if (mem.eql(u8, capability.key, "agent")) {
@@ -521,6 +522,7 @@ pub const Session = struct {
session: Session,
allocator: Allocator,
redirect_uri: *[]u8,
+ http_headers_buffer: []u8,
) !CapabilityIterator {
var info_refs_uri = session.uri;
info_refs_uri.path = try std.fs.path.resolvePosix(allocator, &.{ "/", session.uri.path, "info/refs" });
@@ -528,12 +530,13 @@ pub const Session = struct {
info_refs_uri.query = "service=git-upload-pack";
info_refs_uri.fragment = null;
- var headers = std.http.Headers.init(allocator);
- defer headers.deinit();
- try headers.append("Git-Protocol", "version=2");
-
- var request = try session.transport.open(.GET, info_refs_uri, headers, .{
- .max_redirects = 3,
+ const max_redirects = 3;
+ var request = try session.transport.open(.GET, info_refs_uri, .{
+ .redirect_behavior = @enumFromInt(max_redirects),
+ .server_header_buffer = http_headers_buffer,
+ .extra_headers = &.{
+ .{ .name = "Git-Protocol", .value = "version=2" },
+ },
});
errdefer request.deinit();
try request.send(.{});
@@ -541,7 +544,8 @@ pub const Session = struct {
try request.wait();
if (request.response.status != .ok) return error.ProtocolError;
- if (request.redirects_left < 3) {
+ const any_redirects_occurred = request.redirect_behavior.remaining() < max_redirects;
+ if (any_redirects_occurred) {
if (!mem.endsWith(u8, request.uri.path, "/info/refs")) return error.UnparseableRedirect;
var new_uri = request.uri;
new_uri.path = new_uri.path[0 .. new_uri.path.len - "/info/refs".len];
@@ -620,6 +624,7 @@ pub const Session = struct {
include_symrefs: bool = false,
/// Whether to include the peeled object ID for returned tag refs.
include_peeled: bool = false,
+ server_header_buffer: []u8,
};
/// Returns an iterator over refs known to the server.
@@ -630,11 +635,6 @@ pub const Session = struct {
upload_pack_uri.query = null;
upload_pack_uri.fragment = null;
- var headers = std.http.Headers.init(allocator);
- defer headers.deinit();
- try headers.append("Content-Type", "application/x-git-upload-pack-request");
- try headers.append("Git-Protocol", "version=2");
-
var body = std.ArrayListUnmanaged(u8){};
defer body.deinit(allocator);
const body_writer = body.writer(allocator);
@@ -656,8 +656,13 @@ pub const Session = struct {
}
try Packet.write(.flush, body_writer);
- var request = try session.transport.open(.POST, upload_pack_uri, headers, .{
- .handle_redirects = false,
+ var request = try session.transport.open(.POST, upload_pack_uri, .{
+ .redirect_behavior = .unhandled,
+ .server_header_buffer = options.server_header_buffer,
+ .extra_headers = &.{
+ .{ .name = "Content-Type", .value = "application/x-git-upload-pack-request" },
+ .{ .name = "Git-Protocol", .value = "version=2" },
+ },
});
errdefer request.deinit();
request.transfer_encoding = .{ .content_length = body.items.len };
@@ -721,18 +726,18 @@ pub const Session = struct {
/// Fetches the given refs from the server. A shallow fetch (depth 1) is
/// performed if the server supports it.
- pub fn fetch(session: Session, allocator: Allocator, wants: []const []const u8) !FetchStream {
+ pub fn fetch(
+ session: Session,
+ allocator: Allocator,
+ wants: []const []const u8,
+ http_headers_buffer: []u8,
+ ) !FetchStream {
var upload_pack_uri = session.uri;
upload_pack_uri.path = try std.fs.path.resolvePosix(allocator, &.{ "/", session.uri.path, "git-upload-pack" });
defer allocator.free(upload_pack_uri.path);
upload_pack_uri.query = null;
upload_pack_uri.fragment = null;
- var headers = std.http.Headers.init(allocator);
- defer headers.deinit();
- try headers.append("Content-Type", "application/x-git-upload-pack-request");
- try headers.append("Git-Protocol", "version=2");
-
var body = std.ArrayListUnmanaged(u8){};
defer body.deinit(allocator);
const body_writer = body.writer(allocator);
@@ -756,8 +761,13 @@ pub const Session = struct {
try Packet.write(.{ .data = "done\n" }, body_writer);
try Packet.write(.flush, body_writer);
- var request = try session.transport.open(.POST, upload_pack_uri, headers, .{
- .handle_redirects = false,
+ var request = try session.transport.open(.POST, upload_pack_uri, .{
+ .redirect_behavior = .not_allowed,
+ .server_header_buffer = http_headers_buffer,
+ .extra_headers = &.{
+ .{ .name = "Content-Type", .value = "application/x-git-upload-pack-request" },
+ .{ .name = "Git-Protocol", .value = "version=2" },
+ },
});
errdefer request.deinit();
request.transfer_encoding = .{ .content_length = body.items.len };