this repo has no description
at main 2.6 kB view raw
1const std = @import("std"); 2 3/// Returns a url percent-encoded slice that the caller must free. 4/// Encoded characters: " < > ` # ? ^ { } 5/// Not a complete urlencode implementation; this ignores unicode code points. 6/// See https://url.spec.whatwg.org/#percent-encoded-bytes. 7pub fn encode(allocator: std.mem.Allocator, url: []const u8) ![]const u8 { 8 var new_length = url.len; 9 10 new_length += 2 * std.mem.count(u8, url, "\""); // " -> %22. 11 new_length += 2 * std.mem.count(u8, url, "<"); // < -> %3C. 12 new_length += 2 * std.mem.count(u8, url, ">"); // > -> %3E. 13 new_length += 2 * std.mem.count(u8, url, "`"); // ` -> %60. 14 new_length += 2 * std.mem.count(u8, url, "#"); // ` -> %23. 15 new_length += 2 * std.mem.count(u8, url, "?"); // ` -> %3F. 16 new_length += 2 * std.mem.count(u8, url, "^"); // ` -> %5E. 17 new_length += 2 * std.mem.count(u8, url, "{"); // ` -> %7B. 18 new_length += 2 * std.mem.count(u8, url, "}"); // ` -> %7D. 19 20 const encoded = try allocator.alloc(u8, new_length); 21 22 var encoded_idx: usize = 0; 23 24 for (0..url.len) |i| { 25 const c = url[i]; 26 27 if (c == '\"') { 28 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%22"); 29 encoded_idx += 3; 30 continue; 31 } 32 if (c == '<') { 33 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%3C"); 34 encoded_idx += 3; 35 continue; 36 } 37 if (c == '>') { 38 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%3E"); 39 encoded_idx += 3; 40 continue; 41 } 42 if (c == '`') { 43 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%60"); 44 encoded_idx += 3; 45 continue; 46 } 47 if (c == '#') { 48 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%23"); 49 encoded_idx += 3; 50 continue; 51 } 52 if (c == '?') { 53 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%3F"); 54 encoded_idx += 3; 55 continue; 56 } 57 if (c == '^') { 58 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%5E"); 59 encoded_idx += 3; 60 continue; 61 } 62 if (c == '{') { 63 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%7B"); 64 encoded_idx += 3; 65 continue; 66 } 67 if (c == '}') { 68 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%7D"); 69 encoded_idx += 3; 70 continue; 71 } 72 73 encoded[encoded_idx] = c; 74 encoded_idx += 1; 75 } 76 77 return encoded; 78}