|
4 | 4 | "errors" |
5 | 5 | "fmt" |
6 | 6 | "math" |
7 | | - "net" |
8 | 7 | "net/mail" |
| 8 | + "net/netip" |
9 | 9 | "net/url" |
10 | 10 | "reflect" |
11 | 11 | "regexp" |
@@ -249,18 +249,27 @@ func validateFormat(path *PathBuffer, str string, s *Schema, res *ValidateResult |
249 | 249 | if len(str) >= 256 || !rxHostname.MatchString(str) { |
250 | 250 | res.Add(path, str, validation.MsgExpectedRFC5890Hostname) |
251 | 251 | } |
| 252 | + case "ipv4", "ipv6", "ip": |
| 253 | + addr, err := netip.ParseAddr(str) |
| 254 | + |
| 255 | + switch s.Format { |
| 256 | + case "ipv4": |
| 257 | + if err != nil || !addr.Is4() { |
| 258 | + res.Add(path, str, validation.MsgExpectedRFC2673IPv4) |
| 259 | + } |
| 260 | + case "ipv6": |
| 261 | + if err != nil || !addr.Is6() || addr.Is4In6() { |
| 262 | + res.Add(path, str, validation.MsgExpectedRFC2373IPv6) |
| 263 | + } |
| 264 | + default: // case "ip". |
| 265 | + if err != nil { |
| 266 | + res.Add(path, str, validation.MsgExpectedRFCIPAddr) |
| 267 | + } |
| 268 | + } |
252 | 269 | case "idn-hostname": |
253 | 270 | if _, err := idnaProfile.ToASCII(str); err != nil { |
254 | 271 | res.Add(path, str, validation.MsgExpectedRFC5890Hostname) |
255 | 272 | } |
256 | | - case "ipv4": |
257 | | - if ip := net.ParseIP(str); ip == nil || ip.To4() == nil { |
258 | | - res.Add(path, str, validation.MsgExpectedRFC2673IPv4) |
259 | | - } |
260 | | - case "ipv6": |
261 | | - if ip := net.ParseIP(str); ip == nil || ip.To16() == nil { |
262 | | - res.Add(path, str, validation.MsgExpectedRFC2373IPv6) |
263 | | - } |
264 | 273 | case "uri", "uri-reference", "iri", "iri-reference": |
265 | 274 | if _, err := url.Parse(str); err != nil { |
266 | 275 | res.Add(path, str, ErrorFormatter(validation.MsgExpectedRFC3986URI, err)) |
|
0 commit comments