1
0
mirror of https://github.com/fafhrd91/actix-net synced 2025-08-19 18:55:34 +02:00

Compare commits

..

34 Commits

Author SHA1 Message Date
Rob Ede
a6bece7b33 prepare bytestring release 1.3.0 2023-03-03 22:41:09 +00:00
Rob Ede
fbb53f54ef format changelogs with prettier 2023-03-03 22:36:13 +00:00
Rob Ede
9b388a83c9 reinstate actix-macros trybuild tests 2023-02-26 16:26:19 +00:00
Rob Ede
878d3a1c74 impl AsRef<ByteString> 2023-02-26 16:24:48 +00:00
Yuki Okushi
045cf3f3e8 Upgrade GHA workflows to remove deprecation warnings (#477) 2023-01-28 05:36:05 +09:00
Rob Ede
d13461b337 use secure tokio version range
see RUSTSEC-2023-0001

part of actix/actix-web#2962
2023-01-10 08:56:41 +00:00
Juan Aguilar Santillana
dde38bbe06 remove unnecessary Pin in poll_recv calls (#475) 2023-01-02 13:36:46 +00:00
Rob Ede
d973d5974a fix msrv ci 2022-12-21 23:09:16 +00:00
Rob Ede
d7afd60606 workaround env-logger msrv 2022-12-21 21:17:21 +00:00
Rob Ede
7e47bf4055 prepare actix-server release 2.2.0 2022-12-21 20:37:51 +00:00
Rob Ede
05e7be337e prepare actix-rt release 2.8.0 2022-12-21 20:37:04 +00:00
Rob Ede
8d964713c9 fix futures-util version range 2022-12-21 20:36:26 +00:00
Riley
fe38312db0 asonix/tokio uring 04 (#473) 2022-12-21 11:45:31 +09:00
Yuki Okushi
2b83f08a40 Use old cargo-hack for 1.59.0 CI (#472)
* Use old cargo-hack for 1.57.0 CI

Signed-off-by: Yuki Okushi <jtitor@2k36.org>

* Upgrade MSRV to 1.59.0

Signed-off-by: Yuki Okushi <jtitor@2k36.org>

Signed-off-by: Yuki Okushi <jtitor@2k36.org>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-11-12 14:00:33 +00:00
Rob Ede
8e9401f8e1 prepare bytestring release 1.2.1 2022-11-12 13:19:09 +00:00
VladimirBramstedt
9ede174e81 fix no_std compatibility (#471)
Co-authored-by: Yuki Okushi <jtitor@2k36.org>
2022-11-12 16:00:06 +09:00
Rob Ede
bb36e2a072 prepare bytestring release 1.2.0 2022-11-07 20:22:47 +00:00
Rob Ede
6061a44a22 slice_ref doc tweaks 2022-11-07 20:21:57 +00:00
Wang, Chi
363984ad75 Add ByteString::slice_ref (#470) 2022-11-07 20:16:46 +00:00
Rob Ede
00654aadc5 use direct tokio exports where possible 2022-10-30 20:25:13 +00:00
fakeshadow
428914e65e remove fakeshadow from author lists (#468) 2022-10-25 16:34:36 +01:00
Rob Ede
df9a9d1a1e don't install cargo-cache on 1.57 CI 2022-10-25 00:10:39 +01:00
Rob Ede
056d2cd573 workaround ci msrv issue 2022-10-24 23:44:29 +01:00
Rob Ede
68228a6cf2 update dev deps 2022-10-21 03:23:40 +01:00
Rob Ede
d5a9a6a1c5 prepare actix-utils release 3.0.1 2022-10-21 03:15:48 +01:00
Rob Ede
ade71b7bd3 address soundness footgun in poll_fn 2022-10-21 03:14:38 +01:00
Rob Ede
cb83922b29 add macos test note 2022-10-17 04:27:34 +01:00
Rob Ede
25209f5bd8 use impl-more in -tls 2022-10-17 04:14:09 +01:00
Rob Ede
c4a0f37d0c fix minimal versions for bytestring 2022-07-23 03:06:44 +01:00
Rob Ede
0e649329b9 fix minimal versions 2022-07-23 01:47:59 +01:00
Rob Ede
66756bc448 update all crates msrv to 1.57 (#464) 2022-07-23 00:51:12 +01:00
Iskandarov Lev
126ed4c2e3 normalize logs capital letter (#463)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-07-22 20:53:06 +01:00
Yuki Okushi
283974f3e6 Make actix-codec an optional dependency (#459) 2022-06-23 17:27:36 +01:00
Yuki Okushi
bf2aa3902c Set depth of --feature-powerset on Windows CI (#460) 2022-06-12 02:17:38 +01:00
63 changed files with 669 additions and 663 deletions

View File

@@ -14,13 +14,10 @@ ci-check = "hack --workspace --feature-powerset --exclude-features=io-uring chec
ci-check-linux = "hack --workspace --feature-powerset check --tests --examples" ci-check-linux = "hack --workspace --feature-powerset check --tests --examples"
# tests avoiding io-uring feature # tests avoiding io-uring feature
ci-test = " hack --feature-powerset --exclude=actix-rt --exclude=actix-server --exclude-features=io-uring test --workspace --lib --tests --no-fail-fast -- --nocapture" ci-test = "hack --feature-powerset --exclude-features=io-uring test --lib --tests --no-fail-fast -- --nocapture"
ci-test-rt = " hack --feature-powerset --exclude-features=io-uring test --package=actix-rt --lib --tests --no-fail-fast -- --nocapture"
ci-test-server = "hack --feature-powerset --exclude-features=io-uring test --package=actix-server --lib --tests --no-fail-fast -- --nocapture" # tests avoiding io-uring feature on Windows
ci-test-win = "hack --feature-powerset --depth 2 --exclude-features=io-uring test --lib --tests --no-fail-fast -- --nocapture"
# test with io-uring feature # test with io-uring feature
ci-test-rt-linux = " hack --feature-powerset test --package=actix-rt --lib --tests --no-fail-fast -- --nocapture" ci-test-linux = "hack --feature-powerset test --lib --tests --no-fail-fast -- --nocapture"
ci-test-server-linux = "hack --feature-powerset test --package=actix-server --lib --tests --no-fail-fast -- --nocapture"
# test lower msrv
ci-test-lower-msrv = "hack --workspace --exclude=actix-server --exclude=actix-tls --feature-powerset test --lib --tests --no-fail-fast -- --nocapture"

View File

@@ -29,7 +29,7 @@ jobs:
if: matrix.target.os == 'macos-latest' if: matrix.target.os == 'macos-latest'
run: sudo ifconfig lo0 alias 127.0.0.3 run: sudo ifconfig lo0 alias 127.0.0.3
- uses: actions/checkout@v2 - uses: actions/checkout@v3
# install OpenSSL on Windows # install OpenSSL on Windows
- name: Set vcpkg root - name: Set vcpkg root
@@ -43,11 +43,10 @@ jobs:
run: vcpkg install openssl:x86-windows run: vcpkg install openssl:x86-windows
- name: Install ${{ matrix.version }} - name: Install ${{ matrix.version }}
uses: actions-rs/toolchain@v1 run: |
with: rustup set profile minimal
toolchain: ${{ matrix.version }}-${{ matrix.target.triple }} rustup install ${{ matrix.version }}-${{ matrix.target.triple }}
profile: minimal rustup override set ${{ matrix.version }}-${{ matrix.target.triple }}
override: true
# - name: Install MSYS2 # - name: Install MSYS2
# if: matrix.target.triple == 'x86_64-pc-windows-gnu' # if: matrix.target.triple == 'x86_64-pc-windows-gnu'
@@ -59,56 +58,44 @@ jobs:
# msys2 -c 'pacman --noconfirm -S base-devel pkg-config' # msys2 -c 'pacman --noconfirm -S base-devel pkg-config'
# - name: Generate Cargo.lock # - name: Generate Cargo.lock
# uses: actions-rs/cargo@v1 # run: cargo generate-lockfile
# with: { command: generate-lockfile }
# - name: Cache Dependencies # - name: Cache Dependencies
# uses: Swatinem/rust-cache@v1.2.0 # uses: Swatinem/rust-cache@v2.2.0
- name: Install cargo-hack - name: Install cargo-hack
uses: actions-rs/cargo@v1 run: cargo install cargo-hack
with:
command: install
args: cargo-hack
- name: check lib - name: check lib
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'
uses: actions-rs/cargo@v1 run: cargo ci-check-lib
with: { command: ci-check-lib }
- name: check lib - name: check lib
if: matrix.target.os == 'ubuntu-latest' if: matrix.target.os == 'ubuntu-latest'
uses: actions-rs/cargo@v1 run: cargo ci-check-lib-linux
with: { command: ci-check-lib-linux }
- name: check lib - name: check lib
if: matrix.target.triple == 'x86_64-pc-windows-gnu' if: matrix.target.triple == 'x86_64-pc-windows-gnu'
uses: actions-rs/cargo@v1 run: cargo ci-check-min
with: { command: ci-check-min }
- 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'
uses: actions-rs/cargo@v1 run: cargo ci-check
with: { command: ci-check }
- name: check all - name: check all
if: matrix.target.os == 'ubuntu-latest' if: matrix.target.os == 'ubuntu-latest'
uses: actions-rs/cargo@v1 run: cargo ci-check-linux
with: { command: ci-check-linux }
- 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'
run: | run: cargo ci-test
cargo ci-test
cargo ci-test-rt
cargo ci-test-server
- name: tests - name: tests
if: matrix.target.os == 'ubuntu-latest' if: matrix.target.os == 'ubuntu-latest'
run: | 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" 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-linux"
- name: Clear the cargo caches - name: Clear the cargo caches
run: | run: |
@@ -119,21 +106,19 @@ jobs:
name: coverage name: coverage
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Install Rust (nightly) - name: Install Rust (nightly)
uses: actions-rs/toolchain@v1 run: |
with: rustup set profile minimal
toolchain: nightly rustup install nightly
profile: minimal rustup override set nightly
override: true
- name: Generate Cargo.lock - name: Generate Cargo.lock
uses: actions-rs/cargo@v1 run: cargo generate-lockfile
with: { command: generate-lockfile }
- name: Cache Dependencies - name: Cache Dependencies
uses: Swatinem/rust-cache@v1.3.0 uses: Swatinem/rust-cache@v2.2.0
- name: Generate coverage file - name: Generate coverage file
if: github.ref == 'refs/heads/master' if: github.ref == 'refs/heads/master'
run: | run: |
@@ -141,73 +126,54 @@ jobs:
cargo tarpaulin --out Xml --verbose cargo tarpaulin --out Xml --verbose
- name: Upload to Codecov - name: Upload to Codecov
if: github.ref == 'refs/heads/master' if: github.ref == 'refs/heads/master'
uses: codecov/codecov-action@v1 uses: codecov/codecov-action@v3
with: { file: cobertura.xml } with: { files: cobertura.xml }
minimal-versions: minimal-versions:
name: minimal versions name: minimal versions
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Install Rust (nightly) - name: Install Rust (nightly)
uses: actions-rs/toolchain@v1 run: |
with: rustup set profile minimal
toolchain: nightly rustup install nightly
profile: minimal rustup override set nightly
override: true
- name: Generate Cargo.lock - name: Generate Cargo.lock
uses: actions-rs/cargo@v1 run: cargo generate-lockfile
with: { command: generate-lockfile }
- name: Cache Dependencies - name: Cache Dependencies
uses: Swatinem/rust-cache@v1.3.0 uses: Swatinem/rust-cache@v2.2.0
- name: Install cargo-minimal-versions - name: Install cargo-minimal-versions
uses: actions-rs/cargo@v1 run: cargo install cargo-minimal-versions
with:
command: install
args: cargo-minimal-versions
- name: Install cargo-hack - name: Install cargo-hack
uses: actions-rs/cargo@v1 run: cargo install cargo-hack
with:
command: install
args: cargo-hack
- name: Check With Minimal Versions - name: Check With Minimal Versions
uses: actions-rs/cargo@v1 run: cargo minimal-versions check
with:
command: minimal-versions
args: check
nextest: nextest:
name: nextest name: nextest
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Install Rust - name: Install Rust
uses: actions-rs/toolchain@v1 run: |
with: rustup set profile minimal
toolchain: stable rustup install stable
profile: minimal rustup override set stable
override: true
- name: Generate Cargo.lock - name: Generate Cargo.lock
uses: actions-rs/cargo@v1 run: cargo generate-lockfile
with: { command: generate-lockfile }
- name: Cache Dependencies - name: Cache Dependencies
uses: Swatinem/rust-cache@v1.3.0 uses: Swatinem/rust-cache@v2.2.0
- name: Install cargo-nextest - name: Install cargo-nextest
uses: actions-rs/cargo@v1 run: cargo install cargo-nextest
with:
command: install
args: cargo-nextest
- name: Test with cargo-nextest - name: Test with cargo-nextest
uses: actions-rs/cargo@v1 run: cargo nextest run
with:
command: nextest
args: run

View File

@@ -18,7 +18,7 @@ jobs:
- { name: Windows (MinGW), os: windows-latest, triple: x86_64-pc-windows-gnu } - { 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.59.0
- stable - stable
name: ${{ matrix.target.name }} / ${{ matrix.version }} name: ${{ matrix.target.name }} / ${{ matrix.version }}
@@ -32,7 +32,7 @@ jobs:
if: matrix.target.os == 'macos-latest' if: matrix.target.os == 'macos-latest'
run: sudo ifconfig lo0 alias 127.0.0.3 run: sudo ifconfig lo0 alias 127.0.0.3
- uses: actions/checkout@v2 - uses: actions/checkout@v3
# install OpenSSL on Windows # install OpenSSL on Windows
- name: Set vcpkg root - name: Set vcpkg root
@@ -46,11 +46,10 @@ jobs:
run: vcpkg install openssl:x86-windows run: vcpkg install openssl:x86-windows
- name: Install ${{ matrix.version }} - name: Install ${{ matrix.version }}
uses: actions-rs/toolchain@v1 run: |
with: rustup set profile minimal
toolchain: ${{ matrix.version }}-${{ matrix.target.triple }} rustup install ${{ matrix.version }}-${{ matrix.target.triple }}
profile: minimal rustup override set ${{ matrix.version }}-${{ matrix.target.triple }}
override: true
# - name: Install MSYS2 # - name: Install MSYS2
# if: matrix.target.triple == 'x86_64-pc-windows-gnu' # if: matrix.target.triple == 'x86_64-pc-windows-gnu'
@@ -62,103 +61,71 @@ jobs:
# msys2 -c 'pacman --noconfirm -S base-devel pkg-config' # msys2 -c 'pacman --noconfirm -S base-devel pkg-config'
# - name: Generate Cargo.lock # - name: Generate Cargo.lock
# uses: actions-rs/cargo@v1 # run: cargo generate-lockfile
# with: { command: generate-lockfile }
# - name: Cache Dependencies # - name: Cache Dependencies
# uses: Swatinem/rust-cache@v1.2.0 # uses: Swatinem/rust-cache@v2.2.0
- name: Install cargo-hack - name: Install cargo-hack
uses: actions-rs/cargo@v1 if: matrix.version != '1.59.0'
with: run: cargo install cargo-hack
command: install
args: cargo-hack # newer cargo-hack versions require 1.60 or above
- name: Install cargo-hack (1.59.0)
if: matrix.version == '1.59.0'
run: cargo install cargo-hack --version=0.5.21
- name: workaround MSRV issues
if: matrix.version == '1.59.0'
run: |
cargo install cargo-edit --version=0.8.0
cargo add env_logger@0.9 --dev -p=actix-tls
cargo add env_logger@0.9 --dev -p=actix-server
- name: Generate Cargo.lock - name: Generate Cargo.lock
uses: actions-rs/cargo@v1 run: cargo generate-lockfile
with: { command: generate-lockfile }
- name: Tweak lockfile - name: workaround MSRV issues
if: matrix.version != 'stable'
run: | run: |
cargo update -p=native-tls --precise=0.2.8 cargo update -p=time --precise=0.3.13 # time is only a dev dep so shouldn't affect msrv
- name: check lib - name: check lib
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'
uses: actions-rs/cargo@v1 run: cargo ci-check-lib
with: { command: ci-check-lib }
- name: check lib - name: check lib
if: matrix.target.os == 'ubuntu-latest' if: matrix.target.os == 'ubuntu-latest'
uses: actions-rs/cargo@v1 run: cargo ci-check-lib-linux
with: { command: ci-check-lib-linux }
- name: check lib - name: check lib
if: matrix.target.triple == 'x86_64-pc-windows-gnu' if: matrix.target.triple == 'x86_64-pc-windows-gnu'
uses: actions-rs/cargo@v1 run: cargo ci-check-min
with: { command: ci-check-min }
- 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'
uses: actions-rs/cargo@v1 run: cargo ci-check
with: { command: ci-check }
- name: check all - name: check all
if: matrix.target.os == 'ubuntu-latest' if: matrix.target.os == 'ubuntu-latest'
uses: actions-rs/cargo@v1 run: cargo ci-check-linux
with: { command: ci-check-linux }
- name: tests
if: matrix.target.os == 'macos-latest'
run: cargo ci-test
- name: tests - name: tests
if: > if: >
matrix.target.os != 'ubuntu-latest' matrix.target.os == 'windows-latest'
&& matrix.target.triple != 'x86_64-pc-windows-gnu' && matrix.target.triple != 'x86_64-pc-windows-gnu'
run: | run: cargo ci-test-win
cargo ci-test
cargo ci-test-rt
cargo ci-test-server
- name: tests - name: tests
if: matrix.target.os == 'ubuntu-latest' if: matrix.target.os == 'ubuntu-latest'
run: | 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" 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-linux"
- name: Clear the cargo caches
run: |
cargo install cargo-cache --version 0.6.2 --no-default-features --features ci-autoclean
cargo-cache
build_and_test_lower_msrv:
name: Linux / 1.49 (lower MSRV)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install 1.49.0 # MSRV for all but -server and -tls
uses: actions-rs/toolchain@v1
with:
toolchain: 1.49.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: Generate Cargo.lock
uses: actions-rs/cargo@v1
with: { command: generate-lockfile }
- name: Tweak lockfile
run: |
cargo update -p=rustls --precise=0.20.2
cargo update -p=native-tls --precise=0.2.8
- name: tests
run: |
sudo bash -c "ulimit -Sl 512 && ulimit -Hl 512 && PATH=$PATH:/usr/share/rust/.cargo/bin && RUSTUP_TOOLCHAIN=1.49 cargo ci-test-lower-msrv"
- name: Clear the cargo caches - name: Clear the cargo caches
if: matrix.version == 'stable' # MSRV(1.58) cargo-cache now fails to install on 1.59
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
@@ -168,20 +135,18 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Install Rust (nightly) - name: Install Rust (nightly)
uses: actions-rs/toolchain@v1 run: |
with: rustup set profile minimal
toolchain: nightly-x86_64-unknown-linux-gnu rustup install nightly
profile: minimal rustup override set nightly
override: true
- name: Generate Cargo.lock - name: Generate Cargo.lock
uses: actions-rs/cargo@v1 run: cargo generate-lockfile
with: { command: generate-lockfile }
- name: Cache Dependencies - name: Cache Dependencies
uses: Swatinem/rust-cache@v1.3.0 uses: Swatinem/rust-cache@v2.2.0
- name: doc tests io-uring - name: doc tests io-uring
run: | run: |

View File

@@ -8,35 +8,30 @@ jobs:
fmt: fmt:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Install Rust - name: Install Rust
uses: actions-rs/toolchain@v1 run: |
with: rustup set profile minimal
toolchain: stable rustup install stable
profile: minimal rustup override set stable
components: rustfmt rustup component add rustfmt
override: true
- name: Rustfmt Check - name: Rustfmt Check
uses: actions-rs/cargo@v1 run: cargo fmt --all -- --check
with:
command: fmt
args: --all -- --check
clippy: clippy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Install Rust - name: Install Rust
uses: actions-rs/toolchain@v1 run: |
rustup set profile minimal
rustup install stable
rustup override set stable
rustup component add clippy
- uses: giraffate/clippy-action@v1
with: with:
toolchain: stable reporter: "github-pr-check"
profile: minimal github_token: ${{ secrets.GITHUB_TOKEN }}
components: clippy clippy_flags: --workspace --all-features --tests --examples --bins -- -Dclippy::todo
override: true
- name: Clippy Check
uses: actions-rs/clippy-check@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
args: --workspace --all-features --tests --examples --bins -- -Dclippy::todo

View File

@@ -9,27 +9,21 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Install Rust - name: Install Rust
uses: actions-rs/toolchain@v1 run: |
with: rustup set profile minimal
toolchain: nightly-x86_64-unknown-linux-gnu rustup install nightly
profile: minimal rustup override set nightly
override: true
- name: Build Docs - name: Build Docs
uses: actions-rs/cargo@v1 run: cargo doc --workspace --all-features --no-deps
with:
command: doc
args: --workspace --all-features --no-deps
- name: Tweak HTML - name: Tweak HTML
run: echo '<meta http-equiv="refresh" content="0;url=actix_server/index.html">' > target/doc/index.html run: echo '<meta http-equiv="refresh" content="0;url=actix_server/index.html">' > target/doc/index.html
- name: Deploy to GitHub Pages - name: Deploy to GitHub Pages
uses: JamesIves/github-pages-deploy-action@3.7.1 uses: JamesIves/github-pages-deploy-action@v4
with: with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} folder: target/doc
BRANCH: gh-pages
FOLDER: target/doc

View File

@@ -8,19 +8,19 @@ In the interest of fostering an open and welcoming environment, we as contributo
Examples of behavior that contributes to creating a positive environment include: Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language - Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences - Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism - Gracefully accepting constructive criticism
* Focusing on what is best for the community - Focusing on what is best for the community
* Showing empathy towards other community members - Showing empathy towards other community members
Examples of unacceptable behavior by participants include: Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances - The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks - Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment - Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission - Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting - Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities ## Our Responsibilities
@@ -39,7 +39,7 @@ Instances of abusive, harassing, or otherwise unacceptable behavior may be repor
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
[@robjtede]: https://github.com/robjtede [@robjtede]: https://github.com/robjtede
[@JohnTitor]: https://github.com/JohnTitor [@johntitor]: https://github.com/JohnTitor
## Attribution ## Attribution

View File

@@ -13,7 +13,7 @@ See example folders for [`actix-server`](./actix-server/examples) and [`actix-tl
## MSRV ## MSRV
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. Crates in this repo currently have a Minimum Supported Rust Version (MSRV) of 1.59. As a policy, we permit MSRV increases in non-breaking releases.
## License ## License

View File

@@ -2,37 +2,39 @@
## Unreleased - 2022-xx-xx ## Unreleased - 2022-xx-xx
- Minimum supported Rust version (MSRV) is now 1.59.
## 0.5.1 - 2022-03-15 ## 0.5.1 - 2022-03-15
- Logs emitted now use the `tracing` crate with `log` compatibility. [#451] - Logs emitted now use the `tracing` crate with `log` compatibility. [#451]
- Minimum supported Rust version (MSRV) is now 1.49. - Minimum supported Rust version (MSRV) is now 1.49.
[#451]: https://github.com/actix/actix-net/pull/451 [#451]: https://github.com/actix/actix-net/pull/451
## 0.5.0 - 2022-02-15 ## 0.5.0 - 2022-02-15
- Updated `tokio-util` dependency to `0.7.0`. [#446] - Updated `tokio-util` dependency to `0.7.0`. [#446]
[#446]: https://github.com/actix/actix-net/pull/446 [#446]: https://github.com/actix/actix-net/pull/446
## 0.4.2 - 2021-12-31 ## 0.4.2 - 2021-12-31
- No significant changes since `0.4.1`. - No significant changes since `0.4.1`.
## 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]
@@ -40,16 +42,16 @@
[#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.
@@ -58,31 +60,31 @@
- 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.

View File

@@ -23,12 +23,12 @@ 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 }
memchr = "2.3" memchr = "2.3"
pin-project-lite = "0.2" pin-project-lite = "0.2"
tokio = "1.13.1" tokio = "1.18.4"
tokio-util = { version = "0.7", features = ["codec", "io"] } tokio-util = { version = "0.7", features = ["codec", "io"] }
tracing = { version = "0.1.30", default-features = false, features = ["log"] } tracing = { version = "0.1.30", default-features = false, features = ["log"] }
[dev-dependencies] [dev-dependencies]
criterion = { version = "0.3", features = ["html_reports"] } criterion = { version = "0.4", features = ["html_reports"] }
tokio-test = "0.4.2" tokio-test = "0.4.2"
[[bench]] [[bench]]

View File

@@ -1,8 +1,7 @@
//! Codec utilities for working with framed protocols. //! Codec utilities for working with framed protocols.
//! //!
//! Contains adapters to go from streams of bytes, [`AsyncRead`] and //! Contains adapters to go from streams of bytes, [`AsyncRead`] and [`AsyncWrite`], to framed
//! [`AsyncWrite`], to framed streams implementing [`Sink`] and [`Stream`]. //! streams implementing [`Sink`] and [`Stream`]. Framed streams are also known as `transports`.
//! Framed streams are also known as `transports`.
//! //!
//! [`Sink`]: futures_sink::Sink //! [`Sink`]: futures_sink::Sink
//! [`Stream`]: futures_core::Stream //! [`Stream`]: futures_core::Stream

View File

@@ -1,47 +1,48 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased - 2022-xx-xx
- Minimum supported Rust version (MSRV) is now 1.49.
- Minimum supported Rust version (MSRV) is now 1.59.
## 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

View File

@@ -16,12 +16,12 @@ edition = "2018"
proc-macro = true proc-macro = true
[dependencies] [dependencies]
quote = "1.0.3" quote = "1"
syn = { version = "^1", features = ["full"] } syn = { version = "1", features = ["full"] }
[dev-dependencies] [dev-dependencies]
actix-rt = "2.0.0" actix-rt = "2"
futures-util = { version = "0.3.7", default-features = false } futures-util = { version = "0.3.17", default-features = false }
rustversion = "1" rustversion = "1"
trybuild = "1" trybuild = "1"

View File

@@ -1,4 +1,4 @@
#[rustversion::stable(1.46)] // MSRV #[rustversion::stable(1.59)] // MSRV
#[test] #[test]
fn compile_macros() { fn compile_macros() {
let t = trybuild::TestCases::new(); let t = trybuild::TestCases::new();

View File

@@ -1,90 +1,95 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased - 2022-xx-xx
## 2.8.0 - 2022-12-21
- Add `#[track_caller]` attribute to `spawn` functions and methods. [#454] - Add `#[track_caller]` attribute to `spawn` functions and methods. [#454]
- Update `tokio-uring` dependency to `0.4`. [#473]
- Minimum supported Rust version (MSRV) is now 1.59.
[#454]: https://github.com/actix/actix-net/pull/454 [#454]: https://github.com/actix/actix-net/pull/454
[#473]: https://github.com/actix/actix-net/pull/473
## 2.7.0 - 2022-03-08 ## 2.7.0 - 2022-03-08
- Update `tokio-uring` dependency to `0.3.0`. [#448]
- Update `tokio-uring` dependency to `0.3`. [#448]
- Minimum supported Rust version (MSRV) is now 1.49. - Minimum supported Rust version (MSRV) is now 1.49.
[#448]: https://github.com/actix/actix-net/pull/448 [#448]: https://github.com/actix/actix-net/pull/448
## 2.6.0 - 2022-01-12 ## 2.6.0 - 2022-01-12
- Update `tokio-uring` dependency to `0.2.0`. [#436]
- Update `tokio-uring` dependency to `0.2`. [#436]
[#436]: https://github.com/actix/actix-net/pull/436 [#436]: https://github.com/actix/actix-net/pull/436
## 2.5.1 - 2021-12-31 ## 2.5.1 - 2021-12-31
- Expose `System::with_tokio_rt` and `Arbiter::with_tokio_rt`. [#430] - Expose `System::with_tokio_rt` and `Arbiter::with_tokio_rt`. [#430]
[#430]: https://github.com/actix/actix-net/pull/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
`Ready` object in ok variant. [#293] - **BREAKING** `ActixStream::{poll_read_ready, poll_write_ready}` methods now return `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.
[#293]: https://github.com/actix/actix-net/pull/293 [#293]: https://github.com/actix/actix-net/pull/293
## 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]
@@ -107,21 +112,20 @@
[#256]: https://github.com/actix/actix-net/pull/256 [#256]: https://github.com/actix/actix-net/pull/256
[#257]: https://github.com/actix/actix-net/pull/257 [#257]: https://github.com/actix/actix-net/pull/257
## 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]
@@ -129,74 +133,73 @@
[#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
[#99]: https://github.com/actix/actix-net/pull/99 [#99]: https://github.com/actix/actix-net/pull/99
[#124]: https://github.com/actix/actix-net/pull/124 [#124]: https://github.com/actix/actix-net/pull/124
## 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

View File

@@ -1,10 +1,9 @@
[package] [package]
name = "actix-rt" name = "actix-rt"
version = "2.7.0" version = "2.8.0"
authors = [ authors = [
"Nikolay Kim <fafhrd91@gmail.com>", "Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>", "Rob Ede <robjtede@icloud.com>",
"fakeshadow <24548779@qq.com>",
] ]
description = "Tokio-based single-threaded async runtime for the Actix ecosystem" description = "Tokio-based single-threaded async runtime for the Actix ecosystem"
keywords = ["async", "futures", "io", "runtime"] keywords = ["async", "futures", "io", "runtime"]
@@ -27,12 +26,12 @@ io-uring = ["tokio-uring"]
actix-macros = { version = "0.2.3", optional = true } 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.18.4", 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.3", optional = true } tokio-uring = { version = "0.4", optional = true }
[dev-dependencies] [dev-dependencies]
tokio = { version = "1.13.1", features = ["full"] } tokio = { version = "1.18.4", features = ["full"] }
hyper = { version = "0.14.10", default-features = false, features = ["server", "tcp", "http1"] } hyper = { version = "0.14.10", default-features = false, features = ["server", "tcp", "http1"] }

View File

@@ -3,11 +3,11 @@
> Tokio-based single-threaded async runtime for the Actix ecosystem. > Tokio-based single-threaded async runtime for the Actix ecosystem.
[![crates.io](https://img.shields.io/crates/v/actix-rt?label=latest)](https://crates.io/crates/actix-rt) [![crates.io](https://img.shields.io/crates/v/actix-rt?label=latest)](https://crates.io/crates/actix-rt)
[![Documentation](https://docs.rs/actix-rt/badge.svg?version=2.7.0)](https://docs.rs/actix-rt/2.7.0) [![Documentation](https://docs.rs/actix-rt/badge.svg?version=2.8.0)](https://docs.rs/actix-rt/2.8.0)
[![Version](https://img.shields.io/badge/rustc-1.46+-ab6000.svg)](https://blog.rust-lang.org/2020/03/12/Rust-1.46.html) [![Version](https://img.shields.io/badge/rustc-1.46+-ab6000.svg)](https://blog.rust-lang.org/2020/03/12/Rust-1.46.html)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-rt.svg) ![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-rt.svg)
<br /> <br />
[![dependency status](https://deps.rs/crate/actix-rt/2.7.0/status.svg)](https://deps.rs/crate/actix-rt/2.7.0) [![dependency status](https://deps.rs/crate/actix-rt/2.8.0/status.svg)](https://deps.rs/crate/actix-rt/2.8.0)
![Download](https://img.shields.io/crates/d/actix-rt.svg) ![Download](https://img.shields.io/crates/d/actix-rt.svg)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/WghFtEH6Hb) [![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/WghFtEH6Hb)

View File

@@ -303,7 +303,7 @@ impl Future for ArbiterRunner {
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> {
// process all items currently buffered in channel // process all items currently buffered in channel
loop { loop {
match ready!(Pin::new(&mut self.rx).poll_recv(cx)) { match ready!(self.rx.poll_recv(cx)) {
// channel closed; no more messages can be received // channel closed; no more messages can be received
None => return Poll::Ready(()), None => return Poll::Ready(()),

View File

@@ -292,7 +292,7 @@ impl Future for SystemController {
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> {
// process all items currently buffered in channel // process all items currently buffered in channel
loop { loop {
match ready!(Pin::new(&mut self.cmd_rx).poll_recv(cx)) { match ready!(self.cmd_rx.poll_recv(cx)) {
// channel closed; no more messages can be received // channel closed; no more messages can be received
None => return Poll::Ready(()), None => return Poll::Ready(()),

View File

@@ -2,61 +2,68 @@
## Unreleased - 2022-xx-xx ## Unreleased - 2022-xx-xx
## 2.2.0 - 2022-12-21
- Minimum supported Rust version (MSRV) is now 1.59.
- Update `tokio-uring` dependency to `0.4`. [#473]
[#473]: https://github.com/actix/actix-net/pull/473
## 2.1.1 - 2022-03-09 ## 2.1.1 - 2022-03-09
- No significant changes since `2.1.0`. - No significant changes since `2.1.0`.
## 2.1.0 - 2022-03-08 ## 2.1.0 - 2022-03-08
- Update `tokio-uring` dependency to `0.3.0`. [#448]
- Update `tokio-uring` dependency to `0.3`. [#448]
- Logs emitted now use the `tracing` crate with `log` compatibility. [#448] - Logs emitted now use the `tracing` crate with `log` compatibility. [#448]
- Wait for accept thread to stop before sending completion signal. [#443] - Wait for accept thread to stop before sending completion signal. [#443]
[#443]: https://github.com/actix/actix-net/pull/443 [#443]: https://github.com/actix/actix-net/pull/443
[#448]: https://github.com/actix/actix-net/pull/448 [#448]: https://github.com/actix/actix-net/pull/448
## 2.0.0 - 2022-01-19 ## 2.0.0 - 2022-01-19
- No significant changes since `2.0.0-rc.4`. - No significant changes since `2.0.0-rc.4`.
## 2.0.0-rc.4 - 2022-01-12 ## 2.0.0-rc.4 - 2022-01-12
- Update `tokio-uring` dependency to `0.2.0`. [#436]
- Update `tokio-uring` dependency to `0.2`. [#436]
[#436]: https://github.com/actix/actix-net/pull/436 [#436]: https://github.com/actix/actix-net/pull/436
## 2.0.0-rc.3 - 2021-12-31 ## 2.0.0-rc.3 - 2021-12-31
- No significant changes since `2.0.0-rc.2`. - No significant changes since `2.0.0-rc.2`.
## 2.0.0-rc.2 - 2021-12-27 ## 2.0.0-rc.2 - 2021-12-27
- Simplify `TestServer`. [#431] - Simplify `TestServer`. [#431]
[#431]: https://github.com/actix/actix-net/pull/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]
@@ -68,34 +75,31 @@
[#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 this change. [#349]
- Remove `config` module. `ServiceConfig`, `ServiceRuntime` public types are removed due to
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
[#389]: https://github.com/actix/actix-net/pull/389 [#389]: https://github.com/actix/actix-net/pull/389
## 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
workers to shutdown immediately in force shutdown case. [#333] - Server shutdown notifies all workers to exit regardless if shutdown is graceful. This causes all 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]
@@ -106,149 +110,148 @@
[#265]: https://github.com/actix/actix-net/pull/265 [#265]: https://github.com/actix/actix-net/pull/265
[#273]: https://github.com/actix/actix-net/pull/273 [#273]: https://github.com/actix/actix-net/pull/273
## 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
[#239]: https://github.com/actix/actix-net/pull/239 [#239]: https://github.com/actix/actix-net/pull/239
## 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

View File

@@ -1,9 +1,8 @@
[package] [package]
name = "actix-server" name = "actix-server"
version = "2.1.1" version = "2.2.0"
authors = [ authors = [
"Nikolay Kim <fafhrd91@gmail.com>", "Nikolay Kim <fafhrd91@gmail.com>",
"fakeshadow <24548779@qq.com>",
"Rob Ede <robjtede@icloud.com>", "Rob Ede <robjtede@icloud.com>",
"Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com>", "Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com>",
] ]
@@ -24,27 +23,27 @@ default = []
io-uring = ["tokio-uring", "actix-rt/io-uring"] io-uring = ["tokio-uring", "actix-rt/io-uring"]
[dependencies] [dependencies]
actix-rt = { version = "2.7", default-features = false } actix-rt = { version = "2.8", default-features = false }
actix-service = "2" actix-service = "2"
actix-utils = "3" actix-utils = "3"
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] } futures-core = { version = "0.3.17", default-features = false, features = ["alloc"] }
futures-util = { version = "0.3.7", default-features = false, features = ["alloc"] } futures-util = { version = "0.3.17", default-features = false, features = ["alloc"] }
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.18.4", features = ["sync"] }
tracing = { version = "0.1.30", default-features = false, features = ["log"] } 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.3", optional = true } tokio-uring = { version = "0.4", optional = true }
[dev-dependencies] [dev-dependencies]
actix-codec = "0.5.0" actix-codec = "0.5"
actix-rt = "2.6.0" actix-rt = "2.8"
bytes = "1" bytes = "1"
env_logger = "0.9" env_logger = "0.10"
futures-util = { version = "0.3.7", default-features = false, features = ["sink", "async-await-macro"] } futures-util = { version = "0.3.17", default-features = false, features = ["sink", "async-await-macro"] }
tokio = { version = "1.13.1", features = ["io-util", "rt-multi-thread", "macros", "fs"] } tokio = { version = "1.18.4", features = ["io-util", "rt-multi-thread", "macros", "fs"] }

View File

@@ -3,10 +3,10 @@
> General purpose TCP server built for the Actix ecosystem. > General purpose TCP server built for the Actix ecosystem.
[![crates.io](https://img.shields.io/crates/v/actix-server?label=latest)](https://crates.io/crates/actix-server) [![crates.io](https://img.shields.io/crates/v/actix-server?label=latest)](https://crates.io/crates/actix-server)
[![Documentation](https://docs.rs/actix-server/badge.svg?version=2.1.1)](https://docs.rs/actix-server/2.1.1) [![Documentation](https://docs.rs/actix-server/badge.svg?version=2.2.0)](https://docs.rs/actix-server/2.2.0)
[![Version](https://img.shields.io/badge/rustc-1.52+-ab6000.svg)](https://blog.rust-lang.org/2021/05/06/Rust-1.52.0.html) [![Version](https://img.shields.io/badge/rustc-1.52+-ab6000.svg)](https://blog.rust-lang.org/2021/05/06/Rust-1.52.0.html)
![License](https://img.shields.io/crates/l/actix-server.svg) ![License](https://img.shields.io/crates/l/actix-server.svg)
[![Dependency Status](https://deps.rs/crate/actix-server/2.1.1/status.svg)](https://deps.rs/crate/actix-server/2.1.1) [![Dependency Status](https://deps.rs/crate/actix-server/2.2.0/status.svg)](https://deps.rs/crate/actix-server/2.2.0)
![Download](https://img.shields.io/crates/d/actix-server.svg) ![Download](https://img.shields.io/crates/d/actix-server.svg)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x) [![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)

View File

@@ -74,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| tracing::error!("Service Error: {:?}", err)) .map_err(|err| tracing::error!("service error: {:?}", err))
})? })?
.workers(2) .workers(2)
.run() .run()

View File

@@ -64,7 +64,7 @@ async fn run() -> io::Result<()> {
// stream error; bail from loop with error // stream error; bail from loop with error
Err(err) => { Err(err) => {
tracing::error!("Stream Error: {:?}", err); tracing::error!("stream error: {:?}", err);
return Err(()); return Err(());
} }
} }
@@ -74,7 +74,7 @@ async fn run() -> io::Result<()> {
Ok((buf.freeze(), size)) Ok((buf.freeze(), size))
} }
}) })
.map_err(|err| tracing::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);
tracing::info!("[{}] total bytes read: {}", num, size); tracing::info!("[{}] total bytes read: {}", num, size);

View File

@@ -24,7 +24,7 @@ struct ServerSocketInfo {
timeout: Option<actix_rt::time::Instant>, timeout: Option<actix_rt::time::Instant>,
} }
/// poll instance of the server. /// Poll instance of the server.
pub(crate) struct Accept { pub(crate) struct Accept {
poll: Poll, poll: Poll,
waker_queue: WakerQueue, waker_queue: WakerQueue,
@@ -140,7 +140,7 @@ impl Accept {
WAKER_TOKEN => { WAKER_TOKEN => {
let exit = self.handle_waker(sockets); let exit = self.handle_waker(sockets);
if exit { if exit {
info!("Accept thread stopped"); info!("accept thread stopped");
return; return;
} }
} }
@@ -161,11 +161,13 @@ impl Accept {
// a loop that would try to drain the command channel. It's yet unknown // a loop that would try to drain the command channel. It's yet unknown
// if it's necessary/good practice to actively drain the waker queue. // if it's necessary/good practice to actively drain the waker queue.
loop { loop {
// take guard with every iteration so no new interest can be added // Take guard with every iteration so no new interests can be added until the current
// until the current task is done. // task is done. Take care not to take the guard again inside this loop.
let mut guard = self.waker_queue.guard(); let mut guard = self.waker_queue.guard();
#[allow(clippy::significant_drop_in_scrutinee)]
match guard.pop_front() { match guard.pop_front() {
// worker notify it becomes available. // Worker notified it became available.
Some(WakerInterest::WorkerAvailable(idx)) => { Some(WakerInterest::WorkerAvailable(idx)) => {
drop(guard); drop(guard);
@@ -176,7 +178,7 @@ impl Accept {
} }
} }
// a new worker thread is made and it's handle would be added to Accept // A new worker thread has been created so store its handle.
Some(WakerInterest::Worker(handle)) => { Some(WakerInterest::Worker(handle)) => {
drop(guard); drop(guard);
@@ -297,16 +299,16 @@ impl Accept {
fn register_logged(&self, info: &mut ServerSocketInfo) { fn register_logged(&self, info: &mut ServerSocketInfo) {
match self.register(info) { match self.register(info) {
Ok(_) => debug!("Resume accepting connections on {}", info.lst.local_addr()), Ok(_) => debug!("resume accepting connections on {}", info.lst.local_addr()),
Err(err) => error!("Can not register server socket {}", err), Err(err) => error!("can not register server socket {}", err),
} }
} }
fn deregister_logged(&self, info: &mut ServerSocketInfo) { fn deregister_logged(&self, info: &mut ServerSocketInfo) {
match self.poll.registry().deregister(&mut info.lst) { match self.poll.registry().deregister(&mut info.lst) {
Ok(_) => debug!("Paused accepting connections on {}", info.lst.local_addr()), Ok(_) => debug!("paused accepting connections on {}", info.lst.local_addr()),
Err(err) => { Err(err) => {
error!("Can not deregister server socket {}", err) error!("can not deregister server socket {}", err)
} }
} }
} }
@@ -350,7 +352,7 @@ impl Accept {
self.remove_next(); self.remove_next();
if self.handles.is_empty() { if self.handles.is_empty() {
error!("No workers"); error!("no workers");
// All workers are gone and Conn is nowhere to be sent. // All workers are gone and Conn is nowhere to be sent.
// Treat this situation as Ok and drop Conn. // Treat this situation as Ok and drop Conn.
return Ok(()); return Ok(());
@@ -399,7 +401,7 @@ impl Accept {
Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => return, Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => return,
Err(ref err) if connection_error(err) => continue, Err(ref err) if connection_error(err) => continue,
Err(err) => { Err(err) => {
error!("Error accepting connection: {}", err); error!("error accepting connection: {}", err);
// deregister listener temporary // deregister listener temporary
self.deregister_logged(info); self.deregister_logged(info);

View File

@@ -197,7 +197,7 @@ impl ServerBuilder {
if self.sockets.is_empty() { if self.sockets.is_empty() {
panic!("Server should have at least one bound socket"); panic!("Server should have at least one bound socket");
} else { } else {
info!("Starting {} workers", self.threads); info!("starting {} workers", self.threads);
Server::new(self) Server::new(self)
} }
} }

View File

@@ -200,7 +200,7 @@ impl ServerInner {
for (_, name, lst) in &builder.sockets { for (_, name, lst) in &builder.sockets {
info!( info!(
r#"Starting service: "{}", workers: {}, listening on: {}"#, r#"starting service: "{}", workers: {}, listening on: {}"#,
name, name,
builder.threads, builder.threads,
lst.local_addr() lst.local_addr()
@@ -283,7 +283,7 @@ impl ServerInner {
// TODO: maybe just return with warning log if not found ? // TODO: maybe just return with warning log if not found ?
assert!(self.worker_handles.iter().any(|wrk| wrk.idx == idx)); assert!(self.worker_handles.iter().any(|wrk| wrk.idx == idx));
error!("Worker {} has died; restarting", idx); error!("worker {} has died; restarting", idx);
let factories = self let factories = self
.services .services
@@ -363,6 +363,6 @@ impl Stream for ServerEventMultiplexer {
} }
} }
Pin::new(&mut this.cmd_rx).poll_recv(cx) this.cmd_rx.poll_recv(cx)
} }
} }

View File

@@ -78,7 +78,7 @@ where
Ok(()) Ok(())
} }
Err(err) => { Err(err) => {
error!("Can not convert to an async tcp stream: {}", err); error!("can not convert to an async TCP stream: {}", err);
Err(()) Err(())
} }
}) })

View File

@@ -70,7 +70,7 @@ impl Signals {
.map(|tokio_sig| (*sig, tokio_sig)) .map(|tokio_sig| (*sig, tokio_sig))
.map_err(|e| { .map_err(|e| {
tracing::error!( tracing::error!(
"Can not initialize stream handler for {:?} err: {}", "can not initialize stream handler for {:?} err: {}",
sig, sig,
e e
) )
@@ -96,7 +96,7 @@ impl Future for Signals {
#[cfg(unix)] #[cfg(unix)]
{ {
for (sig, fut) in self.signals.iter_mut() { for (sig, fut) in self.signals.iter_mut() {
if Pin::new(fut).poll_recv(cx).is_ready() { if fut.poll_recv(cx).is_ready() {
trace!("{} received", sig); trace!("{} received", sig);
return Poll::Ready(*sig); return Poll::Ready(*sig);
} }

View File

@@ -337,7 +337,7 @@ impl ServerWorker {
Ok((token, svc)) => services.push((idx, token, svc)), Ok((token, svc)) => services.push((idx, token, svc)),
Err(err) => { Err(err) => {
error!("Can not start worker: {:?}", err); error!("can not start worker: {:?}", err);
return Err(io::Error::new( return Err(io::Error::new(
io::ErrorKind::Other, io::ErrorKind::Other,
format!("can not start server service {}", idx), format!("can not start server service {}", idx),
@@ -436,7 +436,7 @@ impl ServerWorker {
Ok((token, svc)) => services.push((idx, token, svc)), Ok((token, svc)) => services.push((idx, token, svc)),
Err(err) => { Err(err) => {
error!("Can not start worker: {:?}", err); error!("can not start worker: {:?}", err);
Arbiter::current().stop(); Arbiter::current().stop();
factory_tx factory_tx
.send(Err(io::Error::new( .send(Err(io::Error::new(
@@ -476,7 +476,7 @@ impl ServerWorker {
fn restart_service(&mut self, idx: usize, factory_id: usize) { fn restart_service(&mut self, idx: usize, factory_id: usize) {
let factory = &self.factories[factory_id]; let factory = &self.factories[factory_id];
trace!("Service {:?} failed, restarting", factory.name(idx)); trace!("service {:?} failed, restarting", factory.name(idx));
self.services[idx].status = WorkerServiceStatus::Restarting; self.services[idx].status = WorkerServiceStatus::Restarting;
self.state = WorkerState::Restarting(Restart { self.state = WorkerState::Restarting(Restart {
factory_id, factory_id,
@@ -508,7 +508,7 @@ impl ServerWorker {
Poll::Ready(Ok(_)) => { Poll::Ready(Ok(_)) => {
if srv.status == WorkerServiceStatus::Unavailable { if srv.status == WorkerServiceStatus::Unavailable {
trace!( trace!(
"Service {:?} is available", "service {:?} is available",
self.factories[srv.factory_idx].name(idx) self.factories[srv.factory_idx].name(idx)
); );
srv.status = WorkerServiceStatus::Available; srv.status = WorkerServiceStatus::Available;
@@ -519,7 +519,7 @@ impl ServerWorker {
if srv.status == WorkerServiceStatus::Available { if srv.status == WorkerServiceStatus::Available {
trace!( trace!(
"Service {:?} is unavailable", "service {:?} is unavailable",
self.factories[srv.factory_idx].name(idx) self.factories[srv.factory_idx].name(idx)
); );
srv.status = WorkerServiceStatus::Unavailable; srv.status = WorkerServiceStatus::Unavailable;
@@ -527,7 +527,7 @@ impl ServerWorker {
} }
Poll::Ready(Err(_)) => { Poll::Ready(Err(_)) => {
error!( error!(
"Service {:?} readiness check returned error, restarting", "service {:?} readiness check returned error, restarting",
self.factories[srv.factory_idx].name(idx) self.factories[srv.factory_idx].name(idx)
); );
srv.status = WorkerServiceStatus::Failed; srv.status = WorkerServiceStatus::Failed;
@@ -585,16 +585,14 @@ impl Future for ServerWorker {
let this = self.as_mut().get_mut(); let this = self.as_mut().get_mut();
// `StopWorker` message handler // `StopWorker` message handler
if let Poll::Ready(Some(Stop { graceful, tx })) = if let Poll::Ready(Some(Stop { graceful, tx })) = this.stop_rx.poll_recv(cx) {
Pin::new(&mut this.stop_rx).poll_recv(cx)
{
let num = this.counter.total(); let num = this.counter.total();
if num == 0 { if num == 0 {
info!("Shutting down idle worker"); info!("shutting down idle worker");
let _ = tx.send(true); let _ = tx.send(true);
return Poll::Ready(()); return Poll::Ready(());
} else if graceful { } else if graceful {
info!("Graceful worker shutdown; finishing {} connections", num); info!("graceful worker shutdown; finishing {} connections", num);
this.shutdown(false); this.shutdown(false);
this.state = WorkerState::Shutdown(Shutdown { this.state = WorkerState::Shutdown(Shutdown {
@@ -603,7 +601,7 @@ impl Future for ServerWorker {
tx, tx,
}); });
} else { } else {
info!("Force shutdown worker, closing {} connections", num); info!("force shutdown worker, closing {} connections", num);
this.shutdown(true); this.shutdown(true);
let _ = tx.send(false); let _ = tx.send(false);
@@ -638,7 +636,7 @@ impl Future for ServerWorker {
assert_eq!(token, token_new); assert_eq!(token, token_new);
trace!( trace!(
"Service {:?} has been restarted", "service {:?} has been restarted",
this.factories[factory_id].name(token) this.factories[factory_id].name(token)
); );
@@ -649,7 +647,7 @@ impl Future for ServerWorker {
} }
WorkerState::Shutdown(ref mut shutdown) => { WorkerState::Shutdown(ref mut shutdown) => {
// drop all pending connections in rx channel. // drop all pending connections in rx channel.
while let Poll::Ready(Some(conn)) = Pin::new(&mut this.conn_rx).poll_recv(cx) { while let Poll::Ready(Some(conn)) = this.conn_rx.poll_recv(cx) {
// WorkerCounterGuard is needed as Accept thread has incremented counter. // WorkerCounterGuard is needed as Accept thread has incremented counter.
// It's guard's job to decrement the counter together with drop of Conn. // It's guard's job to decrement the counter together with drop of Conn.
let guard = this.counter.guard(); let guard = this.counter.guard();
@@ -685,7 +683,7 @@ impl Future for ServerWorker {
match this.check_readiness(cx) { match this.check_readiness(cx) {
Ok(true) => {} Ok(true) => {}
Ok(false) => { Ok(false) => {
trace!("Worker is unavailable"); trace!("worker is unavailable");
this.state = WorkerState::Unavailable; this.state = WorkerState::Unavailable;
return self.poll(cx); return self.poll(cx);
} }
@@ -696,7 +694,7 @@ impl Future for ServerWorker {
} }
// handle incoming io stream // handle incoming io stream
match ready!(Pin::new(&mut this.conn_rx).poll_recv(cx)) { match ready!(this.conn_rx.poll_recv(cx)) {
Some(msg) => { Some(msg) => {
let guard = this.counter.guard(); let guard = this.counter.guard();
let _ = this.services[msg.token].service.call((guard, msg.io)); let _ = this.services[msg.token].service.call((guard, msg.io));

View File

@@ -186,9 +186,9 @@ fn test_start() {
#[actix_rt::test] #[actix_rt::test]
async fn test_max_concurrent_connections() { async fn test_max_concurrent_connections() {
// Note: // Note:
// A tcp listener would accept connects based on it's backlog setting. // A TCP listener would accept connects based on it's backlog setting.
// //
// The limit test on the other hand is only for concurrent tcp stream limiting a work // The limit test on the other hand is only for concurrent TCP stream limiting a work
// thread accept. // thread accept.
use tokio::io::AsyncWriteExt; use tokio::io::AsyncWriteExt;

View File

@@ -1,36 +1,37 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased - 2022-xx-xx
- Minimum supported Rust version (MSRV) is now 1.49.
- Minimum supported Rust version (MSRV) is now 1.59.
## 2.0.2 - 2021-12-18 ## 2.0.2 - 2021-12-18
- Service types can now be `Send` and `'static` regardless of request, response, and config types, etc. [#397] - 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. [#388] - Documentation fix. [#388]
[#388]: https://github.com/actix/actix-net/pull/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]
@@ -38,158 +39,153 @@
[#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
parameter instead of an associated type. [#232] - `Service`, other traits, and many type signatures now take the the request type as a type 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
[#235]: https://github.com/actix/actix-net/pull/235 [#235]: https://github.com/actix/actix-net/pull/235
## 1.0.6 - 2020-08-09 ## 1.0.6 - 2020-08-09
- 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
service combinators. Attempts to acquire several mutable references to the same data will instead
result in a panic.
- 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 service combinators. Attempts to acquire several mutable references to the same data will instead 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 {
type Response = Response; type Response = Response;
// ... // ...
} }
``` ```
* After: - After:
```rust ```rust
impl Service for Client { impl Service for Client {
type Request = Request; type Request = Request;
@@ -198,31 +194,31 @@
} }
``` ```
## 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

View File

@@ -4,7 +4,6 @@ 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>",
"fakeshadow <24548779@qq.com>",
] ]
description = "Service trait and combinators for representing asynchronous request/response operations." description = "Service trait and combinators for representing asynchronous request/response operations."
keywords = ["network", "framework", "async", "futures", "service"] keywords = ["network", "framework", "async", "futures", "service"]
@@ -18,11 +17,11 @@ name = "actix_service"
path = "src/lib.rs" path = "src/lib.rs"
[dependencies] [dependencies]
futures-core = { version = "0.3.7", default-features = false } futures-core = { version = "0.3.17", default-features = false }
paste = "1" paste = "1"
pin-project-lite = "0.2" pin-project-lite = "0.2"
[dev-dependencies] [dev-dependencies]
actix-rt = "2.0.0" actix-rt = "2"
actix-utils = "3.0.0" actix-utils = "3"
futures-util = { version = "0.3.7", default-features = false } futures-util = { version = "0.3.17", default-features = false }

View File

@@ -25,6 +25,8 @@
/// } /// }
/// } /// }
/// ``` /// ```
///
/// [`forward_ready!`]: crate::forward_ready
#[macro_export] #[macro_export]
macro_rules! always_ready { macro_rules! always_ready {
() => { () => {

View File

@@ -2,39 +2,42 @@
## Unreleased - 2022-xx-xx ## Unreleased - 2022-xx-xx
- Minimum supported Rust version (MSRV) is now 1.59.
## 3.0.4 - 2022-03-15 ## 3.0.4 - 2022-03-15
- Logs emitted now use the `tracing` crate with `log` compatibility. [#451] - Logs emitted now use the `tracing` crate with `log` compatibility. [#451]
[#451]: https://github.com/actix/actix-net/pull/451 [#451]: https://github.com/actix/actix-net/pull/451
## 3.0.3 - 2022-02-15 ## 3.0.3 - 2022-02-15
- No significant changes since `3.0.2`. - No significant changes since `3.0.2`.
## 3.0.2 - 2022-01-28 ## 3.0.2 - 2022-01-28
- Expose `connect::Connection::new`. [#439] - Expose `connect::Connection::new`. [#439]
[#439]: https://github.com/actix/actix-net/pull/439 [#439]: https://github.com/actix/actix-net/pull/439
## 3.0.1 - 2022-01-11 ## 3.0.1 - 2022-01-11
- No significant changes since `3.0.0`. - No significant changes since `3.0.0`.
## 3.0.0 - 2021-12-26 ## 3.0.0 - 2021-12-26
- No significant changes since `3.0.0-rc.2`. - No significant changes since `3.0.0-rc.2`.
## 3.0.0-rc.2 - 2021-12-10 ## 3.0.0-rc.2 - 2021-12-10
- Re-export `openssl::SslConnectorBuilder` in `connect::openssl::reexports`. [#429] - Re-export `openssl::SslConnectorBuilder` in `connect::openssl::reexports`. [#429]
[#429]: https://github.com/actix/actix-net/pull/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]
@@ -44,6 +47,7 @@
- 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]
@@ -60,6 +64,7 @@
- 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]
@@ -67,8 +72,8 @@
[#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]
@@ -77,31 +82,30 @@
[#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`
generation failed instead of panic. [#296] - Changed `connect::ssl::rustls::RustlsConnectorService` to return error when `DNSNameRef` 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]
@@ -113,74 +117,72 @@
[#297]: https://github.com/actix/actix-net/pull/297 [#297]: https://github.com/actix/actix-net/pull/297
[#299]: https://github.com/actix/actix-net/pull/299 [#299]: https://github.com/actix/actix-net/pull/299
## 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>` as owned iterator. [#248]
- Remove `ConnectTakeAddrsIter`. `Connect::take_addrs` now returns `ConnectAddrsIter<'static>`
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 - 2022-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
## 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

View File

@@ -42,13 +42,14 @@ native-tls = ["tokio-native-tls"]
uri = ["http"] uri = ["http"]
[dependencies] [dependencies]
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"
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"] }
impl-more = "0.1"
pin-project-lite = "0.2.7" pin-project-lite = "0.2.7"
tokio = "1.18.4"
tokio-util = "0.7" tokio-util = "0.7"
tracing = { version = "0.1.30", default-features = false, features = ["log"] } tracing = { version = "0.1.30", default-features = false, features = ["log"] }
@@ -67,16 +68,17 @@ webpki-roots = { version = "0.22", optional = true }
tokio-native-tls = { version = "0.3", optional = true } tokio-native-tls = { version = "0.3", optional = true }
[dev-dependencies] [dev-dependencies]
actix-rt = "2.2.0" actix-codec = "0.5"
actix-server = "2.0.0" actix-rt = "2.2"
actix-server = "2"
bytes = "1" bytes = "1"
env_logger = "0.9" env_logger = "0.10"
futures-util = { version = "0.3.7", default-features = false, features = ["sink"] } futures-util = { version = "0.3.17", default-features = false, features = ["sink"] }
log = "0.4" log = "0.4"
rcgen = "0.8" rcgen = "0.10"
rustls-pemfile = "0.2.1" rustls-pemfile = "1"
tokio-rustls = { version = "0.23", features = ["dangerous_configuration"] } tokio-rustls = { version = "0.23", features = ["dangerous_configuration"] }
trust-dns-resolver = "0.20.0" trust-dns-resolver = "0.22"
[[example]] [[example]]
name = "accept-rustls" name = "accept-rustls"

View File

@@ -41,8 +41,7 @@ use tracing::info;
#[actix_rt::main] #[actix_rt::main]
async fn main() -> io::Result<()> { async fn main() -> io::Result<()> {
env::set_var("RUST_LOG", "info"); env_logger::init_from_env(env_logger::Env::default().default_filter_or("info"));
env_logger::init();
// Load TLS key and cert files // Load TLS key and cert files
let cert_file = &mut BufReader::new(File::open("./examples/cert.pem").unwrap()); let cert_file = &mut BufReader::new(File::open("./examples/cert.pem").unwrap());

View File

@@ -10,7 +10,6 @@ use std::{
time::Duration, time::Duration,
}; };
use actix_codec::{AsyncRead, AsyncWrite, ReadBuf};
use actix_rt::{ use actix_rt::{
net::{ActixStream, Ready}, net::{ActixStream, Ready},
time::timeout, time::timeout,
@@ -21,10 +20,10 @@ use actix_utils::{
future::{ready, Ready as FutReady}, future::{ready, Ready as FutReady},
}; };
use futures_core::future::LocalBoxFuture; use futures_core::future::LocalBoxFuture;
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
use tokio_native_tls::{native_tls::Error, TlsAcceptor}; use tokio_native_tls::{native_tls::Error, TlsAcceptor};
use super::{TlsError, DEFAULT_TLS_HANDSHAKE_TIMEOUT, MAX_CONN_COUNTER}; use super::{TlsError, DEFAULT_TLS_HANDSHAKE_TIMEOUT, MAX_CONN_COUNTER};
use crate::impl_more;
pub mod reexports { pub mod reexports {
//! Re-exports from `native-tls` that are useful for acceptors. //! Re-exports from `native-tls` that are useful for acceptors.
@@ -35,9 +34,8 @@ pub mod reexports {
/// Wraps a `native-tls` based async TLS stream in order to implement [`ActixStream`]. /// Wraps a `native-tls` based async TLS stream in order to implement [`ActixStream`].
pub struct TlsStream<IO>(tokio_native_tls::TlsStream<IO>); pub struct TlsStream<IO>(tokio_native_tls::TlsStream<IO>);
impl_more::from! { tokio_native_tls::TlsStream<IO> => TlsStream<IO> } impl_more::impl_from!(<IO> in tokio_native_tls::TlsStream<IO> => TlsStream<IO>);
impl_more::deref! { TlsStream<IO> => 0: tokio_native_tls::TlsStream<IO> } impl_more::impl_deref_and_mut!(<IO> in TlsStream<IO> => tokio_native_tls::TlsStream<IO>);
impl_more::deref_mut! { TlsStream<IO> => 0 }
impl<IO: ActixStream> AsyncRead for TlsStream<IO> { impl<IO: ActixStream> AsyncRead for TlsStream<IO> {
fn poll_read( fn poll_read(

View File

@@ -11,7 +11,6 @@ use std::{
time::Duration, time::Duration,
}; };
use actix_codec::{AsyncRead, AsyncWrite, ReadBuf};
use actix_rt::{ use actix_rt::{
net::{ActixStream, Ready}, net::{ActixStream, Ready},
time::{sleep, Sleep}, time::{sleep, Sleep},
@@ -23,9 +22,9 @@ use actix_utils::{
}; };
use openssl::ssl::{Error, Ssl, SslAcceptor}; use openssl::ssl::{Error, Ssl, SslAcceptor};
use pin_project_lite::pin_project; use pin_project_lite::pin_project;
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
use super::{TlsError, DEFAULT_TLS_HANDSHAKE_TIMEOUT, MAX_CONN_COUNTER}; use super::{TlsError, DEFAULT_TLS_HANDSHAKE_TIMEOUT, MAX_CONN_COUNTER};
use crate::impl_more;
pub mod reexports { pub mod reexports {
//! Re-exports from `openssl` that are useful for acceptors. //! Re-exports from `openssl` that are useful for acceptors.
@@ -38,9 +37,8 @@ pub mod reexports {
/// Wraps an `openssl` based async TLS stream in order to implement [`ActixStream`]. /// Wraps an `openssl` based async TLS stream in order to implement [`ActixStream`].
pub struct TlsStream<IO>(tokio_openssl::SslStream<IO>); pub struct TlsStream<IO>(tokio_openssl::SslStream<IO>);
impl_more::from! { tokio_openssl::SslStream<IO> => TlsStream<IO> } impl_more::impl_from!(<IO> in tokio_openssl::SslStream<IO> => TlsStream<IO>);
impl_more::deref! { TlsStream<IO> => 0: tokio_openssl::SslStream<IO> } impl_more::impl_deref_and_mut!(<IO> in TlsStream<IO> => tokio_openssl::SslStream<IO>);
impl_more::deref_mut! { TlsStream<IO> => 0 }
impl<IO: ActixStream> AsyncRead for TlsStream<IO> { impl<IO: ActixStream> AsyncRead for TlsStream<IO> {
fn poll_read( fn poll_read(

View File

@@ -12,7 +12,6 @@ use std::{
time::Duration, time::Duration,
}; };
use actix_codec::{AsyncRead, AsyncWrite, ReadBuf};
use actix_rt::{ use actix_rt::{
net::{ActixStream, Ready}, net::{ActixStream, Ready},
time::{sleep, Sleep}, time::{sleep, Sleep},
@@ -23,11 +22,11 @@ use actix_utils::{
future::{ready, Ready as FutReady}, future::{ready, Ready as FutReady},
}; };
use pin_project_lite::pin_project; use pin_project_lite::pin_project;
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
use tokio_rustls::rustls::ServerConfig; use tokio_rustls::rustls::ServerConfig;
use tokio_rustls::{Accept, TlsAcceptor}; use tokio_rustls::{Accept, TlsAcceptor};
use super::{TlsError, DEFAULT_TLS_HANDSHAKE_TIMEOUT, MAX_CONN_COUNTER}; use super::{TlsError, DEFAULT_TLS_HANDSHAKE_TIMEOUT, MAX_CONN_COUNTER};
use crate::impl_more;
pub mod reexports { pub mod reexports {
//! Re-exports from `rustls` that are useful for acceptors. //! Re-exports from `rustls` that are useful for acceptors.
@@ -38,9 +37,8 @@ pub mod reexports {
/// Wraps a `rustls` based async TLS stream in order to implement [`ActixStream`]. /// Wraps a `rustls` based async TLS stream in order to implement [`ActixStream`].
pub struct TlsStream<IO>(tokio_rustls::server::TlsStream<IO>); pub struct TlsStream<IO>(tokio_rustls::server::TlsStream<IO>);
impl_more::from! { tokio_rustls::server::TlsStream<IO> => TlsStream<IO> } impl_more::impl_from!(<IO> in tokio_rustls::server::TlsStream<IO> => TlsStream<IO>);
impl_more::deref! { TlsStream<IO> => 0: tokio_rustls::server::TlsStream<IO> } impl_more::impl_deref_and_mut!(<IO> in TlsStream<IO> => tokio_rustls::server::TlsStream<IO>);
impl_more::deref_mut! { TlsStream<IO> => 0 }
impl<IO: ActixStream> AsyncRead for TlsStream<IO> { impl<IO: ActixStream> AsyncRead for TlsStream<IO> {
fn poll_read( fn poll_read(

View File

@@ -1,5 +1,4 @@
use super::Host; use super::Host;
use crate::impl_more;
/// Wraps underlying I/O and the connection request that initiated it. /// Wraps underlying I/O and the connection request that initiated it.
#[derive(Debug)] #[derive(Debug)]
@@ -8,8 +7,7 @@ pub struct Connection<R, IO> {
pub(crate) io: IO, pub(crate) io: IO,
} }
impl_more::deref! { Connection<R, IO> => io: IO } impl_more::impl_deref_and_mut!(<R, IO> in Connection<R, IO> => io: IO);
impl_more::deref_mut! { Connection<R, IO> => io }
impl<R, IO> Connection<R, IO> { impl<R, IO> Connection<R, IO> {
/// Construct new `Connection` from request and IO parts. /// Construct new `Connection` from request and IO parts.

View File

@@ -27,25 +27,25 @@ pub trait Host: Unpin + 'static {
impl Host for String { impl Host for String {
fn hostname(&self) -> &str { fn hostname(&self) -> &str {
str_split_once(self, ':') self.split_once(':')
.map(|(hostname, _)| hostname) .map(|(hostname, _)| hostname)
.unwrap_or(self) .unwrap_or(self)
} }
fn port(&self) -> Option<u16> { fn port(&self) -> Option<u16> {
str_split_once(self, ':').and_then(|(_, port)| port.parse().ok()) self.split_once(':').and_then(|(_, port)| port.parse().ok())
} }
} }
impl Host for &'static str { impl Host for &'static str {
fn hostname(&self) -> &str { fn hostname(&self) -> &str {
str_split_once(self, ':') self.split_once(':')
.map(|(hostname, _)| hostname) .map(|(hostname, _)| hostname)
.unwrap_or(self) .unwrap_or(self)
} }
fn port(&self) -> Option<u16> { fn port(&self) -> Option<u16> {
str_split_once(self, ':').and_then(|(_, port)| port.parse().ok()) self.split_once(':').and_then(|(_, port)| port.parse().ok())
} }
} }
@@ -69,11 +69,3 @@ mod tests {
assert_connection_info_eq!("example.com:false:false", "example.com", None); assert_connection_info_eq!("example.com:false:false", "example.com", None);
} }
} }
// `str::split_once` is stabilized in 1.52.0
fn str_split_once(str: &str, delimiter: char) -> Option<(&str, &str)> {
let mut splitn = str.splitn(2, delimiter);
let prefix = splitn.next()?;
let suffix = splitn.next()?;
Some((prefix, suffix))
}

View File

@@ -74,16 +74,16 @@ where
let connector = self.connector.clone(); let connector = self.connector.clone();
Box::pin(async move { Box::pin(async move {
trace!("SSL Handshake start for: {:?}", stream.hostname()); trace!("TLS handshake start for: {:?}", stream.hostname());
connector connector
.connect(stream.hostname(), io) .connect(stream.hostname(), io)
.await .await
.map(|res| { .map(|res| {
trace!("SSL Handshake success: {:?}", stream.hostname()); trace!("TLS handshake success: {:?}", stream.hostname());
stream.replace_io(res).1 stream.replace_io(res).1
}) })
.map_err(|e| { .map_err(|e| {
trace!("SSL Handshake error: {:?}", e); trace!("TLS handshake error: {:?}", e);
io::Error::new(io::ErrorKind::Other, format!("{}", e)) io::Error::new(io::ErrorKind::Other, format!("{}", e))
}) })
}) })

View File

@@ -97,7 +97,8 @@ where
actix_service::always_ready!(); actix_service::always_ready!();
fn call(&self, stream: Connection<R, IO>) -> Self::Future { fn call(&self, stream: Connection<R, IO>) -> Self::Future {
trace!("SSL Handshake start for: {:?}", stream.hostname()); trace!("TLS handshake start for: {:?}", stream.hostname());
let (io, stream) = stream.replace_io(()); let (io, stream) = stream.replace_io(());
let host = stream.hostname(); let host = stream.hostname();
@@ -137,11 +138,11 @@ where
match ready!(Pin::new(this.io.as_mut().unwrap()).poll_connect(cx)) { match ready!(Pin::new(this.io.as_mut().unwrap()).poll_connect(cx)) {
Ok(_) => { Ok(_) => {
let stream = this.stream.take().unwrap(); let stream = this.stream.take().unwrap();
trace!("SSL Handshake success: {:?}", stream.hostname()); trace!("TLS handshake success: {:?}", stream.hostname());
Poll::Ready(Ok(stream.replace_io(this.io.take().unwrap()).1)) Poll::Ready(Ok(stream.replace_io(this.io.take().unwrap()).1))
} }
Err(err) => { Err(err) => {
trace!("SSL Handshake error: {:?}", err); trace!("TLS handshake error: {:?}", err);
Poll::Ready(Err(io::Error::new( Poll::Ready(Err(io::Error::new(
io::ErrorKind::Other, io::ErrorKind::Other,
format!("{}", err), format!("{}", err),

View File

@@ -101,7 +101,7 @@ where
actix_service::always_ready!(); actix_service::always_ready!();
fn call(&self, connection: Connection<R, IO>) -> Self::Future { fn call(&self, connection: Connection<R, IO>) -> Self::Future {
trace!("SSL Handshake start for: {:?}", connection.hostname()); trace!("TLS handshake start for: {:?}", connection.hostname());
let (stream, connection) = connection.replace_io(()); let (stream, connection) = connection.replace_io(());
match ServerName::try_from(connection.hostname()) { match ServerName::try_from(connection.hostname()) {
@@ -140,7 +140,7 @@ where
Self::Future { connect, connection } => { Self::Future { connect, connection } => {
let stream = ready!(Pin::new(connect).poll(cx))?; let stream = ready!(Pin::new(connect).poll(cx))?;
let connection = connection.take().unwrap(); let connection = connection.take().unwrap();
trace!("SSL Handshake success: {:?}", connection.hostname()); trace!("TLS handshake success: {:?}", connection.hostname());
Poll::Ready(Ok(connection.replace_io(stream).1)) Poll::Ready(Ok(connection.replace_io(stream).1))
} }
} }

View File

@@ -114,8 +114,8 @@ impl<R: Host> TcpConnectorFut<R> {
stream: ReusableBoxFuture::new(connect(addr, local_addr)), stream: ReusableBoxFuture::new(connect(addr, local_addr)),
}, },
// when resolver returns multiple socket addr for request they would be popped from // When resolver returns multiple socket addr for request they would be popped from
// front end of queue and returns with the first successful tcp connection. // front end of queue and returns with the first successful TCP connection.
ConnectAddrs::Multi(mut addrs) => { ConnectAddrs::Multi(mut addrs) => {
let addr = addrs.pop_front().unwrap(); let addr = addrs.pop_front().unwrap();

View File

@@ -1,40 +0,0 @@
/// A helper to implement `Deref` for a type.
#[macro_export]
macro_rules! deref {
($ty:ident $(<$($generic:ident),*>)? => $field:tt: $target:ty) => {
impl $(<$($generic),*>)? ::core::ops::Deref for $ty $(<$($generic),*>)? {
type Target = $target;
fn deref(&self) -> &Self::Target {
&self.$field
}
}
};
}
/// A helper to implement `DerefMut` for a type.
#[macro_export]
macro_rules! deref_mut {
($ty:ident $(<$($generic:ident),*>)? => $field:tt) => {
impl $(<$($generic),*>)? ::core::ops::DerefMut for $ty $(<$($generic),*>)? {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.$field
}
}
};
}
/// A helper to implement `From` for a unit struct.
#[macro_export]
macro_rules! from {
($from:ty => $ty:ident $(<$($generic:ident),*>)?) => {
impl $(<$($generic),*>)? ::core::convert::From<$from> for $ty $(<$($generic),*>)? {
fn from(from: $from) -> Self {
Self(from)
}
}
};
}
#[allow(unused_imports)]
pub(crate) use crate::{deref, deref_mut, from};

View File

@@ -18,5 +18,3 @@ pub mod accept;
#[cfg(feature = "connect")] #[cfg(feature = "connect")]
#[cfg_attr(docsrs, doc(cfg(feature = "connect")))] #[cfg_attr(docsrs, doc(cfg(feature = "connect")))]
pub mod connect; pub mod connect;
mod impl_more;

View File

@@ -143,6 +143,9 @@ async fn test_local_addr() {
}) })
}); });
// if you've arrived here because of a failing test on macOS run this in your terminal:
// sudo ifconfig lo0 alias 127.0.0.3
let conn = Connector::default().service(); let conn = Connector::default().service();
let local = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 3)); let local = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 3));

View File

@@ -1,8 +1,9 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased - 2022-xx-xx
- Minimum supported Rust version (MSRV) is now 1.49.
- Minimum supported Rust version (MSRV) is now 1.59.
## 0.1.0 - 2020-01-15 ## 0.1.0 - 2020-01-15
- Initial release - Initial release

View File

@@ -16,12 +16,12 @@ name = "actix_tracing"
path = "src/lib.rs" path = "src/lib.rs"
[dependencies] [dependencies]
actix-service = "2.0.0" actix-service = "2"
actix-utils = "3.0.0" actix-utils = "3"
tracing = "0.1" tracing = "0.1.35"
tracing-futures = "0.2" tracing-futures = "0.2"
[dev_dependencies] [dev_dependencies]
actix-rt = "2.0.0" actix-rt = "2"
slab = "0.4" slab = "0.4"

View File

@@ -1,20 +1,25 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased - 2022-xx-xx
- Minimum supported Rust version (MSRV) is now 1.49.
- Minimum supported Rust version (MSRV) is now 1.59.
## 3.0.1 - 2022-10-21
- Minimum supported Rust version (MSRV) is now 1.57.
## 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]
@@ -23,14 +28,14 @@
[#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]
@@ -38,146 +43,146 @@
[#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
- BoxedNewService` and `BoxedService` types moved to actix-service crate.
- Use new `NewService` trait
- 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,
in the order that their originating requests were submitted to the service. - Add `InOrder` service. the service yields responses as they become available, 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.

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "actix-utils" name = "actix-utils"
version = "3.0.0" version = "3.0.1"
authors = [ authors = [
"Nikolay Kim <fafhrd91@gmail.com>", "Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>", "Rob Ede <robjtede@icloud.com>",
@@ -21,6 +21,6 @@ pin-project-lite = "0.2"
local-waker = "0.1" local-waker = "0.1"
[dev-dependencies] [dev-dependencies]
actix-rt = "2.0.0" actix-rt = "2"
futures-util = { version = "0.3.7", default-features = false } futures-util = { version = "0.3.17", default-features = false }
static_assertions = "1.1" static_assertions = "1.1"

View File

@@ -1,4 +1,4 @@
//! Asynchronous values. //! Helpers for constructing futures.
mod either; mod either;
mod poll_fn; mod poll_fn;

View File

@@ -8,6 +8,31 @@ 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.
///
/// # Examples
/// ```
/// # use std::task::Poll;
/// # use actix_utils::future::poll_fn;
/// # async fn test_poll_fn() {
/// let res = poll_fn(|_| Poll::Ready(42)).await;
/// assert_eq!(res, 42);
///
/// let mut i = 5;
/// let res = poll_fn(|cx| {
/// i -= 1;
///
/// if i > 0 {
/// cx.waker().wake_by_ref();
/// Poll::Pending
/// } else {
/// Poll::Ready(42)
/// }
/// })
/// .await;
/// assert_eq!(res, 42);
/// # }
/// # actix_rt::Runtime::new().unwrap().block_on(test_poll_fn());
/// ```
#[inline] #[inline]
pub fn poll_fn<F, T>(f: F) -> PollFn<F> pub fn poll_fn<F, T>(f: F) -> PollFn<F>
where where
@@ -16,13 +41,11 @@ where
PollFn { f } PollFn { f }
} }
/// A Future driven by the inner function. /// Future for the [`poll_fn`] function.
pub struct PollFn<F> { pub struct PollFn<F> {
f: F, f: F,
} }
impl<F> Unpin for PollFn<F> {}
impl<F> fmt::Debug for PollFn<F> { impl<F> fmt::Debug for PollFn<F> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("PollFn").finish() f.debug_struct("PollFn").finish()
@@ -36,15 +59,22 @@ where
type Output = T; type Output = T;
#[inline] #[inline]
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
(self.f)(cx) // SAFETY: we are not moving out of the pinned field
// see https://github.com/rust-lang/rust/pull/102737
(unsafe { &mut self.get_unchecked_mut().f })(cx)
} }
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::marker::PhantomPinned;
use super::*; use super::*;
static_assertions::assert_impl_all!(PollFn<()>: Unpin);
static_assertions::assert_not_impl_all!(PollFn<PhantomPinned>: Unpin);
#[actix_rt::test] #[actix_rt::test]
async fn test_poll_fn() { async fn test_poll_fn() {
let res = poll_fn(|_| Poll::Ready(42)).await; let res = poll_fn(|_| Poll::Ready(42)).await;
@@ -64,4 +94,29 @@ mod tests {
.await; .await;
assert_eq!(res, 42); assert_eq!(res, 42);
} }
// following soundness tests taken from https://github.com/tokio-rs/tokio/pull/5087
#[allow(dead_code)]
fn require_send<T: Send>(_t: &T) {}
#[allow(dead_code)]
fn require_sync<T: Sync>(_t: &T) {}
trait AmbiguousIfUnpin<A> {
fn some_item(&self) {}
}
impl<T: ?Sized> AmbiguousIfUnpin<()> for T {}
impl<T: ?Sized + Unpin> AmbiguousIfUnpin<[u8; 0]> for T {}
const _: fn() = || {
let pinned = std::marker::PhantomPinned;
let f = poll_fn(move |_| {
// Use `pinned` to take ownership of it.
let _ = &pinned;
std::task::Poll::Pending::<()>
});
require_send(&f);
require_sync(&f);
AmbiguousIfUnpin::some_item(&f);
};
} }

View File

@@ -1,4 +1,4 @@
//! When MSRV is 1.48, replace with `core::future::Ready` and `core::future::ready()`. //! When `core::future::Ready` has a `into_inner()` method, this can be deprecated.
use core::{ use core::{
future::Future, future::Future,
@@ -6,7 +6,7 @@ use core::{
task::{Context, Poll}, task::{Context, Poll},
}; };
/// Future for the [`ready`](ready()) function. /// Future for the [`ready`] function.
/// ///
/// Panic will occur if polled more than once. /// Panic will occur if polled more than once.
/// ///

View File

@@ -2,43 +2,60 @@
## Unreleased - 2022-xx-xx ## Unreleased - 2022-xx-xx
## 1.3.0 - 2023-03-03
- Implement `AsRef<ByteString>` for `ByteString`.
## 1.2.1 - 2022-11-12
- Fix `#[no_std]` compatibility. [#471]
[#471]: https://github.com/actix/actix-net/pull/471
## 1.2.0 - 2022-11-07
- Add `ByteString::slice_ref` which can safely slice a `ByteString` into a new one with zero copy. [#470]
- Minimum supported Rust version (MSRV) is now 1.57.
[#470]: https://github.com/actix/actix-net/pull/470
## 1.1.0 - 2022-06-11 ## 1.1.0 - 2022-06-11
- Implement `From<Box<str>>` for `ByteString`. [#458] - Implement `From<Box<str>>` for `ByteString`. [#458]
- Implement `Into<String>` for `ByteString`. [#458] - Implement `Into<String>` for `ByteString`. [#458]
- Minimum supported Rust version (MSRV) is now 1.49. - Minimum supported Rust version (MSRV) is now 1.49.
[#458]: https://github.com/actix/actix-net/pull/458 [#458]: https://github.com/actix/actix-net/pull/458
## 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

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "bytestring" name = "bytestring"
version = "1.1.0" version = "1.3.0"
authors = [ authors = [
"Nikolay Kim <fafhrd91@gmail.com>", "Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>", "Rob Ede <robjtede@icloud.com>",
@@ -18,11 +18,11 @@ name = "bytestring"
path = "src/lib.rs" path = "src/lib.rs"
[dependencies] [dependencies]
bytes = "1" bytes = { version = "1.2", default-features = false }
serde = { version = "1.0", optional = true } serde = { version = "1.0", optional = true }
[dev-dependencies] [dev-dependencies]
ahash = { version = "0.7.6", default-features = false } ahash = { version = "0.8", default-features = false }
serde_json = "1.0" serde_json = "1.0"
static_assertions = "1.1" static_assertions = "1.1"
rustversion = "1" rustversion = "1"

View File

@@ -50,6 +50,44 @@ impl ByteString {
pub const unsafe fn from_bytes_unchecked(src: Bytes) -> ByteString { pub const unsafe fn from_bytes_unchecked(src: Bytes) -> ByteString {
Self(src) Self(src)
} }
/// Returns a new byte string that is equivalent to the given `subset`.
///
/// When processing a `ByteString` buffer with other tools, one often gets a `&str` which is in
/// fact a slice of the original `ByteString`; i.e., a subset of it. This function turns that
/// `&str` into another `ByteString`, as if one had sliced the `ByteString` with the offsets
/// that correspond to `subset`.
///
/// Corresponds to [`Bytes::slice_ref`].
///
/// This operation is `O(1)`.
///
/// # Panics
///
/// Panics if `subset` is not a sub-slice of this byte string.
///
/// Note that strings which are only subsets from an equality perspective do not uphold this
/// requirement; see examples.
///
/// # Examples
///
/// ```
/// # use bytestring::ByteString;
/// let string = ByteString::from_static(" foo ");
/// let subset = string.trim();
/// let substring = string.slice_ref(subset);
/// assert_eq!(substring, "foo");
/// ```
///
/// ```should_panic
/// # use bytestring::ByteString;
/// // panics because the given slice is not derived from the original byte string, despite
/// // being a logical subset of the string
/// ByteString::from_static("foo bar").slice_ref("foo");
/// ```
pub fn slice_ref(&self, subset: &str) -> Self {
Self(self.0.slice_ref(subset.as_bytes()))
}
} }
impl PartialEq<str> for ByteString { impl PartialEq<str> for ByteString {
@@ -64,6 +102,12 @@ impl<T: AsRef<str>> PartialEq<T> for ByteString {
} }
} }
impl AsRef<ByteString> for ByteString {
fn as_ref(&self) -> &ByteString {
self
}
}
impl AsRef<[u8]> for ByteString { impl AsRef<[u8]> for ByteString {
fn as_ref(&self) -> &[u8] { fn as_ref(&self) -> &[u8] {
self.0.as_ref() self.0.as_ref()
@@ -72,7 +116,7 @@ impl AsRef<[u8]> for ByteString {
impl AsRef<str> for ByteString { impl AsRef<str> for ByteString {
fn as_ref(&self) -> &str { fn as_ref(&self) -> &str {
&*self self
} }
} }
@@ -96,7 +140,7 @@ impl ops::Deref for ByteString {
impl borrow::Borrow<str> for ByteString { impl borrow::Borrow<str> for ByteString {
fn borrow(&self) -> &str { fn borrow(&self) -> &str {
&*self self
} }
} }
@@ -249,7 +293,10 @@ mod serde {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use alloc::borrow::ToOwned; use alloc::borrow::ToOwned;
use core::hash::{Hash, Hasher}; use core::{
hash::{Hash, Hasher},
panic::{RefUnwindSafe, UnwindSafe},
};
use ahash::AHasher; use ahash::AHasher;
use static_assertions::assert_impl_all; use static_assertions::assert_impl_all;
@@ -259,16 +306,7 @@ mod test {
assert_impl_all!(ByteString: Send, Sync, Unpin, Sized); assert_impl_all!(ByteString: Send, Sync, Unpin, Sized);
assert_impl_all!(ByteString: Clone, Default, Eq, PartialOrd, Ord); assert_impl_all!(ByteString: Clone, Default, Eq, PartialOrd, Ord);
assert_impl_all!(ByteString: fmt::Debug, fmt::Display); assert_impl_all!(ByteString: fmt::Debug, fmt::Display);
assert_impl_all!(ByteString: UnwindSafe, RefUnwindSafe);
#[rustversion::since(1.56)]
mod above_1_56_impls {
// `[Ref]UnwindSafe` traits were only in std until rust 1.56
use core::panic::{RefUnwindSafe, UnwindSafe};
use super::*;
assert_impl_all!(ByteString: UnwindSafe, RefUnwindSafe);
}
#[test] #[test]
fn test_partial_eq() { fn test_partial_eq() {
@@ -349,4 +387,21 @@ mod test {
let s = serde_json::to_string(&ByteString::from_static("nice bytes")).unwrap(); let s = serde_json::to_string(&ByteString::from_static("nice bytes")).unwrap();
assert_eq!(s, r#""nice bytes""#); assert_eq!(s, r#""nice bytes""#);
} }
#[test]
fn slice_ref() {
let string = ByteString::from_static(" foo ");
let subset = string.trim();
// subset is derived from original byte string
let substring = string.slice_ref(subset);
assert_eq!(substring, "foo");
}
#[test]
#[should_panic]
fn test_slice_ref_catches_not_a_subset() {
// panics because the given slice is not derived from the original byte string, despite
// being a logical subset of the string
ByteString::from_static("foo bar").slice_ref("foo");
}
} }

View File

@@ -1 +1 @@
msrv = "1.48" msrv = "1.59"

View File

@@ -2,14 +2,16 @@
## Unreleased - 2022-xx-xx ## Unreleased - 2022-xx-xx
- Minimum supported Rust version (MSRV) is now 1.59.
## 0.1.3 - 2022-05-03 ## 0.1.3 - 2022-05-03
- Minimum supported Rust version (MSRV) is now 1.49. - Minimum supported Rust version (MSRV) is now 1.49.
## 0.1.2 - 2021-04-01 ## 0.1.2 - 2021-04-01
- No significant changes from `0.1.1`. - 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.

View File

@@ -12,10 +12,10 @@ license = "MIT OR Apache-2.0"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
futures-core = { version = "0.3.7", default-features = false } futures-core = "0.3.17"
futures-sink = { version = "0.3.7", default-features = false } futures-sink = "0.3.17"
futures-util = { version = "0.3.7", default-features = false } futures-util = { version = "0.3.17", default-features = false }
local-waker = "0.1" local-waker = "0.1"
[dev-dependencies] [dev-dependencies]
tokio = { version = "1.13.1", features = ["rt", "macros"] } tokio = { version = "1.18.4", features = ["rt", "macros"] }

View File

@@ -2,14 +2,16 @@
## Unreleased - 2022-xx-xx ## Unreleased - 2022-xx-xx
- Minimum supported Rust version (MSRV) is now 1.59.
## 0.1.3 - 2022-05-03 ## 0.1.3 - 2022-05-03
- Minimum supported Rust version (MSRV) is now 1.49. - Minimum supported Rust version (MSRV) is now 1.49.
## 0.1.2 - 2021-12-18 ## 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.

View File

@@ -6,8 +6,8 @@ authors = [
"Nikolay Kim <fafhrd91@gmail.com>", "Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>", "Rob Ede <robjtede@icloud.com>",
] ]
keywords = ["waker", "local", "futures", "no-std"]
repository = "https://github.com/actix/actix-net.git" repository = "https://github.com/actix/actix-net.git"
keywords = ["waker", "local", "futures", "no-std"]
categories = ["asynchronous", "no-std"] categories = ["asynchronous", "no-std"]
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
edition = "2018" edition = "2018"