╭ changed ─────────╮ │src/serve_http.zig│ ╰──────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │115 defer allocator.free(content_type); │ │116 const has_remote_user = findHeader(request, "authorization") != null; │ │117 const protocol_version = protocolVersionFromHeader(findHeader(request, "git-protocol")); │ │118 + │ │119 + const create_if_missing = isReceivePack(handler, suffix, uri.query); │ │120 │ │121 + // pushing over HTTP is disabled outside test mode; pushes go over SSH │ │122 + if (create_if_missing and !is_test) { │ │123 + if (http_server.reader.state == .received_head) { │ │124 + http_server.reader.state = .ready; │ │125 + } │ │126 + try writeSimpleResponse(http_server, 403, "Forbidden", "text/plain", "push over HTTP is disabled");│ │127 + return; │ │128 + } │ │129 + │ │130 const body = if (request.head.method == .POST) blk: { │ │131 const reader = try request.readerExpectContinue(&.{}); │ │132 break :blk try reader.allocRemaining(allocator, .unlimited); │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │137 http_server.reader.state = .ready; │ │138 } │ │139 │ │129 - const create_if_missing = isReceivePack(handler, suffix, uri.query); │ │130 - │ │140 const repo_path = switch (try serve_common.resolveRepoPath(io, allocator, is_test, repo_root_path, admin_repo_path, repo_rel, create_if_missing)) {│ │141 .ok => |p| p, │ │142 .invalid => return writeSimpleResponse(http_server, 400, "Bad Request", "text/plain", "repo path must be <owner>/<repo>"), │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯