| ... | @@ -209,8 +209,17 @@ pub const Address = extern union { | ... | @@ -209,8 +209,17 @@ pub const Address = extern union { |
| 209 | | 209 | |
| 210 | for (buf) |c, i| { | 210 | for (buf) |c, i| { |
| 211 | if (scope_id) { | 211 | if (scope_id) { |
| 212 | scope_id_value[scope_id_index] = c; | 212 | // Handling of percent-encoding should be for an URI library. |
| 213 | scope_id_index += 1; | 213 | if ((c >= '0' and c <= '9') or |
| | 214 | (c >= 'A' and c <= 'Z') or |
| | 215 | (c >= 'a' and c <= 'z') or |
| | 216 | (c == '-') or (c == '.') or (c == '_') or (c == '~')) |
| | 217 | { |
| | 218 | scope_id_value[scope_id_index] = c; |
| | 219 | scope_id_index += 1; |
| | 220 | } else { |
| | 221 | return error.InvalidCharacter; |
| | 222 | } |
| 214 | } else if (c == ':') { | 223 | } else if (c == ':') { |
| 215 | if (!saw_any_digits) { | 224 | if (!saw_any_digits) { |
| 216 | if (abbrv) return error.InvalidCharacter; // ':::' | 225 | if (abbrv) return error.InvalidCharacter; // ':::' |
| ... | @@ -272,6 +281,10 @@ pub const Address = extern union { | ... | @@ -272,6 +281,10 @@ pub const Address = extern union { |
| 272 | return error.Incomplete; | 281 | return error.Incomplete; |
| 273 | } | 282 | } |
| 274 | | 283 | |
| | 284 | if (scope_id and scope_id_index == 0) { |
| | 285 | return error.Incomplete; |
| | 286 | } |
| | 287 | |
| 275 | var resolved_scope_id: u32 = 0; | 288 | var resolved_scope_id: u32 = 0; |
| 276 | if (scope_id_index > 0) { | 289 | if (scope_id_index > 0) { |
| 277 | const scope_id_str = scope_id_value[0..scope_id_index]; | 290 | const scope_id_str = scope_id_value[0..scope_id_index]; |