mirror of
https://github.com/fafhrd91/actix-net
synced 2025-08-15 17:03:51 +02:00
Compare commits
29 Commits
tls-v3.0.2
...
win-full-d
Author | SHA1 | Date | |
---|---|---|---|
|
ff487244db | ||
|
ec77f8f40d | ||
|
887f9deb55 | ||
|
e286485a59 | ||
|
49a034259f | ||
|
3337f63b4e | ||
|
86ce140249 | ||
|
635aebe887 | ||
|
4c1e581a54 | ||
|
dc67ba770d | ||
|
855e3f96fe | ||
|
737b438f73 | ||
|
0cd70b0536 | ||
|
4b6a581ef3 | ||
|
3e132d2bc6 | ||
|
c5d6174cec | ||
|
77d4a69b2f | ||
|
ae5377fd6e | ||
|
bd9bda0504 | ||
|
41ed48219d | ||
|
7804ed12eb | ||
|
2a54065fae | ||
|
217cbd2228 | ||
|
d229c1e886 | ||
|
6792f799a6 | ||
|
72481313cc | ||
|
59b629c74b | ||
|
7988694242 | ||
|
b8a7741524 |
70
.github/workflows/ci-master.yml
vendored
70
.github/workflows/ci-master.yml
vendored
@@ -124,7 +124,7 @@ jobs:
|
|||||||
- name: Install Rust (nightly)
|
- name: Install Rust (nightly)
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
toolchain: stable-x86_64-unknown-linux-gnu
|
toolchain: nightly
|
||||||
profile: minimal
|
profile: minimal
|
||||||
override: true
|
override: true
|
||||||
|
|
||||||
@@ -143,3 +143,71 @@ jobs:
|
|||||||
if: github.ref == 'refs/heads/master'
|
if: github.ref == 'refs/heads/master'
|
||||||
uses: codecov/codecov-action@v1
|
uses: codecov/codecov-action@v1
|
||||||
with: { file: cobertura.xml }
|
with: { file: cobertura.xml }
|
||||||
|
|
||||||
|
minimal-versions:
|
||||||
|
name: minimal versions
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Install Rust (nightly)
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: nightly
|
||||||
|
profile: minimal
|
||||||
|
override: true
|
||||||
|
|
||||||
|
- name: Generate Cargo.lock
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with: { command: generate-lockfile }
|
||||||
|
- name: Cache Dependencies
|
||||||
|
uses: Swatinem/rust-cache@v1.3.0
|
||||||
|
|
||||||
|
- name: Install cargo-minimal-versions
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: install
|
||||||
|
args: cargo-minimal-versions
|
||||||
|
|
||||||
|
- name: Install cargo-hack
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: install
|
||||||
|
args: cargo-hack
|
||||||
|
|
||||||
|
- name: Check With Minimal Versions
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: minimal-versions
|
||||||
|
args: check
|
||||||
|
|
||||||
|
nextest:
|
||||||
|
name: nextest
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Install Rust
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
profile: minimal
|
||||||
|
override: true
|
||||||
|
|
||||||
|
- name: Generate Cargo.lock
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with: { command: generate-lockfile }
|
||||||
|
- name: Cache Dependencies
|
||||||
|
uses: Swatinem/rust-cache@v1.3.0
|
||||||
|
|
||||||
|
- name: Install cargo-nextest
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: install
|
||||||
|
args: cargo-nextest
|
||||||
|
|
||||||
|
- name: Test with cargo-nextest
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: nextest
|
||||||
|
args: run
|
||||||
|
99
.github/workflows/ci.yml
vendored
99
.github/workflows/ci.yml
vendored
@@ -4,7 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, synchronize, reopened]
|
types: [opened, synchronize, reopened]
|
||||||
push:
|
push:
|
||||||
branches: [master]
|
branches: [master, win-full-disk-ci]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build_and_test:
|
build_and_test:
|
||||||
@@ -12,10 +12,6 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
target:
|
target:
|
||||||
- { name: Linux, os: ubuntu-latest, triple: x86_64-unknown-linux-gnu }
|
|
||||||
- { name: macOS, os: macos-latest, triple: x86_64-apple-darwin }
|
|
||||||
- { name: Windows, os: windows-latest, triple: x86_64-pc-windows-msvc }
|
|
||||||
- { name: Windows (MinGW), os: windows-latest, triple: x86_64-pc-windows-gnu }
|
|
||||||
- { name: Windows (32-bit), os: windows-latest, triple: i686-pc-windows-msvc }
|
- { name: Windows (32-bit), os: windows-latest, triple: i686-pc-windows-msvc }
|
||||||
version:
|
version:
|
||||||
- 1.52.0 # MSRV for -server and -tls
|
- 1.52.0 # MSRV for -server and -tls
|
||||||
@@ -38,9 +34,6 @@ jobs:
|
|||||||
- name: Set vcpkg root
|
- name: Set vcpkg root
|
||||||
if: matrix.target.triple == 'x86_64-pc-windows-msvc' || matrix.target.triple == 'i686-pc-windows-msvc'
|
if: matrix.target.triple == 'x86_64-pc-windows-msvc' || matrix.target.triple == 'i686-pc-windows-msvc'
|
||||||
run: echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append
|
run: echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||||
- name: Install OpenSSL
|
|
||||||
if: matrix.target.triple == 'x86_64-pc-windows-msvc'
|
|
||||||
run: vcpkg install openssl:x64-windows
|
|
||||||
- name: Install OpenSSL
|
- name: Install OpenSSL
|
||||||
if: matrix.target.triple == 'i686-pc-windows-msvc'
|
if: matrix.target.triple == 'i686-pc-windows-msvc'
|
||||||
run: vcpkg install openssl:x86-windows
|
run: vcpkg install openssl:x86-windows
|
||||||
@@ -52,27 +45,22 @@ jobs:
|
|||||||
profile: minimal
|
profile: minimal
|
||||||
override: true
|
override: true
|
||||||
|
|
||||||
# - name: Install MSYS2
|
|
||||||
# if: matrix.target.triple == 'x86_64-pc-windows-gnu'
|
|
||||||
# uses: msys2/setup-msys2@v2
|
|
||||||
# - name: Install MinGW Packages
|
|
||||||
# if: matrix.target.triple == 'x86_64-pc-windows-gnu'
|
|
||||||
# run: |
|
|
||||||
# msys2 -c 'pacman -Sy --noconfirm pacman'
|
|
||||||
# msys2 -c 'pacman --noconfirm -S base-devel pkg-config'
|
|
||||||
|
|
||||||
# - name: Generate Cargo.lock
|
|
||||||
# uses: actions-rs/cargo@v1
|
|
||||||
# with: { command: generate-lockfile }
|
|
||||||
# - name: Cache Dependencies
|
|
||||||
# uses: Swatinem/rust-cache@v1.2.0
|
|
||||||
|
|
||||||
- name: Install cargo-hack
|
- name: Install cargo-hack
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: install
|
command: install
|
||||||
args: cargo-hack
|
args: cargo-hack
|
||||||
|
|
||||||
|
- name: Generate Cargo.lock
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with: { command: generate-lockfile }
|
||||||
|
|
||||||
|
- name: Tweak lockfile
|
||||||
|
run: |
|
||||||
|
cargo update -p=native-tls --precise=0.2.8
|
||||||
|
|
||||||
|
- run: Get-PSDrive
|
||||||
|
|
||||||
- name: check lib
|
- name: check lib
|
||||||
if: >
|
if: >
|
||||||
matrix.target.os != 'ubuntu-latest'
|
matrix.target.os != 'ubuntu-latest'
|
||||||
@@ -88,11 +76,14 @@ jobs:
|
|||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with: { command: ci-check-min }
|
with: { command: ci-check-min }
|
||||||
|
|
||||||
|
- run: Get-PSDrive
|
||||||
|
|
||||||
- name: check full
|
- name: check full
|
||||||
# TODO: compile OpenSSL and run tests on MinGW
|
# TODO: compile OpenSSL and run tests on MinGW
|
||||||
if: >
|
if: >
|
||||||
matrix.target.os != 'ubuntu-latest'
|
matrix.target.os != 'ubuntu-latest'
|
||||||
&& matrix.target.triple != 'x86_64-pc-windows-gnu'
|
&& matrix.target.triple != 'x86_64-pc-windows-gnu'
|
||||||
|
continue-on-error: true
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with: { command: ci-check }
|
with: { command: ci-check }
|
||||||
- name: check all
|
- name: check all
|
||||||
@@ -100,72 +91,20 @@ jobs:
|
|||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with: { command: ci-check-linux }
|
with: { command: ci-check-linux }
|
||||||
|
|
||||||
|
- run: Get-PSDrive
|
||||||
|
|
||||||
- name: tests
|
- name: tests
|
||||||
if: >
|
if: >
|
||||||
matrix.target.os != 'ubuntu-latest'
|
matrix.target.os != 'ubuntu-latest'
|
||||||
&& matrix.target.triple != 'x86_64-pc-windows-gnu'
|
&& matrix.target.triple != 'x86_64-pc-windows-gnu'
|
||||||
|
continue-on-error: true
|
||||||
run: |
|
run: |
|
||||||
cargo ci-test
|
cargo ci-test
|
||||||
cargo ci-test-rt
|
|
||||||
cargo ci-test-server
|
cargo ci-test-server
|
||||||
- name: tests
|
|
||||||
if: matrix.target.os == 'ubuntu-latest'
|
- run: Get-PSDrive
|
||||||
run: |
|
|
||||||
sudo bash -c "ulimit -Sl 512 && ulimit -Hl 512 && PATH=$PATH:/usr/share/rust/.cargo/bin && RUSTUP_TOOLCHAIN=${{ matrix.version }} cargo ci-test && RUSTUP_TOOLCHAIN=${{ matrix.version }} cargo ci-test-rt-linux && RUSTUP_TOOLCHAIN=${{ matrix.version }} cargo ci-test-server-linux"
|
|
||||||
|
|
||||||
- name: Clear the cargo caches
|
- name: Clear the cargo caches
|
||||||
run: |
|
run: |
|
||||||
cargo install cargo-cache --version 0.6.2 --no-default-features --features ci-autoclean
|
cargo install cargo-cache --version 0.6.2 --no-default-features --features ci-autoclean
|
||||||
cargo-cache
|
cargo-cache
|
||||||
|
|
||||||
build_and_test_lower_msrv:
|
|
||||||
name: Linux / 1.46 (lower MSRV)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install 1.46.0 # MSRV for all but -server and -tls
|
|
||||||
uses: actions-rs/toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: 1.46.0-x86_64-unknown-linux-gnu
|
|
||||||
profile: minimal
|
|
||||||
override: true
|
|
||||||
|
|
||||||
- name: Install cargo-hack
|
|
||||||
uses: actions-rs/cargo@v1
|
|
||||||
with:
|
|
||||||
command: install
|
|
||||||
args: cargo-hack
|
|
||||||
|
|
||||||
- name: tests
|
|
||||||
run: |
|
|
||||||
sudo bash -c "ulimit -Sl 512 && ulimit -Hl 512 && PATH=$PATH:/usr/share/rust/.cargo/bin && RUSTUP_TOOLCHAIN=1.46 cargo ci-test-lower-msrv"
|
|
||||||
|
|
||||||
- name: Clear the cargo caches
|
|
||||||
run: |
|
|
||||||
cargo install cargo-cache --version 0.6.2 --no-default-features --features ci-autoclean
|
|
||||||
cargo-cache
|
|
||||||
|
|
||||||
rustdoc:
|
|
||||||
name: rustdoc
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install Rust (nightly)
|
|
||||||
uses: actions-rs/toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: nightly-x86_64-unknown-linux-gnu
|
|
||||||
profile: minimal
|
|
||||||
override: true
|
|
||||||
|
|
||||||
- name: Generate Cargo.lock
|
|
||||||
uses: actions-rs/cargo@v1
|
|
||||||
with: { command: generate-lockfile }
|
|
||||||
- name: Cache Dependencies
|
|
||||||
uses: Swatinem/rust-cache@v1.3.0
|
|
||||||
|
|
||||||
- name: doc tests io-uring
|
|
||||||
run: |
|
|
||||||
sudo bash -c "ulimit -Sl 512 && ulimit -Hl 512 && PATH=$PATH:/usr/share/rust/.cargo/bin && RUSTUP_TOOLCHAIN=nightly cargo ci-doctest"
|
|
||||||
|
12
README.md
12
README.md
@@ -2,18 +2,18 @@
|
|||||||
|
|
||||||
> 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://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)
|
||||||
[](https://deps.rs/repo/github/actix/actix-extras)
|
[](https://deps.rs/repo/github/actix/actix-net)
|
||||||
|
|
||||||
## Example
|
## Examples
|
||||||
|
|
||||||
See `actix-server/examples` and `actix-tls/examples` for some basic examples.
|
See example folders for [`actix-server`](./actix-server/examples) and [`actix-tls`](./actix-tls/examples).
|
||||||
|
|
||||||
### MSRV
|
## MSRV
|
||||||
|
|
||||||
This repo's Minimum Supported Rust Version (MSRV) is 1.46.0.
|
Most crates in this repo's have a Minimum Supported Rust Version (MSRV) of 1.49.0. Only `actix-tls` and `actix-server` have MSRV of 1.54.0. As a policy, we permit MSRV increases in non-breaking releases.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
@@ -1,6 +1,19 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2022-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 0.5.1 - 2022-03-15
|
||||||
|
- Logs emitted now use the `tracing` crate with `log` compatibility. [#451]
|
||||||
|
- Minimum supported Rust version (MSRV) is now 1.49.
|
||||||
|
|
||||||
|
[#451]: https://github.com/actix/actix-net/pull/451
|
||||||
|
|
||||||
|
|
||||||
|
## 0.5.0 - 2022-02-15
|
||||||
|
- Updated `tokio-util` dependency to `0.7.0`. [#446]
|
||||||
|
|
||||||
|
[#446]: https://github.com/actix/actix-net/pull/446
|
||||||
|
|
||||||
|
|
||||||
## 0.4.2 - 2021-12-31
|
## 0.4.2 - 2021-12-31
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-codec"
|
name = "actix-codec"
|
||||||
version = "0.4.2"
|
version = "0.5.1"
|
||||||
authors = [
|
authors = [
|
||||||
"Nikolay Kim <fafhrd91@gmail.com>",
|
"Nikolay Kim <fafhrd91@gmail.com>",
|
||||||
"Rob Ede <robjtede@icloud.com>",
|
"Rob Ede <robjtede@icloud.com>",
|
||||||
@@ -17,15 +17,15 @@ name = "actix_codec"
|
|||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "1.2.1"
|
bitflags = "1.2"
|
||||||
bytes = "1"
|
bytes = "1"
|
||||||
futures-core = { version = "0.3.7", default-features = false }
|
futures-core = { version = "0.3.7", default-features = false }
|
||||||
futures-sink = { version = "0.3.7", default-features = false }
|
futures-sink = { version = "0.3.7", default-features = false }
|
||||||
log = "0.4"
|
|
||||||
memchr = "2.3"
|
memchr = "2.3"
|
||||||
pin-project-lite = "0.2"
|
pin-project-lite = "0.2"
|
||||||
tokio = "1.13.1"
|
tokio = "1.13.1"
|
||||||
tokio-util = { version = "0.6", features = ["codec", "io"] }
|
tokio-util = { version = "0.7", features = ["codec", "io"] }
|
||||||
|
tracing = { version = "0.1.30", default-features = false, features = ["log"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
criterion = { version = "0.3", features = ["html_reports"] }
|
criterion = { version = "0.3", features = ["html_reports"] }
|
||||||
|
@@ -197,11 +197,11 @@ impl<T, U> Framed<T, U> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log::trace!("attempting to decode a frame");
|
tracing::trace!("attempting to decode a frame");
|
||||||
|
|
||||||
match this.codec.decode(this.read_buf) {
|
match this.codec.decode(this.read_buf) {
|
||||||
Ok(Some(frame)) => {
|
Ok(Some(frame)) => {
|
||||||
log::trace!("frame decoded from buffer");
|
tracing::trace!("frame decoded from buffer");
|
||||||
return Poll::Ready(Some(Ok(frame)));
|
return Poll::Ready(Some(Ok(frame)));
|
||||||
}
|
}
|
||||||
Err(err) => return Poll::Ready(Some(Err(err))),
|
Err(err) => return Poll::Ready(Some(Err(err))),
|
||||||
@@ -242,10 +242,10 @@ impl<T, U> Framed<T, U> {
|
|||||||
U: Encoder<I>,
|
U: Encoder<I>,
|
||||||
{
|
{
|
||||||
let mut this = self.as_mut().project();
|
let mut this = self.as_mut().project();
|
||||||
log::trace!("flushing framed transport");
|
tracing::trace!("flushing framed transport");
|
||||||
|
|
||||||
while !this.write_buf.is_empty() {
|
while !this.write_buf.is_empty() {
|
||||||
log::trace!("writing; remaining={}", this.write_buf.len());
|
tracing::trace!("writing; remaining={}", this.write_buf.len());
|
||||||
|
|
||||||
let n = ready!(this.io.as_mut().poll_write(cx, this.write_buf))?;
|
let n = ready!(this.io.as_mut().poll_write(cx, this.write_buf))?;
|
||||||
|
|
||||||
@@ -264,7 +264,7 @@ impl<T, U> Framed<T, U> {
|
|||||||
// Try flushing the underlying IO
|
// Try flushing the underlying IO
|
||||||
ready!(this.io.poll_flush(cx))?;
|
ready!(this.io.poll_flush(cx))?;
|
||||||
|
|
||||||
log::trace!("framed transport flushed");
|
tracing::trace!("framed transport flushed");
|
||||||
Poll::Ready(Ok(()))
|
Poll::Ready(Ok(()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -16,10 +16,10 @@ mod bcodec;
|
|||||||
mod framed;
|
mod framed;
|
||||||
mod lines;
|
mod lines;
|
||||||
|
|
||||||
pub use self::bcodec::BytesCodec;
|
|
||||||
pub use self::framed::{Framed, FramedParts};
|
|
||||||
pub use self::lines::LinesCodec;
|
|
||||||
|
|
||||||
pub use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
pub use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
||||||
pub use tokio_util::codec::{Decoder, Encoder};
|
pub use tokio_util::codec::{Decoder, Encoder};
|
||||||
pub use tokio_util::io::poll_read_buf;
|
pub use tokio_util::io::poll_read_buf;
|
||||||
|
|
||||||
|
pub use self::bcodec::BytesCodec;
|
||||||
|
pub use self::framed::{Framed, FramedParts};
|
||||||
|
pub use self::lines::LinesCodec;
|
||||||
|
@@ -7,8 +7,8 @@ use super::{Decoder, Encoder};
|
|||||||
|
|
||||||
/// Lines codec. Reads/writes line delimited strings.
|
/// Lines codec. Reads/writes line delimited strings.
|
||||||
///
|
///
|
||||||
/// Will split input up by LF or CRLF delimiters. I.e. carriage return characters at the end of
|
/// Will split input up by LF or CRLF delimiters. Carriage return characters at the end of lines are
|
||||||
/// lines are not preserved.
|
/// not preserved.
|
||||||
#[derive(Debug, Copy, Clone, Default)]
|
#[derive(Debug, Copy, Clone, Default)]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub struct LinesCodec;
|
pub struct LinesCodec;
|
||||||
|
@@ -1,12 +1,16 @@
|
|||||||
|
use std::{
|
||||||
|
collections::VecDeque,
|
||||||
|
io::{self, Write},
|
||||||
|
pin::Pin,
|
||||||
|
task::{
|
||||||
|
Context,
|
||||||
|
Poll::{self, Pending, Ready},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
use actix_codec::*;
|
use actix_codec::*;
|
||||||
use bytes::Buf;
|
use bytes::{Buf as _, BufMut as _, BytesMut};
|
||||||
use bytes::{BufMut, BytesMut};
|
|
||||||
use futures_sink::Sink;
|
use futures_sink::Sink;
|
||||||
use std::collections::VecDeque;
|
|
||||||
use std::io::{self, Write};
|
|
||||||
use std::pin::Pin;
|
|
||||||
use std::task::Poll::{Pending, Ready};
|
|
||||||
use std::task::{Context, Poll};
|
|
||||||
use tokio_test::{assert_ready, task};
|
use tokio_test::{assert_ready, task};
|
||||||
|
|
||||||
macro_rules! bilateral {
|
macro_rules! bilateral {
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2022-xx-xx
|
||||||
|
- Minimum supported Rust version (MSRV) is now 1.49.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.3 - 2021-10-19
|
## 0.2.3 - 2021-10-19
|
||||||
|
@@ -1,6 +1,16 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2022-xx-xx
|
||||||
|
- Add `#[track_caller]` attribute to `spawn` functions and methods. [#454]
|
||||||
|
|
||||||
|
[#454]: https://github.com/actix/actix-net/pull/454
|
||||||
|
|
||||||
|
|
||||||
|
## 2.7.0 - 2022-03-08
|
||||||
|
- Update `tokio-uring` dependency to `0.3.0`. [#448]
|
||||||
|
- Minimum supported Rust version (MSRV) is now 1.49.
|
||||||
|
|
||||||
|
[#448]: https://github.com/actix/actix-net/pull/448
|
||||||
|
|
||||||
|
|
||||||
## 2.6.0 - 2022-01-12
|
## 2.6.0 - 2022-01-12
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-rt"
|
name = "actix-rt"
|
||||||
version = "2.6.0"
|
version = "2.7.0"
|
||||||
authors = [
|
authors = [
|
||||||
"Nikolay Kim <fafhrd91@gmail.com>",
|
"Nikolay Kim <fafhrd91@gmail.com>",
|
||||||
"Rob Ede <robjtede@icloud.com>",
|
"Rob Ede <robjtede@icloud.com>",
|
||||||
@@ -29,10 +29,10 @@ actix-macros = { version = "0.2.3", optional = true }
|
|||||||
futures-core = { version = "0.3", default-features = false }
|
futures-core = { version = "0.3", default-features = false }
|
||||||
tokio = { version = "1.13.1", features = ["rt", "net", "parking_lot", "signal", "sync", "time"] }
|
tokio = { version = "1.13.1", features = ["rt", "net", "parking_lot", "signal", "sync", "time"] }
|
||||||
|
|
||||||
# runtime for io-uring feature
|
# runtime for `io-uring` feature
|
||||||
[target.'cfg(target_os = "linux")'.dependencies]
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
tokio-uring = { version = "0.2", optional = true }
|
tokio-uring = { version = "0.3", optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tokio = { version = "1.13.1", features = ["full"] }
|
tokio = { version = "1.13.1", features = ["full"] }
|
||||||
hyper = { version = "0.14", default-features = false, features = ["server", "tcp", "http1"] }
|
hyper = { version = "0.14.10", default-features = false, features = ["server", "tcp", "http1"] }
|
||||||
|
@@ -3,11 +3,11 @@
|
|||||||
> Tokio-based single-threaded async runtime for the Actix ecosystem.
|
> Tokio-based single-threaded async runtime for the Actix ecosystem.
|
||||||
|
|
||||||
[](https://crates.io/crates/actix-rt)
|
[](https://crates.io/crates/actix-rt)
|
||||||
[](https://docs.rs/actix-rt/2.6.0)
|
[](https://docs.rs/actix-rt/2.7.0)
|
||||||
[](https://blog.rust-lang.org/2020/03/12/Rust-1.46.html)
|
[](https://blog.rust-lang.org/2020/03/12/Rust-1.46.html)
|
||||||

|

|
||||||
<br />
|
<br />
|
||||||
[](https://deps.rs/crate/actix-rt/2.6.0)
|
[](https://deps.rs/crate/actix-rt/2.7.0)
|
||||||

|

|
||||||
[](https://discord.gg/WghFtEH6Hb)
|
[](https://discord.gg/WghFtEH6Hb)
|
||||||
|
|
||||||
|
@@ -1,7 +1,9 @@
|
|||||||
use hyper::service::{make_service_fn, service_fn};
|
use std::{convert::Infallible, net::SocketAddr};
|
||||||
use hyper::{Body, Request, Response, Server};
|
|
||||||
use std::convert::Infallible;
|
use hyper::{
|
||||||
use std::net::SocketAddr;
|
service::{make_service_fn, service_fn},
|
||||||
|
Body, Request, Response, Server,
|
||||||
|
};
|
||||||
|
|
||||||
async fn handle(_req: Request<Body>) -> Result<Response<Body>, Infallible> {
|
async fn handle(_req: Request<Body>) -> Result<Response<Body>, Infallible> {
|
||||||
Ok(Response::new(Body::from("Hello World")))
|
Ok(Response::new(Body::from("Hello World")))
|
||||||
|
@@ -260,6 +260,7 @@ impl Arbiter {
|
|||||||
/// If you require a result, include a response channel in the future.
|
/// If you require a result, include a response channel in the future.
|
||||||
///
|
///
|
||||||
/// Returns true if future was sent successfully and false if the Arbiter has died.
|
/// Returns true if future was sent successfully and false if the Arbiter has died.
|
||||||
|
#[track_caller]
|
||||||
pub fn spawn<Fut>(&self, future: Fut) -> bool
|
pub fn spawn<Fut>(&self, future: Fut) -> bool
|
||||||
where
|
where
|
||||||
Fut: Future<Output = ()> + Send + 'static,
|
Fut: Future<Output = ()> + Send + 'static,
|
||||||
@@ -275,6 +276,7 @@ impl Arbiter {
|
|||||||
/// channel in the function.
|
/// channel in the function.
|
||||||
///
|
///
|
||||||
/// Returns true if function was sent successfully and false if the Arbiter has died.
|
/// Returns true if function was sent successfully and false if the Arbiter has died.
|
||||||
|
#[track_caller]
|
||||||
pub fn spawn_fn<F>(&self, f: F) -> bool
|
pub fn spawn_fn<F>(&self, f: F) -> bool
|
||||||
where
|
where
|
||||||
F: FnOnce() + Send + 'static,
|
F: FnOnce() + Send + 'static,
|
||||||
|
@@ -51,13 +51,10 @@ compile_error!("io_uring is a linux only feature.");
|
|||||||
|
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
|
|
||||||
use tokio::task::JoinHandle;
|
|
||||||
|
|
||||||
// Cannot define a main macro when compiled into test harness.
|
// Cannot define a main macro when compiled into test harness.
|
||||||
// Workaround for https://github.com/rust-lang/rust/issues/62127.
|
// Workaround for https://github.com/rust-lang/rust/issues/62127.
|
||||||
#[cfg(all(feature = "macros", not(test)))]
|
#[cfg(all(feature = "macros", not(test)))]
|
||||||
pub use actix_macros::main;
|
pub use actix_macros::main;
|
||||||
|
|
||||||
#[cfg(feature = "macros")]
|
#[cfg(feature = "macros")]
|
||||||
pub use actix_macros::test;
|
pub use actix_macros::test;
|
||||||
|
|
||||||
@@ -65,12 +62,13 @@ mod arbiter;
|
|||||||
mod runtime;
|
mod runtime;
|
||||||
mod system;
|
mod system;
|
||||||
|
|
||||||
|
pub use tokio::pin;
|
||||||
|
use tokio::task::JoinHandle;
|
||||||
|
|
||||||
pub use self::arbiter::{Arbiter, ArbiterHandle};
|
pub use self::arbiter::{Arbiter, ArbiterHandle};
|
||||||
pub use self::runtime::Runtime;
|
pub use self::runtime::Runtime;
|
||||||
pub use self::system::{System, SystemRunner};
|
pub use self::system::{System, SystemRunner};
|
||||||
|
|
||||||
pub use tokio::pin;
|
|
||||||
|
|
||||||
pub mod signal {
|
pub mod signal {
|
||||||
//! Asynchronous signal handling (Tokio re-exports).
|
//! Asynchronous signal handling (Tokio re-exports).
|
||||||
|
|
||||||
@@ -95,7 +93,6 @@ pub mod net {
|
|||||||
use tokio::io::{AsyncRead, AsyncWrite, Interest};
|
use tokio::io::{AsyncRead, AsyncWrite, Interest};
|
||||||
pub use tokio::net::UdpSocket;
|
pub use tokio::net::UdpSocket;
|
||||||
pub use tokio::net::{TcpListener, TcpSocket, TcpStream};
|
pub use tokio::net::{TcpListener, TcpSocket, TcpStream};
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
pub use tokio::net::{UnixDatagram, UnixListener, UnixStream};
|
pub use tokio::net::{UnixDatagram, UnixListener, UnixStream};
|
||||||
|
|
||||||
@@ -198,6 +195,7 @@ pub mod task {
|
|||||||
/// assert!(handle.await.unwrap_err().is_cancelled());
|
/// assert!(handle.await.unwrap_err().is_cancelled());
|
||||||
/// # });
|
/// # });
|
||||||
/// ```
|
/// ```
|
||||||
|
#[track_caller]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn spawn<Fut>(f: Fut) -> JoinHandle<Fut::Output>
|
pub fn spawn<Fut>(f: Fut) -> JoinHandle<Fut::Output>
|
||||||
where
|
where
|
||||||
|
@@ -53,6 +53,7 @@ impl Runtime {
|
|||||||
/// # Panics
|
/// # Panics
|
||||||
/// This function panics if the spawn fails. Failure occurs if the executor is currently at
|
/// This function panics if the spawn fails. Failure occurs if the executor is currently at
|
||||||
/// capacity and is unable to spawn a new future.
|
/// capacity and is unable to spawn a new future.
|
||||||
|
#[track_caller]
|
||||||
pub fn spawn<F>(&self, future: F) -> JoinHandle<F::Output>
|
pub fn spawn<F>(&self, future: F) -> JoinHandle<F::Output>
|
||||||
where
|
where
|
||||||
F: Future + 'static,
|
F: Future + 'static,
|
||||||
@@ -73,6 +74,7 @@ impl Runtime {
|
|||||||
///
|
///
|
||||||
/// The caller is responsible for ensuring that other spawned futures complete execution by
|
/// The caller is responsible for ensuring that other spawned futures complete execution by
|
||||||
/// calling `block_on` or `run`.
|
/// calling `block_on` or `run`.
|
||||||
|
#[track_caller]
|
||||||
pub fn block_on<F>(&self, f: F) -> F::Output
|
pub fn block_on<F>(&self, f: F) -> F::Output
|
||||||
where
|
where
|
||||||
F: Future,
|
F: Future,
|
||||||
|
@@ -204,6 +204,7 @@ impl SystemRunner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Runs the provided future, blocking the current thread until the future completes.
|
/// Runs the provided future, blocking the current thread until the future completes.
|
||||||
|
#[track_caller]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn block_on<F: Future>(&self, fut: F) -> F::Output {
|
pub fn block_on<F: Future>(&self, fut: F) -> F::Output {
|
||||||
self.rt.block_on(fut)
|
self.rt.block_on(fut)
|
||||||
|
@@ -4,7 +4,6 @@ use std::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use actix_rt::{task::JoinError, Arbiter, System};
|
use actix_rt::{task::JoinError, Arbiter, System};
|
||||||
|
|
||||||
#[cfg(not(feature = "io-uring"))]
|
#[cfg(not(feature = "io-uring"))]
|
||||||
use {
|
use {
|
||||||
std::{sync::mpsc::channel, thread},
|
std::{sync::mpsc::channel, thread},
|
||||||
|
@@ -1,6 +1,19 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2022-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 2.1.1 - 2022-03-09
|
||||||
|
- No significant changes since `2.1.0`.
|
||||||
|
|
||||||
|
|
||||||
|
## 2.1.0 - 2022-03-08
|
||||||
|
- Update `tokio-uring` dependency to `0.3.0`. [#448]
|
||||||
|
- Logs emitted now use the `tracing` crate with `log` compatibility. [#448]
|
||||||
|
- Wait for accept thread to stop before sending completion signal. [#443]
|
||||||
|
|
||||||
|
[#443]: https://github.com/actix/actix-net/pull/443
|
||||||
|
[#448]: https://github.com/actix/actix-net/pull/448
|
||||||
|
|
||||||
|
|
||||||
## 2.0.0 - 2022-01-19
|
## 2.0.0 - 2022-01-19
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-server"
|
name = "actix-server"
|
||||||
version = "2.0.0"
|
version = "2.1.1"
|
||||||
authors = [
|
authors = [
|
||||||
"Nikolay Kim <fafhrd91@gmail.com>",
|
"Nikolay Kim <fafhrd91@gmail.com>",
|
||||||
"fakeshadow <24548779@qq.com>",
|
"fakeshadow <24548779@qq.com>",
|
||||||
@@ -24,24 +24,24 @@ default = []
|
|||||||
io-uring = ["tokio-uring", "actix-rt/io-uring"]
|
io-uring = ["tokio-uring", "actix-rt/io-uring"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
actix-rt = { version = "2.6.0", default-features = false }
|
actix-rt = { version = "2.7", default-features = false }
|
||||||
actix-service = "2.0.0"
|
actix-service = "2"
|
||||||
actix-utils = "3.0.0"
|
actix-utils = "3"
|
||||||
|
|
||||||
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] }
|
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] }
|
||||||
futures-util = { version = "0.3.7", default-features = false, features = ["alloc"] }
|
futures-util = { version = "0.3.7", default-features = false, features = ["alloc"] }
|
||||||
log = "0.4"
|
|
||||||
mio = { version = "0.8", features = ["os-poll", "net"] }
|
mio = { version = "0.8", features = ["os-poll", "net"] }
|
||||||
num_cpus = "1.13"
|
num_cpus = "1.13"
|
||||||
socket2 = "0.4.2"
|
socket2 = "0.4.2"
|
||||||
tokio = { version = "1.13.1", features = ["sync"] }
|
tokio = { version = "1.13.1", features = ["sync"] }
|
||||||
|
tracing = { version = "0.1.30", default-features = false, features = ["log"] }
|
||||||
|
|
||||||
# runtime for io-uring feature
|
# runtime for `io-uring` feature
|
||||||
[target.'cfg(target_os = "linux")'.dependencies]
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
tokio-uring = { version = "0.2", optional = true }
|
tokio-uring = { version = "0.3", optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-codec = "0.4.2"
|
actix-codec = "0.5.0"
|
||||||
actix-rt = "2.6.0"
|
actix-rt = "2.6.0"
|
||||||
|
|
||||||
bytes = "1"
|
bytes = "1"
|
||||||
|
@@ -3,10 +3,10 @@
|
|||||||
> General purpose TCP server built for the Actix ecosystem.
|
> General purpose TCP server built for the Actix ecosystem.
|
||||||
|
|
||||||
[](https://crates.io/crates/actix-server)
|
[](https://crates.io/crates/actix-server)
|
||||||
[](https://docs.rs/actix-server/2.0.0)
|
[](https://docs.rs/actix-server/2.1.1)
|
||||||
[](https://blog.rust-lang.org/2021/05/06/Rust-1.52.0.html)
|
[](https://blog.rust-lang.org/2021/05/06/Rust-1.52.0.html)
|
||||||

|

|
||||||
[](https://deps.rs/crate/actix-server/2.0.0)
|
[](https://deps.rs/crate/actix-server/2.1.1)
|
||||||

|

|
||||||
[](https://discord.gg/NWpN5mmg3x)
|
[](https://discord.gg/NWpN5mmg3x)
|
||||||
|
|
||||||
|
@@ -21,7 +21,7 @@ async fn run() -> io::Result<()> {
|
|||||||
env_logger::init_from_env(env_logger::Env::default().default_filter_or("info"));
|
env_logger::init_from_env(env_logger::Env::default().default_filter_or("info"));
|
||||||
|
|
||||||
let addr = ("127.0.0.1", 8080);
|
let addr = ("127.0.0.1", 8080);
|
||||||
log::info!("starting server on port: {}", &addr.0);
|
tracing::info!("starting server on port: {}", &addr.0);
|
||||||
|
|
||||||
// Bind socket address and start worker(s). By default, the server uses the number of physical
|
// 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
|
// CPU cores as the worker count. For this reason, the closure passed to bind needs to return
|
||||||
@@ -39,8 +39,10 @@ async fn run() -> io::Result<()> {
|
|||||||
// wait for next line
|
// wait for next line
|
||||||
match framed.next().await {
|
match framed.next().await {
|
||||||
Some(Ok(line)) => {
|
Some(Ok(line)) => {
|
||||||
match File::open(line).await {
|
match File::open(&line).await {
|
||||||
Ok(mut file) => {
|
Ok(mut file) => {
|
||||||
|
tracing::info!("reading file: {}", &line);
|
||||||
|
|
||||||
// read file into String buffer
|
// read file into String buffer
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
file.read_to_string(&mut buf).await?;
|
file.read_to_string(&mut buf).await?;
|
||||||
@@ -52,7 +54,7 @@ async fn run() -> io::Result<()> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::error!("{}", err);
|
tracing::error!("{}", err);
|
||||||
framed
|
framed
|
||||||
.send("File not found or not readable. Try again.")
|
.send("File not found or not readable. Try again.")
|
||||||
.await?;
|
.await?;
|
||||||
@@ -72,7 +74,7 @@ async fn run() -> io::Result<()> {
|
|||||||
// close connection after file has been copied to TCP stream
|
// close connection after file has been copied to TCP stream
|
||||||
Ok(())
|
Ok(())
|
||||||
})
|
})
|
||||||
.map_err(|err| log::error!("Service Error: {:?}", err))
|
.map_err(|err| tracing::error!("Service Error: {:?}", err))
|
||||||
})?
|
})?
|
||||||
.workers(2)
|
.workers(2)
|
||||||
.run()
|
.run()
|
||||||
|
@@ -22,7 +22,6 @@ use actix_server::Server;
|
|||||||
use actix_service::{fn_service, ServiceFactoryExt as _};
|
use actix_service::{fn_service, ServiceFactoryExt as _};
|
||||||
use bytes::BytesMut;
|
use bytes::BytesMut;
|
||||||
use futures_util::future::ok;
|
use futures_util::future::ok;
|
||||||
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<()> {
|
||||||
@@ -31,7 +30,7 @@ async fn run() -> io::Result<()> {
|
|||||||
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);
|
tracing::info!("starting server on port: {}", &addr.0);
|
||||||
|
|
||||||
// Bind socket address and start worker(s). By default, the server uses the number of physical
|
// 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
|
// CPU cores as the worker count. For this reason, the closure passed to bind needs to return
|
||||||
@@ -58,14 +57,14 @@ async fn run() -> io::Result<()> {
|
|||||||
|
|
||||||
// more bytes to process
|
// more bytes to process
|
||||||
Ok(bytes_read) => {
|
Ok(bytes_read) => {
|
||||||
info!("[{}] read {} bytes", num, bytes_read);
|
tracing::info!("[{}] read {} bytes", num, bytes_read);
|
||||||
stream.write_all(&buf[size..]).await.unwrap();
|
stream.write_all(&buf[size..]).await.unwrap();
|
||||||
size += bytes_read;
|
size += bytes_read;
|
||||||
}
|
}
|
||||||
|
|
||||||
// stream error; bail from loop with error
|
// stream error; bail from loop with error
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
error!("Stream Error: {:?}", err);
|
tracing::error!("Stream Error: {:?}", err);
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,10 +74,10 @@ async fn run() -> io::Result<()> {
|
|||||||
Ok((buf.freeze(), size))
|
Ok((buf.freeze(), size))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.map_err(|err| error!("Service Error: {:?}", err))
|
.map_err(|err| tracing::error!("Service Error: {:?}", err))
|
||||||
.and_then(move |(_, size)| {
|
.and_then(move |(_, size)| {
|
||||||
let num = num2.load(Ordering::SeqCst);
|
let num = num2.load(Ordering::SeqCst);
|
||||||
info!("[{}] total bytes read: {}", num, size);
|
tracing::info!("[{}] total bytes read: {}", num, size);
|
||||||
ok(size)
|
ok(size)
|
||||||
})
|
})
|
||||||
})?
|
})?
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use std::{io, thread, time::Duration};
|
use std::{io, thread, time::Duration};
|
||||||
|
|
||||||
use actix_rt::time::Instant;
|
use actix_rt::time::Instant;
|
||||||
use log::{debug, error, info};
|
|
||||||
use mio::{Interest, Poll, Token as MioToken};
|
use mio::{Interest, Poll, Token as MioToken};
|
||||||
|
use tracing::{debug, error, info};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
availability::Availability,
|
availability::Availability,
|
||||||
@@ -41,7 +41,7 @@ impl Accept {
|
|||||||
pub(crate) fn start(
|
pub(crate) fn start(
|
||||||
sockets: Vec<(usize, MioListener)>,
|
sockets: Vec<(usize, MioListener)>,
|
||||||
builder: &ServerBuilder,
|
builder: &ServerBuilder,
|
||||||
) -> io::Result<(WakerQueue, Vec<WorkerHandleServer>)> {
|
) -> io::Result<(WakerQueue, Vec<WorkerHandleServer>, thread::JoinHandle<()>)> {
|
||||||
let handle_server = ServerHandle::new(builder.cmd_tx.clone());
|
let handle_server = ServerHandle::new(builder.cmd_tx.clone());
|
||||||
|
|
||||||
// construct poll instance and its waker
|
// construct poll instance and its waker
|
||||||
@@ -73,12 +73,12 @@ impl Accept {
|
|||||||
handle_server,
|
handle_server,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
thread::Builder::new()
|
let accept_handle = thread::Builder::new()
|
||||||
.name("actix-server acceptor".to_owned())
|
.name("actix-server acceptor".to_owned())
|
||||||
.spawn(move || accept.poll_with(&mut sockets))
|
.spawn(move || accept.poll_with(&mut sockets))
|
||||||
.map_err(|err| io::Error::new(io::ErrorKind::Other, err))?;
|
.map_err(|err| io::Error::new(io::ErrorKind::Other, err))?;
|
||||||
|
|
||||||
Ok((waker_queue, handles_server))
|
Ok((waker_queue, handles_server, accept_handle))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_with_sockets(
|
fn new_with_sockets(
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use std::{io, time::Duration};
|
use std::{io, time::Duration};
|
||||||
|
|
||||||
use actix_rt::net::TcpStream;
|
use actix_rt::net::TcpStream;
|
||||||
use log::{info, trace};
|
|
||||||
use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender};
|
use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender};
|
||||||
|
use tracing::{info, trace};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
server::ServerCommand,
|
server::ServerCommand,
|
||||||
@@ -264,22 +264,23 @@ pub(super) fn bind_addr<S: ToSocketAddrs>(
|
|||||||
addr: S,
|
addr: S,
|
||||||
backlog: u32,
|
backlog: u32,
|
||||||
) -> io::Result<Vec<MioTcpListener>> {
|
) -> io::Result<Vec<MioTcpListener>> {
|
||||||
let mut err = None;
|
let mut opt_err = None;
|
||||||
let mut success = false;
|
let mut success = false;
|
||||||
let mut sockets = Vec::new();
|
let mut sockets = Vec::new();
|
||||||
|
|
||||||
for addr in addr.to_socket_addrs()? {
|
for addr in addr.to_socket_addrs()? {
|
||||||
match create_mio_tcp_listener(addr, backlog) {
|
match create_mio_tcp_listener(addr, backlog) {
|
||||||
Ok(lst) => {
|
Ok(lst) => {
|
||||||
success = true;
|
success = true;
|
||||||
sockets.push(lst);
|
sockets.push(lst);
|
||||||
}
|
}
|
||||||
Err(err) => err = Some(err),
|
Err(err) => opt_err = Some(err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if success {
|
if success {
|
||||||
Ok(sockets)
|
Ok(sockets)
|
||||||
} else if let Some(err) = err.take() {
|
} else if let Some(err) = opt_err.take() {
|
||||||
Err(err)
|
Err(err)
|
||||||
} else {
|
} else {
|
||||||
Err(io::Error::new(
|
Err(io::Error::new(
|
||||||
|
@@ -63,10 +63,10 @@ impl<T> Future for JoinAll<T> {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
|
||||||
|
|
||||||
use actix_utils::future::ready;
|
use actix_utils::future::ready;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_join_all() {
|
async fn test_join_all() {
|
||||||
let futs = vec![ready(Ok(1)), ready(Err(3)), ready(Ok(9))];
|
let futs = vec![ready(Ok(1)), ready(Err(3)), ready(Ok(9))];
|
||||||
|
@@ -22,10 +22,9 @@ 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::ServerServiceFactory;
|
pub use self::service::ServerServiceFactory;
|
||||||
pub use self::test_server::TestServer;
|
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub use self::socket::FromStream;
|
pub use self::socket::FromStream;
|
||||||
|
pub use self::test_server::TestServer;
|
||||||
|
|
||||||
/// Start server building process
|
/// Start server building process
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
@@ -3,14 +3,15 @@ use std::{
|
|||||||
io, mem,
|
io, mem,
|
||||||
pin::Pin,
|
pin::Pin,
|
||||||
task::{Context, Poll},
|
task::{Context, Poll},
|
||||||
|
thread,
|
||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
use actix_rt::{time::sleep, System};
|
use actix_rt::{time::sleep, System};
|
||||||
use futures_core::{future::BoxFuture, Stream};
|
use futures_core::{future::BoxFuture, Stream};
|
||||||
use futures_util::stream::StreamExt as _;
|
use futures_util::stream::StreamExt as _;
|
||||||
use log::{error, info};
|
|
||||||
use tokio::sync::{mpsc::UnboundedReceiver, oneshot};
|
use tokio::sync::{mpsc::UnboundedReceiver, oneshot};
|
||||||
|
use tracing::{error, info};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
accept::Accept,
|
accept::Accept,
|
||||||
@@ -65,7 +66,7 @@ pub(crate) enum ServerCommand {
|
|||||||
/// server has fully shut down.
|
/// server has fully shut down.
|
||||||
///
|
///
|
||||||
/// # Shutdown Signals
|
/// # Shutdown Signals
|
||||||
/// On UNIX systems, `SIGQUIT` will start a graceful shutdown and `SIGTERM` or `SIGINT` will start a
|
/// On UNIX systems, `SIGTERM` will start a graceful shutdown and `SIGQUIT` or `SIGINT` will start a
|
||||||
/// forced shutdown. On Windows, a Ctrl-C signal will start a forced shutdown.
|
/// forced shutdown. On Windows, a Ctrl-C signal will start a forced shutdown.
|
||||||
///
|
///
|
||||||
/// A graceful shutdown will wait for all workers to stop first.
|
/// A graceful shutdown will wait for all workers to stop first.
|
||||||
@@ -158,6 +159,7 @@ impl Future for Server {
|
|||||||
|
|
||||||
pub struct ServerInner {
|
pub struct ServerInner {
|
||||||
worker_handles: Vec<WorkerHandleServer>,
|
worker_handles: Vec<WorkerHandleServer>,
|
||||||
|
accept_handle: Option<thread::JoinHandle<()>>,
|
||||||
worker_config: ServerWorkerConfig,
|
worker_config: ServerWorkerConfig,
|
||||||
services: Vec<Box<dyn InternalServiceFactory>>,
|
services: Vec<Box<dyn InternalServiceFactory>>,
|
||||||
waker_queue: WakerQueue,
|
waker_queue: WakerQueue,
|
||||||
@@ -205,7 +207,7 @@ impl ServerInner {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let (waker_queue, worker_handles) = Accept::start(sockets, &builder)?;
|
let (waker_queue, worker_handles, accept_handle) = Accept::start(sockets, &builder)?;
|
||||||
|
|
||||||
let mux = ServerEventMultiplexer {
|
let mux = ServerEventMultiplexer {
|
||||||
signal_fut: (builder.listen_os_signals).then(Signals::new),
|
signal_fut: (builder.listen_os_signals).then(Signals::new),
|
||||||
@@ -214,6 +216,7 @@ impl ServerInner {
|
|||||||
|
|
||||||
let server = ServerInner {
|
let server = ServerInner {
|
||||||
waker_queue,
|
waker_queue,
|
||||||
|
accept_handle: Some(accept_handle),
|
||||||
worker_handles,
|
worker_handles,
|
||||||
worker_config: builder.worker_config,
|
worker_config: builder.worker_config,
|
||||||
services: builder.factories,
|
services: builder.factories,
|
||||||
@@ -243,7 +246,8 @@ impl ServerInner {
|
|||||||
} => {
|
} => {
|
||||||
self.stopping = true;
|
self.stopping = true;
|
||||||
|
|
||||||
// stop accept thread
|
// Signal accept thread to stop.
|
||||||
|
// Signal is non-blocking; we wait for thread to stop later.
|
||||||
self.waker_queue.wake(WakerInterest::Stop);
|
self.waker_queue.wake(WakerInterest::Stop);
|
||||||
|
|
||||||
// send stop signal to workers
|
// send stop signal to workers
|
||||||
@@ -258,6 +262,13 @@ impl ServerInner {
|
|||||||
let _ = join_all(workers_stop).await;
|
let _ = join_all(workers_stop).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wait for accept thread stop
|
||||||
|
self.accept_handle
|
||||||
|
.take()
|
||||||
|
.unwrap()
|
||||||
|
.join()
|
||||||
|
.expect("Accept thread must not panic in any case");
|
||||||
|
|
||||||
if let Some(tx) = completion {
|
if let Some(tx) = completion {
|
||||||
let _ = tx.send(());
|
let _ = tx.send(());
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ use std::{
|
|||||||
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 tracing::error;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
socket::{FromStream, MioStream},
|
socket::{FromStream, MioStream},
|
||||||
|
@@ -5,7 +5,7 @@ use std::{
|
|||||||
task::{Context, Poll},
|
task::{Context, Poll},
|
||||||
};
|
};
|
||||||
|
|
||||||
use log::trace;
|
use tracing::trace;
|
||||||
|
|
||||||
/// Types of process signals.
|
/// Types of process signals.
|
||||||
// #[allow(dead_code)]
|
// #[allow(dead_code)]
|
||||||
@@ -69,7 +69,7 @@ impl Signals {
|
|||||||
unix::signal(*kind)
|
unix::signal(*kind)
|
||||||
.map(|tokio_sig| (*sig, tokio_sig))
|
.map(|tokio_sig| (*sig, tokio_sig))
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
log::error!(
|
tracing::error!(
|
||||||
"Can not initialize stream handler for {:?} err: {}",
|
"Can not initialize stream handler for {:?} err: {}",
|
||||||
sig,
|
sig,
|
||||||
e
|
e
|
||||||
|
@@ -6,7 +6,6 @@ use std::{fmt, io};
|
|||||||
use actix_rt::net::TcpStream;
|
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};
|
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,
|
||||||
|
@@ -17,11 +17,11 @@ use actix_rt::{
|
|||||||
Arbiter, ArbiterHandle, System,
|
Arbiter, ArbiterHandle, System,
|
||||||
};
|
};
|
||||||
use futures_core::{future::LocalBoxFuture, ready};
|
use futures_core::{future::LocalBoxFuture, ready};
|
||||||
use log::{error, info, trace};
|
|
||||||
use tokio::sync::{
|
use tokio::sync::{
|
||||||
mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender},
|
mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender},
|
||||||
oneshot,
|
oneshot,
|
||||||
};
|
};
|
||||||
|
use tracing::{error, info, trace};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
service::{BoxedServerService, InternalServiceFactory},
|
service::{BoxedServerService, InternalServiceFactory},
|
||||||
|
@@ -254,6 +254,7 @@ async fn test_max_concurrent_connections() {
|
|||||||
h.join().unwrap().unwrap();
|
h.join().unwrap().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: race-y failures detected due to integer underflow when calling Counter::total
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_service_restart() {
|
async fn test_service_restart() {
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2022-xx-xx
|
||||||
|
- Minimum supported Rust version (MSRV) is now 1.49.
|
||||||
|
|
||||||
|
|
||||||
## 2.0.2 - 2021-12-18
|
## 2.0.2 - 2021-12-18
|
||||||
|
@@ -394,9 +394,10 @@ mod tests {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_auto_impl_send() {
|
async fn test_auto_impl_send() {
|
||||||
use crate::{map_config, ServiceExt, ServiceFactoryExt};
|
|
||||||
use alloc::rc::Rc;
|
use alloc::rc::Rc;
|
||||||
|
|
||||||
|
use crate::{map_config, ServiceExt, ServiceFactoryExt};
|
||||||
|
|
||||||
let srv_1 = fn_service(|_: Rc<u8>| ok::<_, Rc<u8>>(Rc::new(0u8)));
|
let srv_1 = fn_service(|_: Rc<u8>| ok::<_, Rc<u8>>(Rc::new(0u8)));
|
||||||
|
|
||||||
let fac_1 = fn_factory_with_config(|_: Rc<u8>| {
|
let fac_1 = fn_factory_with_config(|_: Rc<u8>| {
|
||||||
|
@@ -38,10 +38,9 @@ pub use self::apply_cfg::{apply_cfg, apply_cfg_factory};
|
|||||||
pub use self::ext::{ServiceExt, ServiceFactoryExt, TransformExt};
|
pub use self::ext::{ServiceExt, ServiceFactoryExt, TransformExt};
|
||||||
pub use self::fn_service::{fn_factory, fn_factory_with_config, fn_service};
|
pub use self::fn_service::{fn_factory, fn_factory_with_config, fn_service};
|
||||||
pub use self::map_config::{map_config, unit_config};
|
pub use self::map_config::{map_config, unit_config};
|
||||||
pub use self::transform::{apply, ApplyTransform, Transform};
|
|
||||||
|
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
use self::ready::{err, ok, ready, Ready};
|
use self::ready::{err, ok, ready, Ready};
|
||||||
|
pub use self::transform::{apply, ApplyTransform, Transform};
|
||||||
|
|
||||||
/// An asynchronous operation from `Request` to a `Response`.
|
/// An asynchronous operation from `Request` to a `Response`.
|
||||||
///
|
///
|
||||||
|
@@ -1,6 +1,16 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2022-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 3.0.4 - 2022-03-15
|
||||||
|
- Logs emitted now use the `tracing` crate with `log` compatibility. [#451]
|
||||||
|
|
||||||
|
[#451]: https://github.com/actix/actix-net/pull/451
|
||||||
|
|
||||||
|
|
||||||
|
## 3.0.3 - 2022-02-15
|
||||||
|
- No significant changes since `3.0.2`.
|
||||||
|
|
||||||
|
|
||||||
## 3.0.2 - 2022-01-28
|
## 3.0.2 - 2022-01-28
|
||||||
@@ -128,7 +138,7 @@
|
|||||||
[#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 - 2022-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
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-tls"
|
name = "actix-tls"
|
||||||
version = "3.0.2"
|
version = "3.0.4"
|
||||||
authors = [
|
authors = [
|
||||||
"Nikolay Kim <fafhrd91@gmail.com>",
|
"Nikolay Kim <fafhrd91@gmail.com>",
|
||||||
"Rob Ede <robjtede@icloud.com>",
|
"Rob Ede <robjtede@icloud.com>",
|
||||||
@@ -42,15 +42,15 @@ native-tls = ["tokio-native-tls"]
|
|||||||
uri = ["http"]
|
uri = ["http"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
actix-codec = "0.4.2"
|
actix-codec = "0.5.0"
|
||||||
actix-rt = { version = "2.2.0", default-features = false }
|
actix-rt = { version = "2.2.0", default-features = false }
|
||||||
actix-service = "2.0.0"
|
actix-service = "2.0.0"
|
||||||
actix-utils = "3.0.0"
|
actix-utils = "3.0.0"
|
||||||
|
|
||||||
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] }
|
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] }
|
||||||
log = "0.4"
|
|
||||||
pin-project-lite = "0.2.7"
|
pin-project-lite = "0.2.7"
|
||||||
tokio-util = { version = "0.6.3", default-features = false }
|
tokio-util = "0.7"
|
||||||
|
tracing = { version = "0.1.30", default-features = false, features = ["log"] }
|
||||||
|
|
||||||
# uri
|
# uri
|
||||||
http = { version = "0.2.3", optional = true }
|
http = { version = "0.2.3", optional = true }
|
||||||
|
@@ -15,8 +15,9 @@
|
|||||||
//! http --verify=false https://127.0.0.1:8443
|
//! http --verify=false https://127.0.0.1:8443
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
// this use only exists because of how we have organised the crate
|
#[rustfmt::skip]
|
||||||
// it is not necessary for your actual code
|
// this `use` is only exists because of how we have organised the crate
|
||||||
|
// it is not necessary for your actual code; you should import from `rustls` directly
|
||||||
use tokio_rustls::rustls;
|
use tokio_rustls::rustls;
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
@@ -34,9 +35,9 @@ use actix_server::Server;
|
|||||||
use actix_service::ServiceFactoryExt as _;
|
use actix_service::ServiceFactoryExt as _;
|
||||||
use actix_tls::accept::rustls::{Acceptor as RustlsAcceptor, TlsStream};
|
use actix_tls::accept::rustls::{Acceptor as RustlsAcceptor, TlsStream};
|
||||||
use futures_util::future::ok;
|
use futures_util::future::ok;
|
||||||
use log::info;
|
|
||||||
use rustls::{server::ServerConfig, Certificate, PrivateKey};
|
use rustls::{server::ServerConfig, Certificate, PrivateKey};
|
||||||
use rustls_pemfile::{certs, rsa_private_keys};
|
use rustls_pemfile::{certs, rsa_private_keys};
|
||||||
|
use tracing::info;
|
||||||
|
|
||||||
#[actix_rt::main]
|
#[actix_rt::main]
|
||||||
async fn main() -> io::Result<()> {
|
async fn main() -> io::Result<()> {
|
||||||
|
@@ -8,11 +8,11 @@ use actix_rt::net::ActixStream;
|
|||||||
use actix_service::{Service, ServiceFactory};
|
use actix_service::{Service, ServiceFactory};
|
||||||
use actix_utils::future::{ok, Ready};
|
use actix_utils::future::{ok, Ready};
|
||||||
use futures_core::future::LocalBoxFuture;
|
use futures_core::future::LocalBoxFuture;
|
||||||
use log::trace;
|
|
||||||
use tokio_native_tls::{
|
use tokio_native_tls::{
|
||||||
native_tls::TlsConnector as NativeTlsConnector, TlsConnector as AsyncNativeTlsConnector,
|
native_tls::TlsConnector as NativeTlsConnector, TlsConnector as AsyncNativeTlsConnector,
|
||||||
TlsStream as AsyncTlsStream,
|
TlsStream as AsyncTlsStream,
|
||||||
};
|
};
|
||||||
|
use tracing::trace;
|
||||||
|
|
||||||
use crate::connect::{Connection, Host};
|
use crate::connect::{Connection, Host};
|
||||||
|
|
||||||
@@ -20,7 +20,6 @@ pub mod reexports {
|
|||||||
//! Re-exports from `native-tls` and `tokio-native-tls` that are useful for connectors.
|
//! Re-exports from `native-tls` and `tokio-native-tls` that are useful for connectors.
|
||||||
|
|
||||||
pub use tokio_native_tls::native_tls::TlsConnector;
|
pub use tokio_native_tls::native_tls::TlsConnector;
|
||||||
|
|
||||||
pub use tokio_native_tls::TlsStream as AsyncTlsStream;
|
pub use tokio_native_tls::TlsStream as AsyncTlsStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -13,9 +13,9 @@ use actix_rt::net::ActixStream;
|
|||||||
use actix_service::{Service, ServiceFactory};
|
use actix_service::{Service, ServiceFactory};
|
||||||
use actix_utils::future::{ok, Ready};
|
use actix_utils::future::{ok, Ready};
|
||||||
use futures_core::ready;
|
use futures_core::ready;
|
||||||
use log::trace;
|
|
||||||
use openssl::ssl::SslConnector;
|
use openssl::ssl::SslConnector;
|
||||||
use tokio_openssl::SslStream as AsyncSslStream;
|
use tokio_openssl::SslStream as AsyncSslStream;
|
||||||
|
use tracing::trace;
|
||||||
|
|
||||||
use crate::connect::{Connection, Host};
|
use crate::connect::{Connection, Host};
|
||||||
|
|
||||||
@@ -25,7 +25,6 @@ pub mod reexports {
|
|||||||
pub use openssl::ssl::{
|
pub use openssl::ssl::{
|
||||||
Error, HandshakeError, SslConnector, SslConnectorBuilder, SslMethod,
|
Error, HandshakeError, SslConnector, SslConnectorBuilder, SslMethod,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub use tokio_openssl::SslStream as AsyncSslStream;
|
pub use tokio_openssl::SslStream as AsyncSslStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -12,7 +12,7 @@ use actix_rt::task::{spawn_blocking, JoinHandle};
|
|||||||
use actix_service::{Service, ServiceFactory};
|
use actix_service::{Service, ServiceFactory};
|
||||||
use actix_utils::future::{ok, Ready};
|
use actix_utils::future::{ok, Ready};
|
||||||
use futures_core::{future::LocalBoxFuture, ready};
|
use futures_core::{future::LocalBoxFuture, ready};
|
||||||
use log::trace;
|
use tracing::trace;
|
||||||
|
|
||||||
use super::{ConnectError, ConnectInfo, Host, Resolve};
|
use super::{ConnectError, ConnectInfo, Host, Resolve};
|
||||||
|
|
||||||
|
@@ -15,10 +15,10 @@ use actix_rt::net::ActixStream;
|
|||||||
use actix_service::{Service, ServiceFactory};
|
use actix_service::{Service, ServiceFactory};
|
||||||
use actix_utils::future::{ok, Ready};
|
use actix_utils::future::{ok, Ready};
|
||||||
use futures_core::ready;
|
use futures_core::ready;
|
||||||
use log::trace;
|
|
||||||
use tokio_rustls::rustls::{client::ServerName, OwnedTrustAnchor, RootCertStore};
|
use tokio_rustls::rustls::{client::ServerName, OwnedTrustAnchor, RootCertStore};
|
||||||
use tokio_rustls::{client::TlsStream as AsyncTlsStream, rustls::ClientConfig};
|
use tokio_rustls::{client::TlsStream as AsyncTlsStream, rustls::ClientConfig};
|
||||||
use tokio_rustls::{Connect as RustlsConnect, TlsConnector as RustlsTlsConnector};
|
use tokio_rustls::{Connect as RustlsConnect, TlsConnector as RustlsTlsConnector};
|
||||||
|
use tracing::trace;
|
||||||
use webpki_roots::TLS_SERVER_ROOTS;
|
use webpki_roots::TLS_SERVER_ROOTS;
|
||||||
|
|
||||||
use crate::connect::{Connection, Host};
|
use crate::connect::{Connection, Host};
|
||||||
@@ -26,10 +26,8 @@ use crate::connect::{Connection, Host};
|
|||||||
pub mod reexports {
|
pub mod reexports {
|
||||||
//! Re-exports from `rustls` and `webpki_roots` that are useful for connectors.
|
//! Re-exports from `rustls` and `webpki_roots` that are useful for connectors.
|
||||||
|
|
||||||
pub use tokio_rustls::rustls::ClientConfig;
|
|
||||||
|
|
||||||
pub use tokio_rustls::client::TlsStream as AsyncTlsStream;
|
pub use tokio_rustls::client::TlsStream as AsyncTlsStream;
|
||||||
|
pub use tokio_rustls::rustls::ClientConfig;
|
||||||
pub use webpki_roots::TLS_SERVER_ROOTS;
|
pub use webpki_roots::TLS_SERVER_ROOTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,8 +15,8 @@ use actix_rt::net::{TcpSocket, TcpStream};
|
|||||||
use actix_service::{Service, ServiceFactory};
|
use actix_service::{Service, ServiceFactory};
|
||||||
use actix_utils::future::{ok, Ready};
|
use actix_utils::future::{ok, Ready};
|
||||||
use futures_core::ready;
|
use futures_core::ready;
|
||||||
use log::{error, trace};
|
|
||||||
use tokio_util::sync::ReusableBoxFuture;
|
use tokio_util::sync::ReusableBoxFuture;
|
||||||
|
use tracing::{error, trace};
|
||||||
|
|
||||||
use super::{connect_addrs::ConnectAddrs, error::ConnectError, ConnectInfo, Connection, Host};
|
use super::{connect_addrs::ConnectAddrs, error::ConnectError, ConnectInfo, Connection, Host};
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ pub enum TcpConnectorFut<R> {
|
|||||||
port: u16,
|
port: u16,
|
||||||
local_addr: Option<IpAddr>,
|
local_addr: Option<IpAddr>,
|
||||||
addrs: Option<VecDeque<SocketAddr>>,
|
addrs: Option<VecDeque<SocketAddr>>,
|
||||||
stream: ReusableBoxFuture<Result<TcpStream, io::Error>>,
|
stream: ReusableBoxFuture<'static, Result<TcpStream, io::Error>>,
|
||||||
},
|
},
|
||||||
|
|
||||||
Error(Option<ConnectError>),
|
Error(Option<ConnectError>),
|
||||||
|
@@ -51,13 +51,13 @@ fn openssl_acceptor(cert: String, key: String) -> tls_openssl::ssl::SslAcceptor
|
|||||||
mod danger {
|
mod danger {
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
use tokio_rustls::rustls::{
|
use tokio_rustls::rustls::{
|
||||||
self,
|
self,
|
||||||
client::{ServerCertVerified, ServerCertVerifier},
|
client::{ServerCertVerified, ServerCertVerifier},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
pub struct NoCertificateVerification;
|
pub struct NoCertificateVerification;
|
||||||
|
|
||||||
impl ServerCertVerifier for NoCertificateVerification {
|
impl ServerCertVerifier for NoCertificateVerification {
|
||||||
|
@@ -9,11 +9,10 @@ use actix_codec::{BytesCodec, Framed};
|
|||||||
use actix_rt::net::TcpStream;
|
use actix_rt::net::TcpStream;
|
||||||
use actix_server::TestServer;
|
use actix_server::TestServer;
|
||||||
use actix_service::{fn_service, Service, ServiceFactory};
|
use actix_service::{fn_service, Service, ServiceFactory};
|
||||||
|
use actix_tls::connect::{ConnectError, ConnectInfo, Connection, Connector, Host};
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use futures_util::sink::SinkExt;
|
use futures_util::sink::SinkExt;
|
||||||
|
|
||||||
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() {
|
||||||
|
@@ -8,11 +8,10 @@ use std::{
|
|||||||
use actix_rt::net::TcpStream;
|
use actix_rt::net::TcpStream;
|
||||||
use actix_server::TestServer;
|
use actix_server::TestServer;
|
||||||
use actix_service::{fn_service, Service, ServiceFactory};
|
use actix_service::{fn_service, Service, ServiceFactory};
|
||||||
use futures_core::future::LocalBoxFuture;
|
|
||||||
|
|
||||||
use actix_tls::connect::{
|
use actix_tls::connect::{
|
||||||
ConnectError, ConnectInfo, Connection, Connector, Host, Resolve, Resolver,
|
ConnectError, ConnectInfo, Connection, Connector, Host, Resolve, Resolver,
|
||||||
};
|
};
|
||||||
|
use futures_core::future::LocalBoxFuture;
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn custom_resolver() {
|
async fn custom_resolver() {
|
||||||
|
@@ -1,5 +1,8 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## [0.1.0] - 2020-01-15
|
## Unreleased - 2022-xx-xx
|
||||||
|
- Minimum supported Rust version (MSRV) is now 1.49.
|
||||||
|
|
||||||
|
|
||||||
|
## 0.1.0 - 2020-01-15
|
||||||
- Initial release
|
- Initial release
|
||||||
|
@@ -118,8 +118,6 @@ where
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::collections::{BTreeMap, BTreeSet};
|
use std::collections::{BTreeMap, BTreeSet};
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
@@ -128,6 +126,8 @@ mod test {
|
|||||||
use slab::Slab;
|
use slab::Slab;
|
||||||
use tracing::{span, Event, Level, Metadata, Subscriber};
|
use tracing::{span, Event, Level, Metadata, Subscriber};
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
thread_local! {
|
thread_local! {
|
||||||
static SPAN: RefCell<Vec<span::Id>> = RefCell::new(Vec::new());
|
static SPAN: RefCell<Vec<span::Id>> = RefCell::new(Vec::new());
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2022-xx-xx
|
||||||
|
- Minimum supported Rust version (MSRV) is now 1.49.
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0 - 2021-04-16
|
## 3.0.0 - 2021-04-16
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2022-xx-xx
|
||||||
|
- Minimum supported Rust version (MSRV) is now 1.49.
|
||||||
|
|
||||||
|
|
||||||
## 1.0.0 - 2020-12-31
|
## 1.0.0 - 2020-12-31
|
||||||
|
@@ -219,11 +219,11 @@ mod serde {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod serde_impl_tests {
|
mod serde_impl_tests {
|
||||||
use super::*;
|
|
||||||
|
|
||||||
use serde::de::DeserializeOwned;
|
use serde::de::DeserializeOwned;
|
||||||
use static_assertions::assert_impl_all;
|
use static_assertions::assert_impl_all;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
assert_impl_all!(ByteString: Serialize, DeserializeOwned);
|
assert_impl_all!(ByteString: Serialize, DeserializeOwned);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,10 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2022-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 0.1.3 - 2022-05-03
|
||||||
|
- Minimum supported Rust version (MSRV) is now 1.49.
|
||||||
|
|
||||||
|
|
||||||
## 0.1.2 - 2021-04-01
|
## 0.1.2 - 2021-04-01
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "local-channel"
|
name = "local-channel"
|
||||||
version = "0.1.2"
|
version = "0.1.3"
|
||||||
description = "A non-threadsafe multi-producer, single-consumer, futures-aware, FIFO queue"
|
description = "A non-threadsafe multi-producer, single-consumer, futures-aware, FIFO queue"
|
||||||
authors = [
|
authors = [
|
||||||
"Nikolay Kim <fafhrd91@gmail.com>",
|
"Nikolay Kim <fafhrd91@gmail.com>",
|
||||||
|
1
local-channel/LICENSE-APACHE
Symbolic link
1
local-channel/LICENSE-APACHE
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../LICENSE-APACHE
|
1
local-channel/LICENSE-MIT
Symbolic link
1
local-channel/LICENSE-MIT
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../LICENSE-MIT
|
@@ -1,6 +1,10 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2022-xx-xx
|
||||||
|
|
||||||
|
|
||||||
|
## 0.1.3 - 2022-05-03
|
||||||
|
- Minimum supported Rust version (MSRV) is now 1.49.
|
||||||
|
|
||||||
|
|
||||||
## 0.1.2 - 2021-12-18
|
## 0.1.2 - 2021-12-18
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "local-waker"
|
name = "local-waker"
|
||||||
version = "0.1.2"
|
version = "0.1.3"
|
||||||
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>",
|
||||||
|
1
local-waker/LICENSE-APACHE
Symbolic link
1
local-waker/LICENSE-APACHE
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../LICENSE-APACHE
|
1
local-waker/LICENSE-MIT
Symbolic link
1
local-waker/LICENSE-MIT
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../LICENSE-MIT
|
@@ -1,2 +1,2 @@
|
|||||||
max_width = 96
|
max_width = 96
|
||||||
reorder_imports = true
|
group_imports = "StdExternalCrate"
|
||||||
|
Reference in New Issue
Block a user