mirror of https://github.com/fafhrd91/actix-web
update changelogs
This commit is contained in:
parent
fb63ebe5f7
commit
4468d7d153
20
CHANGES.md
20
CHANGES.md
|
@ -1,6 +1,22 @@
|
|||
# Changes
|
||||
|
||||
## Unreleased - 2021-xx-xx
|
||||
### Added
|
||||
- `impl Hash` for `http::header::Encoding`. [#2501]
|
||||
- `AcceptEncoding::negotiate()`. [#2501]
|
||||
|
||||
### Changed
|
||||
- `AcceptEncoding::preference` now returns `Option<Preference<Encoding>>`. [#2501]
|
||||
- Rename methods `BodyEncoding::{encoding => encode_with, get_encoding => preferred_encoding}`. [#2501]
|
||||
- `http::header::Encoding` now only represents `Content-Encoding` types. [#2501]
|
||||
|
||||
### Fixed
|
||||
- Auto-negotiation of content encoding is more fault-tolerant when using the `Compress` middleware. [#2501]
|
||||
|
||||
### Removed
|
||||
- `Compress::new`; restricting compression algorithm is done through feature flags. [#2501]
|
||||
|
||||
[#2501]: https://github.com/actix/actix-web/pull/2501
|
||||
|
||||
|
||||
## 4.0.0-beta.18 - 2021-12-29
|
||||
|
@ -19,22 +35,18 @@
|
|||
### Added
|
||||
- `guard::GuardContext` for use with the `Guard` trait. [#2552]
|
||||
- `ServiceRequest::guard_ctx` for obtaining a guard context. [#2552]
|
||||
- `impl Hash` for `http::header::Encoding`. [#2501]
|
||||
- `AcceptEncoding::negotiate`. [#2501]
|
||||
|
||||
### Changed
|
||||
- `Guard` trait now receives a `&GuardContext`. [#2552]
|
||||
- `guard::fn_guard` functions now receives a `&GuardContext`. [#2552]
|
||||
- Some guards now return `impl Guard` and their concrete types are made private: `guard::Header` and all the method guards. [#2552]
|
||||
- The `Not` guard is now generic over the type of guard it wraps. [#2552]
|
||||
- `AcceptEncoding::preference` now returns `Option<Preference<Encoding>>`. [#2501]
|
||||
|
||||
### Fixed
|
||||
- Rename `ConnectionInfo::{remote_addr => peer_addr}`, deprecating the old name. [#2554]
|
||||
- `ConnectionInfo::peer_addr` will not return the port number. [#2554]
|
||||
- `ConnectionInfo::realip_remote_addr` will not return the port number if sourcing the IP from the peer's socket address. [#2554]
|
||||
|
||||
[#2501]: https://github.com/actix/actix-web/pull/2501
|
||||
[#2552]: https://github.com/actix/actix-web/pull/2552
|
||||
[#2554]: https://github.com/actix/actix-web/pull/2554
|
||||
|
||||
|
|
|
@ -6,12 +6,22 @@
|
|||
- `impl Copy` for `QualityItem` where `T: Copy`. [#2501]
|
||||
- `Quality::ZERO` equivalent to `q=0`. [#2501]
|
||||
- `QualityItem::zero` that uses `Quality::ZERO`. [#2501]
|
||||
- `ContentEncoding::to_header_value()`. [#2501]
|
||||
|
||||
### Changed
|
||||
- `Quality::MIN` is now the smallest non-zero value. [#2501]
|
||||
- `QualityItem::min` has different semantics due to the `QualityItem::MIN` change. [#2501]
|
||||
- `QualityItem::min` semantics changed with `QualityItem::MIN`. [#2501]
|
||||
- Rename `ContentEncoding::{Br => Brotli}`. [#2501]
|
||||
- Minimum supported Rust version (MSRV) is now 1.54.
|
||||
|
||||
### Fixed
|
||||
- `ContentEncoding::Identity` can now be parsed from a string. [#2501]
|
||||
- A `Vary` header is now correctly sent along with compressed content. [#2501]
|
||||
|
||||
### Removed
|
||||
- `ContentEncoding::Auto` variant. [#2501]
|
||||
- `ContentEncoding::is_compression()`. [#2501]
|
||||
|
||||
[#2501]: https://github.com/actix/actix-web/pull/2501
|
||||
|
||||
|
||||
|
|
82
src/dev.rs
82
src/dev.rs
|
@ -60,18 +60,19 @@ pub trait BodyEncoding {
|
|||
/// [`Compress`]: crate::middleware::Compress
|
||||
fn encode_with(&mut self, encoding: ContentEncoding) -> &mut Self;
|
||||
|
||||
/// Flags that a file already is encoded so that [`Compress`] does not modify it.
|
||||
///
|
||||
/// Effectively a shortcut for `compress_with("identity")`
|
||||
/// plus `insert_header(ContentEncoding, encoding)`.
|
||||
///
|
||||
/// [`Compress`]: crate::middleware::Compress
|
||||
fn pre_encoded_with(&mut self, encoding: ContentEncoding) -> &mut Self;
|
||||
// /// Flags that a file already is encoded so that [`Compress`] does not modify it.
|
||||
// ///
|
||||
// /// Effectively a shortcut for `compress_with("identity")`
|
||||
// /// plus `insert_header(ContentEncoding, encoding)`.
|
||||
// ///
|
||||
// /// [`Compress`]: crate::middleware::Compress
|
||||
// fn pre_encoded_with(&mut self, encoding: ContentEncoding) -> &mut Self;
|
||||
}
|
||||
|
||||
struct CompressWith(ContentEncoding);
|
||||
|
||||
struct PreCompressed(ContentEncoding);
|
||||
// TODO: add or delete this
|
||||
// struct PreCompressed(ContentEncoding);
|
||||
|
||||
impl BodyEncoding for crate::HttpResponseBuilder {
|
||||
fn preferred_encoding(&self) -> Option<ContentEncoding> {
|
||||
|
@ -83,10 +84,10 @@ impl BodyEncoding for crate::HttpResponseBuilder {
|
|||
self
|
||||
}
|
||||
|
||||
fn pre_encoded_with(&mut self, encoding: ContentEncoding) -> &mut Self {
|
||||
self.extensions_mut().insert(PreCompressed(encoding));
|
||||
self
|
||||
}
|
||||
// fn pre_encoded_with(&mut self, encoding: ContentEncoding) -> &mut Self {
|
||||
// self.extensions_mut().insert(PreCompressed(encoding));
|
||||
// self
|
||||
// }
|
||||
}
|
||||
|
||||
impl<B> BodyEncoding for crate::HttpResponse<B> {
|
||||
|
@ -99,10 +100,10 @@ impl<B> BodyEncoding for crate::HttpResponse<B> {
|
|||
self
|
||||
}
|
||||
|
||||
fn pre_encoded_with(&mut self, encoding: ContentEncoding) -> &mut Self {
|
||||
self.extensions_mut().insert(PreCompressed(encoding));
|
||||
self
|
||||
}
|
||||
// fn pre_encoded_with(&mut self, encoding: ContentEncoding) -> &mut Self {
|
||||
// self.extensions_mut().insert(PreCompressed(encoding));
|
||||
// self
|
||||
// }
|
||||
}
|
||||
|
||||
impl<B> BodyEncoding for ServiceResponse<B> {
|
||||
|
@ -120,32 +121,33 @@ impl<B> BodyEncoding for ServiceResponse<B> {
|
|||
self
|
||||
}
|
||||
|
||||
fn pre_encoded_with(&mut self, encoding: ContentEncoding) -> &mut Self {
|
||||
self.request()
|
||||
.extensions_mut()
|
||||
.insert(PreCompressed(encoding));
|
||||
// fn pre_encoded_with(&mut self, encoding: ContentEncoding) -> &mut Self {
|
||||
// self.request()
|
||||
// .extensions_mut()
|
||||
// .insert(PreCompressed(encoding));
|
||||
// self
|
||||
// }
|
||||
}
|
||||
|
||||
// TODO: remove these impls ?
|
||||
impl BodyEncoding for actix_http::ResponseBuilder {
|
||||
fn preferred_encoding(&self) -> Option<ContentEncoding> {
|
||||
self.extensions().get::<CompressWith>().map(|enc| enc.0)
|
||||
}
|
||||
|
||||
fn encode_with(&mut self, encoding: ContentEncoding) -> &mut Self {
|
||||
self.extensions_mut().insert(CompressWith(encoding));
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
// impl BodyEncoding for actix_http::ResponseBuilder {
|
||||
// fn get_encoding(&self) -> Option<ContentEncoding> {
|
||||
// self.extensions().get::<Enc>().map(|enc| enc.0)
|
||||
// }
|
||||
impl<B> BodyEncoding for actix_http::Response<B> {
|
||||
fn preferred_encoding(&self) -> Option<ContentEncoding> {
|
||||
self.extensions().get::<CompressWith>().map(|enc| enc.0)
|
||||
}
|
||||
|
||||
// fn compress_with(&mut self, encoding: ContentEncoding) -> &mut Self {
|
||||
// self.extensions_mut().insert(Enc(encoding));
|
||||
// self
|
||||
// }
|
||||
// }
|
||||
|
||||
// impl<B> BodyEncoding for actix_http::Response<B> {
|
||||
// fn get_encoding(&self) -> Option<ContentEncoding> {
|
||||
// self.extensions().get::<Enc>().map(|enc| enc.0)
|
||||
// }
|
||||
|
||||
// fn compress_with(&mut self, encoding: ContentEncoding) -> &mut Self {
|
||||
// self.extensions_mut().insert(Enc(encoding));
|
||||
// self
|
||||
// }
|
||||
// }
|
||||
fn encode_with(&mut self, encoding: ContentEncoding) -> &mut Self {
|
||||
self.extensions_mut().insert(CompressWith(encoding));
|
||||
self
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ use crate::{
|
|||
body::{EitherBody, MessageBody},
|
||||
dev::BodyEncoding as _,
|
||||
http::{
|
||||
header::{self, AcceptEncoding, ContentEncoding, Encoding, HeaderValue},
|
||||
header::{self, AcceptEncoding, Encoding, HeaderValue},
|
||||
StatusCode,
|
||||
},
|
||||
service::{ServiceRequest, ServiceResponse},
|
||||
|
@ -38,26 +38,10 @@ use crate::{
|
|||
/// .wrap(middleware::Compress::default())
|
||||
/// .default_service(web::to(|| HttpResponse::NotFound()));
|
||||
/// ```
|
||||
#[derive(Debug, Clone)]
|
||||
#[derive(Debug, Clone, Default)]
|
||||
#[non_exhaustive]
|
||||
pub struct Compress;
|
||||
|
||||
impl Compress {
|
||||
/// Create new `Compress` middleware with the specified encoding.
|
||||
// TODO: remove
|
||||
pub fn new(_encoding: ContentEncoding) -> Self {
|
||||
// Compress(encoding)
|
||||
Compress
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Compress {
|
||||
fn default() -> Self {
|
||||
// Compress::new(ContentEncoding::Auto)
|
||||
Compress
|
||||
}
|
||||
}
|
||||
|
||||
impl<S, B> Transform<S, ServiceRequest> for Compress
|
||||
where
|
||||
B: MessageBody,
|
||||
|
@ -70,73 +54,14 @@ where
|
|||
type Future = Ready<Result<Self::Transform, Self::InitError>>;
|
||||
|
||||
fn new_transform(&self, service: S) -> Self::Future {
|
||||
ok(CompressMiddleware {
|
||||
service,
|
||||
// encoding: self.0,
|
||||
})
|
||||
ok(CompressMiddleware { service })
|
||||
}
|
||||
}
|
||||
|
||||
pub struct CompressMiddleware<S> {
|
||||
service: S,
|
||||
// encoding: ContentEncoding,
|
||||
}
|
||||
|
||||
static SUPPORTED_ENCODINGS_STRING: Lazy<String> = Lazy::new(|| {
|
||||
#[allow(unused_mut)] // only unused when no compress features enabled
|
||||
let mut encoding: Vec<&str> = vec![];
|
||||
|
||||
#[cfg(feature = "compress-brotli")]
|
||||
{
|
||||
encoding.push("br");
|
||||
}
|
||||
|
||||
#[cfg(feature = "compress-gzip")]
|
||||
{
|
||||
encoding.push("gzip");
|
||||
encoding.push("deflate");
|
||||
}
|
||||
|
||||
#[cfg(feature = "compress-zstd")]
|
||||
{
|
||||
encoding.push("zstd");
|
||||
}
|
||||
|
||||
assert!(
|
||||
!encoding.is_empty(),
|
||||
"encoding can not be empty unless __compress feature has been explicitly enabled by itself"
|
||||
);
|
||||
|
||||
encoding.join(", ")
|
||||
});
|
||||
|
||||
static SUPPORTED_ENCODINGS: Lazy<Vec<Encoding>> = Lazy::new(|| {
|
||||
let mut encodings = vec![Encoding::identity()];
|
||||
|
||||
#[cfg(feature = "compress-brotli")]
|
||||
{
|
||||
encodings.push(Encoding::brotli());
|
||||
}
|
||||
|
||||
#[cfg(feature = "compress-gzip")]
|
||||
{
|
||||
encodings.push(Encoding::gzip());
|
||||
encodings.push(Encoding::deflate());
|
||||
}
|
||||
|
||||
#[cfg(feature = "compress-zstd")]
|
||||
{
|
||||
encodings.push(Encoding::zstd());
|
||||
}
|
||||
|
||||
assert!(
|
||||
!encodings.is_empty(),
|
||||
"encodings can not be empty unless __compress feature has been explicitly enabled by itself"
|
||||
);
|
||||
|
||||
encodings
|
||||
});
|
||||
|
||||
impl<S, B> Service<ServiceRequest> for CompressMiddleware<S>
|
||||
where
|
||||
S: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
|
||||
|
@ -237,3 +162,58 @@ where
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
static SUPPORTED_ENCODINGS_STRING: Lazy<String> = Lazy::new(|| {
|
||||
#[allow(unused_mut)] // only unused when no compress features enabled
|
||||
let mut encoding: Vec<&str> = vec![];
|
||||
|
||||
#[cfg(feature = "compress-brotli")]
|
||||
{
|
||||
encoding.push("br");
|
||||
}
|
||||
|
||||
#[cfg(feature = "compress-gzip")]
|
||||
{
|
||||
encoding.push("gzip");
|
||||
encoding.push("deflate");
|
||||
}
|
||||
|
||||
#[cfg(feature = "compress-zstd")]
|
||||
{
|
||||
encoding.push("zstd");
|
||||
}
|
||||
|
||||
assert!(
|
||||
!encoding.is_empty(),
|
||||
"encoding can not be empty unless __compress feature has been explicitly enabled by itself"
|
||||
);
|
||||
|
||||
encoding.join(", ")
|
||||
});
|
||||
|
||||
static SUPPORTED_ENCODINGS: Lazy<Vec<Encoding>> = Lazy::new(|| {
|
||||
let mut encodings = vec![Encoding::identity()];
|
||||
|
||||
#[cfg(feature = "compress-brotli")]
|
||||
{
|
||||
encodings.push(Encoding::brotli());
|
||||
}
|
||||
|
||||
#[cfg(feature = "compress-gzip")]
|
||||
{
|
||||
encodings.push(Encoding::gzip());
|
||||
encodings.push(Encoding::deflate());
|
||||
}
|
||||
|
||||
#[cfg(feature = "compress-zstd")]
|
||||
{
|
||||
encodings.push(Encoding::zstd());
|
||||
}
|
||||
|
||||
assert!(
|
||||
!encodings.is_empty(),
|
||||
"encodings can not be empty unless __compress feature has been explicitly enabled by itself"
|
||||
);
|
||||
|
||||
encodings
|
||||
});
|
||||
|
|
|
@ -288,6 +288,7 @@ async fn deny_identity_coding_no_decompress() {
|
|||
}
|
||||
|
||||
// TODO: fix test
|
||||
// currently fails because negotiation doesn't consider unknown encoding types
|
||||
#[ignore]
|
||||
#[actix_rt::test]
|
||||
async fn deny_identity_for_manual_coding() {
|
||||
|
|
|
@ -133,7 +133,7 @@ async fn test_body() {
|
|||
async fn test_body_encoding_override() {
|
||||
let srv = actix_test::start_with(actix_test::config().h1(), || {
|
||||
App::new()
|
||||
.wrap(Compress::new(ContentEncoding::Gzip))
|
||||
.wrap(Compress::default())
|
||||
.service(web::resource("/").route(web::to(|| {
|
||||
HttpResponse::Ok()
|
||||
.encode_with(ContentEncoding::Deflate)
|
||||
|
@ -183,11 +183,8 @@ async fn body_gzip_large() {
|
|||
let srv = actix_test::start_with(actix_test::config().h1(), move || {
|
||||
let data = srv_data.clone();
|
||||
|
||||
App::new()
|
||||
.wrap(Compress::new(ContentEncoding::Gzip))
|
||||
.service(
|
||||
web::resource("/")
|
||||
.route(web::to(move || HttpResponse::Ok().body(data.clone()))),
|
||||
App::new().wrap(Compress::default()).service(
|
||||
web::resource("/").route(web::to(move || HttpResponse::Ok().body(data.clone()))),
|
||||
)
|
||||
});
|
||||
|
||||
|
@ -217,11 +214,8 @@ async fn test_body_gzip_large_random() {
|
|||
|
||||
let srv = actix_test::start_with(actix_test::config().h1(), move || {
|
||||
let data = srv_data.clone();
|
||||
App::new()
|
||||
.wrap(Compress::new(ContentEncoding::Gzip))
|
||||
.service(
|
||||
web::resource("/")
|
||||
.route(web::to(move || HttpResponse::Ok().body(data.clone()))),
|
||||
App::new().wrap(Compress::default()).service(
|
||||
web::resource("/").route(web::to(move || HttpResponse::Ok().body(data.clone()))),
|
||||
)
|
||||
});
|
||||
|
||||
|
@ -244,7 +238,7 @@ async fn test_body_gzip_large_random() {
|
|||
async fn test_body_chunked_implicit() {
|
||||
let srv = actix_test::start_with(actix_test::config().h1(), || {
|
||||
App::new()
|
||||
.wrap(Compress::new(ContentEncoding::Gzip))
|
||||
.wrap(Compress::default())
|
||||
.service(web::resource("/").route(web::get().to(move || {
|
||||
HttpResponse::Ok()
|
||||
.streaming(TestBody::new(Bytes::from_static(STR.as_ref()), 24))
|
||||
|
@ -271,7 +265,7 @@ async fn test_body_chunked_implicit() {
|
|||
async fn test_body_br_streaming() {
|
||||
let srv = actix_test::start_with(actix_test::config().h1(), || {
|
||||
App::new()
|
||||
.wrap(Compress::new(ContentEncoding::Brotli))
|
||||
.wrap(Compress::default())
|
||||
.service(web::resource("/").route(web::to(move || {
|
||||
HttpResponse::Ok()
|
||||
.streaming(TestBody::new(Bytes::from_static(STR.as_ref()), 24))
|
||||
|
@ -337,7 +331,7 @@ async fn test_no_chunking() {
|
|||
async fn test_body_deflate() {
|
||||
let srv = actix_test::start_with(actix_test::config().h1(), || {
|
||||
App::new()
|
||||
.wrap(Compress::new(ContentEncoding::Deflate))
|
||||
.wrap(Compress::default())
|
||||
.service(web::resource("/").route(web::to(move || HttpResponse::Ok().body(STR))))
|
||||
});
|
||||
|
||||
|
@ -360,7 +354,7 @@ async fn test_body_deflate() {
|
|||
async fn test_body_brotli() {
|
||||
let srv = actix_test::start_with(actix_test::config().h1(), || {
|
||||
App::new()
|
||||
.wrap(Compress::new(ContentEncoding::Brotli))
|
||||
.wrap(Compress::default())
|
||||
.service(web::resource("/").route(web::to(move || HttpResponse::Ok().body(STR))))
|
||||
});
|
||||
|
||||
|
@ -383,7 +377,7 @@ async fn test_body_brotli() {
|
|||
async fn test_body_zstd() {
|
||||
let srv = actix_test::start_with(actix_test::config().h1(), || {
|
||||
App::new()
|
||||
.wrap(Compress::new(ContentEncoding::Zstd))
|
||||
.wrap(Compress::default())
|
||||
.service(web::resource("/").route(web::to(move || HttpResponse::Ok().body(STR))))
|
||||
});
|
||||
|
||||
|
@ -406,7 +400,7 @@ async fn test_body_zstd() {
|
|||
async fn test_body_zstd_streaming() {
|
||||
let srv = actix_test::start_with(actix_test::config().h1(), || {
|
||||
App::new()
|
||||
.wrap(Compress::new(ContentEncoding::Zstd))
|
||||
.wrap(Compress::default())
|
||||
.service(web::resource("/").route(web::to(move || {
|
||||
HttpResponse::Ok()
|
||||
.streaming(TestBody::new(Bytes::from_static(STR.as_ref()), 24))
|
||||
|
|
Loading…
Reference in New Issue