mirror of
https://github.com/fafhrd91/actix-net
synced 2025-08-14 06:30:32 +02:00
Compare commits
15 Commits
server-v2.
...
server-v2.
Author | SHA1 | Date | |
---|---|---|---|
|
ae9afd4de7 | ||
|
01d2f18f68 | ||
|
e92b5aaf31 | ||
|
459a6d1b02 | ||
|
9935883905 | ||
|
89a4c2ee27 | ||
|
a4681831a7 | ||
|
5d2da0fdc7 | ||
|
ef18a8342e | ||
|
621deba990 | ||
|
6a9f13c8b4 | ||
|
705b31230f | ||
|
eb490a9125 | ||
|
90f205a465 | ||
|
3a3d654cea |
@@ -3,17 +3,10 @@
|
|||||||
> A collection of lower-level libraries for composable network services.
|
> A collection of lower-level libraries for composable network services.
|
||||||
|
|
||||||

|

|
||||||
|
[](https://github.com/actix/actix-net/actions/workflows/ci.yml)
|
||||||
[](https://codecov.io/gh/actix/actix-net)
|
[](https://codecov.io/gh/actix/actix-net)
|
||||||
[](https://discord.gg/NWpN5mmg3x)
|
[](https://discord.gg/NWpN5mmg3x)
|
||||||
|
|
||||||
## Build statuses
|
|
||||||
| Platform | Build Status |
|
|
||||||
| ---------------- | ------------ |
|
|
||||||
| Linux | [](https://github.com/actix/actix-net/actions?query=workflow%3A"CI+(Linux)") |
|
|
||||||
| macOS | [](https://github.com/actix/actix-net/actions?query=workflow%3A"CI+(macOS)") |
|
|
||||||
| Windows | [](https://github.com/actix/actix-net/actions?query=workflow%3A"CI+(Windows)") |
|
|
||||||
| Windows (MinGW) | [](https://github.com/actix/actix-net/actions?query=workflow%3A"CI+(Windows-mingw)") |
|
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
See `actix-server/examples` and `actix-tls/examples` for some basic examples.
|
See `actix-server/examples` and `actix-tls/examples` for some basic examples.
|
||||||
|
|
||||||
|
@@ -4,68 +4,68 @@
|
|||||||
|
|
||||||
|
|
||||||
## 0.4.1 - 2021-11-05
|
## 0.4.1 - 2021-11-05
|
||||||
* Added `LinesCodec.` [#338]
|
- Added `LinesCodec.` [#338]
|
||||||
* `Framed::poll_ready` flushes when the buffer is full. [#409]
|
- `Framed::poll_ready` flushes when the buffer is full. [#409]
|
||||||
|
|
||||||
[#338]: https://github.com/actix/actix-net/pull/338
|
[#338]: https://github.com/actix/actix-net/pull/338
|
||||||
[#409]: https://github.com/actix/actix-net/pull/409
|
[#409]: https://github.com/actix/actix-net/pull/409
|
||||||
|
|
||||||
|
|
||||||
## 0.4.0 - 2021-04-20
|
## 0.4.0 - 2021-04-20
|
||||||
* No significant changes since v0.4.0-beta.1.
|
- No significant changes since v0.4.0-beta.1.
|
||||||
|
|
||||||
|
|
||||||
## 0.4.0-beta.1 - 2020-12-28
|
## 0.4.0-beta.1 - 2020-12-28
|
||||||
* Replace `pin-project` with `pin-project-lite`. [#237]
|
- Replace `pin-project` with `pin-project-lite`. [#237]
|
||||||
* Upgrade `tokio` dependency to `1`. [#237]
|
- Upgrade `tokio` dependency to `1`. [#237]
|
||||||
* Upgrade `tokio-util` dependency to `0.6`. [#237]
|
- Upgrade `tokio-util` dependency to `0.6`. [#237]
|
||||||
* Upgrade `bytes` dependency to `1`. [#237]
|
- Upgrade `bytes` dependency to `1`. [#237]
|
||||||
|
|
||||||
[#237]: https://github.com/actix/actix-net/pull/237
|
[#237]: https://github.com/actix/actix-net/pull/237
|
||||||
|
|
||||||
|
|
||||||
## 0.3.0 - 2020-08-23
|
## 0.3.0 - 2020-08-23
|
||||||
* No changes from beta 2.
|
- No changes from beta 2.
|
||||||
|
|
||||||
|
|
||||||
## 0.3.0-beta.2 - 2020-08-19
|
## 0.3.0-beta.2 - 2020-08-19
|
||||||
* Remove unused type parameter from `Framed::replace_codec`.
|
- Remove unused type parameter from `Framed::replace_codec`.
|
||||||
|
|
||||||
|
|
||||||
## 0.3.0-beta.1 - 2020-08-19
|
## 0.3.0-beta.1 - 2020-08-19
|
||||||
* Use `.advance()` instead of `.split_to()`.
|
- Use `.advance()` instead of `.split_to()`.
|
||||||
* Upgrade `tokio-util` to `0.3`.
|
- Upgrade `tokio-util` to `0.3`.
|
||||||
* Improve `BytesCodec::encode()` performance.
|
- Improve `BytesCodec::encode()` performance.
|
||||||
* Simplify `BytesCodec::decode()`.
|
- Simplify `BytesCodec::decode()`.
|
||||||
* Rename methods on `Framed` to better describe their use.
|
- Rename methods on `Framed` to better describe their use.
|
||||||
* Add method on `Framed` to get a pinned reference to the underlying I/O.
|
- Add method on `Framed` to get a pinned reference to the underlying I/O.
|
||||||
* Add method on `Framed` check emptiness of read buffer.
|
- Add method on `Framed` check emptiness of read buffer.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.0 - 2019-12-10
|
## 0.2.0 - 2019-12-10
|
||||||
* Use specific futures dependencies.
|
- Use specific futures dependencies.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.0-alpha.4
|
## 0.2.0-alpha.4
|
||||||
* Fix buffer remaining capacity calculation.
|
- Fix buffer remaining capacity calculation.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.0-alpha.3
|
## 0.2.0-alpha.3
|
||||||
* Use tokio 0.2.
|
- Use tokio 0.2.
|
||||||
* Fix low/high watermark for write/read buffers.
|
- Fix low/high watermark for write/read buffers.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.0-alpha.2
|
## 0.2.0-alpha.2
|
||||||
* Migrated to `std::future`.
|
- Migrated to `std::future`.
|
||||||
|
|
||||||
|
|
||||||
## 0.1.2 - 2019-03-27
|
## 0.1.2 - 2019-03-27
|
||||||
* Added `Framed::map_io()` method.
|
- Added `Framed::map_io()` method.
|
||||||
|
|
||||||
|
|
||||||
## 0.1.1 - 2019-03-06
|
## 0.1.1 - 2019-03-06
|
||||||
* Added `FramedParts::with_read_buffer()` method.
|
- Added `FramedParts::with_read_buffer()` method.
|
||||||
|
|
||||||
|
|
||||||
## 0.1.0 - 2018-12-09
|
## 0.1.0 - 2018-12-09
|
||||||
* Move codec to separate crate.
|
- Move codec to separate crate.
|
||||||
|
@@ -156,7 +156,7 @@ impl<T, U> Framed<T, U> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T, U> Framed<T, U> {
|
impl<T, U> Framed<T, U> {
|
||||||
/// Serialize item and Write to the inner buffer
|
/// Serialize item and write to the inner buffer
|
||||||
pub fn write<I>(mut self: Pin<&mut Self>, item: I) -> Result<(), <U as Encoder<I>>::Error>
|
pub fn write<I>(mut self: Pin<&mut Self>, item: I) -> Result<(), <U as Encoder<I>>::Error>
|
||||||
where
|
where
|
||||||
T: AsyncWrite,
|
T: AsyncWrite,
|
||||||
|
@@ -7,8 +7,8 @@
|
|||||||
//! [`Sink`]: futures_sink::Sink
|
//! [`Sink`]: futures_sink::Sink
|
||||||
//! [`Stream`]: futures_core::Stream
|
//! [`Stream`]: futures_core::Stream
|
||||||
|
|
||||||
#![deny(rust_2018_idioms, nonstandard_style, future_incompatible)]
|
#![deny(rust_2018_idioms, nonstandard_style)]
|
||||||
#![warn(missing_docs)]
|
#![warn(future_incompatible, missing_docs)]
|
||||||
#![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")]
|
||||||
|
|
||||||
|
@@ -4,43 +4,43 @@
|
|||||||
|
|
||||||
|
|
||||||
## 0.2.3 - 2021-10-19
|
## 0.2.3 - 2021-10-19
|
||||||
* Fix test macro in presence of other imports named "test". [#399]
|
- Fix test macro in presence of other imports named "test". [#399]
|
||||||
|
|
||||||
[#399]: https://github.com/actix/actix-net/pull/399
|
[#399]: https://github.com/actix/actix-net/pull/399
|
||||||
|
|
||||||
|
|
||||||
## 0.2.2 - 2021-10-14
|
## 0.2.2 - 2021-10-14
|
||||||
* Improve error recovery potential when macro input is invalid. [#391]
|
- Improve error recovery potential when macro input is invalid. [#391]
|
||||||
* Allow custom `System`s on test macro. [#391]
|
- Allow custom `System`s on test macro. [#391]
|
||||||
|
|
||||||
[#391]: https://github.com/actix/actix-net/pull/391
|
[#391]: https://github.com/actix/actix-net/pull/391
|
||||||
|
|
||||||
|
|
||||||
## 0.2.1 - 2021-02-02
|
## 0.2.1 - 2021-02-02
|
||||||
* Add optional argument `system` to `main` macro which can be used to specify the path to `actix_rt::System` (useful for re-exports). [#363]
|
- Add optional argument `system` to `main` macro which can be used to specify the path to `actix_rt::System` (useful for re-exports). [#363]
|
||||||
|
|
||||||
[#363]: https://github.com/actix/actix-net/pull/363
|
[#363]: https://github.com/actix/actix-net/pull/363
|
||||||
|
|
||||||
|
|
||||||
## 0.2.0 - 2021-02-02
|
## 0.2.0 - 2021-02-02
|
||||||
* Update to latest `actix_rt::System::new` signature. [#261]
|
- Update to latest `actix_rt::System::new` signature. [#261]
|
||||||
|
|
||||||
[#261]: https://github.com/actix/actix-net/pull/261
|
[#261]: https://github.com/actix/actix-net/pull/261
|
||||||
|
|
||||||
|
|
||||||
## 0.2.0-beta.1 - 2021-01-09
|
## 0.2.0-beta.1 - 2021-01-09
|
||||||
* Remove `actix-reexport` feature. [#218]
|
- Remove `actix-reexport` feature. [#218]
|
||||||
|
|
||||||
[#218]: https://github.com/actix/actix-net/pull/218
|
[#218]: https://github.com/actix/actix-net/pull/218
|
||||||
|
|
||||||
|
|
||||||
## 0.1.3 - 2020-12-03
|
## 0.1.3 - 2020-12-03
|
||||||
* Add `actix-reexport` feature. [#218]
|
- Add `actix-reexport` feature. [#218]
|
||||||
|
|
||||||
[#218]: https://github.com/actix/actix-net/pull/218
|
[#218]: https://github.com/actix/actix-net/pull/218
|
||||||
|
|
||||||
|
|
||||||
## 0.1.2 - 2020-05-18
|
## 0.1.2 - 2020-05-18
|
||||||
* Forward actix_rt::test arguments to test function [#127]
|
- Forward actix_rt::test arguments to test function [#127]
|
||||||
|
|
||||||
[#127]: https://github.com/actix/actix-net/pull/127
|
[#127]: https://github.com/actix/actix-net/pull/127
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
//! See docs for the [`#[test]`](macro@test) macro.
|
//! See docs for the [`#[test]`](macro@test) macro.
|
||||||
|
|
||||||
#![deny(rust_2018_idioms, nonstandard_style)]
|
#![deny(rust_2018_idioms, nonstandard_style)]
|
||||||
|
#![warn(future_incompatible)]
|
||||||
#![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")]
|
||||||
|
|
||||||
|
@@ -1,32 +1,35 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
- Expose `System::with_tokio_rt` and `Arbiter::with_tokio_rt`. [#430]
|
||||||
|
|
||||||
|
[#430]: https://github.com/actix/actix-net/pull/430
|
||||||
|
|
||||||
|
|
||||||
## 2.5.0 - 2021-11-22
|
## 2.5.0 - 2021-11-22
|
||||||
* Add `System::run_with_code` to allow retrieving the exit code on stop. [#411]
|
- Add `System::run_with_code` to allow retrieving the exit code on stop. [#411]
|
||||||
|
|
||||||
[#411]: https://github.com/actix/actix-net/pull/411
|
[#411]: https://github.com/actix/actix-net/pull/411
|
||||||
|
|
||||||
|
|
||||||
## 2.4.0 - 2021-11-05
|
## 2.4.0 - 2021-11-05
|
||||||
* Add `Arbiter::try_current` for situations where thread may or may not have Arbiter context. [#408]
|
- Add `Arbiter::try_current` for situations where thread may or may not have Arbiter context. [#408]
|
||||||
* Start io-uring with `System::new` when feature is enabled. [#395]
|
- Start io-uring with `System::new` when feature is enabled. [#395]
|
||||||
|
|
||||||
[#395]: https://github.com/actix/actix-net/pull/395
|
[#395]: https://github.com/actix/actix-net/pull/395
|
||||||
[#408]: https://github.com/actix/actix-net/pull/408
|
[#408]: https://github.com/actix/actix-net/pull/408
|
||||||
|
|
||||||
|
|
||||||
## 2.3.0 - 2021-10-11
|
## 2.3.0 - 2021-10-11
|
||||||
* The `spawn` method can now resolve with non-unit outputs. [#369]
|
- The `spawn` method can now resolve with non-unit outputs. [#369]
|
||||||
* Add experimental (semver-exempt) `io-uring` feature for enabling async file I/O on linux. [#374]
|
- Add experimental (semver-exempt) `io-uring` feature for enabling async file I/O on linux. [#374]
|
||||||
|
|
||||||
[#369]: https://github.com/actix/actix-net/pull/369
|
[#369]: https://github.com/actix/actix-net/pull/369
|
||||||
[#374]: https://github.com/actix/actix-net/pull/374
|
[#374]: https://github.com/actix/actix-net/pull/374
|
||||||
|
|
||||||
|
|
||||||
## 2.2.0 - 2021-03-29
|
## 2.2.0 - 2021-03-29
|
||||||
* **BREAKING** `ActixStream::{poll_read_ready, poll_write_ready}` methods now return
|
- **BREAKING** `ActixStream::{poll_read_ready, poll_write_ready}` methods now return
|
||||||
`Ready` object in ok variant. [#293]
|
`Ready` object in ok variant. [#293]
|
||||||
* Breakage is acceptable since `ActixStream` was not intended to be public.
|
* Breakage is acceptable since `ActixStream` was not intended to be public.
|
||||||
|
|
||||||
@@ -34,51 +37,51 @@
|
|||||||
|
|
||||||
|
|
||||||
## 2.1.0 - 2021-02-24
|
## 2.1.0 - 2021-02-24
|
||||||
* Add `ActixStream` extension trait to include readiness methods. [#276]
|
- Add `ActixStream` extension trait to include readiness methods. [#276]
|
||||||
* Re-export `tokio::net::TcpSocket` in `net` module [#282]
|
- Re-export `tokio::net::TcpSocket` in `net` module [#282]
|
||||||
|
|
||||||
[#276]: https://github.com/actix/actix-net/pull/276
|
[#276]: https://github.com/actix/actix-net/pull/276
|
||||||
[#282]: https://github.com/actix/actix-net/pull/282
|
[#282]: https://github.com/actix/actix-net/pull/282
|
||||||
|
|
||||||
|
|
||||||
## 2.0.2 - 2021-02-06
|
## 2.0.2 - 2021-02-06
|
||||||
* Add `Arbiter::handle` to get a handle of an owned Arbiter. [#274]
|
- Add `Arbiter::handle` to get a handle of an owned Arbiter. [#274]
|
||||||
* Add `System::try_current` for situations where actix may or may not be running a System. [#275]
|
- Add `System::try_current` for situations where actix may or may not be running a System. [#275]
|
||||||
|
|
||||||
[#274]: https://github.com/actix/actix-net/pull/274
|
[#274]: https://github.com/actix/actix-net/pull/274
|
||||||
[#275]: https://github.com/actix/actix-net/pull/275
|
[#275]: https://github.com/actix/actix-net/pull/275
|
||||||
|
|
||||||
|
|
||||||
## 2.0.1 - 2021-02-06
|
## 2.0.1 - 2021-02-06
|
||||||
* Expose `JoinError` from Tokio. [#271]
|
- Expose `JoinError` from Tokio. [#271]
|
||||||
|
|
||||||
[#271]: https://github.com/actix/actix-net/pull/271
|
[#271]: https://github.com/actix/actix-net/pull/271
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0 - 2021-02-02
|
## 2.0.0 - 2021-02-02
|
||||||
* Remove all Arbiter-local storage methods. [#262]
|
- Remove all Arbiter-local storage methods. [#262]
|
||||||
* Re-export `tokio::pin`. [#262]
|
- Re-export `tokio::pin`. [#262]
|
||||||
|
|
||||||
[#262]: https://github.com/actix/actix-net/pull/262
|
[#262]: https://github.com/actix/actix-net/pull/262
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.3 - 2021-01-31
|
## 2.0.0-beta.3 - 2021-01-31
|
||||||
* Remove `run_in_tokio`, `attach_to_tokio` and `AsyncSystemRunner`. [#253]
|
- Remove `run_in_tokio`, `attach_to_tokio` and `AsyncSystemRunner`. [#253]
|
||||||
* Return `JoinHandle` from `actix_rt::spawn`. [#253]
|
- Return `JoinHandle` from `actix_rt::spawn`. [#253]
|
||||||
* Remove old `Arbiter::spawn`. Implementation is now inlined into `actix_rt::spawn`. [#253]
|
- Remove old `Arbiter::spawn`. Implementation is now inlined into `actix_rt::spawn`. [#253]
|
||||||
* Rename `Arbiter::{send => spawn}` and `Arbiter::{exec_fn => spawn_fn}`. [#253]
|
- Rename `Arbiter::{send => spawn}` and `Arbiter::{exec_fn => spawn_fn}`. [#253]
|
||||||
* Remove `Arbiter::exec`. [#253]
|
- Remove `Arbiter::exec`. [#253]
|
||||||
* Remove deprecated `Arbiter::local_join` and `Arbiter::is_running`. [#253]
|
- Remove deprecated `Arbiter::local_join` and `Arbiter::is_running`. [#253]
|
||||||
* `Arbiter::spawn` now accepts !Unpin futures. [#256]
|
- `Arbiter::spawn` now accepts !Unpin futures. [#256]
|
||||||
* `System::new` no longer takes arguments. [#257]
|
- `System::new` no longer takes arguments. [#257]
|
||||||
* Remove `System::with_current`. [#257]
|
- Remove `System::with_current`. [#257]
|
||||||
* Remove `Builder`. [#257]
|
- Remove `Builder`. [#257]
|
||||||
* Add `System::with_init` as replacement for `Builder::run`. [#257]
|
- Add `System::with_init` as replacement for `Builder::run`. [#257]
|
||||||
* Rename `System::{is_set => is_registered}`. [#257]
|
- Rename `System::{is_set => is_registered}`. [#257]
|
||||||
* Add `ArbiterHandle` for sending messages to non-current-thread arbiters. [#257].
|
- Add `ArbiterHandle` for sending messages to non-current-thread arbiters. [#257].
|
||||||
* `System::arbiter` now returns an `&ArbiterHandle`. [#257]
|
- `System::arbiter` now returns an `&ArbiterHandle`. [#257]
|
||||||
* `Arbiter::current` now returns an `ArbiterHandle` instead. [#257]
|
- `Arbiter::current` now returns an `ArbiterHandle` instead. [#257]
|
||||||
* `Arbiter::join` now takes self by value. [#257]
|
- `Arbiter::join` now takes self by value. [#257]
|
||||||
|
|
||||||
[#253]: https://github.com/actix/actix-net/pull/253
|
[#253]: https://github.com/actix/actix-net/pull/253
|
||||||
[#254]: https://github.com/actix/actix-net/pull/254
|
[#254]: https://github.com/actix/actix-net/pull/254
|
||||||
@@ -87,37 +90,37 @@
|
|||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.2 - 2021-01-09
|
## 2.0.0-beta.2 - 2021-01-09
|
||||||
* Add `task` mod with re-export of `tokio::task::{spawn_blocking, yield_now, JoinHandle}` [#245]
|
- Add `task` mod with re-export of `tokio::task::{spawn_blocking, yield_now, JoinHandle}` [#245]
|
||||||
* Add default "macros" feature to allow faster compile times when using `default-features=false`.
|
- Add default "macros" feature to allow faster compile times when using `default-features=false`.
|
||||||
|
|
||||||
[#245]: https://github.com/actix/actix-net/pull/245
|
[#245]: https://github.com/actix/actix-net/pull/245
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.1 - 2020-12-28
|
## 2.0.0-beta.1 - 2020-12-28
|
||||||
* Add `System::attach_to_tokio` method. [#173]
|
- Add `System::attach_to_tokio` method. [#173]
|
||||||
* Update `tokio` dependency to `1.0`. [#236]
|
- Update `tokio` dependency to `1.0`. [#236]
|
||||||
* Rename `time` module `delay_for` to `sleep`, `delay_until` to `sleep_until`, `Delay` to `Sleep`
|
- Rename `time` module `delay_for` to `sleep`, `delay_until` to `sleep_until`, `Delay` to `Sleep`
|
||||||
to stay aligned with Tokio's naming. [#236]
|
to stay aligned with Tokio's naming. [#236]
|
||||||
* Remove `'static` lifetime requirement for `Runtime::block_on` and `SystemRunner::block_on`.
|
- Remove `'static` lifetime requirement for `Runtime::block_on` and `SystemRunner::block_on`.
|
||||||
* These methods now accept `&self` when calling. [#236]
|
* These methods now accept `&self` when calling. [#236]
|
||||||
* Remove `'static` lifetime requirement for `System::run` and `Builder::run`. [#236]
|
- Remove `'static` lifetime requirement for `System::run` and `Builder::run`. [#236]
|
||||||
* `Arbiter::spawn` now panics when `System` is not in scope. [#207]
|
- `Arbiter::spawn` now panics when `System` is not in scope. [#207]
|
||||||
* Fix work load issue by removing `PENDING` thread local. [#207]
|
- Fix work load issue by removing `PENDING` thread local. [#207]
|
||||||
|
|
||||||
[#207]: https://github.com/actix/actix-net/pull/207
|
[#207]: https://github.com/actix/actix-net/pull/207
|
||||||
[#236]: https://github.com/actix/actix-net/pull/236
|
[#236]: https://github.com/actix/actix-net/pull/236
|
||||||
|
|
||||||
|
|
||||||
## 1.1.1 - 2020-04-30
|
## 1.1.1 - 2020-04-30
|
||||||
* Fix memory leak due to [#94] (see [#129] for more detail)
|
- Fix memory leak due to [#94] (see [#129] for more detail)
|
||||||
|
|
||||||
[#129]: https://github.com/actix/actix-net/issues/129
|
[#129]: https://github.com/actix/actix-net/issues/129
|
||||||
|
|
||||||
|
|
||||||
## 1.1.0 - 2020-04-08 _(YANKED)_
|
## 1.1.0 - 2020-04-08 _(YANKED)_
|
||||||
* Expose `System::is_set` to check if current system has ben started [#99]
|
- Expose `System::is_set` to check if current system has ben started [#99]
|
||||||
* Add `Arbiter::is_running` to check if event loop is running [#124]
|
- Add `Arbiter::is_running` to check if event loop is running [#124]
|
||||||
* Add `Arbiter::local_join` associated function
|
- Add `Arbiter::local_join` associated function
|
||||||
to get be able to `await` for spawned futures [#94]
|
to get be able to `await` for spawned futures [#94]
|
||||||
|
|
||||||
[#94]: https://github.com/actix/actix-net/pull/94
|
[#94]: https://github.com/actix/actix-net/pull/94
|
||||||
@@ -126,55 +129,55 @@
|
|||||||
|
|
||||||
|
|
||||||
## 1.0.0 - 2019-12-11
|
## 1.0.0 - 2019-12-11
|
||||||
* Update dependencies
|
- Update dependencies
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.3 - 2019-12-07
|
## 1.0.0-alpha.3 - 2019-12-07
|
||||||
* Migrate to tokio 0.2
|
- Migrate to tokio 0.2
|
||||||
* Fix compilation on non-unix platforms
|
- Fix compilation on non-unix platforms
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.2 - 2019-12-02
|
## 1.0.0-alpha.2 - 2019-12-02
|
||||||
* Export `main` and `test` attribute macros
|
- Export `main` and `test` attribute macros
|
||||||
* Export `time` module (re-export of tokio-timer)
|
- Export `time` module (re-export of tokio-timer)
|
||||||
* Export `net` module (re-export of tokio-net)
|
- Export `net` module (re-export of tokio-net)
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.1 - 2019-11-22
|
## 1.0.0-alpha.1 - 2019-11-22
|
||||||
* Migrate to std::future and tokio 0.2
|
- Migrate to std::future and tokio 0.2
|
||||||
|
|
||||||
|
|
||||||
## 0.2.6 - 2019-11-14
|
## 0.2.6 - 2019-11-14
|
||||||
* Allow to join arbiter's thread. #60
|
- Allow to join arbiter's thread. #60
|
||||||
* Fix arbiter's thread panic message.
|
- Fix arbiter's thread panic message.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.5 - 2019-09-02
|
## 0.2.5 - 2019-09-02
|
||||||
* Add arbiter specific storage
|
- Add arbiter specific storage
|
||||||
|
|
||||||
|
|
||||||
## 0.2.4 - 2019-07-17
|
## 0.2.4 - 2019-07-17
|
||||||
* Avoid a copy of the Future when initializing the Box. #29
|
- Avoid a copy of the Future when initializing the Box. #29
|
||||||
|
|
||||||
|
|
||||||
## 0.2.3 - 2019-06-22
|
## 0.2.3 - 2019-06-22
|
||||||
* Allow to start System using existing CurrentThread Handle #22
|
- Allow to start System using existing CurrentThread Handle #22
|
||||||
|
|
||||||
|
|
||||||
## 0.2.2 - 2019-03-28
|
## 0.2.2 - 2019-03-28
|
||||||
* Moved `blocking` module to `actix-threadpool` crate
|
- Moved `blocking` module to `actix-threadpool` crate
|
||||||
|
|
||||||
|
|
||||||
## 0.2.1 - 2019-03-11
|
## 0.2.1 - 2019-03-11
|
||||||
* Added `blocking` module
|
- Added `blocking` module
|
||||||
* Added `Arbiter::exec_fn` - execute fn on the arbiter's thread
|
- Added `Arbiter::exec_fn` - execute fn on the arbiter's thread
|
||||||
* Added `Arbiter::exec` - execute fn on the arbiter's thread and wait result
|
- Added `Arbiter::exec` - execute fn on the arbiter's thread and wait result
|
||||||
|
|
||||||
|
|
||||||
## 0.2.0 - 2019-03-06
|
## 0.2.0 - 2019-03-06
|
||||||
* `run` method returns `io::Result<()>`
|
- `run` method returns `io::Result<()>`
|
||||||
* Removed `Handle`
|
- Removed `Handle`
|
||||||
|
|
||||||
|
|
||||||
## 0.1.0 - 2018-12-09
|
## 0.1.0 - 2018-12-09
|
||||||
* Initial release
|
- Initial release
|
||||||
|
@@ -108,7 +108,6 @@ impl Arbiter {
|
|||||||
///
|
///
|
||||||
/// [tokio-runtime]: tokio::runtime::Runtime
|
/// [tokio-runtime]: tokio::runtime::Runtime
|
||||||
#[cfg(not(all(target_os = "linux", feature = "io-uring")))]
|
#[cfg(not(all(target_os = "linux", feature = "io-uring")))]
|
||||||
#[doc(hidden)]
|
|
||||||
pub fn with_tokio_rt<F>(runtime_factory: F) -> Arbiter
|
pub fn with_tokio_rt<F>(runtime_factory: F) -> Arbiter
|
||||||
where
|
where
|
||||||
F: Fn() -> tokio::runtime::Runtime + Send + 'static,
|
F: Fn() -> tokio::runtime::Runtime + Send + 'static,
|
||||||
|
@@ -41,7 +41,7 @@
|
|||||||
//! In particular, when running a `System`, only `System::block_on` is supported.
|
//! In particular, when running a `System`, only `System::block_on` is supported.
|
||||||
|
|
||||||
#![deny(rust_2018_idioms, nonstandard_style)]
|
#![deny(rust_2018_idioms, nonstandard_style)]
|
||||||
#![warn(missing_docs)]
|
#![warn(future_incompatible, missing_docs)]
|
||||||
#![allow(clippy::type_complexity)]
|
#![allow(clippy::type_complexity)]
|
||||||
#![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")]
|
||||||
|
@@ -46,7 +46,6 @@ impl System {
|
|||||||
/// Create a new System using the [Tokio Runtime](tokio-runtime) returned from a closure.
|
/// Create a new System using the [Tokio Runtime](tokio-runtime) returned from a closure.
|
||||||
///
|
///
|
||||||
/// [tokio-runtime]: tokio::runtime::Runtime
|
/// [tokio-runtime]: tokio::runtime::Runtime
|
||||||
#[doc(hidden)]
|
|
||||||
pub fn with_tokio_rt<F>(runtime_factory: F) -> SystemRunner
|
pub fn with_tokio_rt<F>(runtime_factory: F) -> SystemRunner
|
||||||
where
|
where
|
||||||
F: Fn() -> tokio::runtime::Runtime,
|
F: Fn() -> tokio::runtime::Runtime,
|
||||||
|
@@ -3,46 +3,52 @@
|
|||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 2.0.0-rc.2 - 2021-12-27
|
||||||
|
- Simplify `TestServer`. [#431]
|
||||||
|
|
||||||
|
[#431]: https://github.com/actix/actix-net/pull/431
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-rc.1 - 2021-12-05
|
## 2.0.0-rc.1 - 2021-12-05
|
||||||
* Hide implementation details of `Server`. [#424]
|
- Hide implementation details of `Server`. [#424]
|
||||||
* `Server` now runs only after awaiting it. [#425]
|
- `Server` now runs only after awaiting it. [#425]
|
||||||
|
|
||||||
[#424]: https://github.com/actix/actix-net/pull/424
|
[#424]: https://github.com/actix/actix-net/pull/424
|
||||||
[#425]: https://github.com/actix/actix-net/pull/425
|
[#425]: https://github.com/actix/actix-net/pull/425
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.9 - 2021-11-15
|
## 2.0.0-beta.9 - 2021-11-15
|
||||||
* Restore `Arbiter` support lost in `beta.8`. [#417]
|
- Restore `Arbiter` support lost in `beta.8`. [#417]
|
||||||
|
|
||||||
[#417]: https://github.com/actix/actix-net/pull/417
|
[#417]: https://github.com/actix/actix-net/pull/417
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.8 - 2021-11-05 _(YANKED)_
|
## 2.0.0-beta.8 - 2021-11-05 _(YANKED)_
|
||||||
* Fix non-unix signal handler. [#410]
|
- Fix non-unix signal handler. [#410]
|
||||||
|
|
||||||
[#410]: https://github.com/actix/actix-net/pull/410
|
[#410]: https://github.com/actix/actix-net/pull/410
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.7 - 2021-11-05 _(YANKED)_
|
## 2.0.0-beta.7 - 2021-11-05 _(YANKED)_
|
||||||
* Server can be started in regular Tokio runtime. [#408]
|
- Server can be started in regular Tokio runtime. [#408]
|
||||||
* Expose new `Server` type whose `Future` impl resolves when server stops. [#408]
|
- Expose new `Server` type whose `Future` impl resolves when server stops. [#408]
|
||||||
* Rename `Server` to `ServerHandle`. [#407]
|
- Rename `Server` to `ServerHandle`. [#407]
|
||||||
* Add `Server::handle` to obtain handle to server. [#408]
|
- Add `Server::handle` to obtain handle to server. [#408]
|
||||||
* Rename `ServerBuilder::{maxconn => max_concurrent_connections}`. [#407]
|
- Rename `ServerBuilder::{maxconn => max_concurrent_connections}`. [#407]
|
||||||
* Deprecate crate-level `new` shortcut for server builder. [#408]
|
- Deprecate crate-level `new` shortcut for server builder. [#408]
|
||||||
* Minimum supported Rust version (MSRV) is now 1.52.
|
- Minimum supported Rust version (MSRV) is now 1.52.
|
||||||
|
|
||||||
[#407]: https://github.com/actix/actix-net/pull/407
|
[#407]: https://github.com/actix/actix-net/pull/407
|
||||||
[#408]: https://github.com/actix/actix-net/pull/408
|
[#408]: https://github.com/actix/actix-net/pull/408
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.6 - 2021-10-11
|
## 2.0.0-beta.6 - 2021-10-11
|
||||||
* Add experimental (semver-exempt) `io-uring` feature for enabling async file I/O on linux. [#374]
|
- Add experimental (semver-exempt) `io-uring` feature for enabling async file I/O on linux. [#374]
|
||||||
* Server no long listens to `SIGHUP` signal. Previously, the received was not used but did block
|
- Server no long listens to `SIGHUP` signal. Previously, the received was not used but did block
|
||||||
subsequent exit signals from working. [#389]
|
subsequent exit signals from working. [#389]
|
||||||
* Remove `config` module. `ServiceConfig`, `ServiceRuntime` public types are removed due to
|
- Remove `config` module. `ServiceConfig`, `ServiceRuntime` public types are removed due to
|
||||||
this change. [#349]
|
this change. [#349]
|
||||||
* Remove `ServerBuilder::configure` [#349]
|
- Remove `ServerBuilder::configure` [#349]
|
||||||
|
|
||||||
[#374]: https://github.com/actix/actix-net/pull/374
|
[#374]: https://github.com/actix/actix-net/pull/374
|
||||||
[#349]: https://github.com/actix/actix-net/pull/349
|
[#349]: https://github.com/actix/actix-net/pull/349
|
||||||
@@ -50,23 +56,23 @@
|
|||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.5 - 2021-04-20
|
## 2.0.0-beta.5 - 2021-04-20
|
||||||
* Server shutdown notifies all workers to exit regardless if shutdown is graceful. This causes all
|
- Server shutdown notifies all workers to exit regardless if shutdown is graceful. This causes all
|
||||||
workers to shutdown immediately in force shutdown case. [#333]
|
workers to shutdown immediately in force shutdown case. [#333]
|
||||||
|
|
||||||
[#333]: https://github.com/actix/actix-net/pull/333
|
[#333]: https://github.com/actix/actix-net/pull/333
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.4 - 2021-04-01
|
## 2.0.0-beta.4 - 2021-04-01
|
||||||
* Prevent panic when `shutdown_timeout` is very large. [f9262db]
|
- Prevent panic when `shutdown_timeout` is very large. [f9262db]
|
||||||
|
|
||||||
[f9262db]: https://github.com/actix/actix-net/commit/f9262db
|
[f9262db]: https://github.com/actix/actix-net/commit/f9262db
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.3 - 2021-02-06
|
## 2.0.0-beta.3 - 2021-02-06
|
||||||
* Hidden `ServerBuilder::start` method has been removed. Use `ServerBuilder::run`. [#246]
|
- Hidden `ServerBuilder::start` method has been removed. Use `ServerBuilder::run`. [#246]
|
||||||
* Add retry for EINTR signal (`io::Interrupted`) in `Accept`'s poll loop. [#264]
|
- Add retry for EINTR signal (`io::Interrupted`) in `Accept`'s poll loop. [#264]
|
||||||
* Add `ServerBuilder::worker_max_blocking_threads` to customize blocking thread pool size. [#265]
|
- Add `ServerBuilder::worker_max_blocking_threads` to customize blocking thread pool size. [#265]
|
||||||
* Update `actix-rt` to `2.0.0`. [#273]
|
- Update `actix-rt` to `2.0.0`. [#273]
|
||||||
|
|
||||||
[#246]: https://github.com/actix/actix-net/pull/246
|
[#246]: https://github.com/actix/actix-net/pull/246
|
||||||
[#264]: https://github.com/actix/actix-net/pull/264
|
[#264]: https://github.com/actix/actix-net/pull/264
|
||||||
@@ -75,21 +81,21 @@
|
|||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.2 - 2021-01-03
|
## 2.0.0-beta.2 - 2021-01-03
|
||||||
* Merge `actix-testing` to `actix-server` as `test_server` mod. [#242]
|
- Merge `actix-testing` to `actix-server` as `test_server` mod. [#242]
|
||||||
|
|
||||||
[#242]: https://github.com/actix/actix-net/pull/242
|
[#242]: https://github.com/actix/actix-net/pull/242
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.1 - 2020-12-28
|
## 2.0.0-beta.1 - 2020-12-28
|
||||||
* Added explicit info log message on accept queue pause. [#215]
|
- Added explicit info log message on accept queue pause. [#215]
|
||||||
* Prevent double registration of sockets when back-pressure is resolved. [#223]
|
- Prevent double registration of sockets when back-pressure is resolved. [#223]
|
||||||
* Update `mio` dependency to `0.7.3`. [#239]
|
- Update `mio` dependency to `0.7.3`. [#239]
|
||||||
* Remove `socket2` dependency. [#239]
|
- Remove `socket2` dependency. [#239]
|
||||||
* `ServerBuilder::backlog` now accepts `u32` instead of `i32`. [#239]
|
- `ServerBuilder::backlog` now accepts `u32` instead of `i32`. [#239]
|
||||||
* Remove `AcceptNotify` type and pass `WakerQueue` to `Worker` to wake up `Accept`'s `Poll`. [#239]
|
- Remove `AcceptNotify` type and pass `WakerQueue` to `Worker` to wake up `Accept`'s `Poll`. [#239]
|
||||||
* Convert `mio::net::TcpStream` to `actix_rt::net::TcpStream`(`UnixStream` for uds) using
|
- Convert `mio::net::TcpStream` to `actix_rt::net::TcpStream`(`UnixStream` for uds) using
|
||||||
`FromRawFd` and `IntoRawFd`(`FromRawSocket` and `IntoRawSocket` on windows). [#239]
|
`FromRawFd` and `IntoRawFd`(`FromRawSocket` and `IntoRawSocket` on windows). [#239]
|
||||||
* Remove `AsyncRead` and `AsyncWrite` trait bound for `socket::FromStream` trait. [#239]
|
- Remove `AsyncRead` and `AsyncWrite` trait bound for `socket::FromStream` trait. [#239]
|
||||||
|
|
||||||
[#215]: https://github.com/actix/actix-net/pull/215
|
[#215]: https://github.com/actix/actix-net/pull/215
|
||||||
[#223]: https://github.com/actix/actix-net/pull/223
|
[#223]: https://github.com/actix/actix-net/pull/223
|
||||||
@@ -97,125 +103,125 @@
|
|||||||
|
|
||||||
|
|
||||||
## 1.0.4 - 2020-09-12
|
## 1.0.4 - 2020-09-12
|
||||||
* Update actix-codec to 0.3.0.
|
- Update actix-codec to 0.3.0.
|
||||||
* Workers must be greater than 0. [#167]
|
- Workers must be greater than 0. [#167]
|
||||||
|
|
||||||
[#167]: https://github.com/actix/actix-net/pull/167
|
[#167]: https://github.com/actix/actix-net/pull/167
|
||||||
|
|
||||||
|
|
||||||
## 1.0.3 - 2020-05-19
|
## 1.0.3 - 2020-05-19
|
||||||
* Replace deprecated `net2` crate with `socket2` [#140]
|
- Replace deprecated `net2` crate with `socket2` [#140]
|
||||||
|
|
||||||
[#140]: https://github.com/actix/actix-net/pull/140
|
[#140]: https://github.com/actix/actix-net/pull/140
|
||||||
|
|
||||||
|
|
||||||
## 1.0.2 - 2020-02-26
|
## 1.0.2 - 2020-02-26
|
||||||
* Avoid error by calling `reregister()` on Windows [#103]
|
- Avoid error by calling `reregister()` on Windows [#103]
|
||||||
|
|
||||||
[#103]: https://github.com/actix/actix-net/pull/103
|
[#103]: https://github.com/actix/actix-net/pull/103
|
||||||
|
|
||||||
|
|
||||||
## 1.0.1 - 2019-12-29
|
## 1.0.1 - 2019-12-29
|
||||||
* Rename `.start()` method to `.run()`
|
- Rename `.start()` method to `.run()`
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0 - 2019-12-11
|
## 1.0.0 - 2019-12-11
|
||||||
* Use actix-net releases
|
- Use actix-net releases
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.4 - 2019-12-08
|
## 1.0.0-alpha.4 - 2019-12-08
|
||||||
* Use actix-service 1.0.0-alpha.4
|
- Use actix-service 1.0.0-alpha.4
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.3 - 2019-12-07
|
## 1.0.0-alpha.3 - 2019-12-07
|
||||||
* Migrate to tokio 0.2
|
- Migrate to tokio 0.2
|
||||||
* Fix compilation on non-unix platforms
|
- Fix compilation on non-unix platforms
|
||||||
* Better handling server configuration
|
- Better handling server configuration
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.2 - 2019-12-02
|
## 1.0.0-alpha.2 - 2019-12-02
|
||||||
* Simplify server service (remove actix-server-config)
|
- Simplify server service (remove actix-server-config)
|
||||||
* Allow to wait on `Server` until server stops
|
- Allow to wait on `Server` until server stops
|
||||||
|
|
||||||
|
|
||||||
## 0.8.0-alpha.1 - 2019-11-22
|
## 0.8.0-alpha.1 - 2019-11-22
|
||||||
* Migrate to `std::future`
|
- Migrate to `std::future`
|
||||||
|
|
||||||
|
|
||||||
## 0.7.0 - 2019-10-04
|
## 0.7.0 - 2019-10-04
|
||||||
* Update `rustls` to 0.16
|
- Update `rustls` to 0.16
|
||||||
* Minimum required Rust version upped to 1.37.0
|
- Minimum required Rust version upped to 1.37.0
|
||||||
|
|
||||||
|
|
||||||
## 0.6.1 - 2019-09-25
|
## 0.6.1 - 2019-09-25
|
||||||
* Add UDS listening support to `ServerBuilder`
|
- Add UDS listening support to `ServerBuilder`
|
||||||
|
|
||||||
|
|
||||||
## 0.6.0 - 2019-07-18
|
## 0.6.0 - 2019-07-18
|
||||||
* Support Unix domain sockets #3
|
- Support Unix domain sockets #3
|
||||||
|
|
||||||
|
|
||||||
## 0.5.1 - 2019-05-18
|
## 0.5.1 - 2019-05-18
|
||||||
* ServerBuilder::shutdown_timeout() accepts u64
|
- ServerBuilder::shutdown_timeout() accepts u64
|
||||||
|
|
||||||
|
|
||||||
## 0.5.0 - 2019-05-12
|
## 0.5.0 - 2019-05-12
|
||||||
* Add `Debug` impl for `SslError`
|
- Add `Debug` impl for `SslError`
|
||||||
* Derive debug for `Server` and `ServerCommand`
|
- Derive debug for `Server` and `ServerCommand`
|
||||||
* Upgrade to actix-service 0.4
|
- Upgrade to actix-service 0.4
|
||||||
|
|
||||||
|
|
||||||
## 0.4.3 - 2019-04-16
|
## 0.4.3 - 2019-04-16
|
||||||
* Re-export `IoStream` trait
|
- Re-export `IoStream` trait
|
||||||
* Depend on `ssl` and `rust-tls` features from actix-server-config
|
- Depend on `ssl` and `rust-tls` features from actix-server-config
|
||||||
|
|
||||||
|
|
||||||
## 0.4.2 - 2019-03-30
|
## 0.4.2 - 2019-03-30
|
||||||
* Fix SIGINT force shutdown
|
- Fix SIGINT force shutdown
|
||||||
|
|
||||||
|
|
||||||
## 0.4.1 - 2019-03-14
|
## 0.4.1 - 2019-03-14
|
||||||
* `SystemRuntime::on_start()` - allow to run future before server service initialization
|
- `SystemRuntime::on_start()` - allow to run future before server service initialization
|
||||||
|
|
||||||
|
|
||||||
## 0.4.0 - 2019-03-12
|
## 0.4.0 - 2019-03-12
|
||||||
* Use `ServerConfig` for service factory
|
- Use `ServerConfig` for service factory
|
||||||
* Wrap tcp socket to `Io` type
|
- Wrap tcp socket to `Io` type
|
||||||
* Upgrade actix-service
|
- Upgrade actix-service
|
||||||
|
|
||||||
|
|
||||||
## 0.3.1 - 2019-03-04
|
## 0.3.1 - 2019-03-04
|
||||||
* Add `ServerBuilder::maxconnrate` sets the maximum per-worker number of concurrent connections
|
- Add `ServerBuilder::maxconnrate` sets the maximum per-worker number of concurrent connections
|
||||||
* Add helper ssl error `SslError`
|
- Add helper ssl error `SslError`
|
||||||
* Rename `StreamServiceFactory` to `ServiceFactory`
|
- Rename `StreamServiceFactory` to `ServiceFactory`
|
||||||
* Deprecate `StreamServiceFactory`
|
- Deprecate `StreamServiceFactory`
|
||||||
|
|
||||||
|
|
||||||
## 0.3.0 - 2019-03-02
|
## 0.3.0 - 2019-03-02
|
||||||
* Use new `NewService` trait
|
- Use new `NewService` trait
|
||||||
|
|
||||||
|
|
||||||
## 0.2.1 - 2019-02-09
|
## 0.2.1 - 2019-02-09
|
||||||
* Drop service response
|
- Drop service response
|
||||||
|
|
||||||
|
|
||||||
## 0.2.0 - 2019-02-01
|
## 0.2.0 - 2019-02-01
|
||||||
* Migrate to actix-service 0.2
|
- Migrate to actix-service 0.2
|
||||||
* Updated rustls dependency
|
- Updated rustls dependency
|
||||||
|
|
||||||
|
|
||||||
## 0.1.3 - 2018-12-21
|
## 0.1.3 - 2018-12-21
|
||||||
* Fix max concurrent connections handling
|
- Fix max concurrent connections handling
|
||||||
|
|
||||||
|
|
||||||
## 0.1.2 - 2018-12-12
|
## 0.1.2 - 2018-12-12
|
||||||
* rename ServiceConfig::rt() to ServiceConfig::apply()
|
- rename ServiceConfig::rt() to ServiceConfig::apply()
|
||||||
* Fix back-pressure for concurrent ssl handshakes
|
- Fix back-pressure for concurrent ssl handshakes
|
||||||
|
|
||||||
|
|
||||||
## 0.1.1 - 2018-12-11
|
## 0.1.1 - 2018-12-11
|
||||||
* Fix signal handling on windows
|
- Fix signal handling on windows
|
||||||
|
|
||||||
|
|
||||||
## 0.1.0 - 2018-12-09
|
## 0.1.0 - 2018-12-09
|
||||||
* Move server to separate crate
|
- Move server to separate crate
|
||||||
|
@@ -1,14 +1,17 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-server"
|
name = "actix-server"
|
||||||
version = "2.0.0-rc.1"
|
version = "2.0.0-rc.2"
|
||||||
authors = [
|
authors = [
|
||||||
"Nikolay Kim <fafhrd91@gmail.com>",
|
"Nikolay Kim <fafhrd91@gmail.com>",
|
||||||
"fakeshadow <24548779@qq.com>",
|
"fakeshadow <24548779@qq.com>",
|
||||||
|
"Rob Ede <robjtede@icloud.com>",
|
||||||
|
"Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com>",
|
||||||
]
|
]
|
||||||
description = "General purpose TCP server built for the Actix ecosystem"
|
description = "General purpose TCP server built for the Actix ecosystem"
|
||||||
keywords = ["network", "framework", "async", "futures"]
|
keywords = ["network", "tcp", "server", "framework", "async"]
|
||||||
repository = "https://github.com/actix/actix-net.git"
|
|
||||||
categories = ["network-programming", "asynchronous"]
|
categories = ["network-programming", "asynchronous"]
|
||||||
|
homepage = "https://actix.rs"
|
||||||
|
repository = "https://github.com/actix/actix-net.git"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
@@ -43,4 +46,4 @@ actix-rt = "2.4.0"
|
|||||||
bytes = "1"
|
bytes = "1"
|
||||||
env_logger = "0.9"
|
env_logger = "0.9"
|
||||||
futures-util = { version = "0.3.7", default-features = false, features = ["sink", "async-await-macro"] }
|
futures-util = { version = "0.3.7", default-features = false, features = ["sink", "async-await-macro"] }
|
||||||
tokio = { version = "1.5.1", features = ["io-util", "rt-multi-thread", "macros"] }
|
tokio = { version = "1.5.1", features = ["io-util", "rt-multi-thread", "macros", "fs"] }
|
||||||
|
93
actix-server/examples/file-reader.rs
Normal file
93
actix-server/examples/file-reader.rs
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
//! Simple file-reader TCP server with framed stream.
|
||||||
|
//!
|
||||||
|
//! Using the following command:
|
||||||
|
//!
|
||||||
|
//! ```sh
|
||||||
|
//! nc 127.0.0.1 8080
|
||||||
|
//! ```
|
||||||
|
//!
|
||||||
|
//! Follow the prompt and enter a file path, relative or absolute.
|
||||||
|
|
||||||
|
use std::io;
|
||||||
|
|
||||||
|
use actix_codec::{Framed, LinesCodec};
|
||||||
|
use actix_rt::net::TcpStream;
|
||||||
|
use actix_server::Server;
|
||||||
|
use actix_service::{fn_service, ServiceFactoryExt as _};
|
||||||
|
use futures_util::{SinkExt as _, StreamExt as _};
|
||||||
|
use tokio::{fs::File, io::AsyncReadExt as _};
|
||||||
|
|
||||||
|
async fn run() -> io::Result<()> {
|
||||||
|
env_logger::init_from_env(env_logger::Env::default().default_filter_or("info"));
|
||||||
|
|
||||||
|
let addr = ("127.0.0.1", 8080);
|
||||||
|
log::info!("starting server on port: {}", &addr.0);
|
||||||
|
|
||||||
|
// Bind socket address and start worker(s). By default, the server uses the number of physical
|
||||||
|
// CPU cores as the worker count. For this reason, the closure passed to bind needs to return
|
||||||
|
// a service *factory*; so it can be created once per worker.
|
||||||
|
Server::build()
|
||||||
|
.bind("file-reader", addr, move || {
|
||||||
|
fn_service(move |stream: TcpStream| async move {
|
||||||
|
// set up codec to use with I/O resource
|
||||||
|
let mut framed = Framed::new(stream, LinesCodec::default());
|
||||||
|
|
||||||
|
loop {
|
||||||
|
// prompt for file name
|
||||||
|
framed.send("Type file name to return:").await?;
|
||||||
|
|
||||||
|
// wait for next line
|
||||||
|
match framed.next().await {
|
||||||
|
Some(Ok(line)) => {
|
||||||
|
match File::open(line).await {
|
||||||
|
Ok(mut file) => {
|
||||||
|
// read file into String buffer
|
||||||
|
let mut buf = String::new();
|
||||||
|
file.read_to_string(&mut buf).await?;
|
||||||
|
|
||||||
|
// send String into framed object
|
||||||
|
framed.send(buf).await?;
|
||||||
|
|
||||||
|
// break out of loop and
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
log::error!("{}", err);
|
||||||
|
framed
|
||||||
|
.send("File not found or not readable. Try again.")
|
||||||
|
.await?;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// not being able to read a line from the stream is unrecoverable
|
||||||
|
Some(Err(err)) => return Err(err),
|
||||||
|
|
||||||
|
// This EOF won't be hit.
|
||||||
|
None => continue,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// close connection after file has been copied to TCP stream
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
.map_err(|err| log::error!("Service Error: {:?}", err))
|
||||||
|
})?
|
||||||
|
.workers(2)
|
||||||
|
.run()
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> io::Result<()> {
|
||||||
|
run().await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
// alternatively:
|
||||||
|
// #[actix_rt::main]
|
||||||
|
// async fn main() -> io::Result<()> {
|
||||||
|
// run().await?;
|
||||||
|
// Ok(())
|
||||||
|
// }
|
@@ -26,16 +26,16 @@ use log::{error, info};
|
|||||||
use tokio::io::{AsyncReadExt as _, AsyncWriteExt as _};
|
use tokio::io::{AsyncReadExt as _, AsyncWriteExt as _};
|
||||||
|
|
||||||
async fn run() -> io::Result<()> {
|
async fn run() -> io::Result<()> {
|
||||||
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
|
env_logger::init_from_env(env_logger::Env::default().default_filter_or("info"));
|
||||||
|
|
||||||
let count = Arc::new(AtomicUsize::new(0));
|
let count = Arc::new(AtomicUsize::new(0));
|
||||||
|
|
||||||
let addr = ("127.0.0.1", 8080);
|
let addr = ("127.0.0.1", 8080);
|
||||||
info!("starting server on port: {}", &addr.0);
|
info!("starting server on port: {}", &addr.0);
|
||||||
|
|
||||||
// Bind socket address and start worker(s). By default, the server uses the number of available
|
// Bind socket address and start worker(s). By default, the server uses the number of physical
|
||||||
// logical CPU cores as the worker count. For this reason, the closure passed to bind needs
|
// CPU cores as the worker count. For this reason, the closure passed to bind needs to return
|
||||||
// to return a service *factory*; so it can be created once per worker.
|
// a service *factory*; so it can be created once per worker.
|
||||||
Server::build()
|
Server::build()
|
||||||
.bind("echo", addr, move || {
|
.bind("echo", addr, move || {
|
||||||
let count = Arc::clone(&count);
|
let count = Arc::clone(&count);
|
||||||
|
@@ -6,7 +6,7 @@ use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender};
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
server::ServerCommand,
|
server::ServerCommand,
|
||||||
service::{InternalServiceFactory, ServiceFactory, StreamNewService},
|
service::{InternalServiceFactory, ServerServiceFactory, StreamNewService},
|
||||||
socket::{
|
socket::{
|
||||||
create_mio_tcp_listener, MioListener, MioTcpListener, StdTcpListener, ToSocketAddrs,
|
create_mio_tcp_listener, MioListener, MioTcpListener, StdTcpListener, ToSocketAddrs,
|
||||||
},
|
},
|
||||||
@@ -40,7 +40,7 @@ impl ServerBuilder {
|
|||||||
let (cmd_tx, cmd_rx) = unbounded_channel();
|
let (cmd_tx, cmd_rx) = unbounded_channel();
|
||||||
|
|
||||||
ServerBuilder {
|
ServerBuilder {
|
||||||
threads: num_cpus::get(),
|
threads: num_cpus::get_physical(),
|
||||||
token: 0,
|
token: 0,
|
||||||
factories: Vec::new(),
|
factories: Vec::new(),
|
||||||
sockets: Vec::new(),
|
sockets: Vec::new(),
|
||||||
@@ -55,8 +55,11 @@ impl ServerBuilder {
|
|||||||
|
|
||||||
/// Set number of workers to start.
|
/// Set number of workers to start.
|
||||||
///
|
///
|
||||||
/// By default server uses number of available logical CPU as workers count. Workers must be
|
/// `num` must be greater than 0.
|
||||||
/// greater than 0.
|
///
|
||||||
|
/// The default worker count is the number of physical CPU cores available. If your benchmark
|
||||||
|
/// testing indicates that simultaneous multi-threading is beneficial to your app, you can use
|
||||||
|
/// the [`num_cpus`] crate to acquire the _logical_ core count instead.
|
||||||
pub fn workers(mut self, num: usize) -> Self {
|
pub fn workers(mut self, num: usize) -> Self {
|
||||||
assert_ne!(num, 0, "workers must be greater than 0");
|
assert_ne!(num, 0, "workers must be greater than 0");
|
||||||
self.threads = num;
|
self.threads = num;
|
||||||
@@ -137,10 +140,11 @@ impl ServerBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Add new service to the server.
|
/// Add new service to the server.
|
||||||
pub fn bind<F, U, N: AsRef<str>>(mut self, name: N, addr: U, factory: F) -> io::Result<Self>
|
pub fn bind<F, U, N>(mut self, name: N, addr: U, factory: F) -> io::Result<Self>
|
||||||
where
|
where
|
||||||
F: ServiceFactory<TcpStream>,
|
F: ServerServiceFactory<TcpStream>,
|
||||||
U: ToSocketAddrs,
|
U: ToSocketAddrs,
|
||||||
|
N: AsRef<str>,
|
||||||
{
|
{
|
||||||
let sockets = bind_addr(addr, self.backlog)?;
|
let sockets = bind_addr(addr, self.backlog)?;
|
||||||
|
|
||||||
@@ -169,7 +173,7 @@ impl ServerBuilder {
|
|||||||
factory: F,
|
factory: F,
|
||||||
) -> io::Result<Self>
|
) -> io::Result<Self>
|
||||||
where
|
where
|
||||||
F: ServiceFactory<TcpStream>,
|
F: ServerServiceFactory<TcpStream>,
|
||||||
{
|
{
|
||||||
lst.set_nonblocking(true)?;
|
lst.set_nonblocking(true)?;
|
||||||
let addr = lst.local_addr()?;
|
let addr = lst.local_addr()?;
|
||||||
@@ -210,7 +214,7 @@ impl ServerBuilder {
|
|||||||
/// Add new unix domain service to the server.
|
/// Add new unix domain service to the server.
|
||||||
pub fn bind_uds<F, U, N>(self, name: N, addr: U, factory: F) -> io::Result<Self>
|
pub fn bind_uds<F, U, N>(self, name: N, addr: U, factory: F) -> io::Result<Self>
|
||||||
where
|
where
|
||||||
F: ServiceFactory<actix_rt::net::UnixStream>,
|
F: ServerServiceFactory<actix_rt::net::UnixStream>,
|
||||||
N: AsRef<str>,
|
N: AsRef<str>,
|
||||||
U: AsRef<std::path::Path>,
|
U: AsRef<std::path::Path>,
|
||||||
{
|
{
|
||||||
@@ -237,7 +241,7 @@ impl ServerBuilder {
|
|||||||
factory: F,
|
factory: F,
|
||||||
) -> io::Result<Self>
|
) -> io::Result<Self>
|
||||||
where
|
where
|
||||||
F: ServiceFactory<actix_rt::net::UnixStream>,
|
F: ServerServiceFactory<actix_rt::net::UnixStream>,
|
||||||
{
|
{
|
||||||
use std::net::{IpAddr, Ipv4Addr};
|
use std::net::{IpAddr, Ipv4Addr};
|
||||||
lst.set_nonblocking(true)?;
|
lst.set_nonblocking(true)?;
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
//! General purpose TCP server.
|
//! General purpose TCP server.
|
||||||
|
|
||||||
#![deny(rust_2018_idioms, nonstandard_style)]
|
#![deny(rust_2018_idioms, nonstandard_style)]
|
||||||
|
#![warn(future_incompatible)]
|
||||||
#![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")]
|
||||||
|
|
||||||
@@ -20,7 +21,7 @@ mod worker;
|
|||||||
pub use self::builder::ServerBuilder;
|
pub use self::builder::ServerBuilder;
|
||||||
pub use self::handle::ServerHandle;
|
pub use self::handle::ServerHandle;
|
||||||
pub use self::server::Server;
|
pub use self::server::Server;
|
||||||
pub use self::service::ServiceFactory;
|
pub use self::service::ServerServiceFactory;
|
||||||
pub use self::test_server::TestServer;
|
pub use self::test_server::TestServer;
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
@@ -1,16 +1,21 @@
|
|||||||
use std::marker::PhantomData;
|
use std::{
|
||||||
use std::net::SocketAddr;
|
marker::PhantomData,
|
||||||
use std::task::{Context, Poll};
|
net::SocketAddr,
|
||||||
|
task::{Context, Poll},
|
||||||
|
};
|
||||||
|
|
||||||
use actix_service::{Service, ServiceFactory as BaseServiceFactory};
|
use actix_service::{Service, ServiceFactory as BaseServiceFactory};
|
||||||
use actix_utils::future::{ready, Ready};
|
use actix_utils::future::{ready, Ready};
|
||||||
use futures_core::future::LocalBoxFuture;
|
use futures_core::future::LocalBoxFuture;
|
||||||
use log::error;
|
use log::error;
|
||||||
|
|
||||||
use crate::socket::{FromStream, MioStream};
|
use crate::{
|
||||||
use crate::worker::WorkerCounterGuard;
|
socket::{FromStream, MioStream},
|
||||||
|
worker::WorkerCounterGuard,
|
||||||
|
};
|
||||||
|
|
||||||
pub trait ServiceFactory<Stream: FromStream>: Send + Clone + 'static {
|
#[doc(hidden)]
|
||||||
|
pub trait ServerServiceFactory<Stream: FromStream>: Send + Clone + 'static {
|
||||||
type Factory: BaseServiceFactory<Stream, Config = ()>;
|
type Factory: BaseServiceFactory<Stream, Config = ()>;
|
||||||
|
|
||||||
fn create(&self) -> Self::Factory;
|
fn create(&self) -> Self::Factory;
|
||||||
@@ -80,7 +85,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) struct StreamNewService<F: ServiceFactory<Io>, Io: FromStream> {
|
pub(crate) struct StreamNewService<F: ServerServiceFactory<Io>, Io: FromStream> {
|
||||||
name: String,
|
name: String,
|
||||||
inner: F,
|
inner: F,
|
||||||
token: usize,
|
token: usize,
|
||||||
@@ -90,7 +95,7 @@ pub(crate) struct StreamNewService<F: ServiceFactory<Io>, Io: FromStream> {
|
|||||||
|
|
||||||
impl<F, Io> StreamNewService<F, Io>
|
impl<F, Io> StreamNewService<F, Io>
|
||||||
where
|
where
|
||||||
F: ServiceFactory<Io>,
|
F: ServerServiceFactory<Io>,
|
||||||
Io: FromStream + Send + 'static,
|
Io: FromStream + Send + 'static,
|
||||||
{
|
{
|
||||||
pub(crate) fn create(
|
pub(crate) fn create(
|
||||||
@@ -111,7 +116,7 @@ where
|
|||||||
|
|
||||||
impl<F, Io> InternalServiceFactory for StreamNewService<F, Io>
|
impl<F, Io> InternalServiceFactory for StreamNewService<F, Io>
|
||||||
where
|
where
|
||||||
F: ServiceFactory<Io>,
|
F: ServerServiceFactory<Io>,
|
||||||
Io: FromStream + Send + 'static,
|
Io: FromStream + Send + 'static,
|
||||||
{
|
{
|
||||||
fn name(&self, _: usize) -> &str {
|
fn name(&self, _: usize) -> &str {
|
||||||
@@ -143,7 +148,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F, T, I> ServiceFactory<I> for F
|
impl<F, T, I> ServerServiceFactory<I> for F
|
||||||
where
|
where
|
||||||
F: Fn() -> T + Send + Clone + 'static,
|
F: Fn() -> T + Send + Clone + 'static,
|
||||||
T: BaseServiceFactory<I, Config = ()>,
|
T: BaseServiceFactory<I, Config = ()>,
|
||||||
|
@@ -1,19 +1,18 @@
|
|||||||
pub(crate) use std::net::{
|
pub(crate) use std::net::{
|
||||||
SocketAddr as StdSocketAddr, TcpListener as StdTcpListener, ToSocketAddrs,
|
SocketAddr as StdSocketAddr, TcpListener as StdTcpListener, ToSocketAddrs,
|
||||||
};
|
};
|
||||||
|
use std::{fmt, io};
|
||||||
|
|
||||||
|
use actix_rt::net::TcpStream;
|
||||||
pub(crate) use mio::net::TcpListener as MioTcpListener;
|
pub(crate) use mio::net::TcpListener as MioTcpListener;
|
||||||
|
use mio::{event::Source, Interest, Registry, Token};
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
pub(crate) use {
|
pub(crate) use {
|
||||||
mio::net::UnixListener as MioUnixListener,
|
mio::net::UnixListener as MioUnixListener,
|
||||||
std::os::unix::net::UnixListener as StdUnixListener,
|
std::os::unix::net::UnixListener as StdUnixListener,
|
||||||
};
|
};
|
||||||
|
|
||||||
use std::{fmt, io};
|
|
||||||
|
|
||||||
use actix_rt::net::TcpStream;
|
|
||||||
use mio::{event::Source, Interest, Registry, Token};
|
|
||||||
|
|
||||||
pub(crate) enum MioListener {
|
pub(crate) enum MioListener {
|
||||||
Tcp(MioTcpListener),
|
Tcp(MioTcpListener),
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
|
@@ -2,7 +2,7 @@ use std::{io, net, sync::mpsc, thread};
|
|||||||
|
|
||||||
use actix_rt::{net::TcpStream, System};
|
use actix_rt::{net::TcpStream, System};
|
||||||
|
|
||||||
use crate::{Server, ServerBuilder, ServerHandle, ServiceFactory};
|
use crate::{Server, ServerBuilder, ServerHandle, ServerServiceFactory};
|
||||||
|
|
||||||
/// A testing server.
|
/// A testing server.
|
||||||
///
|
///
|
||||||
@@ -16,7 +16,7 @@ use crate::{Server, ServerBuilder, ServerHandle, ServiceFactory};
|
|||||||
///
|
///
|
||||||
/// #[actix_rt::main]
|
/// #[actix_rt::main]
|
||||||
/// async fn main() {
|
/// async fn main() {
|
||||||
/// let srv = TestServer::with(|| fn_service(
|
/// let srv = TestServer::start(|| fn_service(
|
||||||
/// |sock| async move {
|
/// |sock| async move {
|
||||||
/// println!("New connection: {:?}", sock);
|
/// println!("New connection: {:?}", sock);
|
||||||
/// Ok::<_, ()>(())
|
/// Ok::<_, ()>(())
|
||||||
@@ -28,8 +28,8 @@ use crate::{Server, ServerBuilder, ServerHandle, ServiceFactory};
|
|||||||
/// ```
|
/// ```
|
||||||
pub struct TestServer;
|
pub struct TestServer;
|
||||||
|
|
||||||
/// Test server runtime
|
/// Test server handle.
|
||||||
pub struct TestServerRuntime {
|
pub struct TestServerHandle {
|
||||||
addr: net::SocketAddr,
|
addr: net::SocketAddr,
|
||||||
host: String,
|
host: String,
|
||||||
port: u16,
|
port: u16,
|
||||||
@@ -38,46 +38,26 @@ pub struct TestServerRuntime {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl TestServer {
|
impl TestServer {
|
||||||
/// Start new server with server builder.
|
/// Start new `TestServer` using application factory and default server config.
|
||||||
pub fn start<F>(mut factory: F) -> TestServerRuntime
|
pub fn start(factory: impl ServerServiceFactory<TcpStream>) -> TestServerHandle {
|
||||||
where
|
Self::start_with_builder(Server::build(), factory)
|
||||||
F: FnMut(ServerBuilder) -> ServerBuilder + Send + 'static,
|
|
||||||
{
|
|
||||||
let (tx, rx) = mpsc::channel();
|
|
||||||
|
|
||||||
// run server in separate thread
|
|
||||||
let thread_handle = thread::spawn(move || {
|
|
||||||
System::new().block_on(async {
|
|
||||||
let server = factory(Server::build()).workers(1).disable_signals().run();
|
|
||||||
tx.send(server.handle()).unwrap();
|
|
||||||
server.await
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
let server_handle = rx.recv().unwrap();
|
|
||||||
|
|
||||||
TestServerRuntime {
|
|
||||||
addr: "127.0.0.1:0".parse().unwrap(),
|
|
||||||
host: "127.0.0.1".to_string(),
|
|
||||||
port: 0,
|
|
||||||
server_handle,
|
|
||||||
thread_handle: Some(thread_handle),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Start new test server with application factory.
|
/// Start new `TestServer` using application factory and server builder.
|
||||||
pub fn with<F: ServiceFactory<TcpStream>>(factory: F) -> TestServerRuntime {
|
pub fn start_with_builder(
|
||||||
|
server_builder: ServerBuilder,
|
||||||
|
factory: impl ServerServiceFactory<TcpStream>,
|
||||||
|
) -> TestServerHandle {
|
||||||
let (tx, rx) = mpsc::channel();
|
let (tx, rx) = mpsc::channel();
|
||||||
|
|
||||||
// run server in separate thread
|
// run server in separate thread
|
||||||
let thread_handle = thread::spawn(move || {
|
let thread_handle = thread::spawn(move || {
|
||||||
let sys = System::new();
|
let lst = net::TcpListener::bind("127.0.0.1:0").unwrap();
|
||||||
let tcp = net::TcpListener::bind("127.0.0.1:0").unwrap();
|
let local_addr = lst.local_addr().unwrap();
|
||||||
let local_addr = tcp.local_addr().unwrap();
|
|
||||||
|
|
||||||
sys.block_on(async {
|
System::new().block_on(async {
|
||||||
let server = Server::build()
|
let server = server_builder
|
||||||
.listen("test", tcp, factory)
|
.listen("test", lst, factory)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.workers(1)
|
.workers(1)
|
||||||
.disable_signals()
|
.disable_signals()
|
||||||
@@ -93,7 +73,7 @@ impl TestServer {
|
|||||||
let host = format!("{}", addr.ip());
|
let host = format!("{}", addr.ip());
|
||||||
let port = addr.port();
|
let port = addr.port();
|
||||||
|
|
||||||
TestServerRuntime {
|
TestServerHandle {
|
||||||
addr,
|
addr,
|
||||||
host,
|
host,
|
||||||
port,
|
port,
|
||||||
@@ -107,17 +87,19 @@ impl TestServer {
|
|||||||
use socket2::{Domain, Protocol, Socket, Type};
|
use socket2::{Domain, Protocol, Socket, Type};
|
||||||
|
|
||||||
let addr: net::SocketAddr = "127.0.0.1:0".parse().unwrap();
|
let addr: net::SocketAddr = "127.0.0.1:0".parse().unwrap();
|
||||||
let socket =
|
let domain = Domain::for_address(addr);
|
||||||
Socket::new(Domain::for_address(addr), Type::STREAM, Some(Protocol::TCP)).unwrap();
|
let socket = Socket::new(domain, Type::STREAM, Some(Protocol::TCP)).unwrap();
|
||||||
|
|
||||||
socket.set_reuse_address(true).unwrap();
|
socket.set_reuse_address(true).unwrap();
|
||||||
socket.set_nonblocking(true).unwrap();
|
socket.set_nonblocking(true).unwrap();
|
||||||
socket.bind(&addr.into()).unwrap();
|
socket.bind(&addr.into()).unwrap();
|
||||||
socket.listen(1024).unwrap();
|
socket.listen(1024).unwrap();
|
||||||
|
|
||||||
net::TcpListener::from(socket).local_addr().unwrap()
|
net::TcpListener::from(socket).local_addr().unwrap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TestServerRuntime {
|
impl TestServerHandle {
|
||||||
/// Test server host.
|
/// Test server host.
|
||||||
pub fn host(&self) -> &str {
|
pub fn host(&self) -> &str {
|
||||||
&self.host
|
&self.host
|
||||||
@@ -140,12 +122,12 @@ impl TestServerRuntime {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Connect to server, returning a Tokio `TcpStream`.
|
/// Connect to server, returning a Tokio `TcpStream`.
|
||||||
pub fn connect(&self) -> std::io::Result<TcpStream> {
|
pub fn connect(&self) -> io::Result<TcpStream> {
|
||||||
TcpStream::from_std(net::TcpStream::connect(self.addr)?)
|
TcpStream::from_std(net::TcpStream::connect(self.addr)?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for TestServerRuntime {
|
impl Drop for TestServerHandle {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
self.stop()
|
self.stop()
|
||||||
}
|
}
|
||||||
@@ -158,8 +140,14 @@ mod tests {
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn plain_tokio_runtime() {
|
async fn connect_in_tokio_runtime() {
|
||||||
let srv = TestServer::with(|| fn_service(|_sock| async move { Ok::<_, ()>(()) }));
|
let srv = TestServer::start(|| fn_service(|_sock| async move { Ok::<_, ()>(()) }));
|
||||||
|
assert!(srv.connect().is_ok());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[actix_rt::test]
|
||||||
|
async fn connect_in_actix_runtime() {
|
||||||
|
let srv = TestServer::start(|| fn_service(|_sock| async move { Ok::<_, ()>(()) }));
|
||||||
assert!(srv.connect().is_ok());
|
assert!(srv.connect().is_ok());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -250,7 +250,7 @@ pub(crate) struct ServerWorkerConfig {
|
|||||||
impl Default for ServerWorkerConfig {
|
impl Default for ServerWorkerConfig {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
// 512 is the default max blocking thread count of tokio runtime.
|
// 512 is the default max blocking thread count of tokio runtime.
|
||||||
let max_blocking_threads = std::cmp::max(512 / num_cpus::get(), 1);
|
let max_blocking_threads = std::cmp::max(512 / num_cpus::get_physical(), 1);
|
||||||
Self {
|
Self {
|
||||||
shutdown_timeout: Duration::from_secs(30),
|
shutdown_timeout: Duration::from_secs(30),
|
||||||
max_blocking_threads,
|
max_blocking_threads,
|
||||||
|
@@ -26,20 +26,54 @@ fn test_bind() {
|
|||||||
let srv = Server::build()
|
let srv = Server::build()
|
||||||
.workers(1)
|
.workers(1)
|
||||||
.disable_signals()
|
.disable_signals()
|
||||||
|
.shutdown_timeout(3600)
|
||||||
.bind("test", addr, move || {
|
.bind("test", addr, move || {
|
||||||
fn_service(|_| async { Ok::<_, ()>(()) })
|
fn_service(|_| async { Ok::<_, ()>(()) })
|
||||||
})?
|
})?
|
||||||
.run();
|
.run();
|
||||||
|
|
||||||
let _ = tx.send(srv.handle());
|
tx.send(srv.handle()).unwrap();
|
||||||
|
|
||||||
srv.await
|
srv.await
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
let srv = rx.recv().unwrap();
|
let srv = rx.recv().unwrap();
|
||||||
|
|
||||||
thread::sleep(Duration::from_millis(500));
|
thread::sleep(Duration::from_millis(500));
|
||||||
assert!(net::TcpStream::connect(addr).is_ok());
|
|
||||||
|
net::TcpStream::connect(addr).unwrap();
|
||||||
|
|
||||||
|
let _ = srv.stop(true);
|
||||||
|
h.join().unwrap().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_listen() {
|
||||||
|
let addr = unused_addr();
|
||||||
|
let (tx, rx) = mpsc::channel();
|
||||||
|
let lst = net::TcpListener::bind(addr).unwrap();
|
||||||
|
|
||||||
|
let h = thread::spawn(move || {
|
||||||
|
actix_rt::System::new().block_on(async {
|
||||||
|
let srv = Server::build()
|
||||||
|
.workers(1)
|
||||||
|
.disable_signals()
|
||||||
|
.shutdown_timeout(3600)
|
||||||
|
.listen("test", lst, move || {
|
||||||
|
fn_service(|_| async { Ok::<_, ()>(()) })
|
||||||
|
})?
|
||||||
|
.run();
|
||||||
|
|
||||||
|
tx.send(srv.handle()).unwrap();
|
||||||
|
srv.await
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
let srv = rx.recv().unwrap();
|
||||||
|
|
||||||
|
thread::sleep(Duration::from_millis(500));
|
||||||
|
|
||||||
|
net::TcpStream::connect(addr).unwrap();
|
||||||
|
|
||||||
let _ = srv.stop(true);
|
let _ = srv.stop(true);
|
||||||
h.join().unwrap().unwrap();
|
h.join().unwrap().unwrap();
|
||||||
@@ -80,38 +114,6 @@ fn plain_tokio_runtime() {
|
|||||||
h.join().unwrap().unwrap();
|
h.join().unwrap().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_listen() {
|
|
||||||
let addr = unused_addr();
|
|
||||||
let lst = net::TcpListener::bind(addr).unwrap();
|
|
||||||
|
|
||||||
let (tx, rx) = mpsc::channel();
|
|
||||||
|
|
||||||
let h = thread::spawn(move || {
|
|
||||||
actix_rt::System::new().block_on(async {
|
|
||||||
let srv = Server::build()
|
|
||||||
.disable_signals()
|
|
||||||
.workers(1)
|
|
||||||
.listen("test", lst, move || {
|
|
||||||
fn_service(|_| async { Ok::<_, ()>(()) })
|
|
||||||
})?
|
|
||||||
.run();
|
|
||||||
|
|
||||||
let _ = tx.send(srv.handle());
|
|
||||||
|
|
||||||
srv.await
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
let srv = rx.recv().unwrap();
|
|
||||||
|
|
||||||
thread::sleep(Duration::from_millis(500));
|
|
||||||
assert!(net::TcpStream::connect(addr).is_ok());
|
|
||||||
|
|
||||||
let _ = srv.stop(true);
|
|
||||||
h.join().unwrap().unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
fn test_start() {
|
fn test_start() {
|
73
actix-server/tests/testing_server.rs
Normal file
73
actix-server/tests/testing_server.rs
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
use std::net;
|
||||||
|
|
||||||
|
use actix_rt::net::TcpStream;
|
||||||
|
use actix_server::{Server, TestServer};
|
||||||
|
use actix_service::fn_service;
|
||||||
|
use bytes::BytesMut;
|
||||||
|
use tokio::io::{AsyncReadExt as _, AsyncWriteExt as _};
|
||||||
|
|
||||||
|
macro_rules! await_timeout_ms {
|
||||||
|
($fut:expr, $limit:expr) => {
|
||||||
|
::actix_rt::time::timeout(::std::time::Duration::from_millis($limit), $fut)
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.unwrap();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn testing_server_echo() {
|
||||||
|
let srv = TestServer::start(|| {
|
||||||
|
fn_service(move |mut stream: TcpStream| async move {
|
||||||
|
let mut size = 0;
|
||||||
|
let mut buf = BytesMut::new();
|
||||||
|
|
||||||
|
match stream.read_buf(&mut buf).await {
|
||||||
|
Ok(0) => return Err(()),
|
||||||
|
|
||||||
|
Ok(bytes_read) => {
|
||||||
|
stream.write_all(&buf[size..]).await.unwrap();
|
||||||
|
size += bytes_read;
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(_) => return Err(()),
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok((buf.freeze(), size))
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut conn = srv.connect().unwrap();
|
||||||
|
|
||||||
|
await_timeout_ms!(conn.write_all(b"test"), 200);
|
||||||
|
|
||||||
|
let mut buf = Vec::new();
|
||||||
|
await_timeout_ms!(conn.read_to_end(&mut buf), 200);
|
||||||
|
|
||||||
|
assert_eq!(&buf, b"test".as_ref());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn new_with_builder() {
|
||||||
|
let alt_addr = TestServer::unused_addr();
|
||||||
|
|
||||||
|
let srv = TestServer::start_with_builder(
|
||||||
|
Server::build()
|
||||||
|
.bind("alt", alt_addr, || {
|
||||||
|
fn_service(|_| async { Ok::<_, ()>(()) })
|
||||||
|
})
|
||||||
|
.unwrap(),
|
||||||
|
|| {
|
||||||
|
fn_service(|mut sock: TcpStream| async move {
|
||||||
|
let mut buf = [0u8; 16];
|
||||||
|
sock.read_exact(&mut buf).await
|
||||||
|
})
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// connect to test server
|
||||||
|
srv.connect().unwrap();
|
||||||
|
|
||||||
|
// connect to alt service defined in custom ServerBuilder
|
||||||
|
TcpStream::from_std(net::TcpStream::connect(alt_addr).unwrap()).unwrap();
|
||||||
|
}
|
@@ -1,57 +1,62 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
* Service types can now be `Send` and `'static` regardless of request, response, and config types, etc.. [#397]
|
|
||||||
|
|
||||||
|
## 2.0.2 - 2021-12-18
|
||||||
|
- Service types can now be `Send` and `'static` regardless of request, response, and config types, etc. [#397]
|
||||||
|
|
||||||
[#397]: https://github.com/actix/actix-net/pull/397
|
[#397]: https://github.com/actix/actix-net/pull/397
|
||||||
|
|
||||||
|
|
||||||
## 2.0.1 - 2021-10-11
|
## 2.0.1 - 2021-10-11
|
||||||
* Documentation fix.
|
- Documentation fix. [#388]
|
||||||
|
|
||||||
|
[#388]: https://github.com/actix/actix-net/pull/388
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0 - 2021-04-16
|
## 2.0.0 - 2021-04-16
|
||||||
* Removed pipeline and related structs/functions. [#335]
|
- Removed pipeline and related structs/functions. [#335]
|
||||||
|
|
||||||
[#335]: https://github.com/actix/actix-net/pull/335
|
[#335]: https://github.com/actix/actix-net/pull/335
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.5 - 2021-03-15
|
## 2.0.0-beta.5 - 2021-03-15
|
||||||
* Add default `Service` trait impl for `Rc<S: Service>` and `&S: Service`. [#288]
|
- Add default `Service` trait impl for `Rc<S: Service>` and `&S: Service`. [#288]
|
||||||
* Add `boxed::rc_service` function for constructing `boxed::RcService` type [#290]
|
- Add `boxed::rc_service` function for constructing `boxed::RcService` type [#290]
|
||||||
|
|
||||||
[#288]: https://github.com/actix/actix-net/pull/288
|
[#288]: https://github.com/actix/actix-net/pull/288
|
||||||
[#290]: https://github.com/actix/actix-net/pull/290
|
[#290]: https://github.com/actix/actix-net/pull/290
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.4 - 2021-02-04
|
## 2.0.0-beta.4 - 2021-02-04
|
||||||
* `Service::poll_ready` and `Service::call` receive `&self`. [#247]
|
- `Service::poll_ready` and `Service::call` receive `&self`. [#247]
|
||||||
* `apply_fn` and `apply_fn_factory` now receive `Fn(Req, &Service)` function type. [#247]
|
- `apply_fn` and `apply_fn_factory` now receive `Fn(Req, &Service)` function type. [#247]
|
||||||
* `apply_cfg` and `apply_cfg_factory` now receive `Fn(Req, &Service)` function type. [#247]
|
- `apply_cfg` and `apply_cfg_factory` now receive `Fn(Req, &Service)` function type. [#247]
|
||||||
* `fn_service` and friends now receive `Fn(Req)` function type. [#247]
|
- `fn_service` and friends now receive `Fn(Req)` function type. [#247]
|
||||||
|
|
||||||
[#247]: https://github.com/actix/actix-net/pull/247
|
[#247]: https://github.com/actix/actix-net/pull/247
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.3 - 2021-01-09
|
## 2.0.0-beta.3 - 2021-01-09
|
||||||
* The `forward_ready!` macro converts errors. [#246]
|
- The `forward_ready!` macro converts errors. [#246]
|
||||||
|
|
||||||
[#246]: https://github.com/actix/actix-net/pull/246
|
[#246]: https://github.com/actix/actix-net/pull/246
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.2 - 2021-01-03
|
## 2.0.0-beta.2 - 2021-01-03
|
||||||
* Remove redundant type parameter from `map_config`.
|
- Remove redundant type parameter from `map_config`.
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.1 - 2020-12-28
|
## 2.0.0-beta.1 - 2020-12-28
|
||||||
* `Service`, other traits, and many type signatures now take the the request type as a type
|
- `Service`, other traits, and many type signatures now take the the request type as a type
|
||||||
parameter instead of an associated type. [#232]
|
parameter instead of an associated type. [#232]
|
||||||
* Add `always_ready!` and `forward_ready!` macros. [#233]
|
- Add `always_ready!` and `forward_ready!` macros. [#233]
|
||||||
* Crate is now `no_std`. [#233]
|
- Crate is now `no_std`. [#233]
|
||||||
* Migrate pin projections to `pin-project-lite`. [#233]
|
- Migrate pin projections to `pin-project-lite`. [#233]
|
||||||
* Remove `AndThenApplyFn` and Pipeline `and_then_apply_fn`. Use the
|
- Remove `AndThenApplyFn` and Pipeline `and_then_apply_fn`. Use the
|
||||||
`.and_then(apply_fn(...))` construction. [#233]
|
`.and_then(apply_fn(...))` construction. [#233]
|
||||||
* Move non-vital methods to `ServiceExt` and `ServiceFactoryExt` extension traits. [#235]
|
- Move non-vital methods to `ServiceExt` and `ServiceFactoryExt` extension traits. [#235]
|
||||||
|
|
||||||
[#232]: https://github.com/actix/actix-net/pull/232
|
[#232]: https://github.com/actix/actix-net/pull/232
|
||||||
[#233]: https://github.com/actix/actix-net/pull/233
|
[#233]: https://github.com/actix/actix-net/pull/233
|
||||||
@@ -59,123 +64,123 @@
|
|||||||
|
|
||||||
|
|
||||||
## 1.0.6 - 2020-08-09
|
## 1.0.6 - 2020-08-09
|
||||||
* Removed unsound custom Cell implementation that allowed obtaining several mutable references to
|
- Removed unsound custom Cell implementation that allowed obtaining several mutable references to
|
||||||
the same data, which is undefined behavior in Rust and could lead to violations of memory safety. External code could obtain several mutable references to the same data through
|
the same data, which is undefined behavior in Rust and could lead to violations of memory safety. External code could obtain several mutable references to the same data through
|
||||||
service combinators. Attempts to acquire several mutable references to the same data will instead
|
service combinators. Attempts to acquire several mutable references to the same data will instead
|
||||||
result in a panic.
|
result in a panic.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.5 - 2020-01-16
|
## 1.0.5 - 2020-01-16
|
||||||
* Fixed unsoundness in .and_then()/.then() service combinators.
|
- Fixed unsoundness in .and_then()/.then() service combinators.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.4 - 2020-01-15
|
## 1.0.4 - 2020-01-15
|
||||||
* Revert 1.0.3 change
|
- Revert 1.0.3 change
|
||||||
|
|
||||||
|
|
||||||
## 1.0.3 - 2020-01-15
|
## 1.0.3 - 2020-01-15
|
||||||
* Fixed unsoundness in `AndThenService` impl.
|
- Fixed unsoundness in `AndThenService` impl.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.2 - 2020-01-08
|
## 1.0.2 - 2020-01-08
|
||||||
* Add `into_service` helper function.
|
- Add `into_service` helper function.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.1 - 2019-12-22
|
## 1.0.1 - 2019-12-22
|
||||||
* `map_config()` and `unit_config()` now accept `IntoServiceFactory` type.
|
- `map_config()` and `unit_config()` now accept `IntoServiceFactory` type.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0 - 2019-12-11
|
## 1.0.0 - 2019-12-11
|
||||||
* Add Clone impl for Apply service
|
- Add Clone impl for Apply service
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.4 - 2019-12-08
|
## 1.0.0-alpha.4 - 2019-12-08
|
||||||
* Renamed `service_fn` to `fn_service`
|
- Renamed `service_fn` to `fn_service`
|
||||||
* Renamed `factory_fn` to `fn_factory`
|
- Renamed `factory_fn` to `fn_factory`
|
||||||
* Renamed `factory_fn_cfg` to `fn_factory_with_config`
|
- Renamed `factory_fn_cfg` to `fn_factory_with_config`
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.3 - 2019-12-06
|
## 1.0.0-alpha.3 - 2019-12-06
|
||||||
* Add missing Clone impls
|
- Add missing Clone impls
|
||||||
* Restore `Transform::map_init_err()` combinator
|
- Restore `Transform::map_init_err()` combinator
|
||||||
* Restore `Service/Factory::apply_fn()` in form of `Pipeline/Factory::and_then_apply_fn()`
|
- Restore `Service/Factory::apply_fn()` in form of `Pipeline/Factory::and_then_apply_fn()`
|
||||||
* Optimize service combinators and futures memory layout
|
- Optimize service combinators and futures memory layout
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.2 - 2019-12-02
|
## 1.0.0-alpha.2 - 2019-12-02
|
||||||
* Use owned config value for service factory
|
- Use owned config value for service factory
|
||||||
* Renamed BoxedNewService/BoxedService to BoxServiceFactory/BoxService
|
- Renamed BoxedNewService/BoxedService to BoxServiceFactory/BoxService
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.1 - 2019-11-25
|
## 1.0.0-alpha.1 - 2019-11-25
|
||||||
* Migrated to `std::future`
|
- Migrated to `std::future`
|
||||||
* `NewService` renamed to `ServiceFactory`
|
- `NewService` renamed to `ServiceFactory`
|
||||||
* Added `pipeline` and `pipeline_factory` function
|
- Added `pipeline` and `pipeline_factory` function
|
||||||
|
|
||||||
|
|
||||||
## 0.4.2 - 2019-08-27
|
## 0.4.2 - 2019-08-27
|
||||||
* Check service readiness for `new_apply_cfg` combinator
|
- Check service readiness for `new_apply_cfg` combinator
|
||||||
|
|
||||||
|
|
||||||
## 0.4.1 - 2019-06-06
|
## 0.4.1 - 2019-06-06
|
||||||
* Add `new_apply_cfg` function
|
- Add `new_apply_cfg` function
|
||||||
|
|
||||||
|
|
||||||
## 0.4.0 - 2019-05-12
|
## 0.4.0 - 2019-05-12
|
||||||
* Add `NewService::map_config` and `NewService::unit_config` combinators.
|
- Add `NewService::map_config` and `NewService::unit_config` combinators.
|
||||||
* Use associated type for `NewService` config.
|
- Use associated type for `NewService` config.
|
||||||
* Change `apply_cfg` function.
|
- Change `apply_cfg` function.
|
||||||
* Renamed helper functions.
|
- Renamed helper functions.
|
||||||
|
|
||||||
|
|
||||||
## 0.3.6 - 2019-04-07
|
## 0.3.6 - 2019-04-07
|
||||||
* Poll boxed service call result immediately
|
- Poll boxed service call result immediately
|
||||||
|
|
||||||
|
|
||||||
## 0.3.5 - 2019-03-29
|
## 0.3.5 - 2019-03-29
|
||||||
* Add `impl<S: Service> Service for Rc<RefCell<S>>`.
|
- Add `impl<S: Service> Service for Rc<RefCell<S>>`.
|
||||||
|
|
||||||
|
|
||||||
## 0.3.4 - 2019-03-12
|
## 0.3.4 - 2019-03-12
|
||||||
* Add `Transform::from_err()` combinator
|
- Add `Transform::from_err()` combinator
|
||||||
* Add `apply_fn` helper
|
- Add `apply_fn` helper
|
||||||
* Add `apply_fn_factory` helper
|
- Add `apply_fn_factory` helper
|
||||||
* Add `apply_transform` helper
|
- Add `apply_transform` helper
|
||||||
* Add `apply_cfg` helper
|
- Add `apply_cfg` helper
|
||||||
|
|
||||||
|
|
||||||
## 0.3.3 - 2019-03-09
|
## 0.3.3 - 2019-03-09
|
||||||
* Add `ApplyTransform` new service for transform and new service.
|
- Add `ApplyTransform` new service for transform and new service.
|
||||||
* Add `NewService::apply_cfg()` combinator, allows to use nested `NewService` with different config parameter.
|
- Add `NewService::apply_cfg()` combinator, allows to use nested `NewService` with different config parameter.
|
||||||
* Revert IntoFuture change
|
- Revert IntoFuture change
|
||||||
|
|
||||||
|
|
||||||
## 0.3.2 - 2019-03-04
|
## 0.3.2 - 2019-03-04
|
||||||
* Change `NewService::Future` and `Transform::Future` to the `IntoFuture` trait.
|
- Change `NewService::Future` and `Transform::Future` to the `IntoFuture` trait.
|
||||||
* Export `AndThenTransform` type
|
- Export `AndThenTransform` type
|
||||||
|
|
||||||
|
|
||||||
## 0.3.1 - 2019-03-04
|
## 0.3.1 - 2019-03-04
|
||||||
* Simplify Transform trait
|
- Simplify Transform trait
|
||||||
|
|
||||||
|
|
||||||
## 0.3.0 - 2019-03-02
|
## 0.3.0 - 2019-03-02
|
||||||
* Added boxed NewService and Service.
|
- Added boxed NewService and Service.
|
||||||
* Added `Config` parameter to `NewService` trait.
|
- Added `Config` parameter to `NewService` trait.
|
||||||
* Added `Config` parameter to `NewTransform` trait.
|
- Added `Config` parameter to `NewTransform` trait.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.2 - 2019-02-19
|
## 0.2.2 - 2019-02-19
|
||||||
* Added `NewService` impl for `Rc<S> where S: NewService`
|
- Added `NewService` impl for `Rc<S> where S: NewService`
|
||||||
* Added `NewService` impl for `Arc<S> where S: NewService`
|
- Added `NewService` impl for `Arc<S> where S: NewService`
|
||||||
|
|
||||||
|
|
||||||
## 0.2.1 - 2019-02-03
|
## 0.2.1 - 2019-02-03
|
||||||
* Generalize `.apply` combinator with Transform trait
|
- Generalize `.apply` combinator with Transform trait
|
||||||
|
|
||||||
|
|
||||||
## 0.2.0 - 2019-02-01
|
## 0.2.0 - 2019-02-01
|
||||||
* Use associated type instead of generic for Service definition.
|
- Use associated type instead of generic for Service definition.
|
||||||
* Before:
|
* Before:
|
||||||
```rust
|
```rust
|
||||||
impl Service<Request> for Client {
|
impl Service<Request> for Client {
|
||||||
@@ -194,29 +199,29 @@
|
|||||||
|
|
||||||
|
|
||||||
## 0.1.6 - 2019-01-24
|
## 0.1.6 - 2019-01-24
|
||||||
* Use `FnMut` instead of `Fn` for .apply() and .map() combinators and `FnService` type
|
- Use `FnMut` instead of `Fn` for .apply() and .map() combinators and `FnService` type
|
||||||
* Change `.apply()` error semantic, new service's error is `From<Self::Error>`
|
- Change `.apply()` error semantic, new service's error is `From<Self::Error>`
|
||||||
|
|
||||||
|
|
||||||
## 0.1.5 - 2019-01-13
|
## 0.1.5 - 2019-01-13
|
||||||
* Make `Out::Error` convertible from `T::Error` for apply combinator
|
- Make `Out::Error` convertible from `T::Error` for apply combinator
|
||||||
|
|
||||||
|
|
||||||
## 0.1.4 - 2019-01-11
|
## 0.1.4 - 2019-01-11
|
||||||
* Use `FnMut` instead of `Fn` for `FnService`
|
- Use `FnMut` instead of `Fn` for `FnService`
|
||||||
|
|
||||||
|
|
||||||
## 0.1.3 - 2018-12-12
|
## 0.1.3 - 2018-12-12
|
||||||
* Split service combinators to separate trait
|
- Split service combinators to separate trait
|
||||||
|
|
||||||
|
|
||||||
## 0.1.2 - 2018-12-12
|
## 0.1.2 - 2018-12-12
|
||||||
* Release future early for `.and_then()` and `.then()` combinators
|
- Release future early for `.and_then()` and `.then()` combinators
|
||||||
|
|
||||||
|
|
||||||
## 0.1.1 - 2018-12-09
|
## 0.1.1 - 2018-12-09
|
||||||
* Added Service impl for `Box<S: Service>`
|
- Added Service impl for `Box<S: Service>`
|
||||||
|
|
||||||
|
|
||||||
## 0.1.0 - 2018-12-09
|
## 0.1.0 - 2018-12-09
|
||||||
* Initial import
|
- Initial import
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-service"
|
name = "actix-service"
|
||||||
version = "2.0.1"
|
version = "2.0.2"
|
||||||
authors = [
|
authors = [
|
||||||
"Nikolay Kim <fafhrd91@gmail.com>",
|
"Nikolay Kim <fafhrd91@gmail.com>",
|
||||||
"Rob Ede <robjtede@icloud.com>",
|
"Rob Ede <robjtede@icloud.com>",
|
||||||
|
@@ -3,10 +3,10 @@
|
|||||||
> Service trait and combinators for representing asynchronous request/response operations.
|
> Service trait and combinators for representing asynchronous request/response operations.
|
||||||
|
|
||||||
[](https://crates.io/crates/actix-service)
|
[](https://crates.io/crates/actix-service)
|
||||||
[](https://docs.rs/actix-service/2.0.1)
|
[](https://docs.rs/actix-service/2.0.2)
|
||||||
[](https://blog.rust-lang.org/2020/03/12/Rust-1.46.html)
|
[](https://blog.rust-lang.org/2020/03/12/Rust-1.46.html)
|
||||||

|

|
||||||
[](https://deps.rs/crate/actix-service/2.0.1)
|
[](https://deps.rs/crate/actix-service/2.0.2)
|
||||||

|

|
||||||
[](https://discord.gg/NWpN5mmg3x)
|
[](https://discord.gg/NWpN5mmg3x)
|
||||||
|
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
//! See [`Service`] docs for information on this crate's foundational trait.
|
//! See [`Service`] docs for information on this crate's foundational trait.
|
||||||
|
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![deny(rust_2018_idioms, nonstandard_style, future_incompatible)]
|
#![deny(rust_2018_idioms, nonstandard_style)]
|
||||||
#![warn(missing_docs)]
|
#![warn(future_incompatible, missing_docs)]
|
||||||
#![allow(clippy::type_complexity)]
|
#![allow(clippy::type_complexity)]
|
||||||
#![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")]
|
||||||
|
@@ -3,80 +3,89 @@
|
|||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 3.0.0 - 2021-12-26
|
||||||
|
* No significant changes since `3.0.0-rc.2`.
|
||||||
|
|
||||||
|
|
||||||
|
## 3.0.0-rc.2 - 2021-12-10
|
||||||
|
- Re-export `openssl::SslConnectorBuilder` in `connect::openssl::reexports`. [#429]
|
||||||
|
|
||||||
|
[#429]: https://github.com/actix/actix-net/pull/429
|
||||||
|
|
||||||
## 3.0.0-rc.1 - 2021-11-29
|
## 3.0.0-rc.1 - 2021-11-29
|
||||||
### Added
|
### Added
|
||||||
* Derive `Debug` for `connect::Connection`. [#422]
|
- Derive `Debug` for `connect::Connection`. [#422]
|
||||||
* Implement `Display` for `accept::TlsError`. [#422]
|
- Implement `Display` for `accept::TlsError`. [#422]
|
||||||
* Implement `Error` for `accept::TlsError` where both types also implement `Error`. [#422]
|
- Implement `Error` for `accept::TlsError` where both types also implement `Error`. [#422]
|
||||||
* Implement `Default` for `connect::Resolver`. [#422]
|
- Implement `Default` for `connect::Resolver`. [#422]
|
||||||
* Implement `Error` for `connect::ConnectError`. [#422]
|
- Implement `Error` for `connect::ConnectError`. [#422]
|
||||||
* Implement `Default` for `connect::tcp::{TcpConnector, TcpConnectorService}`. [#423]
|
- Implement `Default` for `connect::tcp::{TcpConnector, TcpConnectorService}`. [#423]
|
||||||
* Implement `Default` for `connect::ConnectorService`. [#423]
|
- Implement `Default` for `connect::ConnectorService`. [#423]
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
* The crate's default features flags no longer include `uri`. [#422]
|
- The crate's default features flags no longer include `uri`. [#422]
|
||||||
* Useful re-exports from underlying TLS crates are exposed in a `reexports` modules in all acceptors and connectors.
|
- Useful re-exports from underlying TLS crates are exposed in a `reexports` modules in all acceptors and connectors.
|
||||||
* Convert `connect::ResolverService` from enum to struct. [#422]
|
- Convert `connect::ResolverService` from enum to struct. [#422]
|
||||||
* Make `ConnectAddrsIter` private. [#422]
|
- Make `ConnectAddrsIter` private. [#422]
|
||||||
* Mark `tcp::{TcpConnector, TcpConnectorService}` structs `#[non_exhaustive]`. [#423]
|
- Mark `tcp::{TcpConnector, TcpConnectorService}` structs `#[non_exhaustive]`. [#423]
|
||||||
* Rename `accept::native_tls::{NativeTlsAcceptorService => AcceptorService}`. [#422]
|
- Rename `accept::native_tls::{NativeTlsAcceptorService => AcceptorService}`. [#422]
|
||||||
* Rename `connect::{Address => Host}` trait. [#422]
|
- Rename `connect::{Address => Host}` trait. [#422]
|
||||||
* Rename method `connect::Connection::{host => hostname}`. [#422]
|
- Rename method `connect::Connection::{host => hostname}`. [#422]
|
||||||
* Rename struct `connect::{Connect => ConnectInfo}`. [#422]
|
- Rename struct `connect::{Connect => ConnectInfo}`. [#422]
|
||||||
* Rename struct `connect::{ConnectService => ConnectorService}`. [#422]
|
- Rename struct `connect::{ConnectService => ConnectorService}`. [#422]
|
||||||
* Rename struct `connect::{ConnectServiceFactory => Connector}`. [#422]
|
- Rename struct `connect::{ConnectServiceFactory => Connector}`. [#422]
|
||||||
* Rename TLS acceptor service future types and hide from docs. [#422]
|
- Rename TLS acceptor service future types and hide from docs. [#422]
|
||||||
* Unbox some service futures types. [#422]
|
- Unbox some service futures types. [#422]
|
||||||
* Inline modules in `connect::tls` to `connect` module. [#422]
|
- Inline modules in `connect::tls` to `connect` module. [#422]
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
* Remove `connect::{new_connector, new_connector_factory, default_connector, default_connector_factory}` methods. [#422]
|
- Remove `connect::{new_connector, new_connector_factory, default_connector, default_connector_factory}` methods. [#422]
|
||||||
* Remove `connect::native_tls::Connector::service` method. [#422]
|
- Remove `connect::native_tls::Connector::service` method. [#422]
|
||||||
* Remove redundant `connect::Connection::from_parts` method. [#422]
|
- Remove redundant `connect::Connection::from_parts` method. [#422]
|
||||||
|
|
||||||
[#422]: https://github.com/actix/actix-net/pull/422
|
[#422]: https://github.com/actix/actix-net/pull/422
|
||||||
[#423]: https://github.com/actix/actix-net/pull/423
|
[#423]: https://github.com/actix/actix-net/pull/423
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.9 - 2021-11-22
|
## 3.0.0-beta.9 - 2021-11-22
|
||||||
* Add configurable timeout for accepting TLS connection. [#393]
|
- Add configurable timeout for accepting TLS connection. [#393]
|
||||||
* Added `TlsError::Timeout` variant. [#393]
|
- Added `TlsError::Timeout` variant. [#393]
|
||||||
* All TLS acceptor services now use `TlsError` for their error types. [#393]
|
- All TLS acceptor services now use `TlsError` for their error types. [#393]
|
||||||
* Added `TlsError::into_service_error`. [#420]
|
- Added `TlsError::into_service_error`. [#420]
|
||||||
|
|
||||||
[#393]: https://github.com/actix/actix-net/pull/393
|
[#393]: https://github.com/actix/actix-net/pull/393
|
||||||
[#420]: https://github.com/actix/actix-net/pull/420
|
[#420]: https://github.com/actix/actix-net/pull/420
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.8 - 2021-11-15
|
## 3.0.0-beta.8 - 2021-11-15
|
||||||
* Add `Connect::request` for getting a reference to the connection request. [#415]
|
- Add `Connect::request` for getting a reference to the connection request. [#415]
|
||||||
|
|
||||||
[#415]: https://github.com/actix/actix-net/pull/415
|
[#415]: https://github.com/actix/actix-net/pull/415
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.7 - 2021-10-20
|
## 3.0.0-beta.7 - 2021-10-20
|
||||||
* Add `webpki_roots_cert_store()` to get rustls compatible webpki roots cert store. [#401]
|
- Add `webpki_roots_cert_store()` to get rustls compatible webpki roots cert store. [#401]
|
||||||
* Alias `connect::ssl` to `connect::tls`. [#401]
|
- Alias `connect::ssl` to `connect::tls`. [#401]
|
||||||
|
|
||||||
[#401]: https://github.com/actix/actix-net/pull/401
|
[#401]: https://github.com/actix/actix-net/pull/401
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.6 - 2021-10-19
|
## 3.0.0-beta.6 - 2021-10-19
|
||||||
* Update `tokio-rustls` to `0.23` which uses `rustls` `0.20`. [#396]
|
- Update `tokio-rustls` to `0.23` which uses `rustls` `0.20`. [#396]
|
||||||
* Removed a re-export of `Session` from `rustls` as it no longer exist. [#396]
|
- Removed a re-export of `Session` from `rustls` as it no longer exist. [#396]
|
||||||
* Minimum supported Rust version (MSRV) is now 1.52.
|
- Minimum supported Rust version (MSRV) is now 1.52.
|
||||||
|
|
||||||
[#396]: https://github.com/actix/actix-net/pull/396
|
[#396]: https://github.com/actix/actix-net/pull/396
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.5 - 2021-03-29
|
## 3.0.0-beta.5 - 2021-03-29
|
||||||
* Changed `connect::ssl::rustls::RustlsConnectorService` to return error when `DNSNameRef`
|
- Changed `connect::ssl::rustls::RustlsConnectorService` to return error when `DNSNameRef`
|
||||||
generation failed instead of panic. [#296]
|
generation failed instead of panic. [#296]
|
||||||
* Remove `connect::ssl::openssl::OpensslConnectServiceFactory`. [#297]
|
- Remove `connect::ssl::openssl::OpensslConnectServiceFactory`. [#297]
|
||||||
* Remove `connect::ssl::openssl::OpensslConnectService`. [#297]
|
- Remove `connect::ssl::openssl::OpensslConnectService`. [#297]
|
||||||
* Add `connect::ssl::native_tls` module for native tls support. [#295]
|
- Add `connect::ssl::native_tls` module for native tls support. [#295]
|
||||||
* Rename `accept::{nativetls => native_tls}`. [#295]
|
- Rename `accept::{nativetls => native_tls}`. [#295]
|
||||||
* Remove `connect::TcpConnectService` type. Service caller expecting a `TcpStream` should use `connect::ConnectService` instead and call `Connection<T, TcpStream>::into_parts`. [#299]
|
- Remove `connect::TcpConnectService` type. Service caller expecting a `TcpStream` should use `connect::ConnectService` instead and call `Connection<T, TcpStream>::into_parts`. [#299]
|
||||||
|
|
||||||
[#295]: https://github.com/actix/actix-net/pull/295
|
[#295]: https://github.com/actix/actix-net/pull/295
|
||||||
[#296]: https://github.com/actix/actix-net/pull/296
|
[#296]: https://github.com/actix/actix-net/pull/296
|
||||||
@@ -85,72 +94,72 @@
|
|||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.4 - 2021-02-24
|
## 3.0.0-beta.4 - 2021-02-24
|
||||||
* Rename `accept::openssl::{SslStream => TlsStream}`.
|
- Rename `accept::openssl::{SslStream => TlsStream}`.
|
||||||
* Add `connect::Connect::set_local_addr` to attach local `IpAddr`. [#282]
|
- Add `connect::Connect::set_local_addr` to attach local `IpAddr`. [#282]
|
||||||
* `connector::TcpConnector` service will try to bind to local_addr of `IpAddr` when given. [#282]
|
- `connector::TcpConnector` service will try to bind to local_addr of `IpAddr` when given. [#282]
|
||||||
|
|
||||||
[#282]: https://github.com/actix/actix-net/pull/282
|
[#282]: https://github.com/actix/actix-net/pull/282
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.3 - 2021-02-06
|
## 3.0.0-beta.3 - 2021-02-06
|
||||||
* Remove `trust-dns-proto` and `trust-dns-resolver`. [#248]
|
- Remove `trust-dns-proto` and `trust-dns-resolver`. [#248]
|
||||||
* Use `std::net::ToSocketAddrs` as simple and basic default resolver. [#248]
|
- Use `std::net::ToSocketAddrs` as simple and basic default resolver. [#248]
|
||||||
* Add `Resolve` trait for custom DNS resolvers. [#248]
|
- Add `Resolve` trait for custom DNS resolvers. [#248]
|
||||||
* Add `Resolver::new_custom` function to construct custom resolvers. [#248]
|
- Add `Resolver::new_custom` function to construct custom resolvers. [#248]
|
||||||
* Export `webpki_roots::TLS_SERVER_ROOTS` in `actix_tls::connect` mod and remove
|
- Export `webpki_roots::TLS_SERVER_ROOTS` in `actix_tls::connect` mod and remove
|
||||||
the export from `actix_tls::accept` [#248]
|
the export from `actix_tls::accept` [#248]
|
||||||
* Remove `ConnectTakeAddrsIter`. `Connect::take_addrs` now returns `ConnectAddrsIter<'static>`
|
- Remove `ConnectTakeAddrsIter`. `Connect::take_addrs` now returns `ConnectAddrsIter<'static>`
|
||||||
as owned iterator. [#248]
|
as owned iterator. [#248]
|
||||||
* Rename `Address::{host => hostname}` to more accurately describe which URL segment is returned.
|
- Rename `Address::{host => hostname}` to more accurately describe which URL segment is returned.
|
||||||
* Update `actix-rt` to `2.0.0`. [#273]
|
- Update `actix-rt` to `2.0.0`. [#273]
|
||||||
|
|
||||||
[#248]: https://github.com/actix/actix-net/pull/248
|
[#248]: https://github.com/actix/actix-net/pull/248
|
||||||
[#273]: https://github.com/actix/actix-net/pull/273
|
[#273]: https://github.com/actix/actix-net/pull/273
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.2 - 2021-xx-xx
|
## 3.0.0-beta.2 - 2021-xx-xx
|
||||||
* Depend on stable trust-dns packages. [#204]
|
- Depend on stable trust-dns packages. [#204]
|
||||||
|
|
||||||
[#204]: https://github.com/actix/actix-net/pull/204
|
[#204]: https://github.com/actix/actix-net/pull/204
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.1 - 2020-12-29
|
## 3.0.0-beta.1 - 2020-12-29
|
||||||
* Move acceptors under `accept` module. [#238]
|
- Move acceptors under `accept` module. [#238]
|
||||||
* Merge `actix-connect` crate under `connect` module. [#238]
|
- Merge `actix-connect` crate under `connect` module. [#238]
|
||||||
* Add feature flags to enable acceptors and/or connectors individually. [#238]
|
- Add feature flags to enable acceptors and/or connectors individually. [#238]
|
||||||
|
|
||||||
[#238]: https://github.com/actix/actix-net/pull/238
|
[#238]: https://github.com/actix/actix-net/pull/238
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0 - 2020-09-03
|
## 2.0.0 - 2020-09-03
|
||||||
* `nativetls::NativeTlsAcceptor` is renamed to `nativetls::Acceptor`.
|
- `nativetls::NativeTlsAcceptor` is renamed to `nativetls::Acceptor`.
|
||||||
* Where possible, "SSL" terminology is replaced with "TLS".
|
- Where possible, "SSL" terminology is replaced with "TLS".
|
||||||
* `SslError` is renamed to `TlsError`.
|
* `SslError` is renamed to `TlsError`.
|
||||||
* `TlsError::Ssl` enum variant is renamed to `TlsError::Tls`.
|
* `TlsError::Ssl` enum variant is renamed to `TlsError::Tls`.
|
||||||
* `max_concurrent_ssl_connect` is renamed to `max_concurrent_tls_connect`.
|
* `max_concurrent_ssl_connect` is renamed to `max_concurrent_tls_connect`.
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-alpha.2 - 2020-08-17
|
## 2.0.0-alpha.2 - 2020-08-17
|
||||||
* Update `rustls` dependency to 0.18
|
- Update `rustls` dependency to 0.18
|
||||||
* Update `tokio-rustls` dependency to 0.14
|
- Update `tokio-rustls` dependency to 0.14
|
||||||
* Update `webpki-roots` dependency to 0.20
|
- Update `webpki-roots` dependency to 0.20
|
||||||
|
|
||||||
|
|
||||||
## [2.0.0-alpha.1] - 2020-03-03
|
## [2.0.0-alpha.1] - 2020-03-03
|
||||||
* Update `rustls` dependency to 0.17
|
- Update `rustls` dependency to 0.17
|
||||||
* Update `tokio-rustls` dependency to 0.13
|
- Update `tokio-rustls` dependency to 0.13
|
||||||
* Update `webpki-roots` dependency to 0.19
|
- Update `webpki-roots` dependency to 0.19
|
||||||
|
|
||||||
|
|
||||||
## [1.0.0] - 2019-12-11
|
## [1.0.0] - 2019-12-11
|
||||||
* 1.0.0 release
|
- 1.0.0 release
|
||||||
|
|
||||||
|
|
||||||
## [1.0.0-alpha.3] - 2019-12-07
|
## [1.0.0-alpha.3] - 2019-12-07
|
||||||
* Migrate to tokio 0.2
|
- Migrate to tokio 0.2
|
||||||
* Enable rustls acceptor service
|
- Enable rustls acceptor service
|
||||||
* Enable native-tls acceptor service
|
- Enable native-tls acceptor service
|
||||||
|
|
||||||
|
|
||||||
## [1.0.0-alpha.1] - 2019-12-02
|
## [1.0.0-alpha.1] - 2019-12-02
|
||||||
* Split openssl acceptor from actix-server package
|
- Split openssl acceptor from actix-server package
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-tls"
|
name = "actix-tls"
|
||||||
version = "3.0.0-rc.1"
|
version = "3.0.0"
|
||||||
authors = [
|
authors = [
|
||||||
"Nikolay Kim <fafhrd91@gmail.com>",
|
"Nikolay Kim <fafhrd91@gmail.com>",
|
||||||
"Rob Ede <robjtede@icloud.com>",
|
"Rob Ede <robjtede@icloud.com>",
|
||||||
@@ -8,7 +8,7 @@ authors = [
|
|||||||
description = "TLS acceptor and connector services for Actix ecosystem"
|
description = "TLS acceptor and connector services for Actix ecosystem"
|
||||||
keywords = ["network", "tls", "ssl", "async", "transport"]
|
keywords = ["network", "tls", "ssl", "async", "transport"]
|
||||||
repository = "https://github.com/actix/actix-net.git"
|
repository = "https://github.com/actix/actix-net.git"
|
||||||
categories = ["network-programming", "asynchronous"]
|
categories = ["network-programming", "asynchronous", "cryptography"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ tokio-native-tls = { version = "0.3", optional = true }
|
|||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-rt = "2.2.0"
|
actix-rt = "2.2.0"
|
||||||
actix-server = "2.0.0-rc.1"
|
actix-server = "2.0.0-rc.2"
|
||||||
bytes = "1"
|
bytes = "1"
|
||||||
env_logger = "0.9"
|
env_logger = "0.9"
|
||||||
futures-util = { version = "0.3.7", default-features = false, features = ["sink"] }
|
futures-util = { version = "0.3.7", default-features = false, features = ["sink"] }
|
||||||
|
@@ -22,7 +22,9 @@ use crate::connect::{Connection, Host};
|
|||||||
pub mod reexports {
|
pub mod reexports {
|
||||||
//! Re-exports from `openssl` and `tokio-openssl` that are useful for connectors.
|
//! Re-exports from `openssl` and `tokio-openssl` that are useful for connectors.
|
||||||
|
|
||||||
pub use openssl::ssl::{Error, HandshakeError, SslConnector, SslMethod};
|
pub use openssl::ssl::{
|
||||||
|
Error, HandshakeError, SslConnector, SslConnectorBuilder, SslMethod,
|
||||||
|
};
|
||||||
|
|
||||||
pub use tokio_openssl::SslStream as AsyncSslStream;
|
pub use tokio_openssl::SslStream as AsyncSslStream;
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
//! TLS acceptor and connector services for the Actix ecosystem.
|
//! TLS acceptor and connector services for the Actix ecosystem.
|
||||||
|
|
||||||
#![deny(rust_2018_idioms, nonstandard_style)]
|
#![deny(rust_2018_idioms, nonstandard_style)]
|
||||||
#![warn(missing_docs)]
|
#![warn(future_incompatible, missing_docs)]
|
||||||
#![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")]
|
||||||
|
// enable unstable doc_cfg feature only on on docs.rs where nightly compiler is used
|
||||||
#![cfg_attr(docsrs, feature(doc_cfg))]
|
#![cfg_attr(docsrs, feature(doc_cfg))]
|
||||||
|
|
||||||
#[cfg(feature = "openssl")]
|
#[cfg(feature = "openssl")]
|
||||||
|
@@ -94,7 +94,7 @@ fn rustls_connector(_cert: String, _key: String) -> ClientConfig {
|
|||||||
async fn accepts_connections() {
|
async fn accepts_connections() {
|
||||||
let (cert, key) = new_cert_and_key();
|
let (cert, key) = new_cert_and_key();
|
||||||
|
|
||||||
let srv = TestServer::with({
|
let srv = TestServer::start({
|
||||||
let cert = cert.clone();
|
let cert = cert.clone();
|
||||||
let key = key.clone();
|
let key = key.clone();
|
||||||
|
|
||||||
|
@@ -74,7 +74,7 @@ fn openssl_connector(cert: String, key: String) -> SslConnector {
|
|||||||
async fn accepts_connections() {
|
async fn accepts_connections() {
|
||||||
let (cert, key) = new_cert_and_key();
|
let (cert, key) = new_cert_and_key();
|
||||||
|
|
||||||
let srv = TestServer::with({
|
let srv = TestServer::start({
|
||||||
let cert = cert.clone();
|
let cert = cert.clone();
|
||||||
let key = key.clone();
|
let key = key.clone();
|
||||||
|
|
||||||
|
@@ -17,7 +17,7 @@ use actix_tls::connect::{ConnectError, ConnectInfo, Connection, Connector, Host}
|
|||||||
#[cfg(feature = "openssl")]
|
#[cfg(feature = "openssl")]
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_string() {
|
async fn test_string() {
|
||||||
let srv = TestServer::with(|| {
|
let srv = TestServer::start(|| {
|
||||||
fn_service(|io: TcpStream| async {
|
fn_service(|io: TcpStream| async {
|
||||||
let mut framed = Framed::new(io, BytesCodec);
|
let mut framed = Framed::new(io, BytesCodec);
|
||||||
framed.send(Bytes::from_static(b"test")).await?;
|
framed.send(Bytes::from_static(b"test")).await?;
|
||||||
@@ -34,7 +34,7 @@ async fn test_string() {
|
|||||||
#[cfg(feature = "rustls")]
|
#[cfg(feature = "rustls")]
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_rustls_string() {
|
async fn test_rustls_string() {
|
||||||
let srv = TestServer::with(|| {
|
let srv = TestServer::start(|| {
|
||||||
fn_service(|io: TcpStream| async {
|
fn_service(|io: TcpStream| async {
|
||||||
let mut framed = Framed::new(io, BytesCodec);
|
let mut framed = Framed::new(io, BytesCodec);
|
||||||
framed.send(Bytes::from_static(b"test")).await?;
|
framed.send(Bytes::from_static(b"test")).await?;
|
||||||
@@ -50,7 +50,7 @@ async fn test_rustls_string() {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_static_str() {
|
async fn test_static_str() {
|
||||||
let srv = TestServer::with(|| {
|
let srv = TestServer::start(|| {
|
||||||
fn_service(|io: TcpStream| async {
|
fn_service(|io: TcpStream| async {
|
||||||
let mut framed = Framed::new(io, BytesCodec);
|
let mut framed = Framed::new(io, BytesCodec);
|
||||||
framed.send(Bytes::from_static(b"test")).await?;
|
framed.send(Bytes::from_static(b"test")).await?;
|
||||||
@@ -81,7 +81,7 @@ async fn service_factory() {
|
|||||||
Connector::default()
|
Connector::default()
|
||||||
}
|
}
|
||||||
|
|
||||||
let srv = TestServer::with(|| {
|
let srv = TestServer::start(|| {
|
||||||
fn_service(|io: TcpStream| async {
|
fn_service(|io: TcpStream| async {
|
||||||
let mut framed = Framed::new(io, BytesCodec);
|
let mut framed = Framed::new(io, BytesCodec);
|
||||||
framed.send(Bytes::from_static(b"test")).await?;
|
framed.send(Bytes::from_static(b"test")).await?;
|
||||||
@@ -101,7 +101,7 @@ async fn service_factory() {
|
|||||||
async fn test_openssl_uri() {
|
async fn test_openssl_uri() {
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
let srv = TestServer::with(|| {
|
let srv = TestServer::start(|| {
|
||||||
fn_service(|io: TcpStream| async {
|
fn_service(|io: TcpStream| async {
|
||||||
let mut framed = Framed::new(io, BytesCodec);
|
let mut framed = Framed::new(io, BytesCodec);
|
||||||
framed.send(Bytes::from_static(b"test")).await?;
|
framed.send(Bytes::from_static(b"test")).await?;
|
||||||
@@ -120,7 +120,7 @@ async fn test_openssl_uri() {
|
|||||||
async fn test_rustls_uri() {
|
async fn test_rustls_uri() {
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
let srv = TestServer::with(|| {
|
let srv = TestServer::start(|| {
|
||||||
fn_service(|io: TcpStream| async {
|
fn_service(|io: TcpStream| async {
|
||||||
let mut framed = Framed::new(io, BytesCodec);
|
let mut framed = Framed::new(io, BytesCodec);
|
||||||
framed.send(Bytes::from_static(b"test")).await?;
|
framed.send(Bytes::from_static(b"test")).await?;
|
||||||
@@ -136,7 +136,7 @@ async fn test_rustls_uri() {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_local_addr() {
|
async fn test_local_addr() {
|
||||||
let srv = TestServer::with(|| {
|
let srv = TestServer::start(|| {
|
||||||
fn_service(|io: TcpStream| async {
|
fn_service(|io: TcpStream| async {
|
||||||
let mut framed = Framed::new(io, BytesCodec);
|
let mut framed = Framed::new(io, BytesCodec);
|
||||||
framed.send(Bytes::from_static(b"test")).await?;
|
framed.send(Bytes::from_static(b"test")).await?;
|
||||||
|
@@ -53,7 +53,7 @@ async fn custom_resolver_connect() {
|
|||||||
use trust_dns_resolver::TokioAsyncResolver;
|
use trust_dns_resolver::TokioAsyncResolver;
|
||||||
|
|
||||||
let srv =
|
let srv =
|
||||||
TestServer::with(|| fn_service(|_io: TcpStream| async { Ok::<_, io::Error>(()) }));
|
TestServer::start(|| fn_service(|_io: TcpStream| async { Ok::<_, io::Error>(()) }));
|
||||||
|
|
||||||
struct MyResolver {
|
struct MyResolver {
|
||||||
trust_dns: TokioAsyncResolver,
|
trust_dns: TokioAsyncResolver,
|
||||||
|
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
## [0.1.0] - 2020-01-15
|
## [0.1.0] - 2020-01-15
|
||||||
|
|
||||||
* Initial release
|
- Initial release
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
//! Actix tracing - support for tokio tracing with Actix services.
|
//! Actix tracing - support for tokio tracing with Actix services.
|
||||||
|
|
||||||
#![deny(rust_2018_idioms, nonstandard_style)]
|
#![deny(rust_2018_idioms, nonstandard_style)]
|
||||||
|
#![warn(future_incompatible)]
|
||||||
#![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")]
|
||||||
|
|
||||||
|
@@ -4,179 +4,179 @@
|
|||||||
|
|
||||||
|
|
||||||
## 3.0.0 - 2021-04-16
|
## 3.0.0 - 2021-04-16
|
||||||
* No significant changes from `3.0.0-beta.4`.
|
- No significant changes from `3.0.0-beta.4`.
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.4 - 2021-04-01
|
## 3.0.0-beta.4 - 2021-04-01
|
||||||
* Add `future::Either` type. [#305]
|
- Add `future::Either` type. [#305]
|
||||||
|
|
||||||
[#305]: https://github.com/actix/actix-net/pull/305
|
[#305]: https://github.com/actix/actix-net/pull/305
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.3 - 2021-04-01
|
## 3.0.0-beta.3 - 2021-04-01
|
||||||
* Moved `mpsc` to own crate `local-channel`. [#301]
|
- Moved `mpsc` to own crate `local-channel`. [#301]
|
||||||
* Moved `task::LocalWaker` to own crate `local-waker`. [#301]
|
- Moved `task::LocalWaker` to own crate `local-waker`. [#301]
|
||||||
* Remove `timeout` module. [#301]
|
- Remove `timeout` module. [#301]
|
||||||
* Remove `dispatcher` module. [#301]
|
- Remove `dispatcher` module. [#301]
|
||||||
* Expose `future` mod with `ready` and `poll_fn` helpers. [#301]
|
- Expose `future` mod with `ready` and `poll_fn` helpers. [#301]
|
||||||
|
|
||||||
[#301]: https://github.com/actix/actix-net/pull/301
|
[#301]: https://github.com/actix/actix-net/pull/301
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.2 - 2021-02-06
|
## 3.0.0-beta.2 - 2021-02-06
|
||||||
* Update `actix-rt` to `2.0.0`. [#273]
|
- Update `actix-rt` to `2.0.0`. [#273]
|
||||||
|
|
||||||
[#273]: https://github.com/actix/actix-net/pull/273
|
[#273]: https://github.com/actix/actix-net/pull/273
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-beta.1 - 2020-12-28
|
## 3.0.0-beta.1 - 2020-12-28
|
||||||
* Update `bytes` dependency to `1`. [#237]
|
- Update `bytes` dependency to `1`. [#237]
|
||||||
* Use `pin-project-lite` to replace `pin-project`. [#229]
|
- Use `pin-project-lite` to replace `pin-project`. [#229]
|
||||||
* Remove `condition`,`either`,`inflight`,`keepalive`,`oneshot`,`order`,`stream` and `time` mods. [#229]
|
- Remove `condition`,`either`,`inflight`,`keepalive`,`oneshot`,`order`,`stream` and `time` mods. [#229]
|
||||||
|
|
||||||
[#229]: https://github.com/actix/actix-net/pull/229
|
[#229]: https://github.com/actix/actix-net/pull/229
|
||||||
[#237]: https://github.com/actix/actix-net/pull/237
|
[#237]: https://github.com/actix/actix-net/pull/237
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0 - 2020-08-23
|
## 2.0.0 - 2020-08-23
|
||||||
* No changes from beta 1.
|
- No changes from beta 1.
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0-beta.1 - 2020-08-19
|
## 2.0.0-beta.1 - 2020-08-19
|
||||||
* Upgrade `tokio-util` to `0.3`.
|
- Upgrade `tokio-util` to `0.3`.
|
||||||
* Remove unsound custom Cell and use `std::cell::RefCell` instead, as well as `actix-service`.
|
- Remove unsound custom Cell and use `std::cell::RefCell` instead, as well as `actix-service`.
|
||||||
* Rename method to correctly spelled `LocalWaker::is_registered`.
|
- Rename method to correctly spelled `LocalWaker::is_registered`.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.6 - 2020-01-08
|
## 1.0.6 - 2020-01-08
|
||||||
* Add `Clone` impl for `condition::Waiter`.
|
- Add `Clone` impl for `condition::Waiter`.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.5 - 2020-01-08
|
## 1.0.5 - 2020-01-08
|
||||||
* Add `Condition` type.
|
- Add `Condition` type.
|
||||||
* Add `Pool` of one-shot's.
|
- Add `Pool` of one-shot's.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.4 - 2019-12-20
|
## 1.0.4 - 2019-12-20
|
||||||
* Add methods to check `LocalWaker` registration state.
|
- Add methods to check `LocalWaker` registration state.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.3 - 2019-12-11
|
## 1.0.3 - 2019-12-11
|
||||||
* Revert InOrder service changes
|
- Revert InOrder service changes
|
||||||
|
|
||||||
|
|
||||||
## 1.0.2 - 2019-12-11
|
## 1.0.2 - 2019-12-11
|
||||||
* Allow to create `framed::Dispatcher` with custom `mpsc::Receiver`.
|
- Allow to create `framed::Dispatcher` with custom `mpsc::Receiver`.
|
||||||
* Add `oneshot::Sender::is_canceled()` method.
|
- Add `oneshot::Sender::is_canceled()` method.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.1 - 2019-12-11
|
## 1.0.1 - 2019-12-11
|
||||||
* Optimize InOrder service.
|
- Optimize InOrder service.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0 - 2019-12-11
|
## 1.0.0 - 2019-12-11
|
||||||
* Simplify oneshot and mpsc implementations.
|
- Simplify oneshot and mpsc implementations.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.3 - 2019-12-07
|
## 1.0.0-alpha.3 - 2019-12-07
|
||||||
* Migrate to tokio 0.2.
|
- Migrate to tokio 0.2.
|
||||||
* Fix oneshot.
|
- Fix oneshot.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0-alpha.2 - 2019-12-02
|
## 1.0.0-alpha.2 - 2019-12-02
|
||||||
* Migrate to `std::future`.
|
- Migrate to `std::future`.
|
||||||
|
|
||||||
|
|
||||||
## 0.4.7 - 2019-10-14
|
## 0.4.7 - 2019-10-14
|
||||||
* Re-register task on every framed transport poll.
|
- Re-register task on every framed transport poll.
|
||||||
|
|
||||||
|
|
||||||
## 0.4.6 - 2019-10-08
|
## 0.4.6 - 2019-10-08
|
||||||
* Refactor `Counter` type. register current task in available method.
|
- Refactor `Counter` type. register current task in available method.
|
||||||
|
|
||||||
|
|
||||||
## 0.4.5 - 2019-07-19
|
## 0.4.5 - 2019-07-19
|
||||||
* Deprecated `CloneableService` as it is not safe.
|
- Deprecated `CloneableService` as it is not safe.
|
||||||
|
|
||||||
|
|
||||||
## 0.4.4 - 2019-07-17
|
## 0.4.4 - 2019-07-17
|
||||||
* Undeprecate `FramedTransport` as it is actually useful.
|
- Undeprecate `FramedTransport` as it is actually useful.
|
||||||
|
|
||||||
|
|
||||||
## 0.4.3 - 2019-07-17
|
## 0.4.3 - 2019-07-17
|
||||||
* Deprecate `CloneableService` as it is not safe and in general not very useful.
|
- Deprecate `CloneableService` as it is not safe and in general not very useful.
|
||||||
* Deprecate `FramedTransport` in favor of `actix-ioframe`.
|
- Deprecate `FramedTransport` in favor of `actix-ioframe`.
|
||||||
|
|
||||||
|
|
||||||
## 0.4.2 - 2019-06-26
|
## 0.4.2 - 2019-06-26
|
||||||
* Do not block on sink drop for FramedTransport.
|
- Do not block on sink drop for FramedTransport.
|
||||||
|
|
||||||
|
|
||||||
## 0.4.1 - 2019-05-15
|
## 0.4.1 - 2019-05-15
|
||||||
* Change `Either` constructor.
|
- Change `Either` constructor.
|
||||||
|
|
||||||
|
|
||||||
## 0.4.0 - 2019-05-11
|
## 0.4.0 - 2019-05-11
|
||||||
* Change `Either` to handle two nexted services.
|
- Change `Either` to handle two nexted services.
|
||||||
* Upgrade actix-service 0.4.
|
- Upgrade actix-service 0.4.
|
||||||
* Removed framed related services.
|
- Removed framed related services.
|
||||||
* Removed stream related services.
|
- Removed stream related services.
|
||||||
|
|
||||||
|
|
||||||
## 0.3.5 - 2019-04-04
|
## 0.3.5 - 2019-04-04
|
||||||
* Allow to send messages to `FramedTransport` via mpsc channel.
|
- Allow to send messages to `FramedTransport` via mpsc channel.
|
||||||
* Remove `'static` constraint from Clonable service.
|
- Remove `'static` constraint from Clonable service.
|
||||||
|
|
||||||
|
|
||||||
## 0.3.4 - 2019-03-12
|
## 0.3.4 - 2019-03-12
|
||||||
* `TimeoutService`, `InOrderService`, `InFlightService` accepts generic IntoService services.
|
- `TimeoutService`, `InOrderService`, `InFlightService` accepts generic IntoService services.
|
||||||
* Fix `InFlightService::poll_ready()` nested service readiness check.
|
- Fix `InFlightService::poll_ready()` nested service readiness check.
|
||||||
* Fix `InOrderService::poll_ready()` nested service readiness check.
|
- Fix `InOrderService::poll_ready()` nested service readiness check.
|
||||||
|
|
||||||
|
|
||||||
## 0.3.3 - 2019-03-09
|
## 0.3.3 - 2019-03-09
|
||||||
* Revert IntoFuture change.
|
- Revert IntoFuture change.
|
||||||
* Add generic config param for IntoFramed and TakeOne new services.
|
- Add generic config param for IntoFramed and TakeOne new services.
|
||||||
|
|
||||||
|
|
||||||
## 0.3.2 - 2019-03-04
|
## 0.3.2 - 2019-03-04
|
||||||
* Use IntoFuture for new services.
|
- Use IntoFuture for new services.
|
||||||
|
|
||||||
## 0.3.1 - 2019-03-04
|
## 0.3.1 - 2019-03-04
|
||||||
* Use new type of transform trait.
|
- Use new type of transform trait.
|
||||||
|
|
||||||
|
|
||||||
## 0.3.0 - 2019-03-02
|
## 0.3.0 - 2019-03-02
|
||||||
* Use new `NewService` trait
|
- Use new `NewService` trait
|
||||||
* BoxedNewService` and `BoxedService` types moved to actix-service crate.
|
- BoxedNewService` and `BoxedService` types moved to actix-service crate.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.4 - 2019-02-21
|
## 0.2.4 - 2019-02-21
|
||||||
* Custom `BoxedNewService` implementation.
|
- Custom `BoxedNewService` implementation.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.3 - 2019-02-21
|
## 0.2.3 - 2019-02-21
|
||||||
* Add `BoxedNewService` and `BoxedService`.
|
- Add `BoxedNewService` and `BoxedService`.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.2 - 2019-02-11
|
## 0.2.2 - 2019-02-11
|
||||||
* Add `Display` impl for `TimeoutError`.
|
- Add `Display` impl for `TimeoutError`.
|
||||||
* Add `Display` impl for `InOrderError`.
|
- Add `Display` impl for `InOrderError`.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.1 - 2019-02-06
|
## 0.2.1 - 2019-02-06
|
||||||
* Add `InOrder` service. the service yields responses as they become available,
|
- Add `InOrder` service. the service yields responses as they become available,
|
||||||
in the order that their originating requests were submitted to the service.
|
in the order that their originating requests were submitted to the service.
|
||||||
* Convert `Timeout` and `InFlight` services to a transforms.
|
- Convert `Timeout` and `InFlight` services to a transforms.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.0 - 2019-02-01
|
## 0.2.0 - 2019-02-01
|
||||||
* Fix framed transport error handling.
|
- Fix framed transport error handling.
|
||||||
* Added Clone impl for Either service.
|
- Added Clone impl for Either service.
|
||||||
* Added Clone impl for Timeout service factory.
|
- Added Clone impl for Timeout service factory.
|
||||||
* Added Service and NewService for Stream dispatcher.
|
- Added Service and NewService for Stream dispatcher.
|
||||||
* Switch to actix-service 0.2.
|
- Switch to actix-service 0.2.
|
||||||
|
|
||||||
|
|
||||||
## 0.1.0 - 2018-12-09
|
## 0.1.0 - 2018-12-09
|
||||||
* Move utils services to separate crate.
|
- Move utils services to separate crate.
|
||||||
|
@@ -22,16 +22,19 @@ impl Counter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Create new counter guard, incrementing the counter.
|
/// Create new counter guard, incrementing the counter.
|
||||||
|
#[inline]
|
||||||
pub fn get(&self) -> CounterGuard {
|
pub fn get(&self) -> CounterGuard {
|
||||||
CounterGuard::new(self.0.clone())
|
CounterGuard::new(self.0.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if counter is below capacity. Otherwise, register to wake task when it is.
|
/// Returns true if counter is below capacity. Otherwise, register to wake task when it is.
|
||||||
|
#[inline]
|
||||||
pub fn available(&self, cx: &mut task::Context<'_>) -> bool {
|
pub fn available(&self, cx: &mut task::Context<'_>) -> bool {
|
||||||
self.0.available(cx)
|
self.0.available(cx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get total number of acquired guards.
|
/// Get total number of acquired guards.
|
||||||
|
#[inline]
|
||||||
pub fn total(&self) -> usize {
|
pub fn total(&self) -> usize {
|
||||||
self.0.count.get()
|
self.0.count.get()
|
||||||
}
|
}
|
||||||
|
@@ -40,11 +40,13 @@ pin_project! {
|
|||||||
|
|
||||||
impl<L, R> Either<L, R> {
|
impl<L, R> Either<L, R> {
|
||||||
/// Creates new `Either` using left variant.
|
/// Creates new `Either` using left variant.
|
||||||
|
#[inline]
|
||||||
pub fn left(value: L) -> Either<L, R> {
|
pub fn left(value: L) -> Either<L, R> {
|
||||||
Either::Left { value }
|
Either::Left { value }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates new `Either` using right variant.
|
/// Creates new `Either` using right variant.
|
||||||
|
#[inline]
|
||||||
pub fn right(value: R) -> Either<L, R> {
|
pub fn right(value: R) -> Either<L, R> {
|
||||||
Either::Right { value }
|
Either::Right { value }
|
||||||
}
|
}
|
||||||
@@ -52,6 +54,7 @@ impl<L, R> Either<L, R> {
|
|||||||
|
|
||||||
impl<T> Either<T, T> {
|
impl<T> Either<T, T> {
|
||||||
/// Unwraps into inner value when left and right have a common type.
|
/// Unwraps into inner value when left and right have a common type.
|
||||||
|
#[inline]
|
||||||
pub fn into_inner(self) -> T {
|
pub fn into_inner(self) -> T {
|
||||||
match self {
|
match self {
|
||||||
Either::Left { value } => value,
|
Either::Left { value } => value,
|
||||||
@@ -67,6 +70,7 @@ where
|
|||||||
{
|
{
|
||||||
type Output = L::Output;
|
type Output = L::Output;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
||||||
match self.project() {
|
match self.project() {
|
||||||
EitherProj::Left { value } => value.poll(cx),
|
EitherProj::Left { value } => value.poll(cx),
|
||||||
|
@@ -8,6 +8,7 @@ use core::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// Creates a future driven by the provided function that receives a task context.
|
/// Creates a future driven by the provided function that receives a task context.
|
||||||
|
#[inline]
|
||||||
pub fn poll_fn<F, T>(f: F) -> PollFn<F>
|
pub fn poll_fn<F, T>(f: F) -> PollFn<F>
|
||||||
where
|
where
|
||||||
F: FnMut(&mut Context<'_>) -> Poll<T>,
|
F: FnMut(&mut Context<'_>) -> Poll<T>,
|
||||||
@@ -34,6 +35,7 @@ where
|
|||||||
{
|
{
|
||||||
type Output = T;
|
type Output = T;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
||||||
(self.f)(cx)
|
(self.f)(cx)
|
||||||
}
|
}
|
||||||
|
@@ -65,6 +65,7 @@ impl<T> Future for Ready<T> {
|
|||||||
/// let a = ready(1);
|
/// let a = ready(1);
|
||||||
/// assert_eq!(a.into_inner(), 1);
|
/// assert_eq!(a.into_inner(), 1);
|
||||||
/// ```
|
/// ```
|
||||||
|
#[inline]
|
||||||
pub fn ready<T>(val: T) -> Ready<T> {
|
pub fn ready<T>(val: T) -> Ready<T> {
|
||||||
Ready { val: Some(val) }
|
Ready { val: Some(val) }
|
||||||
}
|
}
|
||||||
@@ -80,6 +81,7 @@ pub fn ready<T>(val: T) -> Ready<T> {
|
|||||||
/// assert_eq!(a.await, Ok(1));
|
/// assert_eq!(a.await, Ok(1));
|
||||||
/// # }
|
/// # }
|
||||||
/// ```
|
/// ```
|
||||||
|
#[inline]
|
||||||
pub fn ok<T, E>(val: T) -> Ready<Result<T, E>> {
|
pub fn ok<T, E>(val: T) -> Ready<Result<T, E>> {
|
||||||
Ready { val: Some(Ok(val)) }
|
Ready { val: Some(Ok(val)) }
|
||||||
}
|
}
|
||||||
@@ -95,6 +97,7 @@ pub fn ok<T, E>(val: T) -> Ready<Result<T, E>> {
|
|||||||
/// assert_eq!(a.await, Err(1));
|
/// assert_eq!(a.await, Err(1));
|
||||||
/// # }
|
/// # }
|
||||||
/// ```
|
/// ```
|
||||||
|
#[inline]
|
||||||
pub fn err<T, E>(err: E) -> Ready<Result<T, E>> {
|
pub fn err<T, E>(err: E) -> Ready<Result<T, E>> {
|
||||||
Ready {
|
Ready {
|
||||||
val: Some(Err(err)),
|
val: Some(Err(err)),
|
||||||
@@ -106,12 +109,13 @@ mod tests {
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
use futures_util::task::noop_waker;
|
use futures_util::task::noop_waker;
|
||||||
use static_assertions::{assert_impl_all, assert_not_impl_all};
|
use static_assertions::{assert_impl_all, assert_not_impl_any};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
assert_impl_all!(Ready<()>: Send, Sync, Clone);
|
assert_impl_all!(Ready<()>: Send, Sync, Unpin, Clone);
|
||||||
assert_not_impl_all!(Ready<Rc<()>>: Send, Sync);
|
assert_impl_all!(Ready<Rc<()>>: Unpin, Clone);
|
||||||
|
assert_not_impl_any!(Ready<Rc<()>>: Send, Sync);
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic]
|
#[should_panic]
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
//! Various utilities used in the Actix ecosystem.
|
//! Various utilities used in the Actix ecosystem.
|
||||||
|
|
||||||
#![deny(rust_2018_idioms, nonstandard_style)]
|
#![deny(rust_2018_idioms, nonstandard_style)]
|
||||||
#![warn(missing_docs)]
|
#![warn(future_incompatible, missing_docs)]
|
||||||
#![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")]
|
||||||
|
|
||||||
|
@@ -4,33 +4,33 @@
|
|||||||
|
|
||||||
|
|
||||||
## 1.0.0 - 2020-12-31
|
## 1.0.0 - 2020-12-31
|
||||||
* Update `bytes` dependency to `1`.
|
- Update `bytes` dependency to `1`.
|
||||||
* Add array and slice of `u8` impls of `TryFrom` up to 32 in length.
|
- Add array and slice of `u8` impls of `TryFrom` up to 32 in length.
|
||||||
* Rename `get_ref` to `as_bytes` and rename `into_inner` to `into_bytes`.
|
- Rename `get_ref` to `as_bytes` and rename `into_inner` to `into_bytes`.
|
||||||
* `ByteString::new` is now a `const fn`.
|
- `ByteString::new` is now a `const fn`.
|
||||||
* Crate is now `#[no_std]` compatible.
|
- Crate is now `#[no_std]` compatible.
|
||||||
|
|
||||||
|
|
||||||
## 0.1.5 - 2020-03-30
|
## 0.1.5 - 2020-03-30
|
||||||
* Serde support
|
- Serde support
|
||||||
|
|
||||||
|
|
||||||
## 0.1.4 - 2020-01-14
|
## 0.1.4 - 2020-01-14
|
||||||
* Fix `AsRef<str>` impl
|
- Fix `AsRef<str>` impl
|
||||||
|
|
||||||
|
|
||||||
## 0.1.3 - 2020-01-13
|
## 0.1.3 - 2020-01-13
|
||||||
* Add `PartialEq<T: AsRef<str>>`, `AsRef<[u8]>` impls
|
- Add `PartialEq<T: AsRef<str>>`, `AsRef<[u8]>` impls
|
||||||
|
|
||||||
|
|
||||||
## 0.1.2 - 2019-12-22
|
## 0.1.2 - 2019-12-22
|
||||||
* Fix `new()` method
|
- Fix `new()` method
|
||||||
* Make `ByteString::from_static()` and `ByteString::from_bytes_unchecked()` methods const.
|
- Make `ByteString::from_static()` and `ByteString::from_bytes_unchecked()` methods const.
|
||||||
|
|
||||||
|
|
||||||
## 0.1.1 - 2019-12-07
|
## 0.1.1 - 2019-12-07
|
||||||
* Fix hash impl
|
- Fix hash impl
|
||||||
|
|
||||||
|
|
||||||
## 0.1.0 - 2019-12-07
|
## 0.1.0 - 2019-12-07
|
||||||
* Initial release
|
- Initial release
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![deny(rust_2018_idioms, nonstandard_style)]
|
#![deny(rust_2018_idioms, nonstandard_style)]
|
||||||
#![warn(missing_docs)]
|
#![warn(future_incompatible, missing_docs)]
|
||||||
|
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
|
@@ -3,5 +3,9 @@
|
|||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 0.1.2 - 2021-04-01
|
||||||
|
- No significant changes from `0.1.1`.
|
||||||
|
|
||||||
|
|
||||||
## 0.1.1 - 2021-03-29
|
## 0.1.1 - 2021-03-29
|
||||||
* Move local mpsc channel to it's own crate.
|
- Move local mpsc channel to it's own crate.
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
//! Non-thread-safe channels.
|
//! Non-thread-safe channels.
|
||||||
|
|
||||||
#![deny(rust_2018_idioms, nonstandard_style)]
|
#![deny(rust_2018_idioms, nonstandard_style)]
|
||||||
#![warn(missing_docs)]
|
#![warn(future_incompatible, missing_docs)]
|
||||||
|
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
|
@@ -3,9 +3,9 @@
|
|||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
|
||||||
|
|
||||||
## 0.1.2 - 2021-04-01
|
## 0.1.2 - 2021-12-18
|
||||||
* Fix crate metadata.
|
- Fix crate metadata.
|
||||||
|
|
||||||
|
|
||||||
## 0.1.1 - 2021-03-29
|
## 0.1.1 - 2021-03-29
|
||||||
* Move `LocalWaker` to it's own crate.
|
- Move `LocalWaker` to it's own crate.
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "local-waker"
|
name = "local-waker"
|
||||||
version = "0.1.1"
|
version = "0.1.2"
|
||||||
description = "A synchronization primitive for thread-local task wakeup"
|
description = "A synchronization primitive for thread-local task wakeup"
|
||||||
authors = [
|
authors = [
|
||||||
"Nikolay Kim <fafhrd91@gmail.com>",
|
"Nikolay Kim <fafhrd91@gmail.com>",
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![deny(rust_2018_idioms, nonstandard_style)]
|
#![deny(rust_2018_idioms, nonstandard_style)]
|
||||||
#![warn(missing_docs)]
|
#![warn(future_incompatible, missing_docs)]
|
||||||
|
|
||||||
use core::{cell::Cell, fmt, marker::PhantomData, task::Waker};
|
use core::{cell::Cell, fmt, marker::PhantomData, task::Waker};
|
||||||
|
|
||||||
|
@@ -1,5 +1,2 @@
|
|||||||
max_width = 96
|
max_width = 96
|
||||||
reorder_imports = true
|
reorder_imports = true
|
||||||
#wrap_comments = true
|
|
||||||
#fn_args_density = "Compressed"
|
|
||||||
#use_small_heuristics = false
|
|
||||||
|
Reference in New Issue
Block a user