| ... | ... | @@ -28,11 +28,11 @@ pub const ValidateError = error{ |
| 28 | 28 | pub fn validate(bytes: []const u8) ValidateError!void { |
| 29 | 29 | if (bytes.len == 0) return error.InvalidHostName; |
| 30 | 30 | |
| 31 | | // Ignore trailing dot (FQDN). It doesn't count toward our length. |
| 32 | | const end = if (bytes[bytes.len - 1] == '.') bytes.len - 1 else bytes.len; |
| 33 | | |
| 34 | 31 | // The accepted maximum length of a hostname, including labels and dots. |
| 35 | | if (end > max_len) return error.NameTooLong; |
| 32 | if (bytes.len > max_len) return error.NameTooLong; |
| 33 | |
| 34 | // Ignore trailing dot (FQDN). |
| 35 | const end = if (bytes[bytes.len - 1] == '.') bytes.len - 1 else bytes.len; |
| 36 | 36 | |
| 37 | 37 | // Hostnames are divided into dot-separated "labels", which: |
| 38 | 38 | // |
| ... | ... | @@ -83,7 +83,6 @@ test validate { |
| 83 | 83 | const many_a_dot_buf: [127][2]u8 = @splat(.{ 'a', '.' }); |
| 84 | 84 | const many_a_dot: []const u8 = @ptrCast(&many_a_dot_buf); |
| 85 | 85 | try validate(many_a_dot ++ "a"); // Total length 255 (valid) |
| 86 | | try validate(many_a_dot ++ "a."); // Total length 255 + trailing dot (valid) |
| 87 | 86 | |
| 88 | 87 | // Invalid hostnames |
| 89 | 88 | try std.testing.expectError(error.InvalidHostName, validate("")); |
| ... | ... | @@ -98,8 +97,8 @@ test validate { |
| 98 | 97 | try std.testing.expectError(error.InvalidHostName, validate(".")); |
| 99 | 98 | try std.testing.expectError(error.InvalidHostName, validate("..")); |
| 100 | 99 | try std.testing.expectError(error.InvalidHostName, validate(&many_a ++ "a.com")); // Label length 64 (too long) |
| 100 | try std.testing.expectError(error.NameTooLong, validate(many_a_dot ++ "a.")); // Total length 255 + trailing dot (too long) |
| 101 | 101 | try std.testing.expectError(error.NameTooLong, validate(many_a_dot ++ "ab")); // Total length 256 (too long) |
| 102 | | try std.testing.expectError(error.NameTooLong, validate(many_a_dot ++ "ab.")); // Total length 256 + trailing dot (too long) |
| 103 | 102 | } |
| 104 | 103 | |
| 105 | 104 | pub fn init(bytes: []const u8) ValidateError!HostName { |