From c8967a08f84a0193de7746ad9a6c13e96dbd4939 Mon Sep 17 00:00:00 2001 From: Danh Phan Date: Sun, 21 Apr 2024 14:40:00 -0500 Subject: [PATCH] de: Fix std.Uri deserialization --- build.zig.zon | 4 +-- src/de/blocks/uri.zig | 28 +++++++++------- src/de/impls/visitor/uri.zig | 63 +++++++++++++++++++++++++++++++----- 3 files changed, 74 insertions(+), 21 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index b07dcaa7..4dc367b1 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -10,8 +10,8 @@ }, .dependencies = .{ .protest = .{ - .url = "https://github.com/ibokuri/protest/archive/bae398b701e763ef18480aa3cfcca103716996de.tar.gz", - .hash = "1220c70517d1bc1b3734c9c4fe81045b1927320b2590d8af28be32883f5fd4d3af8d", + .url = "https://github.com/ibokuri/protest/archive/339da6d86a9f1d00178e2b697d04ac8d2ba3f453.tar.gz", + .hash = "122023b5e4aa0d3dde9cbdcd09f3ac529ac37a10c2b26be82f1caf6d3792328fc9bd", }, }, } diff --git a/src/de/blocks/uri.zig b/src/de/blocks/uri.zig index 35e5e9a1..6dc79c2a 100644 --- a/src/de/blocks/uri.zig +++ b/src/de/blocks/uri.zig @@ -49,11 +49,11 @@ test "deserialize - std.Uri" { .scheme = "foo", .user = null, .password = null, - .host = "example.com", + .host = .{ .raw = "example.com" }, .port = 8042, - .path = "/over/there", - .query = "name=ferret", - .fragment = "nose", + .path = .{ .raw = "/over/there" }, + .query = .{ .raw = "name=ferret" }, + .fragment = .{ .raw = "nose" }, }, }, .{ @@ -65,7 +65,7 @@ test "deserialize - std.Uri" { .password = null, .host = null, .port = null, - .path = "example:animal:ferret:nose", + .path = .{ .raw = "example:animal:ferret:nose" }, .query = null, .fragment = null, }, @@ -88,25 +88,31 @@ test "deserialize - std.Uri" { defer result.deinit(); try require.equalf(t.want.scheme, result.value.scheme, "Test case: {s}", .{t.name}); - try require.equalf(t.want.port, result.value.port, "Test case: {s}", .{t.name}); - try require.equalf(t.want.path, result.value.path, "Test case: {s}", .{t.name}); - if (t.want.host) |host| { - try require.notNullf(result.value.host, "Test case: {s}", .{t.name}); - try require.equalf(host, result.value.host.?, "Test case: {s}", .{t.name}); - } if (t.want.user) |user| { try require.notNullf(result.value.user, "Test case: {s}", .{t.name}); try require.equalf(user, result.value.user.?, "Test case: {s}", .{t.name}); } + if (t.want.password) |password| { try require.notNullf(result.value.password, "Test case: {s}", .{t.name}); try require.equalf(password, result.value.password.?, "Test case: {s}", .{t.name}); } + + if (t.want.host) |host| { + try require.notNullf(result.value.host, "Test case: {s}", .{t.name}); + try require.equalf(host, result.value.host.?, "Test case: {s}", .{t.name}); + } + + try require.equalf(t.want.port, result.value.port, "Test case: {s}", .{t.name}); + + try require.equalf(t.want.path, result.value.path, "Test case: {s}", .{t.name}); + if (t.want.query) |query| { try require.notNullf(result.value.query, "Test case: {s}", .{t.name}); try require.equalf(query, result.value.query.?, "Test case: {s}", .{t.name}); } + if (t.want.fragment) |fragment| { try require.notNullf(result.value.fragment, "Test case: {s}", .{t.name}); try require.equalf(fragment, result.value.fragment.?, "Test case: {s}", .{t.name}); diff --git a/src/de/impls/visitor/uri.zig b/src/de/impls/visitor/uri.zig index 03bb6a96..15a3b619 100644 --- a/src/de/impls/visitor/uri.zig +++ b/src/de/impls/visitor/uri.zig @@ -30,22 +30,69 @@ fn visitString( .heap => used = true, .stack, .managed => { uri.scheme = try ally.dupe(u8, uri.scheme); - uri.path = try ally.dupe(u8, uri.path); - if (uri.host) |host| { - uri.host = try ally.dupe(u8, host); - } if (uri.user) |user| { - uri.user = try ally.dupe(u8, user); + uri.user = switch (user) { + .raw => |v| std.Uri.Component{ + .raw = try ally.dupe(u8, v), + }, + .percent_encoded => |v| std.Uri.Component{ + .percent_encoded = try ally.dupe(u8, v), + }, + }; } + if (uri.password) |password| { - uri.password = try ally.dupe(u8, password); + uri.password = switch (password) { + .raw => |v| std.Uri.Component{ + .raw = try ally.dupe(u8, v), + }, + .percent_encoded => |v| std.Uri.Component{ + .percent_encoded = try ally.dupe(u8, v), + }, + }; } + + if (uri.host) |host| { + uri.host = switch (host) { + .raw => |v| std.Uri.Component{ + .raw = try ally.dupe(u8, v), + }, + .percent_encoded => |v| std.Uri.Component{ + .percent_encoded = try ally.dupe(u8, v), + }, + }; + } + + uri.path = switch (uri.path) { + .raw => |v| std.Uri.Component{ + .raw = try ally.dupe(u8, v), + }, + .percent_encoded => |v| std.Uri.Component{ + .percent_encoded = try ally.dupe(u8, v), + }, + }; + if (uri.query) |query| { - uri.query = try ally.dupe(u8, query); + uri.query = switch (query) { + .raw => |v| std.Uri.Component{ + .raw = try ally.dupe(u8, v), + }, + .percent_encoded => |v| std.Uri.Component{ + .percent_encoded = try ally.dupe(u8, v), + }, + }; } + if (uri.fragment) |fragment| { - uri.fragment = try ally.dupe(u8, fragment); + uri.fragment = switch (fragment) { + .raw => |v| std.Uri.Component{ + .raw = try ally.dupe(u8, v), + }, + .percent_encoded => |v| std.Uri.Component{ + .percent_encoded = try ally.dupe(u8, v), + }, + }; } }, }