diff --git a/src/browser/url/url.zig b/src/browser/url/url.zig index 75232d03..94d322cd 100644 --- a/src/browser/url/url.zig +++ b/src/browser/url/url.zig @@ -219,7 +219,7 @@ pub const URL = struct { } pub fn _toJSON(self: *URL, page: *Page) ![]const u8 { - return try self.get_href(page); + return self.get_href(page); } }; diff --git a/src/url.zig b/src/url.zig index c4341bf4..6244bf59 100644 --- a/src/url.zig +++ b/src/url.zig @@ -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| { const last_slash_pos = index + protocol_end; if (last_slash_pos == base.len - 1) { - return std.fmt.allocPrint(allocator, "{s}{s}", .{ base, src }); - } else { - return std.fmt.allocPrint(allocator, "{s}/{s}", .{ base[0..last_slash_pos], src }); + return std.fmt.allocPrint(allocator, "{s}{s}", .{ base, normalized_src }); } - } else { - return std.fmt.allocPrint(allocator, "{s}/{s}", .{ base, src }); + return std.fmt.allocPrint(allocator, "{s}/{s}", .{ base[0..last_slash_pos], normalized_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 { @@ -233,6 +233,16 @@ test "URL: Stitching Base & Src URLs (Just Ending Slash)" { 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)" { const allocator = testing.allocator;