Merge branch 'master' into feat/files-utf8-text

This commit is contained in:
Rob Ede 2020-10-03 00:15:47 +01:00 committed by GitHub
commit baa0c2c799
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 60 additions and 28 deletions

View File

@ -1,12 +1,22 @@
# Changes # Changes
## Unreleased - 2020-xx-xx ## Unreleased - 2020-xx-xx
### Changed
* Add `TrailingSlash::MergeOnly` behaviour to `NormalizePath`, which allow `NormalizePath`
to keep the trailing slash's existance as it is. [#1695]
* Fix `ResourceMap` recursive references when printing/debugging. [#1708]
## 3.1.0 - 2020-09-29
### Changed
* Add `TrailingSlash::MergeOnly` behaviour to `NormalizePath`, which allows `NormalizePath`
to retain any trailing slashes. [#1695]
* Remove bound `std::marker::Sized` from `web::Data` to support storing `Arc<dyn Trait>`
via `web::Data::from` [#1710]
### Fixed
* `ResourceMap` debug printing is no longer infinitely recursive. [#1708]
[#1695]: https://github.com/actix/actix-web/pull/1695
[#1708]: https://github.com/actix/actix-web/pull/1708 [#1708]: https://github.com/actix/actix-web/pull/1708
[#1710]: https://github.com/actix/actix-web/pull/1710
## 3.0.2 - 2020-09-15 ## 3.0.2 - 2020-09-15
### Fixed ### Fixed
@ -176,7 +186,7 @@
### Deleted ### Deleted
* Delete HttpServer::run(), it is not useful witht async/await * Delete HttpServer::run(), it is not useful with async/await
## [2.0.0-alpha.3] - 2019-12-07 ## [2.0.0-alpha.3] - 2019-12-07
@ -221,7 +231,7 @@
### Changed ### Changed
* Make UrlEncodedError::Overflow more informativve * Make UrlEncodedError::Overflow more informative
* Use actix-testing for testing utils * Use actix-testing for testing utils
@ -239,7 +249,7 @@
* Re-implement Host predicate (#989) * Re-implement Host predicate (#989)
* Form immplements Responder, returning a `application/x-www-form-urlencoded` response * Form implements Responder, returning a `application/x-www-form-urlencoded` response
* Add `into_inner` to `Data` * Add `into_inner` to `Data`

View File

@ -1,6 +1,6 @@
[package] [package]
name = "actix-web" name = "actix-web"
version = "3.0.2" version = "3.1.0"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"] authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix web is a powerful, pragmatic, and extremely fast web framework for Rust." description = "Actix web is a powerful, pragmatic, and extremely fast web framework for Rust."
readme = "README.md" readme = "README.md"

View File

@ -7,6 +7,7 @@
clippy::new_without_default, clippy::new_without_default,
clippy::borrow_interior_mutable_const clippy::borrow_interior_mutable_const
)] )]
#![allow(clippy::manual_strip)] // Allow this to keep MSRV(1.42).
#[macro_use] #[macro_use]
extern crate log; extern crate log;

View File

@ -5,7 +5,7 @@
## 0.4.0 - 2020-09-20 ## 0.4.0 - 2020-09-20
* Added compile success and failure testing. [#1677] * Added compile success and failure testing. [#1677]
* Add `route` macro for supporting multiple HTTP methods guards. * Add `route` macro for supporting multiple HTTP methods guards. [#1674]
[#1677]: https://github.com/actix/actix-web/pull/1677 [#1677]: https://github.com/actix/actix-web/pull/1677
[#1674]: https://github.com/actix/actix-web/pull/1674 [#1674]: https://github.com/actix/actix-web/pull/1674
@ -21,47 +21,48 @@
[#1559]: https://github.com/actix/actix-web/pull/1559 [#1559]: https://github.com/actix/actix-web/pull/1559
## [0.2.2] - 2020-05-23 ## 0.2.2 - 2020-05-23
* Add resource middleware on actix-web-codegen [#1467] * Add resource middleware on actix-web-codegen [#1467]
[#1467]: https://github.com/actix/actix-web/pull/1467 [#1467]: https://github.com/actix/actix-web/pull/1467
## [0.2.1] - 2020-02-25
## 0.2.1 - 2020-02-25
* Add `#[allow(missing_docs)]` attribute to generated structs [#1368] * Add `#[allow(missing_docs)]` attribute to generated structs [#1368]
* Allow the handler function to be named as `config` [#1290] * Allow the handler function to be named as `config` [#1290]
[#1368]: https://github.com/actix/actix-web/issues/1368 [#1368]: https://github.com/actix/actix-web/issues/1368
[#1290]: https://github.com/actix/actix-web/issues/1290 [#1290]: https://github.com/actix/actix-web/issues/1290
## [0.2.0] - 2019-12-13
## 0.2.0 - 2019-12-13
* Generate code for actix-web 2.0 * Generate code for actix-web 2.0
## [0.1.3] - 2019-10-14
## 0.1.3 - 2019-10-14
* Bump up `syn` & `quote` to 1.0 * Bump up `syn` & `quote` to 1.0
* Provide better error message * Provide better error message
## [0.1.2] - 2019-06-04
## 0.1.2 - 2019-06-04
* Add macros for head, options, trace, connect and patch http methods * Add macros for head, options, trace, connect and patch http methods
## [0.1.1] - 2019-06-01
## 0.1.1 - 2019-06-01
* Add syn "extra-traits" feature * Add syn "extra-traits" feature
## [0.1.0] - 2019-05-18
## 0.1.0 - 2019-05-18
* Release * Release
## [0.1.0-beta.1] - 2019-04-20
## 0.1.0-beta.1 - 2019-04-20
* Gen code for actix-web 1.0.0-beta.1 * Gen code for actix-web 1.0.0-beta.1
## [0.1.0-alpha.6] - 2019-04-14
## 0.1.0-alpha.6 - 2019-04-14
* Gen code for actix-web 1.0.0-alpha.6 * Gen code for actix-web 1.0.0-alpha.6
## [0.1.0-alpha.1] - 2019-03-28
## 0.1.0-alpha.1 - 2019-03-28
* Initial impl * Initial impl

View File

@ -66,7 +66,7 @@ pub(crate) type FnDataFactory =
/// } /// }
/// ``` /// ```
#[derive(Debug)] #[derive(Debug)]
pub struct Data<T>(Arc<T>); pub struct Data<T: ?Sized>(Arc<T>);
impl<T> Data<T> { impl<T> Data<T> {
/// Create new `Data` instance. /// Create new `Data` instance.
@ -89,7 +89,7 @@ impl<T> Data<T> {
} }
} }
impl<T> Deref for Data<T> { impl<T: ?Sized> Deref for Data<T> {
type Target = Arc<T>; type Target = Arc<T>;
fn deref(&self) -> &Arc<T> { fn deref(&self) -> &Arc<T> {
@ -97,19 +97,19 @@ impl<T> Deref for Data<T> {
} }
} }
impl<T> Clone for Data<T> { impl<T: ?Sized> Clone for Data<T> {
fn clone(&self) -> Data<T> { fn clone(&self) -> Data<T> {
Data(self.0.clone()) Data(self.0.clone())
} }
} }
impl<T> From<Arc<T>> for Data<T> { impl<T: ?Sized> From<Arc<T>> for Data<T> {
fn from(arc: Arc<T>) -> Self { fn from(arc: Arc<T>) -> Self {
Data(arc) Data(arc)
} }
} }
impl<T: 'static> FromRequest for Data<T> { impl<T: ?Sized + 'static> FromRequest for Data<T> {
type Config = (); type Config = ();
type Error = Error; type Error = Error;
type Future = Ready<Result<Self, Error>>; type Future = Ready<Result<Self, Error>>;
@ -131,7 +131,7 @@ impl<T: 'static> FromRequest for Data<T> {
} }
} }
impl<T: 'static> DataFactory for Data<T> { impl<T: ?Sized + 'static> DataFactory for Data<T> {
fn create(&self, extensions: &mut Extensions) -> bool { fn create(&self, extensions: &mut Extensions) -> bool {
if !extensions.contains::<Data<T>>() { if !extensions.contains::<Data<T>>() {
extensions.insert(Data(self.0.clone())); extensions.insert(Data(self.0.clone()));
@ -293,4 +293,24 @@ mod tests {
let data_from_arc = Data::from(Arc::new(String::from("test-123"))); let data_from_arc = Data::from(Arc::new(String::from("test-123")));
assert_eq!(data_new.0, data_from_arc.0) assert_eq!(data_new.0, data_from_arc.0)
} }
#[actix_rt::test]
async fn test_data_from_dyn_arc() {
trait TestTrait {
fn get_num(&self) -> i32;
}
struct A {}
impl TestTrait for A {
fn get_num(&self) -> i32 {
42
}
}
// This works when Sized is required
let dyn_arc_box: Arc<Box<dyn TestTrait>> = Arc::new(Box::new(A {}));
let data_arc_box = Data::from(dyn_arc_box);
// This works when Data Sized Bound is removed
let dyn_arc: Arc<dyn TestTrait> = Arc::new(A {});
let data_arc = Data::from(dyn_arc);
assert_eq!(data_arc_box.get_num(), data_arc.get_num())
}
} }

View File

@ -67,6 +67,7 @@
#![deny(rust_2018_idioms)] #![deny(rust_2018_idioms)]
#![allow(clippy::needless_doctest_main, clippy::type_complexity)] #![allow(clippy::needless_doctest_main, clippy::type_complexity)]
#![allow(clippy::rc_buffer)] // FXIME: We should take a closer look for the warnings at some point.
#![doc(html_logo_url = "https://actix.rs/img/logo.png")] #![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")] #![doc(html_favicon_url = "https://actix.rs/favicon.ico")]

View File

@ -58,7 +58,6 @@ type BoxedResponse = LocalBoxFuture<'static, Result<ServiceResponse, Error>>;
/// * /{project_id}/path1 - responds to all http method /// * /{project_id}/path1 - responds to all http method
/// * /{project_id}/path2 - `GET` requests /// * /{project_id}/path2 - `GET` requests
/// * /{project_id}/path3 - `HEAD` requests /// * /{project_id}/path3 - `HEAD` requests
///
pub struct Scope<T = ScopeEndpoint> { pub struct Scope<T = ScopeEndpoint> {
endpoint: T, endpoint: T,
rdef: String, rdef: String,

View File

@ -283,7 +283,7 @@ impl JsonConfig {
fn from_req(req: &HttpRequest) -> &Self { fn from_req(req: &HttpRequest) -> &Self {
req.app_data::<Self>() req.app_data::<Self>()
.or_else(|| req.app_data::<web::Data<Self>>().map(|d| d.as_ref())) .or_else(|| req.app_data::<web::Data<Self>>().map(|d| d.as_ref()))
.unwrap_or_else(|| &DEFAULT_CONFIG) .unwrap_or(&DEFAULT_CONFIG)
} }
} }

View File

@ -284,7 +284,7 @@ impl PayloadConfig {
fn from_req(req: &HttpRequest) -> &Self { fn from_req(req: &HttpRequest) -> &Self {
req.app_data::<Self>() req.app_data::<Self>()
.or_else(|| req.app_data::<web::Data<Self>>().map(|d| d.as_ref())) .or_else(|| req.app_data::<web::Data<Self>>().map(|d| d.as_ref()))
.unwrap_or_else(|| &DEFAULT_CONFIG) .unwrap_or(&DEFAULT_CONFIG)
} }
} }