summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Boeckel <mathstuf@users.noreply.github.com>2018-02-26 13:38:56 -0500
committerCarl Lerche <me@carllerche.com>2018-02-26 10:38:56 -0800
commit40cbd0f296556f91e3c4c3d429dffc34e1b3f3e7 (patch)
tree8246770b612d1b61e4d26cc1729893f40c6e1a29
parent3b64fe93638a8453a1c001a6a443915e4ac71c25 (diff)
length_delimited: add a native_endian builder method (#144)
This method is useful when reading from a operating system service.
-rw-r--r--tokio-io/src/length_delimited.rs26
-rw-r--r--tokio-io/tests/length_delimited.rs17
2 files changed, 43 insertions, 0 deletions
diff --git a/tokio-io/src/length_delimited.rs b/tokio-io/src/length_delimited.rs
index 54e305ee..7de61a35 100644
--- a/tokio-io/src/length_delimited.rs
+++ b/tokio-io/src/length_delimited.rs
@@ -649,6 +649,32 @@ impl Builder {
self
}
+ /// Read the length field as a native endian integer
+ ///
+ /// The default setting is big endian.
+ ///
+ /// This configuration option applies to both encoding and decoding.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # use tokio_io::AsyncRead;
+ /// use tokio_io::codec::length_delimited::Builder;
+ ///
+ /// # fn bind_read<T: AsyncRead>(io: T) {
+ /// Builder::new()
+ /// .native_endian()
+ /// .new_read(io);
+ /// # }
+ /// ```
+ pub fn native_endian(&mut self) -> &mut Self {
+ if cfg!(target_endian = "big") {
+ self.big_endian()
+ } else {
+ self.little_endian()
+ }
+ }
+
/// Sets the max frame length
///
/// This configuration option applies to both encoding and decoding. The
diff --git a/tokio-io/tests/length_delimited.rs b/tokio-io/tests/length_delimited.rs
index a94ae688..b51cda2c 100644
--- a/tokio-io/tests/length_delimited.rs
+++ b/tokio-io/tests/length_delimited.rs
@@ -49,6 +49,23 @@ fn read_single_frame_one_packet_little_endian() {
}
#[test]
+fn read_single_frame_one_packet_native_endian() {
+ let data = if cfg!(target_endian = "big") {
+ b"\x00\x00\x00\x09abcdefghi"
+ } else {
+ b"\x09\x00\x00\x00abcdefghi"
+ };
+ let mut io = Builder::new()
+ .native_endian()
+ .new_read(mock! {
+ Ok(data[..].into()),
+ });
+
+ assert_eq!(io.poll().unwrap(), Ready(Some(b"abcdefghi"[..].into())));
+ assert_eq!(io.poll().unwrap(), Ready(None));
+}
+
+#[test]
fn read_single_multi_frame_one_packet() {
let mut data: Vec<u8> = vec![];
data.extend_from_slice(b"\x00\x00\x00\x09abcdefghi");