From 71bc4890a0bfebeb7b2602d464d11da6a7c830d6 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Sat, 23 Jan 2021 18:48:33 -0800 Subject: [PATCH] remove either crate and simplify AsName trait --- actix-http/Cargo.toml | 1 - actix-http/src/header/map.rs | 75 ++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/actix-http/Cargo.toml b/actix-http/Cargo.toml index af6209248..ebc0f142c 100644 --- a/actix-http/Cargo.toml +++ b/actix-http/Cargo.toml @@ -53,7 +53,6 @@ bytes = "1" bytestring = "1" cookie = { version = "0.14.1", features = ["percent-encode"] } derive_more = "0.99.5" -either = "1.5.3" encoding_rs = "0.8" futures-channel = { version = "0.3.7", default-features = false } futures-core = { version = "0.3.7", default-features = false } diff --git a/actix-http/src/header/map.rs b/actix-http/src/header/map.rs index 8f20f3e6f..1d6820cbe 100644 --- a/actix-http/src/header/map.rs +++ b/actix-http/src/header/map.rs @@ -4,8 +4,7 @@ use std::{ }; use ahash::AHashMap; -use either::Either; -use http::header::{HeaderName, HeaderValue}; +use http::header::{HeaderName, HeaderValue, InvalidHeaderName}; use smallvec::{smallvec, SmallVec}; /// A multi-map of HTTP headers. @@ -126,14 +125,9 @@ impl HeaderMap { fn get2(&self, name: N) -> Option<&Value> { match name.as_name() { - Either::Left(name) => self.inner.get(name), - Either::Right(s) => { - if let Ok(name) = HeaderName::try_from(s) { - self.inner.get(&name) - } else { - None - } - } + AsHeaderName::Borrowed(name) => self.inner.get(name), + AsHeaderName::Owned(Ok(name)) => self.inner.get(&name), + AsHeaderName::Owned(Err(_)) => None, } } @@ -156,28 +150,22 @@ impl HeaderMap { /// key. Returns `None` if there are no values associated with the key. pub fn get_mut(&mut self, name: N) -> Option<&mut HeaderValue> { match name.as_name() { - Either::Left(name) => self.inner.get_mut(name).map(|v| v.first_mut()), - Either::Right(s) => { - if let Ok(name) = HeaderName::try_from(s) { - self.inner.get_mut(&name).map(|v| v.first_mut()) - } else { - None - } + AsHeaderName::Borrowed(name) => { + self.inner.get_mut(name).map(|v| v.first_mut()) } + AsHeaderName::Owned(Ok(name)) => { + self.inner.get_mut(&name).map(|v| v.first_mut()) + } + AsHeaderName::Owned(Err(_)) => None, } } /// Returns true if the map contains a value for the specified key. pub fn contains_key(&self, key: N) -> bool { match key.as_name() { - Either::Left(name) => self.inner.contains_key(name), - Either::Right(s) => { - if let Ok(name) = HeaderName::try_from(s) { - self.inner.contains_key(&name) - } else { - false - } - } + AsHeaderName::Borrowed(name) => self.inner.contains_key(name), + AsHeaderName::Owned(Ok(name)) => self.inner.contains_key(&name), + AsHeaderName::Owned(Err(_)) => false, } } @@ -238,50 +226,55 @@ impl HeaderMap { /// Removes all headers for a particular header name from the map. pub fn remove(&mut self, key: N) { match key.as_name() { - Either::Left(name) => { + AsHeaderName::Borrowed(name) => { let _ = self.inner.remove(name); } - Either::Right(s) => { - if let Ok(name) = HeaderName::try_from(s) { - let _ = self.inner.remove(&name); - } + AsHeaderName::Owned(Ok(name)) => { + let _ = self.inner.remove(&name); } + AsHeaderName::Owned(Err(_)) => {} } } } +#[doc(hidden)] +pub enum AsHeaderName<'a> { + Owned(Result), + Borrowed(&'a HeaderName), +} + #[doc(hidden)] pub trait AsName { - fn as_name(&self) -> Either<&HeaderName, &str>; + fn as_name(&self) -> AsHeaderName<'_>; } impl AsName for HeaderName { - fn as_name(&self) -> Either<&HeaderName, &str> { - Either::Left(self) + fn as_name(&self) -> AsHeaderName<'_> { + AsHeaderName::Borrowed(self) } } impl<'a> AsName for &'a HeaderName { - fn as_name(&self) -> Either<&HeaderName, &str> { - Either::Left(self) + fn as_name(&self) -> AsHeaderName<'_> { + AsHeaderName::Borrowed(self) } } impl<'a> AsName for &'a str { - fn as_name(&self) -> Either<&HeaderName, &str> { - Either::Right(self) + fn as_name(&self) -> AsHeaderName<'_> { + AsHeaderName::Owned(HeaderName::try_from(*self)) } } impl AsName for String { - fn as_name(&self) -> Either<&HeaderName, &str> { - Either::Right(self.as_str()) + fn as_name(&self) -> AsHeaderName<'_> { + AsHeaderName::Owned(HeaderName::try_from(self.as_str())) } } impl<'a> AsName for &'a String { - fn as_name(&self) -> Either<&HeaderName, &str> { - Either::Right(self.as_str()) + fn as_name(&self) -> AsHeaderName<'_> { + AsHeaderName::Owned(HeaderName::try_from(self.as_str())) } }