URL stitch avoid double /

This commit is contained in:
Karl Seguin
2025-06-04 19:31:43 +08:00
parent 1090ff0175
commit b35107a966
2 changed files with 16 additions and 6 deletions

View File

@@ -219,7 +219,7 @@ pub const URL = struct {
} }
pub fn _toJSON(self: *URL, page: *Page) ![]const u8 { pub fn _toJSON(self: *URL, page: *Page) ![]const u8 {
return try self.get_href(page); return self.get_href(page);
} }
}; };

View File

@@ -125,16 +125,16 @@ pub const URL = struct {
} }
}; };
const normalized_src = if (src[0] == '/') src[1..] else src;
if (std.mem.lastIndexOfScalar(u8, base[protocol_end..], '/')) |index| { if (std.mem.lastIndexOfScalar(u8, base[protocol_end..], '/')) |index| {
const last_slash_pos = index + protocol_end; const last_slash_pos = index + protocol_end;
if (last_slash_pos == base.len - 1) { if (last_slash_pos == base.len - 1) {
return std.fmt.allocPrint(allocator, "{s}{s}", .{ base, src }); return std.fmt.allocPrint(allocator, "{s}{s}", .{ base, normalized_src });
} else {
return std.fmt.allocPrint(allocator, "{s}/{s}", .{ base[0..last_slash_pos], src });
} }
} else { return std.fmt.allocPrint(allocator, "{s}/{s}", .{ base[0..last_slash_pos], normalized_src });
return std.fmt.allocPrint(allocator, "{s}/{s}", .{ base, src });
} }
return std.fmt.allocPrint(allocator, "{s}/{s}", .{ base, normalized_src });
} }
pub fn concatQueryString(arena: Allocator, url: []const u8, query_string: []const u8) ![]const u8 { pub fn concatQueryString(arena: Allocator, url: []const u8, query_string: []const u8) ![]const u8 {
@@ -233,6 +233,16 @@ test "URL: Stitching Base & Src URLs (Just Ending Slash)" {
try testing.expectString("https://www.google.com/something.js", result); try testing.expectString("https://www.google.com/something.js", result);
} }
test "URL: Stitching Base & Src URLs with leading slash" {
const allocator = testing.allocator;
const base = "https://www.google.com/";
const src = "/something.js";
const result = try URL.stitch(allocator, src, base, .{});
defer allocator.free(result);
try testing.expectString("https://www.google.com/something.js", result);
}
test "URL: Stitching Base & Src URLs (No Ending Slash)" { test "URL: Stitching Base & Src URLs (No Ending Slash)" {
const allocator = testing.allocator; const allocator = testing.allocator;