From 49ade22bd990f5ad9165431a4c974e5d8b0e8732 Mon Sep 17 00:00:00 2001 From: Tamir Duberstein Date: Sun, 4 Oct 2020 21:56:48 +0000 Subject: [PATCH] Parse SocketAddrV6::scope_id --- library/std/src/net/parser.rs | 13 +++++++++++-- library/std/src/net/parser/tests.rs | 6 ++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/library/std/src/net/parser.rs b/library/std/src/net/parser.rs index 87ff18411c7..e8b89626fbd 100644 --- a/library/std/src/net/parser.rs +++ b/library/std/src/net/parser.rs @@ -32,7 +32,7 @@ macro_rules! impl_helper { })*) } -impl_helper! { u8 u16 } +impl_helper! { u8 u16 u32 } struct Parser<'a> { // parsing as ASCII, so can use byte array @@ -219,6 +219,14 @@ impl<'a> Parser<'a> { }) } + /// Read a % followed by a scope id in base 10. + fn read_scope_id(&mut self) -> Option { + self.read_atomically(|p| { + p.read_given_char('%')?; + p.read_number(10, None) + }) + } + /// Read an IPV4 address with a port fn read_socket_addr_v4(&mut self) -> Option { self.read_atomically(|p| { @@ -233,10 +241,11 @@ impl<'a> Parser<'a> { self.read_atomically(|p| { p.read_given_char('[')?; let ip = p.read_ipv6_addr()?; + let scope_id = p.read_scope_id().unwrap_or(0); p.read_given_char(']')?; let port = p.read_port()?; - Some(SocketAddrV6::new(ip, port, 0, 0)) + Some(SocketAddrV6::new(ip, port, 0, scope_id)) }) } diff --git a/library/std/src/net/parser/tests.rs b/library/std/src/net/parser/tests.rs index ecf5a782c0c..8d8889cd19d 100644 --- a/library/std/src/net/parser/tests.rs +++ b/library/std/src/net/parser/tests.rs @@ -3,6 +3,7 @@ use crate::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAdd use crate::str::FromStr; const PORT: u16 = 8080; +const SCOPE_ID: u32 = 1337; const IPV4: Ipv4Addr = Ipv4Addr::new(192, 168, 0, 1); const IPV4_STR: &str = "192.168.0.1"; @@ -13,6 +14,7 @@ const IPV6_STR_FULL: &str = "2001:db8:0:0:0:0:c0a8:1"; const IPV6_STR_COMPRESS: &str = "2001:db8::c0a8:1"; const IPV6_STR_V4: &str = "2001:db8::192.168.0.1"; const IPV6_STR_PORT: &str = "[2001:db8::c0a8:1]:8080"; +const IPV6_STR_PORT_SCOPE_ID: &str = "[2001:db8::c0a8:1%1337]:8080"; #[test] fn parse_ipv4() { @@ -74,8 +76,8 @@ fn parse_socket_v4() { #[test] fn parse_socket_v6() { - let result: SocketAddrV6 = IPV6_STR_PORT.parse().unwrap(); - assert_eq!(result, SocketAddrV6::new(IPV6, PORT, 0, 0)); + assert_eq!(IPV6_STR_PORT.parse(), Ok(SocketAddrV6::new(IPV6, PORT, 0, 0))); + assert_eq!(IPV6_STR_PORT_SCOPE_ID.parse(), Ok(SocketAddrV6::new(IPV6, PORT, 0, SCOPE_ID))); assert!(SocketAddrV6::from_str(IPV4_STR).is_err()); assert!(SocketAddrV6::from_str(IPV4_STR_PORT).is_err());