Skip to content

Commit b49a081

Browse files
olsonjefferybrson
authored andcommitted
---
yaml --- r: 15990 b: refs/heads/try c: 7de1a68 h: refs/heads/master v: v3
1 parent 5cf6c2a commit b49a081

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
refs/heads/master: 61b1875c16de39c166b0f4d54bba19f9c6777d1a
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
5-
refs/heads/try: bb88f772a457d09616d790fed0f548d63863e5ee
5+
refs/heads/try: 7de1a68217767eaedc7c192301c3814eea8c7a5e
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/try/src/libstd/net_ip.rs

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ Types/fns concerning Internet Protocol (IP), versions 4 & 6
55
import vec;
66
import uint;
77

8-
export ip_addr;
8+
export ip_addr, parse_addr_err;
99
export format_addr;
1010
export v4;
11-
//format_addr, parse_addr;
1211

1312
#[doc = "An IP address"]
1413
enum ip_addr {
@@ -17,6 +16,13 @@ enum ip_addr {
1716
ipv6(u16,u16,u16,u16,u16,u16,u16,u16)
1817
}
1918

19+
#[doc="
20+
Human-friendly feedback on why a parse_addr attempt failed
21+
"]
22+
type parse_addr_err = {
23+
err_msg: str
24+
};
25+
2026
#[doc="
2127
Convert a `ip_addr` to a str
2228
@@ -29,7 +35,7 @@ fn format_addr(ip: ip_addr) -> str {
2935
ipv4(a, b, c, d) {
3036
#fmt["%u.%u.%u.%u", a as uint, b as uint, c as uint, d as uint]
3137
}
32-
ipv6(a,b,c,d,e,f,g,h) {
38+
ipv6(_, _, _, _, _, _, _, _) {
3339
fail "FIXME impl parsing of ipv6 addr";
3440
}
3541
}
@@ -52,14 +58,32 @@ j Fails if the string is not a valid IPv4 address
5258
* an `ip_addr` of the `ipv4` variant
5359
"]
5460
fn parse_addr(ip: str) -> ip_addr {
61+
alt try_parse_addr(ip) {
62+
result::ok(addr) { addr }
63+
result::err(err_data) {
64+
fail err_data.err_msg
65+
}
66+
}
67+
}
68+
fn try_parse_addr(ip: str) -> result::result<ip_addr,parse_addr_err> {
5569
let parts = vec::map(str::split_char(ip, '.'), {|s|
5670
alt uint::from_str(s) {
5771
some(n) if n <= 255u { n }
58-
_ { fail "Invalid IP Address part." }
72+
_ { 256u }
5973
}
6074
});
61-
if vec::len(parts) != 4u { fail "Too many dots in IP address"; }
62-
ipv4(parts[0] as u8, parts[1] as u8, parts[2] as u8, parts[3] as u8)
75+
if vec::len(parts) != 4u {
76+
result::err({err_msg: #fmt("'%s' doesn't have 4 parts",
77+
ip)})
78+
}
79+
else if vec::contains(parts, 256u) {
80+
result::err({err_msg: #fmt("invalid octal in provided addr '%s'",
81+
ip)})
82+
}
83+
else {
84+
result::ok(ipv4(parts[0] as u8, parts[1] as u8,
85+
parts[2] as u8, parts[3] as u8))
86+
}
6387
}
6488
}
6589

0 commit comments

Comments
 (0)