From 3a4a1e5f386137514b91c76ad06d909789bcd549 Mon Sep 17 00:00:00 2001 From: Nick Hamann Date: Sat, 2 May 2015 19:25:44 -0500 Subject: [PATCH 1/4] Implement Debug for std::net::{UdpSocket,TcpStream,TcpListener,Shutdown} Fixes #23134. --- src/libstd/net/mod.rs | 2 +- src/libstd/net/tcp.rs | 13 +++++++++++++ src/libstd/net/udp.rs | 7 +++++++ src/libstd/sys/common/net2.rs | 29 +++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/libstd/net/mod.rs b/src/libstd/net/mod.rs index 2e7c0a2c80e..bf444ce671d 100644 --- a/src/libstd/net/mod.rs +++ b/src/libstd/net/mod.rs @@ -32,7 +32,7 @@ mod parser; /// Possible values which can be passed to the `shutdown` method of `TcpStream` /// and `UdpSocket`. -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone, PartialEq, Debug)] #[stable(feature = "rust1", since = "1.0.0")] pub enum Shutdown { /// Indicates that the reading portion of this stream/socket should be shut diff --git a/src/libstd/net/tcp.rs b/src/libstd/net/tcp.rs index 130e1eee8f9..73bc00b4554 100644 --- a/src/libstd/net/tcp.rs +++ b/src/libstd/net/tcp.rs @@ -14,6 +14,7 @@ use prelude::v1::*; use io::prelude::*; +use fmt; use io; use net::{ToSocketAddrs, SocketAddr, Shutdown}; use sys_common::net2 as net_imp; @@ -167,6 +168,12 @@ impl FromInner for TcpStream { fn from_inner(inner: net_imp::TcpStream) -> TcpStream { TcpStream(inner) } } +impl fmt::Debug for TcpStream { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(f) + } +} + impl TcpListener { /// Creates a new `TcpListener` which will be bound to the specified /// address. @@ -239,6 +246,12 @@ impl FromInner for TcpListener { } } +impl fmt::Debug for TcpListener { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(f) + } +} + #[cfg(test)] mod tests { use prelude::v1::*; diff --git a/src/libstd/net/udp.rs b/src/libstd/net/udp.rs index 0b04ecb1b72..96d6e95f03a 100644 --- a/src/libstd/net/udp.rs +++ b/src/libstd/net/udp.rs @@ -13,6 +13,7 @@ use prelude::v1::*; +use fmt; use io::{self, Error, ErrorKind}; use net::{ToSocketAddrs, SocketAddr, IpAddr}; use sys_common::net2 as net_imp; @@ -136,6 +137,12 @@ impl FromInner for UdpSocket { fn from_inner(inner: net_imp::UdpSocket) -> UdpSocket { UdpSocket(inner) } } +impl fmt::Debug for UdpSocket { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(f) + } +} + #[cfg(test)] mod tests { use prelude::v1::*; diff --git a/src/libstd/sys/common/net2.rs b/src/libstd/sys/common/net2.rs index 2b2c31d92ed..08242f6bab8 100644 --- a/src/libstd/sys/common/net2.rs +++ b/src/libstd/sys/common/net2.rs @@ -11,6 +11,7 @@ use prelude::v1::*; use ffi::{CStr, CString}; +use fmt; use io::{self, Error, ErrorKind}; use libc::{self, c_int, c_char, c_void, socklen_t}; use mem; @@ -268,6 +269,16 @@ impl FromInner for TcpStream { } } +impl fmt::Debug for TcpStream { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("TcpStream") + .field("addr", &self.socket_addr()) + .field("peer", &self.peer_addr()) + .field("inner", &self.inner.as_inner()) + .finish() + } +} + //////////////////////////////////////////////////////////////////////////////// // TCP listeners //////////////////////////////////////////////////////////////////////////////// @@ -327,6 +338,15 @@ impl FromInner for TcpListener { } } +impl fmt::Debug for TcpListener { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("TcpListener") + .field("addr", &self.socket_addr()) + .field("inner", &self.inner.as_inner()) + .finish() + } +} + //////////////////////////////////////////////////////////////////////////////// // UDP //////////////////////////////////////////////////////////////////////////////// @@ -445,3 +465,12 @@ impl FromInner for UdpSocket { UdpSocket { inner: socket } } } + +impl fmt::Debug for UdpSocket { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("UdpSocket") + .field("addr", &self.socket_addr()) + .field("inner", &self.inner.as_inner()) + .finish() + } +} From dd85c42ee151a9d350327f3aab7492a178716507 Mon Sep 17 00:00:00 2001 From: Nick Hamann Date: Sun, 3 May 2015 17:13:42 -0500 Subject: [PATCH 2/4] Unwrap address values in Debug implementations for TcpStream/TcpListener/UdpSocket. This now omits address fields in Debug implementations when a proper address value cannot be unwrapped. --- src/libstd/sys/common/net2.rs | 41 ++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/libstd/sys/common/net2.rs b/src/libstd/sys/common/net2.rs index 08242f6bab8..688d0edcff1 100644 --- a/src/libstd/sys/common/net2.rs +++ b/src/libstd/sys/common/net2.rs @@ -271,11 +271,18 @@ impl FromInner for TcpStream { impl fmt::Debug for TcpStream { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("TcpStream") - .field("addr", &self.socket_addr()) - .field("peer", &self.peer_addr()) - .field("inner", &self.inner.as_inner()) - .finish() + let mut res = f.debug_struct("TcpStream"); + + if let Ok(addr) = self.socket_addr() { + res = res.field("addr", &addr); + } + + if let Ok(peer) = self.peer_addr() { + res = res.field("peer", &peer); + } + + res = res.field("inner", &self.inner.as_inner()); + res.finish() } } @@ -340,10 +347,14 @@ impl FromInner for TcpListener { impl fmt::Debug for TcpListener { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("TcpListener") - .field("addr", &self.socket_addr()) - .field("inner", &self.inner.as_inner()) - .finish() + let mut res = f.debug_struct("TcpListener"); + + if let Ok(addr) = self.socket_addr() { + res = res.field("addr", &addr); + } + + res = res.field("inner", &self.inner.as_inner()); + res.finish() } } @@ -468,9 +479,13 @@ impl FromInner for UdpSocket { impl fmt::Debug for UdpSocket { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("UdpSocket") - .field("addr", &self.socket_addr()) - .field("inner", &self.inner.as_inner()) - .finish() + let mut res = f.debug_struct("UdpSocket"); + + if let Ok(addr) = self.socket_addr() { + res = res.field("addr", &addr); + } + + res = res.field("inner", &self.inner.as_inner()); + res.finish() } } From 91f9dd468fe3248d215620db00ecc739e67ae964 Mon Sep 17 00:00:00 2001 From: Nick Hamann Date: Sun, 3 May 2015 17:31:26 -0500 Subject: [PATCH 3/4] Change 'inner' field name to 'fd'/'socket' on Unix/Windows in Debug impls --- src/libstd/sys/common/net2.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/libstd/sys/common/net2.rs b/src/libstd/sys/common/net2.rs index 688d0edcff1..7da7071670a 100644 --- a/src/libstd/sys/common/net2.rs +++ b/src/libstd/sys/common/net2.rs @@ -281,7 +281,8 @@ impl fmt::Debug for TcpStream { res = res.field("peer", &peer); } - res = res.field("inner", &self.inner.as_inner()); + let name = if cfg!(windows) {"socket"} else {"fd"}; + res = res.field(name, &self.inner.as_inner()); res.finish() } } @@ -353,7 +354,8 @@ impl fmt::Debug for TcpListener { res = res.field("addr", &addr); } - res = res.field("inner", &self.inner.as_inner()); + let name = if cfg!(windows) {"socket"} else {"fd"}; + res = res.field(name, &self.inner.as_inner()); res.finish() } } @@ -485,7 +487,8 @@ impl fmt::Debug for UdpSocket { res = res.field("addr", &addr); } - res = res.field("inner", &self.inner.as_inner()); + let name = if cfg!(windows) {"socket"} else {"fd"}; + res = res.field(name, &self.inner.as_inner()); res.finish() } } From 987eb28ecad144928bfc21e27777d443f56547de Mon Sep 17 00:00:00 2001 From: Nick Hamann Date: Sun, 3 May 2015 20:01:25 -0500 Subject: [PATCH 4/4] Add tests for 3 Debug implementations --- src/libstd/net/tcp.rs | 24 ++++++++++++++++++++++++ src/libstd/net/udp.rs | 13 +++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/libstd/net/tcp.rs b/src/libstd/net/tcp.rs index 73bc00b4554..c0d880877b5 100644 --- a/src/libstd/net/tcp.rs +++ b/src/libstd/net/tcp.rs @@ -261,6 +261,7 @@ mod tests { use net::*; use net::test::{next_test_ip4, next_test_ip6}; use sync::mpsc::channel; + use sys_common::AsInner; use thread; fn each_ip(f: &mut FnMut(SocketAddr)) { @@ -831,4 +832,27 @@ mod tests { rx.recv().unwrap(); }) } + + #[test] + fn debug() { + let name = if cfg!(windows) {"socket"} else {"fd"}; + let socket_addr = next_test_ip4(); + + let listener = t!(TcpListener::bind(&socket_addr)); + let listener_inner = listener.0.socket().as_inner(); + let compare = format!("TcpListener {{ addr: {:?}, {}: {:?} }}", + socket_addr, name, listener_inner); + assert_eq!(format!("{:?}", listener), compare); + + let mut stream = t!(TcpStream::connect(&("localhost", + socket_addr.port()))); + let stream_inner = stream.0.socket().as_inner(); + let compare = format!("TcpStream {{ addr: {:?}, \ + peer: {:?}, {}: {:?} }}", + stream.local_addr().unwrap(), + stream.peer_addr().unwrap(), + name, + stream_inner); + assert_eq!(format!("{:?}", stream), compare); + } } diff --git a/src/libstd/net/udp.rs b/src/libstd/net/udp.rs index 96d6e95f03a..4360f62c1bf 100644 --- a/src/libstd/net/udp.rs +++ b/src/libstd/net/udp.rs @@ -151,6 +151,7 @@ mod tests { use net::*; use net::test::{next_test_ip4, next_test_ip6}; use sync::mpsc::channel; + use sys_common::AsInner; use thread; fn each_ip(f: &mut FnMut(SocketAddr, SocketAddr)) { @@ -308,4 +309,16 @@ mod tests { serv_rx.recv().unwrap(); }) } + + #[test] + fn debug() { + let name = if cfg!(windows) {"socket"} else {"fd"}; + let socket_addr = next_test_ip4(); + + let udpsock = t!(UdpSocket::bind(&socket_addr)); + let udpsock_inner = udpsock.0.socket().as_inner(); + let compare = format!("UdpSocket {{ addr: {:?}, {}: {:?} }}", + socket_addr, name, udpsock_inner); + assert_eq!(format!("{:?}", udpsock), compare); + } }