Skip to content

Commit

Permalink
remove cookies feature from http crate
Browse files Browse the repository at this point in the history
  • Loading branch information
robjtede committed Apr 8, 2021
1 parent a811494 commit 6984120
Show file tree
Hide file tree
Showing 11 changed files with 33 additions and 213 deletions.
10 changes: 3 additions & 7 deletions Cargo.toml
Expand Up @@ -18,10 +18,6 @@ edition = "2018"
# features that docs.rs will build with
features = ["openssl", "rustls", "compress", "secure-cookies"]

[badges]
travis-ci = { repository = "actix/actix-web", branch = "master" }
codecov = { repository = "actix/actix-web", branch = "master", service = "github" }

[lib]
name = "actix_web"
path = "src/lib.rs"
Expand All @@ -46,10 +42,10 @@ default = ["compress", "cookies"]
compress = ["actix-http/compress"]

# support for cookies
cookies = ["actix-http/cookies"]
cookies = ["cookie"]

# secure cookies feature
secure-cookies = ["actix-http/secure-cookies"]
secure-cookies = ["cookie/secure"]

# openssl
openssl = ["actix-http/openssl", "actix-tls/accept", "actix-tls/openssl"]
Expand Down Expand Up @@ -88,7 +84,7 @@ actix-http = "3.0.0-beta.5"

ahash = "0.7"
bytes = "1"
cookie = "0.15"
cookie = { version = "0.15", features = ["percent-encode"], optional = true }
derive_more = "0.99.5"
either = "1.5.3"
encoding_rs = "0.8"
Expand Down
11 changes: 2 additions & 9 deletions actix-http/Cargo.toml
Expand Up @@ -16,7 +16,7 @@ edition = "2018"

[package.metadata.docs.rs]
# features that docs.rs will build with
features = ["openssl", "rustls", "compress", "cookies", "secure-cookies"]
features = ["openssl", "rustls", "compress"]

[lib]
name = "actix_http"
Expand All @@ -34,12 +34,6 @@ rustls = ["actix-tls/rustls"]
# enable compression support
compress = ["flate2", "brotli2"]

# support for cookies
cookies = ["cookie"]

# support for secure cookies
secure-cookies = ["cookies", "cookie/secure"]

# trust-dns as client dns resolver
trust-dns = ["trust-dns-resolver"]

Expand All @@ -55,7 +49,6 @@ base64 = "0.13"
bitflags = "1.2"
bytes = "1"
bytestring = "1"
cookie = { version = "0.15", features = ["percent-encode"], optional = true }
derive_more = "0.99.5"
encoding_rs = "0.8"
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] }
Expand Down Expand Up @@ -95,7 +88,7 @@ actix-tls = { version = "3.0.0-beta.5", features = ["openssl"] }
criterion = "0.3"
env_logger = "0.8"
rcgen = "0.8"
serde_derive = "1.0"
serde = { version = "1.0", features = ["derive"] }
tls-openssl = { version = "0.10", package = "openssl" }
tls-rustls = { version = "0.19", package = "rustls" }

Expand Down
5 changes: 0 additions & 5 deletions actix-http/src/lib.rs
Expand Up @@ -53,9 +53,6 @@ pub mod h2;
pub mod test;
pub mod ws;

#[cfg(feature = "cookies")]
use cookie;

pub use self::builder::HttpServiceBuilder;
pub use self::config::{KeepAlive, ServiceConfig};
pub use self::error::{Error, ResponseError, Result};
Expand All @@ -76,8 +73,6 @@ pub mod http {
pub use http::{uri, Error, Uri};
pub use http::{Method, StatusCode, Version};

#[cfg(feature = "cookies")]
pub use crate::cookie::{Cookie, CookieBuilder};
pub use crate::header::HeaderMap;

/// A collection of HTTP headers and helpers.
Expand Down
41 changes: 0 additions & 41 deletions actix-http/src/request.rs
Expand Up @@ -5,8 +5,6 @@ use std::{
fmt, net, str,
};

#[cfg(feature = "cookies")]
use cookie::{Cookie, ParseError as CookieParseError};
use http::{header, Method, Uri, Version};

use crate::{
Expand All @@ -17,9 +15,6 @@ use crate::{
HttpMessage,
};

#[cfg(feature = "cookies")]
struct Cookies(Vec<Cookie<'static>>);

/// Request
pub struct Request<P = PayloadStream> {
pub(crate) payload: Payload<P>,
Expand Down Expand Up @@ -175,42 +170,6 @@ impl<P> Request<P> {
pub fn peer_addr(&self) -> Option<net::SocketAddr> {
self.head().peer_addr
}

/// Load request cookies.
#[cfg(feature = "cookies")]
pub fn cookies(&self) -> Result<Ref<'_, Vec<Cookie<'static>>>, CookieParseError> {
if self.extensions().get::<Cookies>().is_none() {
let mut cookies = Vec::new();
for hdr in self.headers().get_all(header::COOKIE) {
let s =
str::from_utf8(hdr.as_bytes()).map_err(CookieParseError::from)?;
for cookie_str in s.split(';').map(|s| s.trim()) {
if !cookie_str.is_empty() {
cookies.push(Cookie::parse_encoded(cookie_str)?.into_owned());
}
}
}
self.extensions_mut().insert(Cookies(cookies));
}

Ok(Ref::map(self.extensions(), |ext| {
&ext.get::<Cookies>().unwrap().0
}))
}

/// Return request cookie.
#[cfg(feature = "cookies")]
pub fn cookie(&self, name: &str) -> Option<Cookie<'static>> {
if let Ok(cookies) = self.cookies() {
for cookie in cookies.iter() {
if cookie.name() == name {
return Some(cookie.to_owned());
}
}
}

None
}
}

impl<P> fmt::Debug for Request<P> {
Expand Down
143 changes: 10 additions & 133 deletions actix-http/src/response.rs
Expand Up @@ -25,11 +25,6 @@ use crate::{
},
message::{BoxedResponseHead, ConnectionType, ResponseHead},
};
#[cfg(feature = "cookies")]
use crate::{
cookie::{Cookie, CookieJar},
http::header::HeaderValue,
};

/// An HTTP Response
pub struct Response<B = Body> {
Expand Down Expand Up @@ -248,34 +243,12 @@ impl Future for Response {
}
}

#[cfg(feature = "cookies")]
pub struct CookieIter<'a> {
iter: header::GetAll<'a>,
}

#[cfg(feature = "cookies")]
impl<'a> Iterator for CookieIter<'a> {
type Item = Cookie<'a>;

#[inline]
fn next(&mut self) -> Option<Cookie<'a>> {
for v in self.iter.by_ref() {
if let Ok(c) = Cookie::parse_encoded(v.to_str().ok()?) {
return Some(c);
}
}
None
}
}

/// An HTTP response builder.
///
/// This type can be used to construct an instance of `Response` through a builder-like pattern.
pub struct ResponseBuilder {
head: Option<BoxedResponseHead>,
err: Option<HttpError>,
#[cfg(feature = "cookies")]
cookies: Option<CookieJar>,
}

impl ResponseBuilder {
Expand All @@ -285,8 +258,6 @@ impl ResponseBuilder {
ResponseBuilder {
head: Some(BoxedResponseHead::new(status)),
err: None,
#[cfg(feature = "cookies")]
cookies: None,
}
}

Expand Down Expand Up @@ -353,7 +324,10 @@ impl ResponseBuilder {
}

/// Replaced with [`Self::insert_header()`].
#[deprecated = "Replaced with `insert_header((key, value))`."]
#[deprecated(
since = "4.0.0",
note = "Replaced with `insert_header((key, value))`. Will be removed in v5."
)]
pub fn set_header<K, V>(&mut self, key: K, value: V) -> &mut Self
where
K: TryInto<HeaderName>,
Expand All @@ -374,7 +348,10 @@ impl ResponseBuilder {
}

/// Replaced with [`Self::append_header()`].
#[deprecated = "Replaced with `append_header((key, value))`."]
#[deprecated(
since = "4.0.0",
note = "Replaced with `append_header((key, value))`. Will be removed in v5."
)]
pub fn header<K, V>(&mut self, key: K, value: V) -> &mut Self
where
K: TryInto<HeaderName>,
Expand Down Expand Up @@ -467,89 +444,6 @@ impl ResponseBuilder {
self
}

/// Set a cookie
///
/// ```
/// use actix_http::{http, Request, Response};
///
/// fn index(req: Request) -> Response {
/// Response::Ok()
/// .cookie(
/// http::Cookie::build("name", "value")
/// .domain("www.rust-lang.org")
/// .path("/")
/// .secure(true)
/// .http_only(true)
/// .finish(),
/// )
/// .finish()
/// }
/// ```
#[cfg(feature = "cookies")]
pub fn cookie<'c>(&mut self, cookie: Cookie<'c>) -> &mut Self {
if self.cookies.is_none() {
let mut jar = CookieJar::new();
jar.add(cookie.into_owned());
self.cookies = Some(jar)
} else {
self.cookies.as_mut().unwrap().add(cookie.into_owned());
}
self
}

/// Remove cookie
///
/// ```
/// use actix_http::{http, Request, Response, HttpMessage};
///
/// fn index(req: Request) -> Response {
/// let mut builder = Response::Ok();
///
/// if let Some(ref cookie) = req.cookie("name") {
/// builder.del_cookie(cookie);
/// }
///
/// builder.finish()
/// }
/// ```
#[cfg(feature = "cookies")]
pub fn del_cookie<'a>(&mut self, cookie: &Cookie<'a>) -> &mut Self {
if self.cookies.is_none() {
self.cookies = Some(CookieJar::new())
}
let jar = self.cookies.as_mut().unwrap();
let cookie = cookie.clone().into_owned();
jar.add_original(cookie.clone());
jar.remove(cookie);
self
}

/// This method calls provided closure with builder reference if value is `true`.
#[doc(hidden)]
#[deprecated = "Use an if statement."]
pub fn if_true<F>(&mut self, value: bool, f: F) -> &mut Self
where
F: FnOnce(&mut ResponseBuilder),
{
if value {
f(self);
}
self
}

/// This method calls provided closure with builder reference if value is `Some`.
#[doc(hidden)]
#[deprecated = "Use an if-let construction."]
pub fn if_some<T, F>(&mut self, value: Option<T>, f: F) -> &mut Self
where
F: FnOnce(T, &mut ResponseBuilder),
{
if let Some(val) = value {
f(val, self);
}
self
}

/// Responses extensions
#[inline]
pub fn extensions(&self) -> Ref<'_, Extensions> {
Expand Down Expand Up @@ -580,19 +474,7 @@ impl ResponseBuilder {
return Response::from(Error::from(e)).into_body();
}

// allow unused mut when cookies feature is disabled
#[allow(unused_mut)]
let mut response = self.head.take().expect("cannot reuse response builder");

#[cfg(feature = "cookies")]
if let Some(ref jar) = self.cookies {
for cookie in jar.delta() {
match HeaderValue::from_str(&cookie.to_string()) {
Ok(val) => response.headers.append(header::SET_COOKIE, val),
Err(e) => return Response::from(Error::from(e)).into_body(),
};
}
}
let response = self.head.take().expect("cannot reuse response builder");

Response {
head: response,
Expand Down Expand Up @@ -648,8 +530,6 @@ impl ResponseBuilder {
ResponseBuilder {
head: self.head.take(),
err: self.err.take(),
#[cfg(feature = "cookies")]
cookies: self.cookies.take(),
}
}
}
Expand All @@ -671,8 +551,6 @@ impl<B> From<Response<B>> for ResponseBuilder {
ResponseBuilder {
head: Some(res.head),
err: None,
#[cfg(feature = "cookies")]
cookies: None,
}
}
}
Expand All @@ -693,8 +571,6 @@ impl<'a> From<&'a ResponseHead> for ResponseBuilder {
ResponseBuilder {
head: Some(msg),
err: None,
#[cfg(feature = "cookies")]
cookies: None,
}
}
}
Expand Down Expand Up @@ -866,6 +742,7 @@ mod tests {
#[test]
fn test_serde_json_in_body() {
use serde_json::json;

let resp =
ResponseBuilder::new(StatusCode::OK).body(json!({"test-key":"test-value"}));
assert_eq!(resp.body().get_ref(), br#"{"test-key":"test-value"}"#);
Expand Down
2 changes: 1 addition & 1 deletion actix-test/Cargo.toml
Expand Up @@ -20,7 +20,7 @@ openssl = ["tls-openssl", "actix-http/openssl"]

[dependencies]
actix-codec = "0.4.0-beta.1"
actix-http = { version = "3.0.0-beta.5", features = ["cookies"] }
actix-http = "3.0.0-beta.5"
actix-http-test = { version = "3.0.0-beta.4", features = [] }
actix-service = "2.0.0-beta.4"
actix-utils = "3.0.0-beta.2"
Expand Down

0 comments on commit 6984120

Please sign in to comment.