Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove cookie support from -http #2065

Merged
merged 12 commits into from Apr 9, 2021
4 changes: 4 additions & 0 deletions .cargo/config.toml
@@ -1,3 +1,7 @@
[alias]
chk = "hack check --workspace --all-features --tests --examples"
lint = "hack --clean-per-run clippy --workspace --tests --examples"
ci-min = "hack check --workspace --no-default-features"
ci-min-test = "hack check --workspace --no-default-features --tests --examples"
ci-default = "hack check --workspace"
ci-full = "check --workspace --bins --examples --tests"
3 changes: 3 additions & 0 deletions CHANGES.md
@@ -1,7 +1,10 @@
# Changes

## Unreleased - 2021-xx-xx
### Added
* `HttpResponse` and `HttpResponseBuilder` structs. [#2065]

[#2065]: https://github.com/actix/actix-web/pull/2065

## 4.0.0-beta.5 - 2021-04-02
### Added
Expand Down
46 changes: 23 additions & 23 deletions Cargo.toml
Expand Up @@ -16,11 +16,7 @@ edition = "2018"

[package.metadata.docs.rs]
# 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" }
features = ["openssl", "rustls", "compress", "cookies", "secure-cookies"]

[lib]
name = "actix_web"
Expand All @@ -38,6 +34,8 @@ members = [
"actix-http-test",
"actix-test",
]
# enable when MSRV is 1.51+
# resolver = "2"

[features]
default = ["compress", "cookies"]
Expand All @@ -46,33 +44,17 @@ 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"]

# rustls
rustls = ["actix-http/rustls", "actix-tls/accept", "actix-tls/rustls"]

[[example]]
name = "basic"
required-features = ["compress"]

[[example]]
name = "uds"
required-features = ["compress"]

[[test]]
name = "test_server"
required-features = ["compress", "cookies"]

[[example]]
name = "on_connect"
required-features = []

[dependencies]
actix-codec = "0.4.0-beta.1"
actix-macros = "0.2.0"
Expand All @@ -88,11 +70,13 @@ actix-http = "3.0.0-beta.5"

ahash = "0.7"
bytes = "1"
cookie = { version = "0.15", features = ["percent-encode"], optional = true }
derive_more = "0.99.5"
either = "1.5.3"
encoding_rs = "0.8"
futures-core = { version = "0.3.7", default-features = false }
futures-util = { version = "0.3.7", default-features = false }
itoa = "0.4"
language-tags = "0.2"
once_cell = "1.5"
log = "0.4"
Expand Down Expand Up @@ -137,6 +121,22 @@ actix-web-actors = { path = "actix-web-actors" }
actix-web-codegen = { path = "actix-web-codegen" }
awc = { path = "awc" }

[[test]]
name = "test_server"
required-features = ["compress", "cookies"]

[[example]]
name = "basic"
required-features = ["compress"]

[[example]]
name = "uds"
required-features = ["compress"]

[[example]]
name = "on_connect"
required-features = []

[[bench]]
name = "server"
harness = false
Expand Down
6 changes: 3 additions & 3 deletions actix-files/src/error.rs
@@ -1,4 +1,4 @@
use actix_web::{http::StatusCode, HttpResponse, ResponseError};
use actix_web::{http::StatusCode, ResponseError};
use derive_more::Display;

/// Errors which can occur when serving static files.
Expand All @@ -16,8 +16,8 @@ pub enum FilesError {

/// Return `NotFound` for `FilesError`
impl ResponseError for FilesError {
fn error_response(&self) -> HttpResponse {
HttpResponse::new(StatusCode::NOT_FOUND)
fn status_code(&self) -> StatusCode {
StatusCode::NOT_FOUND
}
}

Expand Down
7 changes: 7 additions & 0 deletions actix-http/CHANGES.md
@@ -1,6 +1,13 @@
# Changes

## Unreleased - 2021-xx-xx
### Removed
* `cookies` feature flag. [#2065]
* Top-level `cookies` mod (re-export). [#2065]
* `HttpMessage` trait loses the `cookies` and `cookie` methods. [#2065]
* `impl ResponseError for CookieParseError`. [#2065]

[#2065]: https://github.com/actix/actix-web/pull/2065


## 3.0.0-beta.5 - 2021-04-02
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.14.1", 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
6 changes: 3 additions & 3 deletions actix-http/examples/ws.rs
Expand Up @@ -11,7 +11,7 @@ use std::{
};

use actix_codec::Encoder;
use actix_http::{error::Error, ws, HttpService, Request, Response};
use actix_http::{body::BodyStream, error::Error, ws, HttpService, Request, Response};
use actix_rt::time::{interval, Interval};
use actix_server::Server;
use bytes::{Bytes, BytesMut};
Expand All @@ -34,14 +34,14 @@ async fn main() -> io::Result<()> {
.await
}

async fn handler(req: Request) -> Result<Response, Error> {
async fn handler(req: Request) -> Result<Response<BodyStream<Heartbeat>>, Error> {
log::info!("handshaking");
let mut res = ws::handshake(req.head())?;

// handshake will always fail under HTTP/2

log::info!("responding");
Ok(res.streaming(Heartbeat::new(ws::Codec::new())))
Ok(res.message_body(BodyStream::new(Heartbeat::new(ws::Codec::new()))))
}

struct Heartbeat {
Expand Down
22 changes: 1 addition & 21 deletions actix-http/src/error.rs
Expand Up @@ -14,12 +14,7 @@ use serde::de::value::Error as DeError;
use serde_json::error::Error as JsonError;
use serde_urlencoded::ser::Error as FormError;

use crate::body::Body;
use crate::helpers::Writer;
use crate::response::{Response, ResponseBuilder};

#[cfg(feature = "cookies")]
pub use crate::cookie::ParseError as CookieParseError;
use crate::{body::Body, helpers::Writer, Response, ResponseBuilder};

/// A specialized [`std::result::Result`]
/// for actix web operations
Expand Down Expand Up @@ -378,14 +373,6 @@ impl ResponseError for PayloadError {
}
}

/// Return `BadRequest` for `cookie::ParseError`
#[cfg(feature = "cookies")]
impl ResponseError for crate::cookie::ParseError {
fn status_code(&self) -> StatusCode {
StatusCode::BAD_REQUEST
}
}

#[derive(Debug, Display, From)]
/// A set of errors that can occur during dispatching HTTP requests
pub enum DispatchError {
Expand Down Expand Up @@ -959,13 +946,6 @@ mod tests {
assert_eq!(resp.status(), StatusCode::INTERNAL_SERVER_ERROR);
}

#[cfg(feature = "cookies")]
#[test]
fn test_cookie_parse() {
let resp: Response = CookieParseError::EmptyName.error_response();
assert_eq!(resp.status(), StatusCode::BAD_REQUEST);
}

#[test]
fn test_as_response() {
let orig = io::Error::new(io::ErrorKind::Other, "other");
Expand Down
2 changes: 1 addition & 1 deletion actix-http/src/h1/dispatcher.rs
Expand Up @@ -346,7 +346,7 @@ where

// send service call error as response
Poll::Ready(Err(err)) => {
let res: Response = err.into().into();
let res = Response::from_error(err.into());
let (res, body) = res.replace_body(());
self.as_mut().send_response(res, body.into_body())?;
}
Expand Down
40 changes: 0 additions & 40 deletions actix-http/src/http_message.rs
Expand Up @@ -9,11 +9,6 @@ use crate::error::{ContentTypeError, ParseError};
use crate::extensions::Extensions;
use crate::header::{Header, HeaderMap};
use crate::payload::Payload;
#[cfg(feature = "cookies")]
use crate::{cookie::Cookie, error::CookieParseError};

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

/// Trait that implements general purpose operations on HTTP messages.
pub trait HttpMessage: Sized {
Expand Down Expand Up @@ -104,41 +99,6 @@ pub trait HttpMessage: Sized {
Ok(false)
}
}

/// Load request cookies.
#[cfg(feature = "cookies")]
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")]
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<'a, T> HttpMessage for &'a mut T
Expand Down
7 changes: 0 additions & 7 deletions actix-http/src/lib.rs
Expand Up @@ -6,13 +6,11 @@
//! | `openssl` | TLS support via [OpenSSL]. |
//! | `rustls` | TLS support via [rustls]. |
//! | `compress` | Payload compression support. (Deflate, Gzip & Brotli) |
//! | `cookies` | Support for cookies backed by the [cookie] crate. |
//! | `secure-cookies` | Adds for secure cookies. Enables `cookies` feature. |
//! | `trust-dns` | Use [trust-dns] as the client DNS resolver. |
//!
//! [OpenSSL]: https://crates.io/crates/openssl
//! [rustls]: https://crates.io/crates/rustls
//! [cookie]: https://crates.io/crates/cookie
//! [trust-dns]: https://crates.io/crates/trust-dns

#![deny(rust_2018_idioms, nonstandard_style)]
Expand Down Expand Up @@ -55,9 +53,6 @@ pub mod h2;
pub mod test;
pub mod ws;

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

pub use self::builder::HttpServiceBuilder;
pub use self::config::{KeepAlive, ServiceConfig};
pub use self::error::{Error, ResponseError, Result};
Expand All @@ -78,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
4 changes: 2 additions & 2 deletions actix-http/src/message.rs
Expand Up @@ -345,8 +345,8 @@ impl ResponseHead {
}

pub struct Message<T: Head> {
// Rc here should not be cloned by anyone.
// It's used to reuse allocation of T and no shared ownership is allowed.
/// Rc here should not be cloned by anyone.
/// It's used to reuse allocation of T and no shared ownership is allowed.
head: Rc<T>,
}

Expand Down
14 changes: 8 additions & 6 deletions actix-http/src/request.rs
Expand Up @@ -2,16 +2,18 @@

use std::{
cell::{Ref, RefMut},
fmt, net,
fmt, net, str,
};

use http::{header, Method, Uri, Version};

use crate::extensions::Extensions;
use crate::header::HeaderMap;
use crate::message::{Message, RequestHead};
use crate::payload::{Payload, PayloadStream};
use crate::HttpMessage;
use crate::{
extensions::Extensions,
header::HeaderMap,
message::{Message, RequestHead},
payload::{Payload, PayloadStream},
HttpMessage,
};

/// Request
pub struct Request<P = PayloadStream> {
Expand Down