Compare commits

...

214 Commits

Author SHA1 Message Date
dependabot[bot] b57ab7e8f0
build(deps): bump taiki-e/install-action from 2.49.32 to 2.49.34 (#659)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.49.32 to 2.49.34.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.49.32...v2.49.34)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-25 00:34:54 +00:00
dependabot[bot] 887975ab11
build(deps): bump taiki-e/install-action from 2.49.19 to 2.49.28 (#657)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.49.19 to 2.49.28.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.49.19...v2.49.28)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-21 06:02:34 +00:00
Rob Ede 9069fd8590
build: fix msrv 2025-03-21 05:38:25 +00:00
dependabot[bot] 8204690568
build(deps): bump syn from 2.0.99 to 2.0.100 (#652)
Bumps [syn](https://github.com/dtolnay/syn) from 2.0.99 to 2.0.100.
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/2.0.99...2.0.100)

---
updated-dependencies:
- dependency-name: syn
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-10 18:34:13 +00:00
dependabot[bot] bbb3139c45
build(deps): bump taiki-e/install-action from 2.49.11 to 2.49.19 (#653)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.49.11 to 2.49.19.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.49.11...v2.49.19)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-10 18:32:15 +00:00
dependabot[bot] 0915904bdb
build(deps): bump serde from 1.0.218 to 1.0.219 (#654)
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.218 to 1.0.219.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.218...v1.0.219)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-10 18:31:58 +00:00
Rob Ede 70f0008f42
chore(actix-service): prepare release 2.0.3 2025-03-09 17:36:45 +00:00
Dylan Anthony 12df4d7027
Remove need for paste (#649)
Co-authored-by: Dylan Anthony <dbanty@users.noreply.github.com>
2025-03-09 16:53:48 +00:00
dependabot[bot] 6f5b81d2a0
build(deps): bump codecov/codecov-action from 5.3.1 to 5.4.0 (#647)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.3.1 to 5.4.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v5.3.1...v5.4.0)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-08 18:07:04 +00:00
dependabot[bot] 4cf37171b5
build(deps): bump actions-rust-lang/setup-rust-toolchain (#645)
Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.10.1 to 1.11.0.
- [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases)
- [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/v1.10.1...v1.11.0)

---
updated-dependencies:
- dependency-name: actions-rust-lang/setup-rust-toolchain
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-08 18:02:05 +00:00
dependabot[bot] 00f40e1471
build(deps): bump taiki-e/install-action from 2.49.1 to 2.49.11 (#646)
* build(deps): bump taiki-e/install-action from 2.49.1 to 2.49.11

Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.49.1 to 2.49.11.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.49.1...v2.49.11)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* ci: fix msrv

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2025-03-08 17:52:46 +00:00
Rob Ede 15f0b63492
test: fix panic in tokio stream construction 2025-03-08 17:37:40 +00:00
Rob Ede 9d4b1673aa
chore(actix-server): prepare release 2.5.1 2025-03-08 17:32:46 +00:00
Rob Ede fc902b2d56
chore: check lockfile in 2025-03-08 17:24:28 +00:00
Rob Ede f4175a4ad4
chore: fix doc recipe 2025-03-08 17:24:28 +00:00
Rob Ede 323a2e2931
fix(server): fix panic in test server 2025-03-08 17:24:28 +00:00
dependabot[bot] 4b9f7ae46d
build(deps): bump ilammy/setup-nasm from 1.5.1 to 1.5.2 (#643)
Bumps [ilammy/setup-nasm](https://github.com/ilammy/setup-nasm) from 1.5.1 to 1.5.2.
- [Release notes](https://github.com/ilammy/setup-nasm/releases)
- [Commits](https://github.com/ilammy/setup-nasm/compare/v1.5.1...v1.5.2)

---
updated-dependencies:
- dependency-name: ilammy/setup-nasm
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-24 22:22:32 +00:00
dependabot[bot] 0e119fd9b2
build(deps): bump taiki-e/install-action from 2.48.13 to 2.49.1 (#644)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.48.13 to 2.49.1.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.48.13...v2.49.1)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-24 22:22:23 +00:00
Rob Ede b04b88e81a
ci: fix msrv job 2025-02-24 22:00:44 +00:00
dependabot[bot] 0a8f2baa11
build(deps): bump taiki-e/install-action from 2.48.6 to 2.48.13 (#642)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.48.6 to 2.48.13.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.48.6...v2.48.13)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-17 18:37:23 +00:00
dependabot[bot] d79d500ffe
build(deps): bump taiki-e/install-action from 2.48.1 to 2.48.6 (#641)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.48.1 to 2.48.6.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.48.1...v2.48.6)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-10 22:39:52 +00:00
dependabot[bot] 7a7e3de430
build(deps): bump taiki-e/cache-cargo-install-action from 2.1.0 to 2.1.1 (#640)
Bumps [taiki-e/cache-cargo-install-action](https://github.com/taiki-e/cache-cargo-install-action) from 2.1.0 to 2.1.1.
- [Release notes](https://github.com/taiki-e/cache-cargo-install-action/releases)
- [Changelog](https://github.com/taiki-e/cache-cargo-install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/cache-cargo-install-action/compare/v2.1.0...v2.1.1)

---
updated-dependencies:
- dependency-name: taiki-e/cache-cargo-install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-10 22:39:50 +00:00
dependabot[bot] f062ede06f
build(deps): bump codecov/codecov-action from 5.1.2 to 5.3.1 (#637)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.1.2 to 5.3.1.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v5.1.2...v5.3.1)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-03 18:56:29 +00:00
dependabot[bot] 1338276934
build(deps): bump taiki-e/install-action from 2.47.19 to 2.48.1 (#639)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.47.19 to 2.48.1.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.47.19...v2.48.1)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-03 18:26:03 +00:00
dependabot[bot] 4746b4e2fa
build(deps): bump taiki-e/install-action from 2.47.12 to 2.47.19 (#634)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.47.12 to 2.47.19.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.47.12...v2.47.19)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-23 01:32:18 +00:00
dependabot[bot] 0509f0cede
build(deps): bump taiki-e/cache-cargo-install-action from 2.0.1 to 2.1.0 (#635)
Bumps [taiki-e/cache-cargo-install-action](https://github.com/taiki-e/cache-cargo-install-action) from 2.0.1 to 2.1.0.
- [Release notes](https://github.com/taiki-e/cache-cargo-install-action/releases)
- [Changelog](https://github.com/taiki-e/cache-cargo-install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/cache-cargo-install-action/compare/v2.0.1...v2.1.0)

---
updated-dependencies:
- dependency-name: taiki-e/cache-cargo-install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-23 01:32:07 +00:00
dependabot[bot] 3831e0d7fe
build(deps): bump taiki-e/install-action from 2.47.7 to 2.47.12 (#633)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.47.7 to 2.47.12.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.47.7...v2.47.12)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-13 20:01:14 +00:00
dependabot[bot] 60945d0481
build(deps): bump taiki-e/install-action from 2.47.0 to 2.47.7 (#632)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.47.0 to 2.47.7.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.47.0...v2.47.7)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-08 10:40:55 +00:00
dependabot[bot] 2615a19e28
build(deps): update itertools requirement from 0.13 to 0.14 (#631)
Updates the requirements on [itertools](https://github.com/rust-itertools/itertools) to permit the latest version.
- [Changelog](https://github.com/rust-itertools/itertools/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-itertools/itertools/compare/v0.13.0...v0.14.0)

---
updated-dependencies:
- dependency-name: itertools
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-08 10:40:41 +00:00
Rob Ede 1a0f44fff1
chore: allow missing docs on tests 2024-12-29 14:44:11 +00:00
Rob Ede 8d1cd2ec87
chore: allow missing docs on tests 2024-12-29 14:40:37 +00:00
Rob Ede b87174b5f2
chore: allow missing docs on tests 2024-12-29 14:34:28 +00:00
Rob Ede 8097af6a27
chore: allow missing docs on tests 2024-12-29 14:31:46 +00:00
Rob Ede ecba6e21da
chore: fmt project 2024-12-29 14:27:58 +00:00
dependabot[bot] 23f797a81d
build(deps): bump codecov/codecov-action from 5.1.1 to 5.1.2 (#629)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.1.1 to 5.1.2.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v5.1.1...v5.1.2)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-29 13:59:48 +00:00
dependabot[bot] d2a5091451
build(deps): bump taiki-e/install-action from 2.46.4 to 2.47.0 (#630)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.46.4 to 2.47.0.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.46.4...v2.47.0)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-29 13:57:58 +00:00
Rob Ede e0c09c2aa4
ci: remove public-api-diff job 2024-12-29 13:44:48 +00:00
Rob Ede 8234543066
ci: fix tests 2024-12-29 13:41:41 +00:00
dependabot[bot] 34826c6253
build(deps): bump codecov/codecov-action from 5.0.7 to 5.1.1 (#624)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.0.7 to 5.1.1.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v5.0.7...v5.1.1)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-10 11:48:11 +00:00
dependabot[bot] 42b788d131
build(deps): bump taiki-e/install-action from 2.45.6 to 2.46.4 (#625)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.45.6 to 2.46.4.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.45.6...v2.46.4)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-10 11:48:02 +00:00
dependabot[bot] 9796593b24
build(deps): bump actions-rust-lang/setup-rust-toolchain (#620)
Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.8.0 to 1.10.1.
- [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases)
- [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/v1.8...v1.10.1)

---
updated-dependencies:
- dependency-name: actions-rust-lang/setup-rust-toolchain
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-02 08:31:34 +00:00
dependabot[bot] c362fc4414
build(deps): bump codecov/codecov-action from 5.0.2 to 5.0.7 (#621)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.0.2 to 5.0.7.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v5.0.2...v5.0.7)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-02 08:31:21 +00:00
dependabot[bot] 52733337e4
build(deps): bump taiki-e/install-action from 2.34.0 to 2.45.6 (#622)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.34.0 to 2.45.6.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.34.0...v2.45.6)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-02 08:31:14 +00:00
Rob Ede 0e36c5f5c4
feat(bytestring): split_at method (#619) 2024-11-24 00:55:18 +00:00
dependabot[bot] 47f0017899
build(deps): bump codecov/codecov-action from 4.6.0 to 5.0.2 (#617)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.6.0 to 5.0.2.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v4.6.0...v5.0.2)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-18 21:25:34 +00:00
dependabot[bot] bb4fc31461
build(deps): bump taiki-e/install-action from 2.44.69 to 2.44.71 (#618)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.44.69 to 2.44.71.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.44.69...v2.44.71)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-18 21:25:24 +00:00
dependabot[bot] 01a104eb82
build(deps): bump taiki-e/install-action from 2.44.60 to 2.44.69 (#616)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.44.60 to 2.44.69.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.44.60...v2.44.69)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-14 09:05:08 +00:00
Rob Ede 4ab27bfc4a
ci: move nightly rust versions to vars (#615) 2024-11-14 08:43:47 +00:00
dependabot[bot] 8084cec705
build(deps): bump taiki-e/install-action from 2.44.54 to 2.44.60 (#613)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-04 21:48:44 +00:00
dependabot[bot] a2517da225
build(deps): bump taiki-e/install-action from 2.44.44 to 2.44.54 (#612)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-29 23:03:00 +00:00
dependabot[bot] a4b6943ddc
build(deps): bump taiki-e/install-action from 2.44.35 to 2.44.44 (#611)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.44.35 to 2.44.44.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.44.35...v2.44.44)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-23 14:04:33 +00:00
dependabot[bot] 7d24196d5c
build(deps): bump taiki-e/install-action from 2.44.26 to 2.44.35 (#610)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-14 20:55:07 +01:00
dependabot[bot] 582edf5444
build(deps): bump actions-rust-lang/setup-rust-toolchain (#609)
Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.10.0 to 1.10.1.
- [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases)
- [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/v1.10.0...v1.10.1)

---
updated-dependencies:
- dependency-name: actions-rust-lang/setup-rust-toolchain
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-07 18:48:02 +00:00
dependabot[bot] 57485f1a21
build(deps): bump taiki-e/install-action from 2.44.13 to 2.44.26 (#607)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.44.13 to 2.44.26.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.44.13...v2.44.26)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-07 18:47:49 +00:00
dependabot[bot] e8871d0d06
build(deps): bump codecov/codecov-action from 4.5.0 to 4.6.0 (#608)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.5.0 to 4.6.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v4.5.0...v4.6.0)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-07 18:47:43 +00:00
Rob Ede 83e896a6e5
ci: remove upload doc job 2024-10-01 04:41:12 +01:00
dependabot[bot] af00dada5c
build(deps): bump taiki-e/install-action from 2.44.7 to 2.44.13 (#605)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.44.7 to 2.44.13.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.44.7...v2.44.13)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-30 23:51:19 +00:00
dependabot[bot] 0681b515de
build(deps): bump actions-rust-lang/setup-rust-toolchain (#602)
Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.9.0 to 1.10.0.
- [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases)
- [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/v1.9.0...v1.10.0)

---
updated-dependencies:
- dependency-name: actions-rust-lang/setup-rust-toolchain
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-30 17:43:14 +00:00
dependabot[bot] 3672137d17
build(deps): bump taiki-e/install-action from 2.42.37 to 2.44.7 (#603)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.42.37 to 2.44.7.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.42.37...v2.44.7)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-30 17:43:02 +00:00
ahbkc fad1fda194
Fix fist to first (#598)
Co-authored-by: yinqilei <yinqilei_ug@126.com>
2024-09-05 01:55:49 +01:00
dependabot[bot] cfae737314
build(deps): bump JamesIves/github-pages-deploy-action (#594)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-03 05:15:44 +01:00
dependabot[bot] 4583daa3c2
build(deps): bump taiki-e/install-action from 2.42.18 to 2.42.37 (#595)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-03 05:15:36 +01:00
ahbkc b1cbacc7f6
fix actix-service/src/ext.rs 'fist' to 'first' (#596)
Co-authored-by: yinqilei <yinqilei_ug@126.com>
2024-09-03 05:15:24 +01:00
dependabot[bot] 77588aba81
build(deps): update rcgen requirement from 0.12 to 0.13 (#590)
* build(deps): update rcgen requirement from 0.12 to 0.13

Updates the requirements on [rcgen](https://github.com/rustls/rcgen) to permit the latest version.
- [Commits](https://github.com/rustls/rcgen/compare/v0.12.0...v0.13.1)

---
updated-dependencies:
- dependency-name: rcgen
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: fix rcgen tests

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-08-06 23:54:18 +00:00
dependabot[bot] aad3a48edd
build(deps): bump taiki-e/install-action from 2.42.10 to 2.42.18 (#589)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.42.10 to 2.42.18.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.42.10...v2.42.18)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-05 22:52:43 +00:00
Rob Ede 97e8c571cf
chore(actix-server): prepare release 2.5.0
closes #586
2024-08-04 22:41:04 +01:00
Rob Ede 0d8c7e5085
build: add nix flake 2024-08-04 22:39:19 +01:00
Rob Ede baf1b6042a
docs(server): update changelog 2024-08-04 22:34:17 +01:00
dependabot[bot] 779fa28bd5
build(deps): bump taiki-e/install-action from 2.42.4 to 2.42.10 (#587)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.42.4 to 2.42.10.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.42.4...v2.42.10)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-29 19:40:21 +00:00
dependabot[bot] e282811d69
build(deps): update rustversion-msrv requirement from 0.99 to 0.100 (#584)
---
updated-dependencies:
- dependency-name: rustversion-msrv
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-22 19:27:49 +00:00
dependabot[bot] 5c44115978
build(deps): bump taiki-e/install-action from 2.42.0 to 2.42.4 (#585)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.42.0 to 2.42.4.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.42.0...v2.42.4)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-22 18:56:19 +00:00
Rob Ede ead0e2b200
chore: fix nightly warnings 2024-07-20 18:57:00 +01:00
Rob Ede ace737fc4c
chore: overspecified deps 2024-07-20 18:00:39 +01:00
dependabot[bot] c45ae294fb
build(deps): bump taiki-e/install-action from 2.41.11 to 2.42.0 (#583)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.41.11 to 2.42.0.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.41.11...v2.42.0)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-16 02:14:15 +00:00
dependabot[bot] 939377f6ab
build(deps): bump taiki-e/install-action from 2.41.7 to 2.41.11 (#582)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.41.7 to 2.41.11.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.41.7...v2.41.11)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-08 21:40:27 +00:00
dependabot[bot] 20149f957b
build(deps): bump JamesIves/github-pages-deploy-action (#581)
Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.6.1 to 4.6.3.
- [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)
- [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.6.1...v4.6.3)

---
updated-dependencies:
- dependency-name: JamesIves/github-pages-deploy-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-08 21:40:25 +00:00
dependabot[bot] 544e5d3b40
build(deps): bump taiki-e/install-action from 2.41.3 to 2.41.7 (#579)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.41.3 to 2.41.7.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.41.3...v2.41.7)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-02 01:08:35 +00:00
dependabot[bot] d482af529c
build(deps): bump taiki-e/install-action from 2.39.1 to 2.41.3 (#578)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.39.1 to 2.41.3.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.39.1...v2.41.3)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-25 16:32:28 +00:00
Rob Ede 0030800b9a
chore: update mio dependency to v1 (#577) 2024-06-20 01:22:33 +01:00
dependabot[bot] 64fa2f8462
build(deps): bump taiki-e/install-action from 2.38.1 to 2.39.1 (#574)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.38.1 to 2.39.1.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.38.1...v2.39.1)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-17 20:52:59 +00:00
dependabot[bot] b0d1c8d193
build(deps): bump codecov/codecov-action from 4.4.1 to 4.5.0 (#575)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.4.1 to 4.5.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v4.4.1...v4.5.0)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-17 20:52:48 +00:00
Jiri Andras 46cc62c6d8
Fix logging "starting service:..." (#573)
Co-authored-by: Jiří Andras <jiri.andras@braiins.cz>
2024-06-14 17:11:32 +00:00
dependabot[bot] 912daa3d0a
build(deps): bump taiki-e/cache-cargo-install-action from 2.0.0 to 2.0.1 (#570)
Bumps [taiki-e/cache-cargo-install-action](https://github.com/taiki-e/cache-cargo-install-action) from 2.0.0 to 2.0.1.
- [Release notes](https://github.com/taiki-e/cache-cargo-install-action/releases)
- [Changelog](https://github.com/taiki-e/cache-cargo-install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/cache-cargo-install-action/compare/v2.0.0...v2.0.1)

---
updated-dependencies:
- dependency-name: taiki-e/cache-cargo-install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-10 19:36:41 +00:00
dependabot[bot] aefa810496
build(deps): bump actions-rust-lang/setup-rust-toolchain (#571)
Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.8.0 to 1.9.0.
- [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases)
- [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/v1.8.0...v1.9.0)

---
updated-dependencies:
- dependency-name: actions-rust-lang/setup-rust-toolchain
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-10 19:36:09 +00:00
dependabot[bot] 2c443a7620
build(deps): bump taiki-e/install-action from 2.34.1 to 2.38.1 (#572)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.34.1 to 2.38.1.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.34.1...v2.38.1)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-10 19:35:52 +00:00
Rob Ede b3b1583115
docs: update changelog 2024-06-09 18:08:53 +01:00
Rob Ede 0d3d1926bc
fix: relax bounds on with_tokio_rt (#569) 2024-06-09 07:12:24 +01:00
Rob Ede 0c26ecf9fa
chore(actix-server): prepare release 2.4.0 2024-06-09 06:12:28 +01:00
Rob Ede 1bdb15ec20
chore(actix-rt): prepare release 2.10.0 2024-06-09 06:12:07 +01:00
dependabot[bot] a524f15e34
build(deps): update tokio-uring requirement from 0.4 to 0.5 (#568)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-06-07 18:51:27 +01:00
dependabot[bot] 451a44c2e0
build(deps): bump taiki-e/install-action from 2.33.34 to 2.34.1 (#567)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.33.34 to 2.34.1.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.33.34...v2.34.1)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-03 18:25:40 +00:00
Rob Ede 18071d1fc0
ci: disable io-uring tests 2024-05-27 22:57:35 +01:00
dependabot[bot] 786014cc2f
build(deps): bump taiki-e/install-action from 2.33.26 to 2.33.34 (#566)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.33.26 to 2.33.34.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.33.26...v2.33.34)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-27 21:24:55 +00:00
Rob Ede a7ef438f25
ci: use mold linker on linux jobs 2024-05-27 22:25:35 +01:00
dependabot[bot] 375c352810
--- (#565)
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-20 19:11:09 +00:00
dependabot[bot] 2d1b5468d0
--- (#563)
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-20 19:08:43 +00:00
dependabot[bot] 3696cda155
--- (#562)
updated-dependencies:
- dependency-name: itertools
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-20 19:06:51 +00:00
dependabot[bot] 55e89d1f30
--- (#564)
updated-dependencies:
- dependency-name: JamesIves/github-pages-deploy-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-20 19:05:28 +00:00
Rob Ede 24be36b18d
chore: prepare actix-tls release v3.4.0 2024-05-18 18:14:26 +01:00
Rob Ede 38ae762569
ci: fix msrv just variable 2024-05-18 17:34:18 +01:00
dependabot[bot] 8cf79d3d13
build(deps): bump taiki-e/install-action from 2.33.17 to 2.33.22 (#561)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.33.17 to 2.33.22.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.33.17...v2.33.22)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-13 20:43:50 +00:00
asonix 73451070db
actix-tls: Disable default features for rustls 0.23 via tokio-rustls 0.26 (#560)
* actix-tls: Disable default features for rustls 0.23 via tokio-rustls 0.26

This also fixes a panic in accept-rustls due to both ring and aws-lc-rs
being enabled for that example

* Switch a test from aws-lc-rs to ring since aws-lc-rs is no longer enabled in dev-dependencies

* Switch another test from aws-lc-rs to ring since aws-lc-rs is no longer enabled in dev-dependencies

* Go the other way - use aws_lc_rs instead of ring

---------

Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-05-12 21:09:59 +00:00
Rob Ede 2632c984cc
ci: fix nightly windows builds 2024-05-12 21:53:26 +01:00
Rob Ede af8e6cd656
ci: read MSRV from manifest (#559) 2024-05-12 21:35:39 +01:00
SleeplessOne1917 db7988609e
feat(actix-tls): support for rustls 0.23 (#554)
* Add feature for using rustls 0.23

* Fix mistake

* Fix use of wrong tokio rustls package

* Fix accept openssl test

* Use rustls 0.23 for the example

* Install nasm in CI step for windows

* Change outdated step name

* Fix CI mistake

* test: install default crypto provider in tests

* docs: update changelog

---------

Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-05-12 18:47:49 +00:00
Rob Ede 1db640f62e
chore: update env logger 2024-05-12 19:10:27 +01:00
Rob Ede 9e7d612121
ci: remove 32-bit windows support 2024-05-12 18:25:02 +01:00
Rob Ede 5edbf9e3dc
chore: switch to rustversion-msrv 2024-05-12 18:24:37 +01:00
Rob Ede f028a74240
build: fix rustversion spec 2024-05-11 17:41:31 +01:00
Rob Ede f4139a0878
chore: update MSRV to 1.70 2024-05-11 17:39:34 +01:00
Rob Ede 3147dbe7ca
ci: rely more on just recipes (#558) 2024-05-11 15:10:56 +01:00
dependabot[bot] 95ca8f0318
build(deps): bump taiki-e/install-action from 2.33.12 to 2.33.17 (#555)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.33.12 to 2.33.17.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.33.12...v2.33.17)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-06 21:02:51 +00:00
dependabot[bot] f947374a73
build(deps): bump codecov/codecov-action from 4.3.0 to 4.3.1 (#556)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v4.3.0...v4.3.1)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-06 21:02:32 +00:00
dependabot[bot] 85191934c8
build(deps): bump codecov/codecov-action from 4.1.0 to 4.3.0 (#548)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.1.0 to 4.3.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v4.1.0...v4.3.0)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-02 03:24:47 +01:00
dependabot[bot] 234a4c9c7f
build(deps): bump JamesIves/github-pages-deploy-action (#549)
Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.5.0 to 4.6.0.
- [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)
- [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.5.0...v4.6.0)

---
updated-dependencies:
- dependency-name: JamesIves/github-pages-deploy-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-02 02:20:46 +01:00
dependabot[bot] d5171c2ab3
build(deps): bump taiki-e/cache-cargo-install-action from 1.3.0 to 2.0.0 (#551)
Bumps [taiki-e/cache-cargo-install-action](https://github.com/taiki-e/cache-cargo-install-action) from 1.3.0 to 2.0.0.
- [Release notes](https://github.com/taiki-e/cache-cargo-install-action/releases)
- [Changelog](https://github.com/taiki-e/cache-cargo-install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/cache-cargo-install-action/compare/v1.3.0...v2.0.0)

---
updated-dependencies:
- dependency-name: taiki-e/cache-cargo-install-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-02 02:20:35 +01:00
dependabot[bot] 875218488c
build(deps): bump taiki-e/install-action from 2.28.1 to 2.33.12 (#553)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.28.1 to 2.33.12.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.28.1...v2.33.12)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-02 02:20:21 +01:00
Rob Ede b826bf8471
ci: relax ahash msrv pin 2024-05-02 01:48:55 +01:00
Rob Ede 10bd847177
ci: fix msrv checks 2024-05-02 01:30:28 +01:00
dependabot[bot] 481cf55414
build(deps): bump codecov/codecov-action from 4.0.2 to 4.1.0 (#538)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.0.2 to 4.1.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v4.0.2...v4.1.0)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-05 17:51:42 +00:00
dependabot[bot] b4990023c4
build(deps): bump taiki-e/install-action from 2.27.11 to 2.28.1 (#537)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.27.11 to 2.28.1.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.27.11...v2.28.1)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-05 17:49:17 +00:00
dependabot[bot] eb5cec0064
build(deps): bump codecov/codecov-action from 4.0.1 to 4.0.2 (#535)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-01 18:06:10 +00:00
dependabot[bot] db925bf8e6
build(deps): bump taiki-e/install-action from 2.26.13 to 2.27.11 (#536)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-01 18:05:48 +00:00
Rob Ede 850f6c0491
chore: allow unused trait in test 2024-02-19 12:32:06 +00:00
Rob Ede 0f71fd5a7a
chore: remove redundant imports 2024-02-19 12:19:08 +00:00
Rob Ede 40b10847df
chore: remove redundant imports 2024-02-19 12:10:47 +00:00
Rob Ede 39bab04800
chore: remove redundant imports 2024-02-19 11:36:15 +00:00
Rob Ede 3cb247874e
ci: workaround ahash msrv 2024-02-19 11:31:41 +00:00
Rob Ede 5792d9f010
docs: fix repo links 2024-02-19 11:29:37 +00:00
dependabot[bot] bd8bd1020b
build(deps): bump taiki-e/install-action from 2.26.7 to 2.26.13 (#531)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-05 21:10:17 +00:00
dependabot[bot] 21be7d84bd
build(deps): bump codecov/codecov-action from 3.1.6 to 4.0.1 (#532)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-02-05 21:10:06 +00:00
Rob Ede 57fd6ea809
chore(actix-tls): prepare release 3.3.0 (#530) 2024-02-03 20:26:15 +00:00
Rob Ede 9a3f3eef6a
test(tls): fix accept-openssl test 2024-02-03 17:01:47 +00:00
Rob Ede e427911cdb
feat(tls): rustls-0_22 create feature 2024-02-03 16:39:21 +00:00
Rob Ede a1ae524512
docs: clean changelog 2024-02-01 06:42:41 +00:00
dependabot[bot] 88833355e4
build(deps): bump taiki-e/install-action from 2.25.2 to 2.26.7 (#527)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-30 22:41:04 +00:00
dependabot[bot] 7737ba5cfb
build(deps): bump codecov/codecov-action from 3.1.4 to 3.1.6 (#529)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-30 22:40:17 +00:00
Rob Ede fd32a0a97a
ci: workaround half crate msrv 2024-01-30 21:51:12 +00:00
Rob Ede 07e7f82345
chore(actix-codec): prepare release 0.5.2 2024-01-30 21:16:42 +00:00
Rob Ede 1a5d85ec8b
fix(tls): resolve http imports 2024-01-17 04:29:44 +00:00
Rob Ede bd1467e928
chore(tls): changelog wording 2024-01-17 04:27:52 +00:00
Rob Ede 968ad3b854
chore(actix-tls): prepare release 3.2.0 2024-01-17 04:26:46 +00:00
Rob Ede 079f0f66f0
chore(tls): clippy 2024-01-17 04:23:48 +00:00
dependabot[bot] d85903b31a
build(deps): bump taiki-e/install-action from 2.24.1 to 2.25.2 (#521)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.24.1 to 2.25.2.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.24.1...v2.25.2)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-15 18:28:26 +00:00
dependabot[bot] a0675fb0dd
build(deps): bump actions-rust-lang/setup-rust-toolchain (#520)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-15 18:47:31 +00:00
dependabot[bot] af9ccd17d9
build(deps): bump taiki-e/install-action from 2.22.0 to 2.24.1 (#518)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.22.0 to 2.24.1.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.22.0...v2.24.1)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-08 19:05:18 +00:00
Rob Ede eb977e9aeb
ci: combine install steps 2023-12-26 04:03:49 +00:00
Rob Ede d28c7db3b3
ci: use cargo-ci-clean-cache 2023-12-26 03:58:34 +00:00
Rob Ede c5b2d0cd36
chore(tls): fix feature flagging of DEFAULT_TLS_HANDSHAKE_TIMEOUT 2023-12-16 00:43:02 +00:00
Rob Ede 02ac0bb4f7
feat(tls): add accept::rustls_0_22 module 2023-12-16 00:23:11 +00:00
dependabot[bot] 86b000fe71
build(deps): bump taiki-e/install-action from 2.21.26 to 2.22.0 (#514)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.21.26 to 2.22.0.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.21.26...v2.22.0)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-11 21:10:42 +00:00
Rob Ede 951e46186b
feat: add rustls v0.22 support (#513) 2023-12-06 04:04:39 +00:00
Rob Ede 9edc0b393a
feat(tls): add crate feature for rustls native root certs (#506) 2023-12-06 01:39:13 +00:00
morenol 1945fa0675
feat: added suport to `http` crate `1.0` (#508)
* chore: use same feature

* test: add test for new http version added

* stylistic review

---------

Co-authored-by: Luis Moreno <morenol@users.noreply.github.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-12-06 00:18:17 +00:00
dependabot[bot] 923a443950
Bump taiki-e/install-action from 2.21.20 to 2.21.26 (#512)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.21.20 to 2.21.26.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.21.20...v2.21.26)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-04 19:15:55 +00:00
dependabot[bot] b526197a9a
Bump JamesIves/github-pages-deploy-action from 4.4.3 to 4.5.0 (#511)
Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.4.3 to 4.5.0.
- [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)
- [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.4.3...v4.5.0)

---
updated-dependencies:
- dependency-name: JamesIves/github-pages-deploy-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-04 19:15:52 +00:00
dependabot[bot] 8fc2253c61
Bump actions-rust-lang/setup-rust-toolchain from 1.5.0 to 1.6.0 (#510)
Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.5.0 to 1.6.0.
- [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases)
- [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/v1.5.0...v1.6.0)

---
updated-dependencies:
- dependency-name: actions-rust-lang/setup-rust-toolchain
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-04 19:15:50 +00:00
dependabot[bot] 4c12b81492
Bump taiki-e/install-action from 2.21.17 to 2.21.20 (#507)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.21.17 to 2.21.20.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.21.17...v2.21.20)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-27 20:16:33 +00:00
dependabot[bot] ef716a8488
Bump taiki-e/install-action from 2.21.11 to 2.21.17 (#505)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.21.11 to 2.21.17.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.21.11...v2.21.17)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-20 19:13:51 +00:00
Rob Ede 2a4df30c63
chore(rt): remove hyper example 2023-11-20 18:37:11 +00:00
dependabot[bot] 2d9b147cc3
Bump taiki-e/install-action from 2.21.7 to 2.21.11 (#502)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.21.7 to 2.21.11.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.21.7...v2.21.11)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-13 19:29:01 +00:00
Rob Ede 5515a37002
ci: run on merge groups 2023-11-06 23:53:36 +00:00
Rob Ede 4067fbe8f0
chore: fix check-external-types for rt 2023-11-06 22:19:59 +00:00
dependabot[bot] 01f9910e7c
Bump taiki-e/install-action from 2.21.3 to 2.21.7 (#501)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.21.3 to 2.21.7.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.21.3...v2.21.7)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-06 22:19:09 +00:00
Rob Ede df12c10a3f
fix check external types 2023-11-06 22:13:45 +00:00
dependabot[bot] f632ef2ba8
Bump taiki-e/cache-cargo-install-action from 1.2.2 to 1.3.0 (#499)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-30 19:50:39 +00:00
dependabot[bot] 19d03f0454
Bump taiki-e/install-action from 2.20.2 to 2.21.3 (#500)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-30 19:03:12 +00:00
Rob Ede e9c2a0c318
ci: fix check-external-types recipe 2023-10-30 00:26:39 +00:00
Rob Ede f967562ac4
chore: specify external types for each crate (#496) 2023-10-30 00:07:28 +00:00
Rob Ede 61b6e01b02
chore(bytestring): prepare release 1.3.1 2023-10-29 23:17:28 +00:00
Rob Ede 392e591820
chore(local-channel): prepare release 0.1.5 2023-10-29 23:16:53 +00:00
Rob Ede 87440e5734
chore(local-channel): prepare release 0.1.5 2023-10-29 23:15:19 +00:00
Rob Ede 665dec456f
chore(local-waker): prepare release 0.1.4 2023-10-29 23:14:14 +00:00
Rob Ede 7d138f0c31
build: fix min version compat (#498) 2023-10-29 21:15:40 +00:00
Rob Ede 3cd5d8b07a
doc: complete ServerBuilder::workers docs 2023-10-29 18:47:38 +00:00
Rob Ede 09548c96b0
doc: fix doc references 2023-10-29 18:45:12 +00:00
Rob Ede 17fd135349
docs: improve docs on ServerBuilder::{bind, workers} 2023-10-29 18:37:29 +00:00
dependabot[bot] b9b628c47b
Update criterion requirement from 0.4 to 0.5 (#495)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 05:08:55 +00:00
dependabot[bot] 580af3dec4
Bump actions/checkout from 3 to 4 (#494)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 04:17:06 +00:00
dependabot[bot] db54639f0f
Bump taiki-e/install-action from 2.18.9 to 2.21.2 (#497)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-29 03:30:20 +00:00
Rob Ede 6d9eb7e162
ci: specify full action versions 2023-10-29 01:55:34 +00:00
Rob Ede 69e50b5e66
add dependabot updater for actions and cargo 2023-10-29 01:35:12 +00:00
Rob Ede 17409cd203
docs: add bytestring readme 2023-09-17 20:33:36 +01:00
Rob Ede 4a7f2c95af
chore: remove dates from changelogs 2023-09-17 20:25:58 +01:00
Rob Ede c69b8e9ade
ci: move coverage to own workflow 2023-09-17 20:11:05 +01:00
Rob Ede 9f59093adc
chore(local-channel): prepare release 0.1.4 2023-09-17 19:32:01 +01:00
Paolo Barbolini bfeb4cd9e7
local-channel: drop futures-util by using future::poll_fn from std (#490) 2023-09-17 11:45:55 +00:00
Rob Ede 14272a1762
chore: force secure rustls-webpki 2023-08-29 18:45:11 +01:00
Rob Ede 7e043048a0
chore(actix-tls): prepare release 3.1.1 2023-08-29 18:41:48 +01:00
Rob Ede 45a7dcba90
chore(tls): fix min rustls version 2023-08-29 18:40:55 +01:00
Rob Ede 5029beb866
prepare actix-tls release 3.1.0 2023-08-26 18:05:39 +01:00
Rob Ede 910c181251
prepare actix-server release 2.3.0 2023-08-26 18:04:22 +01:00
Rob Ede 150d2c05d3
prepare actix-rt release 2.9.0 2023-08-26 18:02:48 +01:00
Alik Aslanyan 3b5716c23e
Add getter methods for actix_rt::Runtime and tokio::runtime::Runtime (#484)
Co-authored-by: Alik Aslanyan <inline0@pm.me>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-08-26 15:04:08 +00:00
Rob Ede 0bc310a656
Rustls v0.21 support (#480) 2023-08-26 14:59:51 +01:00
Rob Ede 6ce8307060
remove num_cpus dependency (#488) 2023-08-24 00:56:31 +01:00
Rob Ede 9cb8a1fadc
remove lint exception 2023-07-24 03:27:44 +01:00
Rob Ede 9017de439f
ci: fix post-merge tool installs 2023-07-20 00:22:55 +01:00
Rob Ede 3eba5b152e
prepare actix-macros release 0.2.4 2023-07-19 23:52:56 +01:00
Rob Ede 3c4b0c2755
ci: rename post-merge workflow 2023-07-19 23:49:31 +01:00
Rob Ede 462ab6a4f0
ci: try to fix master jobs on windows 2023-07-18 02:06:01 +01:00
Rob Ede e539f83615
attempt windows CI fix 2023-07-18 01:47:37 +01:00
Martin André 755b231e00
add MPTCP socket protocol (optional) (#466)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-07-17 04:10:36 +01:00
Rob Ede 8d5d1dbf6f
bump MSRV to 1.65 (#485) 2023-07-17 03:05:39 +01:00
Rob Ede 177590a7d8
increase bytestring test coverage 2023-04-01 22:45:18 +01:00
Rob Ede 4cbe741230
use secure openssl version 2023-04-01 22:26:08 +01:00
Rob Ede 80320a0325
use secure tokio version range 2023-04-01 22:24:10 +01:00
Rob Ede 6d0dc9628b
install cargo-hack faster 2023-04-01 22:21:57 +01:00
Rob Ede dbce150993
update syn to v2 (#481
* update syn to v2

* update changelog
2023-04-01 22:21:14 +01:00
Rob Ede 54ec06cd23
update bitflags to v2 2023-04-01 21:57:10 +01:00
Rob Ede c0693da9ba
update msrv to 1.60 (#482
* update msrv to 1.60

* inherit workspace msrv
2023-04-01 21:39:19 +01:00
Rob Ede 28f36e4e30
update unreleased sections date 2023-04-01 05:24:40 +01:00
Rob Ede c6ebbcf21b
clippy run on -tls 2023-04-01 05:24:00 +01:00
Rob Ede c60d2f9ddb
use doc_auto_cfg 2023-04-01 05:18:22 +01:00
119 changed files with 6230 additions and 1383 deletions

View File

@ -2,22 +2,14 @@
lint = "clippy --workspace --tests --examples --bins -- -Dclippy::todo" lint = "clippy --workspace --tests --examples --bins -- -Dclippy::todo"
lint-all = "clippy --workspace --all-features --tests --examples --bins -- -Dclippy::todo" lint-all = "clippy --workspace --all-features --tests --examples --bins -- -Dclippy::todo"
ci-doctest = "test --workspace --all-features --doc --no-fail-fast -- --nocapture"
# just check the library (without dev deps) # just check the library (without dev deps)
ci-check-min = "hack --workspace check --no-default-features" ci-check-min = "hack --workspace check --no-default-features"
ci-check-lib = "hack --workspace --feature-powerset --exclude-features=io-uring check" ci-check-lib = "hack --workspace --feature-powerset --depth=2 --exclude-features=io-uring check"
ci-check-lib-linux = "hack --workspace --feature-powerset check" ci-check-lib-linux = "hack --workspace --feature-powerset --depth=2 check"
# check everything # check everything
ci-check = "hack --workspace --feature-powerset --exclude-features=io-uring check --tests --examples" ci-check = "hack --workspace --feature-powerset --depth=2 --exclude-features=io-uring check --tests --examples"
ci-check-linux = "hack --workspace --feature-powerset check --tests --examples" ci-check-linux = "hack --workspace --feature-powerset --depth=2 check --tests --examples"
# tests avoiding io-uring feature # tests avoiding io-uring feature
ci-test = "hack --feature-powerset --exclude-features=io-uring test --lib --tests --no-fail-fast -- --nocapture" ci-test = "hack --feature-powerset --depth=2 --exclude-features=io-uring test --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
ci-test-linux = "hack --feature-powerset test --lib --tests --no-fail-fast -- --nocapture"

1
.envrc Normal file
View File

@ -0,0 +1 @@
use flake

View File

@ -1,10 +1,12 @@
## PR Type ## PR Type
<!-- What kind of change does this PR make? --> <!-- What kind of change does this PR make? -->
<!-- Bug Fix / Feature / Refactor / Code Style / Other --> <!-- Bug Fix / Feature / Refactor / Code Style / Other -->
INSERT_PR_TYPE INSERT_PR_TYPE
## PR Checklist ## PR Checklist
Check your PR fulfills the following: Check your PR fulfills the following:
<!-- For draft PRs check the boxes as you complete them. --> <!-- For draft PRs check the boxes as you complete them. -->
@ -14,11 +16,10 @@ Check your PR fulfills the following:
- [ ] A changelog entry has been made for the appropriate packages. - [ ] A changelog entry has been made for the appropriate packages.
- [ ] Format code with the latest stable rustfmt - [ ] Format code with the latest stable rustfmt
## Overview ## Overview
<!-- Describe the current and new behavior. --> <!-- Describe the current and new behavior. -->
<!-- Emphasize any breaking changes. --> <!-- Emphasize any breaking changes. -->
<!-- If this PR fixes or closes an issue, reference it here. --> <!-- If this PR fixes or closes an issue, reference it here. -->
<!-- Closes #000 --> <!-- Closes #000 -->

10
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
- package-ecosystem: cargo
directory: /
schedule:
interval: weekly

View File

@ -1,179 +0,0 @@
name: CI (master only)
on:
push:
branches: [master]
jobs:
build_and_test_nightly:
strategy:
fail-fast: false
matrix:
target:
- { name: Linux, os: ubuntu-latest, triple: x86_64-unknown-linux-gnu }
- { name: macOS, os: macos-latest, triple: x86_64-apple-darwin }
- { name: Windows, os: windows-latest, triple: x86_64-pc-windows-msvc }
- { name: Windows (MinGW), os: windows-latest, triple: x86_64-pc-windows-gnu }
- { name: Windows (32-bit), os: windows-latest, triple: i686-pc-windows-msvc }
version:
- nightly
name: ${{ matrix.target.name }} / ${{ matrix.version }}
runs-on: ${{ matrix.target.os }}
env:
VCPKGRS_DYNAMIC: 1
steps:
- name: Setup Routing
if: matrix.target.os == 'macos-latest'
run: sudo ifconfig lo0 alias 127.0.0.3
- uses: actions/checkout@v3
# install OpenSSL on Windows
- name: Set vcpkg root
if: matrix.target.triple == 'x86_64-pc-windows-msvc' || matrix.target.triple == 'i686-pc-windows-msvc'
run: echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Install OpenSSL
if: matrix.target.triple == 'x86_64-pc-windows-msvc'
run: vcpkg install openssl:x64-windows
- name: Install OpenSSL
if: matrix.target.triple == 'i686-pc-windows-msvc'
run: vcpkg install openssl:x86-windows
- name: Install ${{ matrix.version }}
run: |
rustup set profile minimal
rustup install ${{ matrix.version }}-${{ matrix.target.triple }}
rustup override set ${{ matrix.version }}-${{ matrix.target.triple }}
# - name: Install MSYS2
# if: matrix.target.triple == 'x86_64-pc-windows-gnu'
# uses: msys2/setup-msys2@v2
# - name: Install MinGW Packages
# if: matrix.target.triple == 'x86_64-pc-windows-gnu'
# run: |
# msys2 -c 'pacman -Sy --noconfirm pacman'
# msys2 -c 'pacman --noconfirm -S base-devel pkg-config'
# - name: Generate Cargo.lock
# run: cargo generate-lockfile
# - name: Cache Dependencies
# uses: Swatinem/rust-cache@v2.2.0
- name: Install cargo-hack
run: cargo install cargo-hack
- name: check lib
if: >
matrix.target.os != 'ubuntu-latest'
&& matrix.target.triple != 'x86_64-pc-windows-gnu'
run: cargo ci-check-lib
- name: check lib
if: matrix.target.os == 'ubuntu-latest'
run: cargo ci-check-lib-linux
- name: check lib
if: matrix.target.triple == 'x86_64-pc-windows-gnu'
run: cargo ci-check-min
- name: check full
# TODO: compile OpenSSL and run tests on MinGW
if: >
matrix.target.os != 'ubuntu-latest'
&& matrix.target.triple != 'x86_64-pc-windows-gnu'
run: cargo ci-check
- name: check all
if: matrix.target.os == 'ubuntu-latest'
run: cargo ci-check-linux
- name: tests
if: >
matrix.target.os != 'ubuntu-latest'
&& matrix.target.triple != 'x86_64-pc-windows-gnu'
run: cargo ci-test
- name: tests
if: matrix.target.os == 'ubuntu-latest'
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-linux"
- name: Clear the cargo caches
run: |
cargo install cargo-cache --version 0.6.2 --no-default-features --features ci-autoclean
cargo-cache
coverage:
name: coverage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Rust (nightly)
run: |
rustup set profile minimal
rustup install nightly
rustup override set nightly
- name: Generate Cargo.lock
run: cargo generate-lockfile
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2.2.0
- name: Generate coverage file
if: github.ref == 'refs/heads/master'
run: |
cargo install cargo-tarpaulin
cargo tarpaulin --out Xml --verbose
- name: Upload to Codecov
if: github.ref == 'refs/heads/master'
uses: codecov/codecov-action@v3
with: { files: cobertura.xml }
minimal-versions:
name: minimal versions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Rust (nightly)
run: |
rustup set profile minimal
rustup install nightly
rustup override set nightly
- name: Generate Cargo.lock
run: cargo generate-lockfile
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2.2.0
- name: Install cargo-minimal-versions
run: cargo install cargo-minimal-versions
- name: Install cargo-hack
run: cargo install cargo-hack
- name: Check With Minimal Versions
run: cargo minimal-versions check
nextest:
name: nextest
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Rust
run: |
rustup set profile minimal
rustup install stable
rustup override set stable
- name: Generate Cargo.lock
run: cargo generate-lockfile
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2.2.0
- name: Install cargo-nextest
run: cargo install cargo-nextest
- name: Test with cargo-nextest
run: cargo nextest run

129
.github/workflows/ci-post-merge.yml vendored Normal file
View File

@ -0,0 +1,129 @@
name: CI (post-merge)
on:
push:
branches: [master]
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build_and_test_nightly:
strategy:
fail-fast: false
matrix:
# prettier-ignore
target:
- { name: Linux, os: ubuntu-latest, triple: x86_64-unknown-linux-gnu }
- { name: macOS, os: macos-latest, triple: x86_64-apple-darwin }
- { name: Windows, os: windows-latest, triple: x86_64-pc-windows-msvc }
- { name: Windows (MinGW), os: windows-latest, triple: x86_64-pc-windows-gnu }
version:
- nightly
name: ${{ matrix.target.name }} / ${{ matrix.version }}
runs-on: ${{ matrix.target.os }}
env: {}
steps:
- name: Setup Routing
if: matrix.target.os == 'macos-latest'
run: sudo ifconfig lo0 alias 127.0.0.3
- uses: actions/checkout@v4
- name: Free Disk Space
if: matrix.target.os == 'ubuntu-latest'
run: ./scripts/free-disk-space.sh
- name: Setup mold linker
if: matrix.target.os == 'ubuntu-latest'
uses: rui314/setup-mold@v1
- name: Install nasm
if: matrix.target.os == 'windows-latest'
uses: ilammy/setup-nasm@v1.5.2
- name: Install OpenSSL
if: matrix.target.os == 'windows-latest'
shell: bash
run: |
set -e
choco install openssl --version=1.1.1.2100 -y --no-progress
echo 'OPENSSL_DIR=C:\Program Files\OpenSSL' >> $GITHUB_ENV
echo "RUSTFLAGS=-C target-feature=+crt-static" >> $GITHUB_ENV
- name: Install Rust (${{ matrix.version }})
uses: actions-rust-lang/setup-rust-toolchain@v1.11.0
with:
toolchain: ${{ matrix.version }}
- name: Install just, cargo-hack, cargo-nextest, cargo-ci-cache-clean
uses: taiki-e/install-action@v2.49.34
with:
tool: just,cargo-hack,cargo-nextest,cargo-ci-cache-clean
- name: check lib
if: >
matrix.target.os != 'ubuntu-latest'
&& matrix.target.triple != 'x86_64-pc-windows-gnu'
run: cargo ci-check-lib
- name: check lib
if: matrix.target.os == 'ubuntu-latest'
run: cargo ci-check-lib-linux
- name: check lib
if: matrix.target.triple == 'x86_64-pc-windows-gnu'
run: cargo ci-check-min
- name: check full
# TODO: compile OpenSSL and run tests on MinGW
if: >
matrix.target.os != 'ubuntu-latest'
&& matrix.target.triple != 'x86_64-pc-windows-gnu'
run: cargo ci-check
- name: check all
if: matrix.target.os == 'ubuntu-latest'
run: cargo ci-check-linux
- name: tests
run: just test
# TODO: re-instate some io-uring tests PRs
# - name: tests
# if: matrix.target.os == 'ubuntu-latest'
# run: >-
# sudo bash -c "
# ulimit -Sl 512
# && ulimit -Hl 512
# && PATH=$PATH:/usr/share/rust/.cargo/bin
# && RUSTUP_TOOLCHAIN=${{ matrix.version }} cargo ci-test-rustls-020
# && RUSTUP_TOOLCHAIN=${{ matrix.version }} cargo ci-test-rustls-021
# && RUSTUP_TOOLCHAIN=${{ matrix.version }} cargo ci-test-linux
# "
- name: CI cache clean
run: cargo-ci-cache-clean
minimal-versions:
name: minimal versions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust (nightly)
uses: actions-rust-lang/setup-rust-toolchain@v1.11.0
with:
toolchain: nightly
- name: Install cargo-hack & cargo-minimal-versions
uses: taiki-e/install-action@v2.49.34
with:
tool: cargo-hack,cargo-minimal-versions
- name: Check With Minimal Versions
run: cargo minimal-versions check

View File

@ -1,93 +1,88 @@
name: CI name: CI
on: on:
pull_request: pull_request: {}
types: [opened, synchronize, reopened] merge_group: { types: [checks_requested] }
push: push: { branches: [master] }
branches: [master]
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs: jobs:
read_msrv:
name: Read MSRV
uses: actions-rust-lang/msrv/.github/workflows/msrv.yml@v0.1.0
build_and_test: build_and_test:
needs:
- read_msrv
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
# prettier-ignore
target: target:
- { name: Linux, os: ubuntu-latest, triple: x86_64-unknown-linux-gnu } - { name: Linux, os: ubuntu-latest, triple: x86_64-unknown-linux-gnu }
- { name: macOS, os: macos-latest, triple: x86_64-apple-darwin } - { name: macOS, os: macos-latest, triple: x86_64-apple-darwin }
- { name: Windows, os: windows-latest, triple: x86_64-pc-windows-msvc } - { name: Windows, os: windows-latest, triple: x86_64-pc-windows-msvc }
- { name: Windows (MinGW), os: windows-latest, triple: x86_64-pc-windows-gnu } - { name: Windows (MinGW), os: windows-latest, triple: x86_64-pc-windows-gnu }
- { name: Windows (32-bit), os: windows-latest, triple: i686-pc-windows-msvc }
version: version:
- 1.59.0 - { name: msrv, version: "${{ needs.read_msrv.outputs.msrv }}" }
- stable - { name: stable, version: stable }
name: ${{ matrix.target.name }} / ${{ matrix.version }} name: ${{ matrix.target.name }} / ${{ matrix.version.name }}
runs-on: ${{ matrix.target.os }} runs-on: ${{ matrix.target.os }}
env: env: {}
VCPKGRS_DYNAMIC: 1
steps: steps:
- name: Setup Routing - name: Setup Routing
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@v3 - uses: actions/checkout@v4
- name: Free Disk Space
if: matrix.target.os == 'ubuntu-latest'
run: ./scripts/free-disk-space.sh
- name: Setup mold linker
if: matrix.target.os == 'ubuntu-latest'
uses: rui314/setup-mold@v1
- name: Install nasm
if: matrix.target.os == 'windows-latest'
uses: ilammy/setup-nasm@v1.5.2
# install OpenSSL on Windows
- name: Set vcpkg root
if: matrix.target.triple == 'x86_64-pc-windows-msvc' || matrix.target.triple == 'i686-pc-windows-msvc'
run: echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Install OpenSSL - name: Install OpenSSL
if: matrix.target.triple == 'x86_64-pc-windows-msvc' if: matrix.target.os == 'windows-latest'
run: vcpkg install openssl:x64-windows shell: bash
- name: Install OpenSSL
if: matrix.target.triple == 'i686-pc-windows-msvc'
run: vcpkg install openssl:x86-windows
- name: Install ${{ matrix.version }}
run: | run: |
rustup set profile minimal set -e
rustup install ${{ matrix.version }}-${{ matrix.target.triple }} choco install openssl --version=1.1.1.2100 -y --no-progress
rustup override set ${{ matrix.version }}-${{ matrix.target.triple }} echo 'OPENSSL_DIR=C:\Program Files\OpenSSL' >> $GITHUB_ENV
echo "RUSTFLAGS=-C target-feature=+crt-static" >> $GITHUB_ENV
# - name: Install MSYS2 - name: Install Rust (${{ matrix.version.name }})
# if: matrix.target.triple == 'x86_64-pc-windows-gnu' uses: actions-rust-lang/setup-rust-toolchain@v1.11.0
# uses: msys2/setup-msys2@v2 with:
# - name: Install MinGW Packages toolchain: ${{ matrix.version.version }}
# if: matrix.target.triple == 'x86_64-pc-windows-gnu'
# run: |
# msys2 -c 'pacman -Sy --noconfirm pacman'
# msys2 -c 'pacman --noconfirm -S base-devel pkg-config'
# - name: Generate Cargo.lock - name: Install just, cargo-hack, cargo-nextest, cargo-ci-cache-clean
# run: cargo generate-lockfile uses: taiki-e/install-action@v2.49.34
# - name: Cache Dependencies with:
# uses: Swatinem/rust-cache@v2.2.0 tool: just,cargo-hack,cargo-nextest,cargo-ci-cache-clean
- name: Install cargo-hack
if: matrix.version != '1.59.0'
run: cargo install 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
run: cargo generate-lockfile run: cargo generate-lockfile
- name: workaround MSRV issues - name: workaround MSRV issues
if: matrix.version != 'stable' if: matrix.version.name == 'msrv'
run: | run: just downgrade-for-msrv
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: >
@ -98,7 +93,7 @@ jobs:
if: matrix.target.os == 'ubuntu-latest' if: matrix.target.os == 'ubuntu-latest'
run: cargo ci-check-lib-linux run: cargo 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'
run: cargo ci-check-min run: cargo ci-check-min
- name: check full - name: check full
@ -112,42 +107,27 @@ jobs:
run: cargo ci-check-linux run: cargo ci-check-linux
- name: tests - name: tests
if: matrix.target.os == 'macos-latest' run: just test
run: cargo ci-test
- name: tests
if: >
matrix.target.os == 'windows-latest'
&& matrix.target.triple != 'x86_64-pc-windows-gnu'
run: cargo ci-test-win
- name: tests
if: matrix.target.os == 'ubuntu-latest'
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-linux"
- name: Clear the cargo caches - name: CI cache clean
if: matrix.version == 'stable' # MSRV(1.58) cargo-cache now fails to install on 1.59 run: cargo-ci-cache-clean
run: |
cargo install cargo-cache --version 0.6.2 --no-default-features --features ci-autoclean
cargo-cache
rustdoc: docs:
name: rustdoc name: Documentation
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Install Rust (nightly) - name: Install Rust (nightly)
run: | uses: actions-rust-lang/setup-rust-toolchain@v1.11.0
rustup set profile minimal with:
rustup install nightly toolchain: nightly
rustup override set nightly
- name: Generate Cargo.lock - name: Install just
run: cargo generate-lockfile uses: taiki-e/install-action@v2.49.34
- name: Cache Dependencies with:
uses: Swatinem/rust-cache@v2.2.0 tool: just
- name: doc tests io-uring - name: doc tests
run: | run: just test-docs
sudo bash -c "ulimit -Sl 512 && ulimit -Hl 512 && PATH=$PATH:/usr/share/rust/.cargo/bin && RUSTUP_TOOLCHAIN=nightly cargo ci-doctest"

View File

@ -1,37 +0,0 @@
name: Lint
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
fmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Rust
run: |
rustup set profile minimal
rustup install stable
rustup override set stable
rustup component add rustfmt
- name: Rustfmt Check
run: cargo fmt --all -- --check
clippy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Rust
run: |
rustup set profile minimal
rustup install stable
rustup override set stable
rustup component add clippy
- uses: giraffate/clippy-action@v1
with:
reporter: "github-pr-check"
github_token: ${{ secrets.GITHUB_TOKEN }}
clippy_flags: --workspace --all-features --tests --examples --bins -- -Dclippy::todo

39
.github/workflows/coverage.yml vendored Normal file
View File

@ -0,0 +1,39 @@
name: Coverage
on:
push:
branches: [master]
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1.11.0
with:
components: llvm-tools-preview
- name: Install cargo-llvm-cov
uses: taiki-e/install-action@v2.49.34
with:
tool: cargo-llvm-cov
- name: Generate code coverage
run: cargo llvm-cov --workspace --all-features --codecov --output-path codecov.json
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5.4.0
with:
files: codecov.json
fail_ci_if_error: true
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

69
.github/workflows/lint.yml vendored Normal file
View File

@ -0,0 +1,69 @@
name: Lint
on:
pull_request: {}
merge_group: { types: [checks_requested] }
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
fmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rust-lang/setup-rust-toolchain@v1.11.0
with:
toolchain: nightly
components: rustfmt
- name: Rustfmt Check
run: cargo fmt --all -- --check
clippy:
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rust-lang/setup-rust-toolchain@v1.11.0
with: { components: clippy }
- uses: giraffate/clippy-action@v1.0.1
with:
reporter: "github-pr-check"
github_token: ${{ secrets.GITHUB_TOKEN }}
clippy_flags: --workspace --all-features --tests --examples --bins -- -Dclippy::todo -Aunknown_lints
check-external-types:
if: false # rustdoc mismatch currently
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust (${{ vars.RUST_VERSION_EXTERNAL_TYPES }})
uses: actions-rust-lang/setup-rust-toolchain@v1.11.0
with:
toolchain: ${{ vars.RUST_VERSION_EXTERNAL_TYPES }}
- name: Install just
uses: taiki-e/install-action@v2.49.34
with:
tool: just
- name: Install cargo-check-external-types
uses: taiki-e/cache-cargo-install-action@v2.1.1
with:
tool: cargo-check-external-types
- name: check external types
run: just check-external-types-all +${{ vars.RUST_VERSION_EXTERNAL_TYPES }}

View File

@ -1,29 +0,0 @@
name: Upload documentation
on:
push:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Rust
run: |
rustup set profile minimal
rustup install nightly
rustup override set nightly
- name: Build Docs
run: cargo doc --workspace --all-features --no-deps
- name: Tweak HTML
run: echo '<meta http-equiv="refresh" content="0;url=actix_server/index.html">' > target/doc/index.html
- name: Deploy to GitHub Pages
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: target/doc

5
.gitignore vendored
View File

@ -1,4 +1,3 @@
Cargo.lock
target/ target/
guide/build/ guide/build/
/gh-pages /gh-pages
@ -13,4 +12,8 @@ guide/build/
# These are backup files generated by rustfmt # These are backup files generated by rustfmt
**/*.rs.bk **/*.rs.bk
# IDEs
.idea .idea
# direnv
/.direnv

3
.rustfmt.toml Normal file
View File

@ -0,0 +1,3 @@
group_imports = "StdExternalCrate"
imports_granularity = "Crate"
use_field_init_shorthand = true

29
.taplo.toml Normal file
View File

@ -0,0 +1,29 @@
exclude = ["target/*"]
include = ["**/*.toml"]
[formatting]
column_width = 110
[[rule]]
include = ["**/Cargo.toml"]
keys = [
"dependencies",
"*-dependencies",
"workspace.dependencies",
"workspace.*-dependencies",
"target.*.dependencies",
"target.*.*-dependencies",
]
formatting.reorder_keys = true
[[rule]]
include = ["**/Cargo.toml"]
keys = [
"dependencies.*",
"*-dependencies.*",
"workspace.dependencies.*",
"workspace.*-dependencies.*",
"target.*.dependencies",
"target.*.*-dependencies",
]
formatting.reorder_keys = false

2941
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,5 @@
[workspace] [workspace]
resolver = "2"
members = [ members = [
"actix-codec", "actix-codec",
"actix-macros", "actix-macros",
@ -13,6 +14,11 @@ members = [
"local-waker", "local-waker",
] ]
[workspace.package]
license = "MIT OR Apache-2.0"
edition = "2021"
rust-version = "1.71.1"
[patch.crates-io] [patch.crates-io]
actix-codec = { path = "actix-codec" } actix-codec = { path = "actix-codec" }
actix-macros = { path = "actix-macros" } actix-macros = { path = "actix-macros" }
@ -30,3 +36,9 @@ local-waker = { path = "local-waker" }
lto = true lto = true
opt-level = 3 opt-level = 3
codegen-units = 1 codegen-units = 1
[workspace.lints.rust]
rust_2018_idioms = "deny"
nonstandard-style = "deny"
future_incompatible = "deny"
missing_docs = { level = "warn", priority = -1 }

View File

@ -3,7 +3,7 @@
> A collection of lower-level libraries for composable network services. > A collection of lower-level libraries for composable network services.
[![CI](https://github.com/actix/actix-net/actions/workflows/ci.yml/badge.svg?event=push&style=flat-square)](https://github.com/actix/actix-net/actions/workflows/ci.yml) [![CI](https://github.com/actix/actix-net/actions/workflows/ci.yml/badge.svg?event=push&style=flat-square)](https://github.com/actix/actix-net/actions/workflows/ci.yml)
[![codecov](https://codecov.io/gh/actix/actix-net/branch/master/graph/badge.svg)](https://codecov.io/gh/actix/actix-net) [![codecov](https://codecov.io/gh/actix/actix-net/graph/badge.svg?token=8rKIZKtLLm)](https://codecov.io/gh/actix/actix-net)
[![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)
[![Dependency Status](https://deps.rs/repo/github/actix/actix-net/status.svg)](https://deps.rs/repo/github/actix/actix-net) [![Dependency Status](https://deps.rs/repo/github/actix/actix-net/status.svg)](https://deps.rs/repo/github/actix/actix-net)
@ -13,7 +13,7 @@ See example folders for [`actix-server`](./actix-server/examples) and [`actix-tl
## MSRV ## MSRV
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. Crates in this repo currently have a Minimum Supported Rust Version (MSRV) of 1.65. As a policy, we permit MSRV increases in non-breaking releases.
## License ## License

View File

@ -1,56 +1,51 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased
- Minimum supported Rust version (MSRV) is now 1.59. - Minimum supported Rust version (MSRV) is now 1.71.
## 0.5.1 - 2022-03-15 ## 0.5.2
- Logs emitted now use the `tracing` crate with `log` compatibility. [#451] - Minimum supported Rust version (MSRV) is now 1.65.
## 0.5.1
- Logs emitted now use the `tracing` crate with `log` compatibility.
- 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 ## 0.5.0
## 0.5.0 - 2022-02-15 - Updated `tokio-util` dependency to `0.7.0`.
- Updated `tokio-util` dependency to `0.7.0`. [#446] ## 0.4.2
[#446]: https://github.com/actix/actix-net/pull/446
## 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
- Added `LinesCodec.` [#338] - Added `LinesCodec`.
- `Framed::poll_ready` flushes when the buffer is full. [#409] - `Framed::poll_ready` flushes when the buffer is full.
[#338]: https://github.com/actix/actix-net/pull/338 ## 0.4.0
[#409]: https://github.com/actix/actix-net/pull/409
## 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
- Replace `pin-project` with `pin-project-lite`. [#237] - Replace `pin-project` with `pin-project-lite`.
- Upgrade `tokio` dependency to `1`. [#237] - Upgrade `tokio` dependency to `1`.
- Upgrade `tokio-util` dependency to `0.6`. [#237] - Upgrade `tokio-util` dependency to `0.6`.
- Upgrade `bytes` dependency to `1`. [#237] - Upgrade `bytes` dependency to `1`.
[#237]: https://github.com/actix/actix-net/pull/237 ## 0.3.0
## 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
- 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
- Use `.advance()` instead of `.split_to()`. - Use `.advance()` instead of `.split_to()`.
- Upgrade `tokio-util` to `0.3`. - Upgrade `tokio-util` to `0.3`.
@ -60,7 +55,7 @@
- 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
- Use specific futures dependencies. - Use specific futures dependencies.
@ -77,14 +72,14 @@
- Migrated to `std::future`. - Migrated to `std::future`.
## 0.1.2 - 2019-03-27 ## 0.1.2
- Added `Framed::map_io()` method. - Added `Framed::map_io()` method.
## 0.1.1 - 2019-03-06 ## 0.1.1
- Added `FramedParts::with_read_buffer()` method. - Added `FramedParts::with_read_buffer()` method.
## 0.1.0 - 2018-12-09 ## 0.1.0
- Move codec to separate crate. - Move codec to separate crate.

View File

@ -1,36 +1,36 @@
[package] [package]
name = "actix-codec" name = "actix-codec"
version = "0.5.1" version = "0.5.2"
authors = [ authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
description = "Codec utilities for working with framed protocols" description = "Codec utilities for working with framed protocols"
keywords = ["network", "framework", "async", "futures"] keywords = ["network", "framework", "async", "futures"]
repository = "https://github.com/actix/actix-net" repository = "https://github.com/actix/actix-net"
categories = ["network-programming", "asynchronous"] categories = ["network-programming", "asynchronous"]
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
edition = "2018" edition.workspace = true
rust-version.workspace = true
[lib] [package.metadata.cargo_check_external_types]
name = "actix_codec" allowed_external_types = ["bytes::*", "futures_core::*", "futures_sink::*", "tokio::*", "tokio_util::*"]
path = "src/lib.rs"
[dependencies] [dependencies]
bitflags = "1.2" bitflags = "2"
bytes = "1" bytes = "1"
futures-core = { version = "0.3.7", default-features = false } futures-core = { version = "0.3.7", default-features = false }
futures-sink = { version = "0.3.7", default-features = false } futures-sink = { version = "0.3.7", default-features = false }
memchr = "2.3" memchr = "2.3"
pin-project-lite = "0.2" pin-project-lite = "0.2"
tokio = "1.18.4" tokio = "1.23.1"
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.4", features = ["html_reports"] } criterion = { version = "0.5", features = ["html_reports"] }
tokio-test = "0.4.2" tokio-test = "0.4.2"
[[bench]] [[bench]]
name = "lines" name = "lines"
harness = false harness = false
[lints]
workspace = true

View File

@ -1,3 +1,5 @@
#![allow(missing_docs)]
use bytes::BytesMut; use bytes::BytesMut;
use criterion::{criterion_group, criterion_main, Criterion}; use criterion::{criterion_group, criterion_main, Criterion};

View File

@ -18,6 +18,7 @@ const LW: usize = 1024;
const HW: usize = 8 * 1024; const HW: usize = 8 * 1024;
bitflags! { bitflags! {
#[derive(Debug, Clone, Copy)]
struct Flags: u8 { struct Flags: u8 {
const EOF = 0b0001; const EOF = 0b0001;
const READABLE = 0b0010; const READABLE = 0b0010;
@ -233,10 +234,7 @@ impl<T, U> Framed<T, U> {
} }
/// Flush write buffer to underlying I/O stream. /// Flush write buffer to underlying I/O stream.
pub fn flush<I>( pub fn flush<I>(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), U::Error>>
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Result<(), U::Error>>
where where
T: AsyncWrite, T: AsyncWrite,
U: Encoder<I>, U: Encoder<I>,
@ -269,10 +267,7 @@ impl<T, U> Framed<T, U> {
} }
/// Flush write buffer and shutdown underlying I/O stream. /// Flush write buffer and shutdown underlying I/O stream.
pub fn close<I>( pub fn close<I>(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), U::Error>>
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Result<(), U::Error>>
where where
T: AsyncWrite, T: AsyncWrite,
U: Encoder<I>, U: Encoder<I>,

View File

@ -6,19 +6,21 @@
//! [`Sink`]: futures_sink::Sink //! [`Sink`]: futures_sink::Sink
//! [`Stream`]: futures_core::Stream //! [`Stream`]: futures_core::Stream
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible, missing_docs)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")] #![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")] #![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
pub use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
pub use tokio_util::{
codec::{Decoder, Encoder},
io::poll_read_buf,
};
mod bcodec; mod bcodec;
mod framed; mod framed;
mod lines; mod lines;
pub use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; pub use self::{
pub use tokio_util::codec::{Decoder, Encoder}; bcodec::BytesCodec,
pub use tokio_util::io::poll_read_buf; framed::{Framed, FramedParts},
lines::LinesCodec,
pub use self::bcodec::BytesCodec; };
pub use self::framed::{Framed, FramedParts};
pub use self::lines::LinesCodec;

View File

@ -1,3 +1,5 @@
#![allow(missing_docs)]
use std::{ use std::{
collections::VecDeque, collections::VecDeque,
io::{self, Write}, io::{self, Write},
@ -81,10 +83,7 @@ impl AsyncWrite for Bilateral {
other => Ready(other), other => Ready(other),
} }
} }
fn poll_shutdown( fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Result<(), io::Error>> {
unimplemented!() unimplemented!()
} }
} }

View File

@ -1,47 +1,52 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased
- Minimum supported Rust version (MSRV) is now 1.59. - Minimum supported Rust version (MSRV) is now 1.71.
## 0.2.3 - 2021-10-19 ## 0.2.4
- Update `syn` dependency to `2`.
- Minimum supported Rust version (MSRV) is now 1.65.
## 0.2.3
- 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
- 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
- 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
- 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
- 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
- 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
- Forward actix_rt::test arguments to test function [#127] - Forward actix_rt::test arguments to test function [#127]

View File

@ -1,27 +1,39 @@
[package] [package]
name = "actix-macros" name = "actix-macros"
version = "0.2.3" version = "0.2.4"
authors = [ authors = [
"Nikolay Kim <fafhrd91@gmail.com>", "Nikolay Kim <fafhrd91@gmail.com>",
"Ibraheem Ahmed <ibrah1440@gmail.com>", "Ibraheem Ahmed <ibrah1440@gmail.com>",
"Rob Ede <robjtede@icloud.com>", "Rob Ede <robjtede@icloud.com>",
] ]
description = "Macros for Actix system and runtime" description = "Macros for Actix system and runtime"
repository = "https://github.com/actix/actix-net.git" repository = "https://github.com/actix/actix-net"
categories = ["network-programming", "asynchronous"] categories = ["network-programming", "asynchronous"]
license = "MIT OR Apache-2.0" license.workspace = true
edition = "2018" edition.workspace = true
rust-version.workspace = true
[package.metadata.cargo-machete]
ignored = [
"proc_macro2", # specified for minimal versions compat
]
[lib] [lib]
proc-macro = true proc-macro = true
[dependencies] [dependencies]
quote = "1" quote = "1"
syn = { version = "1", features = ["full"] } syn = { version = "2", features = ["full"] }
# minimal versions compat
[target.'cfg(any())'.dependencies]
proc-macro2 = "1.0.60"
[dev-dependencies] [dev-dependencies]
actix-rt = "2" actix-rt = "2"
futures-util = { version = "0.3.17", default-features = false } futures-util = { version = "0.3.17", default-features = false }
rustversion = "1" rustversion-msrv = "0.100"
trybuild = "1" trybuild = "1"
[lints]
workspace = true

View File

@ -8,13 +8,14 @@
//! # Tests //! # Tests
//! See docs for the [`#[test]`](macro@test) macro. //! See docs for the [`#[test]`](macro@test) macro.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")] #![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")] #![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
use proc_macro::TokenStream; use proc_macro::TokenStream;
use quote::quote; use quote::quote;
use syn::parse::Parser as _;
type AttributeArgs = syn::punctuated::Punctuated<syn::Meta, syn::Token![,]>;
/// Marks async entry-point function to be executed by Actix system. /// Marks async entry-point function to be executed by Actix system.
/// ///
@ -25,9 +26,7 @@ use quote::quote;
/// println!("Hello world"); /// println!("Hello world");
/// } /// }
/// ``` /// ```
#[allow(clippy::needless_doctest_main)]
#[proc_macro_attribute] #[proc_macro_attribute]
#[cfg(not(test))] // Work around for rust-lang/rust#62127
pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
let mut input = match syn::parse::<syn::ItemFn>(item.clone()) { let mut input = match syn::parse::<syn::ItemFn>(item.clone()) {
Ok(input) => input, Ok(input) => input,
@ -35,7 +34,11 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
Err(err) => return input_and_compile_error(item, err), Err(err) => return input_and_compile_error(item, err),
}; };
let args = syn::parse_macro_input!(args as syn::AttributeArgs); let parser = AttributeArgs::parse_terminated;
let args = match parser.parse(args.clone()) {
Ok(args) => args,
Err(err) => return input_and_compile_error(args, err),
};
let attrs = &input.attrs; let attrs = &input.attrs;
let vis = &input.vis; let vis = &input.vis;
@ -55,11 +58,15 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
for arg in &args { for arg in &args {
match arg { match arg {
syn::NestedMeta::Meta(syn::Meta::NameValue(syn::MetaNameValue { syn::Meta::NameValue(syn::MetaNameValue {
lit: syn::Lit::Str(lit),
path, path,
value:
syn::Expr::Lit(syn::ExprLit {
lit: syn::Lit::Str(lit),
..
}),
.. ..
})) => match path }) => match path
.get_ident() .get_ident()
.map(|i| i.to_string().to_lowercase()) .map(|i| i.to_string().to_lowercase())
.as_deref() .as_deref()
@ -78,6 +85,7 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
.into(); .into();
} }
}, },
_ => { _ => {
return syn::Error::new_spanned(arg, "Unknown attribute specified") return syn::Error::new_spanned(arg, "Unknown attribute specified")
.to_compile_error() .to_compile_error()
@ -114,7 +122,11 @@ pub fn test(args: TokenStream, item: TokenStream) -> TokenStream {
Err(err) => return input_and_compile_error(item, err), Err(err) => return input_and_compile_error(item, err),
}; };
let args = syn::parse_macro_input!(args as syn::AttributeArgs); let parser = AttributeArgs::parse_terminated;
let args = match parser.parse(args.clone()) {
Ok(args) => args,
Err(err) => return input_and_compile_error(args, err),
};
let attrs = &input.attrs; let attrs = &input.attrs;
let vis = &input.vis; let vis = &input.vis;
@ -123,7 +135,7 @@ pub fn test(args: TokenStream, item: TokenStream) -> TokenStream {
let mut has_test_attr = false; let mut has_test_attr = false;
for attr in attrs { for attr in attrs {
if attr.path.is_ident("test") { if attr.path().is_ident("test") {
has_test_attr = true; has_test_attr = true;
} }
} }
@ -149,11 +161,15 @@ pub fn test(args: TokenStream, item: TokenStream) -> TokenStream {
for arg in &args { for arg in &args {
match arg { match arg {
syn::NestedMeta::Meta(syn::Meta::NameValue(syn::MetaNameValue { syn::Meta::NameValue(syn::MetaNameValue {
lit: syn::Lit::Str(lit),
path, path,
value:
syn::Expr::Lit(syn::ExprLit {
lit: syn::Lit::Str(lit),
..
}),
.. ..
})) => match path }) => match path
.get_ident() .get_ident()
.map(|i| i.to_string().to_lowercase()) .map(|i| i.to_string().to_lowercase())
.as_deref() .as_deref()

View File

@ -1,7 +1,10 @@
#[rustversion::stable(1.59)] // MSRV #![allow(missing_docs)]
#[rustversion_msrv::msrv]
#[test] #[test]
fn compile_macros() { fn compile_macros() {
let t = trybuild::TestCases::new(); let t = trybuild::TestCases::new();
t.pass("tests/trybuild/main-01-basic.rs"); t.pass("tests/trybuild/main-01-basic.rs");
t.compile_fail("tests/trybuild/main-02-only-async.rs"); t.compile_fail("tests/trybuild/main-02-only-async.rs");
t.pass("tests/trybuild/main-03-fn-params.rs"); t.pass("tests/trybuild/main-03-fn-params.rs");

View File

@ -1,14 +1,11 @@
error: the async keyword is missing from the function declaration error: the async keyword is missing from the function declaration
--> $DIR/main-02-only-async.rs:2:1 --> tests/trybuild/main-02-only-async.rs:2:1
| |
2 | fn main() { 2 | fn main() {
| ^^ | ^^
error[E0601]: `main` function not found in crate `$CRATE` error[E0601]: `main` function not found in crate `$CRATE`
--> $DIR/main-02-only-async.rs:1:1 --> tests/trybuild/main-02-only-async.rs:4:2
| |
1 | / #[actix_rt::main] 4 | }
2 | | fn main() { | ^ consider adding a `main` function to `$DIR/tests/trybuild/main-02-only-async.rs`
3 | | futures_util::future::ready(()).await
4 | | }
| |_^ consider adding a `main` function to `$DIR/tests/trybuild/main-02-only-async.rs`

View File

@ -1,205 +1,174 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased
## 2.8.0 - 2022-12-21 - Minimum supported Rust version (MSRV) is now 1.71.
- Add `#[track_caller]` attribute to `spawn` functions and methods. [#454] ## 2.10.0
- Update `tokio-uring` dependency to `0.4`. [#473]
- Relax `F`'s bound (`Fn => FnOnce`) on `{Arbiter, System}::with_tokio_rt()` functions.
- Update `tokio-uring` dependency to `0.5`.
- Minimum supported Rust version (MSRV) is now 1.70.
## 2.9.0
- Add `actix_rt::System::runtime()` method to retrieve the underlying `actix_rt::Runtime` runtime.
- Add `actix_rt::Runtime::tokio_runtime()` method to retrieve the underlying Tokio runtime.
- Minimum supported Rust version (MSRV) is now 1.65.
## 2.8.0
- Add `#[track_caller]` attribute to `spawn` functions and methods.
- Update `tokio-uring` dependency to `0.4`.
- Minimum supported Rust version (MSRV) is now 1.59. - Minimum supported Rust version (MSRV) is now 1.59.
[#454]: https://github.com/actix/actix-net/pull/454 ## 2.7.0
[#473]: https://github.com/actix/actix-net/pull/473
## 2.7.0 - 2022-03-08 - Update `tokio-uring` dependency to `0.3`.
- 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 ## 2.6.0
## 2.6.0 - 2022-01-12 - Update `tokio-uring` dependency to `0.2`.
- Update `tokio-uring` dependency to `0.2`. [#436] ## 2.5.1
[#436]: https://github.com/actix/actix-net/pull/436 - Expose `System::with_tokio_rt` and `Arbiter::with_tokio_rt`.
## 2.5.1 - 2021-12-31 ## 2.5.0
- Expose `System::with_tokio_rt` and `Arbiter::with_tokio_rt`. [#430] - Add `System::run_with_code` to allow retrieving the exit code on stop.
[#430]: https://github.com/actix/actix-net/pull/430 ## 2.4.0
## 2.5.0 - 2021-11-22 - Add `Arbiter::try_current` for situations where thread may or may not have Arbiter context.
- Start io-uring with `System::new` when feature is enabled.
- Add `System::run_with_code` to allow retrieving the exit code on stop. [#411] ## 2.3.0
[#411]: https://github.com/actix/actix-net/pull/411 - The `spawn` method can now resolve with non-unit outputs.
- Add experimental (semver-exempt) `io-uring` feature for enabling async file I/O on linux.
## 2.4.0 - 2021-11-05 ## 2.2.0
- Add `Arbiter::try_current` for situations where thread may or may not have Arbiter context. [#408] - **BREAKING** `ActixStream::{poll_read_ready, poll_write_ready}` methods now return `Ready` object in ok variant.
- Start io-uring with `System::new` when feature is enabled. [#395]
[#395]: https://github.com/actix/actix-net/pull/395
[#408]: https://github.com/actix/actix-net/pull/408
## 2.3.0 - 2021-10-11
- 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]
[#369]: https://github.com/actix/actix-net/pull/369
[#374]: https://github.com/actix/actix-net/pull/374
## 2.2.0 - 2021-03-29
- **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 ## 2.1.0
## 2.1.0 - 2021-02-24 - Add `ActixStream` extension trait to include readiness methods.
- Re-export `tokio::net::TcpSocket` in `net` module
- Add `ActixStream` extension trait to include readiness methods. [#276] ## 2.0.2
- Re-export `tokio::net::TcpSocket` in `net` module [#282]
[#276]: https://github.com/actix/actix-net/pull/276 - Add `Arbiter::handle` to get a handle of an owned Arbiter.
[#282]: https://github.com/actix/actix-net/pull/282 - Add `System::try_current` for situations where actix may or may not be running a System.
## 2.0.2 - 2021-02-06 ## 2.0.1
- Add `Arbiter::handle` to get a handle of an owned Arbiter. [#274] - Expose `JoinError` from Tokio.
- 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 ## 2.0.0
[#275]: https://github.com/actix/actix-net/pull/275
## 2.0.1 - 2021-02-06 - Remove all Arbiter-local storage methods.
- Re-export `tokio::pin`.
- Expose `JoinError` from Tokio. [#271] ## 2.0.0-beta.3
[#271]: https://github.com/actix/actix-net/pull/271 - Remove `run_in_tokio`, `attach_to_tokio` and `AsyncSystemRunner`.
- Return `JoinHandle` from `actix_rt::spawn`.
- Remove old `Arbiter::spawn`. Implementation is now inlined into `actix_rt::spawn`.
- Rename `Arbiter::{send => spawn}` and `Arbiter::{exec_fn => spawn_fn}`.
- Remove `Arbiter::exec`.
- Remove deprecated `Arbiter::local_join` and `Arbiter::is_running`.
- `Arbiter::spawn` now accepts !Unpin futures.
- `System::new` no longer takes arguments.
- Remove `System::with_current`.
- Remove `Builder`.
- Add `System::with_init` as replacement for `Builder::run`.
- Rename `System::{is_set => is_registered}`.
- Add `ArbiterHandle` for sending messages to non-current-thread arbiters.
- `System::arbiter` now returns an `&ArbiterHandle`.
- `Arbiter::current` now returns an `ArbiterHandle` instead.
- `Arbiter::join` now takes self by value.
## 2.0.0 - 2021-02-02 ## 2.0.0-beta.2
- Remove all Arbiter-local storage methods. [#262] - Add `task` mod with re-export of `tokio::task::{spawn_blocking, yield_now, JoinHandle}`
- Re-export `tokio::pin`. [#262]
[#262]: https://github.com/actix/actix-net/pull/262
## 2.0.0-beta.3 - 2021-01-31
- Remove `run_in_tokio`, `attach_to_tokio` and `AsyncSystemRunner`. [#253]
- Return `JoinHandle` from `actix_rt::spawn`. [#253]
- Remove old `Arbiter::spawn`. Implementation is now inlined into `actix_rt::spawn`. [#253]
- Rename `Arbiter::{send => spawn}` and `Arbiter::{exec_fn => spawn_fn}`. [#253]
- Remove `Arbiter::exec`. [#253]
- Remove deprecated `Arbiter::local_join` and `Arbiter::is_running`. [#253]
- `Arbiter::spawn` now accepts !Unpin futures. [#256]
- `System::new` no longer takes arguments. [#257]
- Remove `System::with_current`. [#257]
- Remove `Builder`. [#257]
- Add `System::with_init` as replacement for `Builder::run`. [#257]
- Rename `System::{is_set => is_registered}`. [#257]
- Add `ArbiterHandle` for sending messages to non-current-thread arbiters. [#257].
- `System::arbiter` now returns an `&ArbiterHandle`. [#257]
- `Arbiter::current` now returns an `ArbiterHandle` instead. [#257]
- `Arbiter::join` now takes self by value. [#257]
[#253]: https://github.com/actix/actix-net/pull/253
[#254]: https://github.com/actix/actix-net/pull/254
[#256]: https://github.com/actix/actix-net/pull/256
[#257]: https://github.com/actix/actix-net/pull/257
## 2.0.0-beta.2 - 2021-01-09
- 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 ## 2.0.0-beta.1
## 2.0.0-beta.1 - 2020-12-28 - Add `System::attach_to_tokio` method.
- Update `tokio` dependency to `1.0`.
- Add `System::attach_to_tokio` method. [#173] - Rename `time` module `delay_for` to `sleep`, `delay_until` to `sleep_until`, `Delay` to `Sleep` to stay aligned with Tokio's naming.
- Update `tokio` dependency to `1.0`. [#236]
- Rename `time` module `delay_for` to `sleep`, `delay_until` to `sleep_until`, `Delay` to `Sleep` 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.
- Remove `'static` lifetime requirement for `System::run` and `Builder::run`. [#236] - Remove `'static` lifetime requirement for `System::run` and `Builder::run`.
- `Arbiter::spawn` now panics when `System` is not in scope. [#207] - `Arbiter::spawn` now panics when `System` is not in scope.
- Fix work load issue by removing `PENDING` thread local. [#207] - Fix work load issue by removing `PENDING` thread local.
[#207]: https://github.com/actix/actix-net/pull/207 ## 1.1.1
[#236]: https://github.com/actix/actix-net/pull/236
## 1.1.1 - 2020-04-30 - Fix memory leak due to
- Fix memory leak due to [#94] (see [#129] for more detail) ## 1.1.0 _(YANKED)_
[#129]: https://github.com/actix/actix-net/issues/129 - Expose `System::is_set` to check if current system has ben started
- Add `Arbiter::is_running` to check if event loop is running
- Add `Arbiter::local_join` associated function to get be able to `await` for spawned futures
## 1.1.0 - 2020-04-08 _(YANKED)_ ## 1.0.0
- 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::local_join` associated function to get be able to `await` for spawned futures [#94]
[#94]: https://github.com/actix/actix-net/pull/94
[#99]: https://github.com/actix/actix-net/pull/99
[#124]: https://github.com/actix/actix-net/pull/124
## 1.0.0 - 2019-12-11
- Update dependencies - Update dependencies
## 1.0.0-alpha.3 - 2019-12-07 ## 1.0.0-alpha.3
- 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
- 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
- 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
- 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
- Add arbiter specific storage - Add arbiter specific storage
## 0.2.4 - 2019-07-17 ## 0.2.4
- 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
- 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
- Moved `blocking` module to `actix-threadpool` crate - Moved `blocking` module to `actix-threadpool` crate
## 0.2.1 - 2019-03-11 ## 0.2.1
- 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
- `run` method returns `io::Result<()>` - `run` method returns `io::Result<()>`
- Removed `Handle` - Removed `Handle`
## 0.1.0 - 2018-12-09 ## 0.1.0
- Initial release - Initial release

View File

@ -1,21 +1,18 @@
[package] [package]
name = "actix-rt" name = "actix-rt"
version = "2.8.0" version = "2.10.0"
authors = [ authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.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"]
homepage = "https://actix.rs" homepage = "https://actix.rs"
repository = "https://github.com/actix/actix-net.git" repository = "https://github.com/actix/actix-net"
categories = ["network-programming", "asynchronous"] categories = ["network-programming", "asynchronous"]
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
edition = "2018" edition.workspace = true
rust-version.workspace = true
[lib] [package.metadata.cargo_check_external_types]
name = "actix_rt" allowed_external_types = ["actix_macros::*", "tokio::*"]
path = "src/lib.rs"
[features] [features]
default = ["macros"] default = ["macros"]
@ -26,12 +23,14 @@ 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.18.4", features = ["rt", "net", "parking_lot", "signal", "sync", "time"] } tokio = { version = "1.23.1", features = ["rt", "net", "parking_lot", "signal", "sync", "time"] }
# runtime for `io-uring` feature # runtime for `io-uring` feature
[target.'cfg(target_os = "linux")'.dependencies] [target.'cfg(target_os = "linux")'.dependencies]
tokio-uring = { version = "0.4", optional = true } tokio-uring = { version = "0.5", optional = true }
[dev-dependencies] [dev-dependencies]
tokio = { version = "1.18.4", features = ["full"] } tokio = { version = "1.23.1", features = ["full"] }
hyper = { version = "0.14.10", default-features = false, features = ["server", "tcp", "http1"] }
[lints]
workspace = true

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.8.0)](https://docs.rs/actix-rt/2.8.0) [![Documentation](https://docs.rs/actix-rt/badge.svg?version=2.10.0)](https://docs.rs/actix-rt/2.10.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.8.0/status.svg)](https://deps.rs/crate/actix-rt/2.8.0) [![dependency status](https://deps.rs/crate/actix-rt/2.10.0/status.svg)](https://deps.rs/crate/actix-rt/2.10.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

@ -1,30 +0,0 @@
use std::{convert::Infallible, net::SocketAddr};
use hyper::{
service::{make_service_fn, service_fn},
Body, Request, Response, Server,
};
async fn handle(_req: Request<Body>) -> Result<Response<Body>, Infallible> {
Ok(Response::new(Body::from("Hello World")))
}
fn main() {
actix_rt::System::with_tokio_rt(|| {
tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()
.unwrap()
})
.block_on(async {
let make_service =
make_service_fn(|_conn| async { Ok::<_, Infallible>(service_fn(handle)) });
let server =
Server::bind(&SocketAddr::from(([127, 0, 0, 1], 3000))).serve(make_service);
if let Err(err) = server.await {
eprintln!("server error: {}", err);
}
})
}

View File

@ -16,7 +16,7 @@ use crate::system::{System, SystemCommand};
pub(crate) static COUNT: AtomicUsize = AtomicUsize::new(0); pub(crate) static COUNT: AtomicUsize = AtomicUsize::new(0);
thread_local!( thread_local!(
static HANDLE: RefCell<Option<ArbiterHandle>> = RefCell::new(None); static HANDLE: RefCell<Option<ArbiterHandle>> = const { RefCell::new(None) };
); );
pub(crate) enum ArbiterCommand { pub(crate) enum ArbiterCommand {
@ -99,8 +99,7 @@ impl Arbiter {
#[allow(clippy::new_without_default)] #[allow(clippy::new_without_default)]
pub fn new() -> Arbiter { pub fn new() -> Arbiter {
Self::with_tokio_rt(|| { Self::with_tokio_rt(|| {
crate::runtime::default_tokio_runtime() crate::runtime::default_tokio_runtime().expect("Cannot create new Arbiter's Runtime.")
.expect("Cannot create new Arbiter's Runtime.")
}) })
} }
@ -110,7 +109,7 @@ impl Arbiter {
#[cfg(not(all(target_os = "linux", feature = "io-uring")))] #[cfg(not(all(target_os = "linux", feature = "io-uring")))]
pub fn with_tokio_rt<F>(runtime_factory: F) -> Arbiter pub fn with_tokio_rt<F>(runtime_factory: F) -> Arbiter
where where
F: Fn() -> tokio::runtime::Runtime + Send + 'static, F: FnOnce() -> tokio::runtime::Runtime + Send + 'static,
{ {
let sys = System::current(); let sys = System::current();
let system_id = sys.id(); let system_id = sys.id();
@ -149,9 +148,7 @@ impl Arbiter {
.send(SystemCommand::DeregisterArbiter(arb_id)); .send(SystemCommand::DeregisterArbiter(arb_id));
} }
}) })
.unwrap_or_else(|err| { .unwrap_or_else(|err| panic!("Cannot spawn Arbiter's thread: {name:?}: {err:?}"));
panic!("Cannot spawn Arbiter's thread: {:?}. {:?}", &name, err)
});
ready_rx.recv().unwrap(); ready_rx.recv().unwrap();
@ -201,9 +198,7 @@ impl Arbiter {
.send(SystemCommand::DeregisterArbiter(arb_id)); .send(SystemCommand::DeregisterArbiter(arb_id));
} }
}) })
.unwrap_or_else(|err| { .unwrap_or_else(|err| panic!("Cannot spawn Arbiter's thread: {name:?}: {err:?}"));
panic!("Cannot spawn Arbiter's thread: {:?}. {:?}", &name, err)
});
ready_rx.recv().unwrap(); ready_rx.recv().unwrap();

View File

@ -34,14 +34,13 @@
//! ``` //! ```
//! //!
//! # `io-uring` Support //! # `io-uring` Support
//!
//! There is experimental support for using io-uring with this crate by enabling the //! There is experimental support for using io-uring with this crate by enabling the
//! `io-uring` feature. For now, it is semver exempt. //! `io-uring` feature. For now, it is semver exempt.
//! //!
//! Note that there are currently some unimplemented parts of using `actix-rt` with `io-uring`. //! Note that there are currently some unimplemented parts of using `actix-rt` with `io-uring`.
//! In particular, when running a `System`, only `System::block_on` is supported. //! In particular, when running a `System`, only `System::block_on` is supported.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible, missing_docs)]
#![allow(clippy::type_complexity)] #![allow(clippy::type_complexity)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")] #![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")] #![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
@ -65,9 +64,11 @@ mod system;
pub use tokio::pin; pub use tokio::pin;
use tokio::task::JoinHandle; use tokio::task::JoinHandle;
pub use self::arbiter::{Arbiter, ArbiterHandle}; pub use self::{
pub use self::runtime::Runtime; arbiter::{Arbiter, ArbiterHandle},
pub use self::system::{System, SystemRunner}; runtime::Runtime,
system::{System, SystemRunner},
};
pub mod signal { pub mod signal {
//! Asynchronous signal handling (Tokio re-exports). //! Asynchronous signal handling (Tokio re-exports).
@ -89,12 +90,13 @@ pub mod net {
task::{Context, Poll}, task::{Context, Poll},
}; };
pub use tokio::io::Ready;
use tokio::io::{AsyncRead, AsyncWrite, Interest}; use tokio::io::{AsyncRead, AsyncWrite, Interest};
pub use tokio::net::UdpSocket;
pub use tokio::net::{TcpListener, TcpSocket, TcpStream};
#[cfg(unix)] #[cfg(unix)]
pub use tokio::net::{UnixDatagram, UnixListener, UnixStream}; pub use tokio::net::{UnixDatagram, UnixListener, UnixStream};
pub use tokio::{
io::Ready,
net::{TcpListener, TcpSocket, TcpStream, UdpSocket},
};
/// Extension trait over async read+write types that can also signal readiness. /// Extension trait over async read+write types that can also signal readiness.
#[doc(hidden)] #[doc(hidden)]
@ -153,10 +155,9 @@ pub mod net {
pub mod time { pub mod time {
//! Utilities for tracking time (Tokio re-exports). //! Utilities for tracking time (Tokio re-exports).
pub use tokio::time::Instant; pub use tokio::time::{
pub use tokio::time::{interval, interval_at, Interval}; interval, interval_at, sleep, sleep_until, timeout, Instant, Interval, Sleep, Timeout,
pub use tokio::time::{sleep, sleep_until, Sleep}; };
pub use tokio::time::{timeout, Timeout};
} }
pub mod task { pub mod task {

View File

@ -61,6 +61,62 @@ impl Runtime {
self.local.spawn_local(future) self.local.spawn_local(future)
} }
/// Retrieves a reference to the underlying Tokio runtime associated with this instance.
///
/// The Tokio runtime is responsible for executing asynchronous tasks and managing
/// the event loop for an asynchronous Rust program. This method allows accessing
/// the runtime to interact with its features directly.
///
/// In a typical use case, you might need to share the same runtime between different
/// modules of your project. For example, a module might require a `tokio::runtime::Handle`
/// to spawn tasks on the same runtime, or the runtime itself to configure more complex
/// behaviours.
///
/// # Example
///
/// ```
/// use actix_rt::Runtime;
///
/// mod module_a {
/// pub fn do_something(handle: tokio::runtime::Handle) {
/// handle.spawn(async {
/// // Some asynchronous task here
/// });
/// }
/// }
///
/// mod module_b {
/// pub fn do_something_else(rt: &tokio::runtime::Runtime) {
/// rt.spawn(async {
/// // Another asynchronous task here
/// });
/// }
/// }
///
/// let actix_runtime = actix_rt::Runtime::new().unwrap();
/// let tokio_runtime = actix_runtime.tokio_runtime();
///
/// let handle = tokio_runtime.handle().clone();
///
/// module_a::do_something(handle);
/// module_b::do_something_else(tokio_runtime);
/// ```
///
/// # Returns
///
/// An immutable reference to the `tokio::runtime::Runtime` instance associated with this
/// `Runtime` instance.
///
/// # Note
///
/// While this method provides an immutable reference to the Tokio runtime, which is safe to share across threads,
/// be aware that spawning blocking tasks on the Tokio runtime could potentially impact the execution
/// of the Actix runtime. This is because Tokio is responsible for driving the Actix system,
/// and blocking tasks could delay or deadlock other tasks in run loop.
pub fn tokio_runtime(&self) -> &tokio::runtime::Runtime {
&self.rt
}
/// Runs the provided future, blocking the current thread until the future completes. /// Runs the provided future, blocking the current thread until the future completes.
/// ///
/// This function can be used to synchronously block the current thread until the provided /// This function can be used to synchronously block the current thread until the provided

View File

@ -16,7 +16,7 @@ use crate::{arbiter::ArbiterHandle, Arbiter};
static SYSTEM_COUNT: AtomicUsize = AtomicUsize::new(0); static SYSTEM_COUNT: AtomicUsize = AtomicUsize::new(0);
thread_local!( thread_local!(
static CURRENT: RefCell<Option<System>> = RefCell::new(None); static CURRENT: RefCell<Option<System>> = const { RefCell::new(None) };
); );
/// A manager for a per-thread distributed async runtime. /// A manager for a per-thread distributed async runtime.
@ -48,7 +48,7 @@ impl System {
/// [tokio-runtime]: tokio::runtime::Runtime /// [tokio-runtime]: tokio::runtime::Runtime
pub fn with_tokio_rt<F>(runtime_factory: F) -> SystemRunner pub fn with_tokio_rt<F>(runtime_factory: F) -> SystemRunner
where where
F: Fn() -> tokio::runtime::Runtime, F: FnOnce() -> tokio::runtime::Runtime,
{ {
let (stop_tx, stop_rx) = oneshot::channel(); let (stop_tx, stop_rx) = oneshot::channel();
let (sys_tx, sys_rx) = mpsc::unbounded_channel(); let (sys_tx, sys_rx) = mpsc::unbounded_channel();
@ -87,7 +87,7 @@ impl System {
#[doc(hidden)] #[doc(hidden)]
pub fn with_tokio_rt<F>(_: F) -> SystemRunner pub fn with_tokio_rt<F>(_: F) -> SystemRunner
where where
F: Fn() -> tokio::runtime::Runtime, F: FnOnce() -> tokio::runtime::Runtime,
{ {
unimplemented!("System::with_tokio_rt is not implemented for io-uring feature yet") unimplemented!("System::with_tokio_rt is not implemented for io-uring feature yet")
} }
@ -203,6 +203,40 @@ impl SystemRunner {
.map_err(|err| io::Error::new(io::ErrorKind::Other, err)) .map_err(|err| io::Error::new(io::ErrorKind::Other, err))
} }
/// Retrieves a reference to the underlying [Actix runtime](crate::Runtime) associated with this
/// `SystemRunner` instance.
///
/// The Actix runtime is responsible for managing the event loop for an Actix system and
/// executing asynchronous tasks. This method provides access to the runtime, allowing direct
/// interaction with its features.
///
/// In a typical use case, you might need to share the same runtime between different
/// parts of your project. For example, some components might require a [`Runtime`] to spawn
/// tasks on the same runtime.
///
/// Read more in the documentation for [`Runtime`].
///
/// # Examples
///
/// ```
/// let system_runner = actix_rt::System::new();
/// let actix_runtime = system_runner.runtime();
///
/// // Use the runtime to spawn an async task or perform other operations
/// ```
///
/// # Note
///
/// While this method provides an immutable reference to the Actix runtime, which is safe to
/// share across threads, be aware that spawning blocking tasks on the Actix runtime could
/// potentially impact system performance. This is because the Actix runtime is responsible for
/// driving the system, and blocking tasks could delay other tasks in the run loop.
///
/// [`Runtime`]: crate::Runtime
pub fn runtime(&self) -> &crate::runtime::Runtime {
&self.rt
}
/// Runs the provided future, blocking the current thread until the future completes. /// Runs the provided future, blocking the current thread until the future completes.
#[track_caller] #[track_caller]
#[inline] #[inline]
@ -226,9 +260,7 @@ impl SystemRunner {
/// Runs the event loop until [stopped](System::stop_with_code), returning the exit code. /// Runs the event loop until [stopped](System::stop_with_code), returning the exit code.
pub fn run_with_code(self) -> io::Result<i32> { pub fn run_with_code(self) -> io::Result<i32> {
unimplemented!( unimplemented!("SystemRunner::run_with_code is not implemented for io-uring feature yet");
"SystemRunner::run_with_code is not implemented for io-uring feature yet"
);
} }
/// Runs the provided future, blocking the current thread until the future completes. /// Runs the provided future, blocking the current thread until the future completes.

View File

@ -1,3 +1,5 @@
#![allow(missing_docs)]
use std::{ use std::{
future::Future, future::Future,
time::{Duration, Instant}, time::{Duration, Instant},
@ -358,7 +360,7 @@ fn tokio_uring_arbiter() {
let f = tokio_uring::fs::File::create("test.txt").await.unwrap(); let f = tokio_uring::fs::File::create("test.txt").await.unwrap();
let buf = b"Hello World!"; let buf = b"Hello World!";
let (res, _) = f.write_at(&buf[..], 0).await; let (res, _) = f.write_all_at(&buf[..], 0).await;
assert!(res.is_ok()); assert!(res.is_ok());
f.sync_all().await.unwrap(); f.sync_all().await.unwrap();

View File

@ -1,257 +1,232 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased
## 2.2.0 - 2022-12-21 ## 2.5.1
- Fix panic in test server.
- Minimum supported Rust version (MSRV) is now 1.71.
## 2.5.0
- Update `mio` dependency to `1`.
## 2.4.0
- Update `tokio-uring` dependency to `0.5`.
- Minimum supported Rust version (MSRV) is now 1.70.
## 2.3.0
- Add support for MultiPath TCP (MPTCP) with `MpTcp` enum and `ServerBuilder::mptcp()` method.
- Minimum supported Rust version (MSRV) is now 1.65.
## 2.2.0
- Minimum supported Rust version (MSRV) is now 1.59. - Minimum supported Rust version (MSRV) is now 1.59.
- Update `tokio-uring` dependency to `0.4`. [#473] - Update `tokio-uring` dependency to `0.4`.
[#473]: https://github.com/actix/actix-net/pull/473 ## 2.1.1
## 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
- Update `tokio-uring` dependency to `0.3`. [#448] - Update `tokio-uring` dependency to `0.3`.
- Logs emitted now use the `tracing` crate with `log` compatibility. [#448] - Logs emitted now use the `tracing` crate with `log` compatibility.
- Wait for accept thread to stop before sending completion signal. [#443] - Wait for accept thread to stop before sending completion signal.
[#443]: https://github.com/actix/actix-net/pull/443 ## 2.0.0
[#448]: https://github.com/actix/actix-net/pull/448
## 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
- Update `tokio-uring` dependency to `0.2`. [#436] - Update `tokio-uring` dependency to `0.2`.
[#436]: https://github.com/actix/actix-net/pull/436 ## 2.0.0-rc.3
## 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
- Simplify `TestServer`. [#431] - Simplify `TestServer`.
[#431]: https://github.com/actix/actix-net/pull/431 ## 2.0.0-rc.1
## 2.0.0-rc.1 - 2021-12-05 - Hide implementation details of `Server`.
- `Server` now runs only after awaiting it.
- Hide implementation details of `Server`. [#424] ## 2.0.0-beta.9
- `Server` now runs only after awaiting it. [#425]
[#424]: https://github.com/actix/actix-net/pull/424 - Restore `Arbiter` support lost in `beta.8`.
[#425]: https://github.com/actix/actix-net/pull/425
## 2.0.0-beta.9 - 2021-11-15 ## 2.0.0-beta.8
- Restore `Arbiter` support lost in `beta.8`. [#417] - Fix non-unix signal handler.
[#417]: https://github.com/actix/actix-net/pull/417 ## 2.0.0-beta.7
## 2.0.0-beta.8 - 2021-11-05 _(YANKED)_ - Server can be started in regular Tokio runtime.
- Expose new `Server` type whose `Future` impl resolves when server stops.
- Fix non-unix signal handler. [#410] - Rename `Server` to `ServerHandle`.
- Add `Server::handle` to obtain handle to server.
[#410]: https://github.com/actix/actix-net/pull/410 - Rename `ServerBuilder::{maxconn => max_concurrent_connections}`.
- Deprecate crate-level `new` shortcut for server builder.
## 2.0.0-beta.7 - 2021-11-05 _(YANKED)_
- Server can be started in regular Tokio runtime. [#408]
- Expose new `Server` type whose `Future` impl resolves when server stops. [#408]
- Rename `Server` to `ServerHandle`. [#407]
- Add `Server::handle` to obtain handle to server. [#408]
- Rename `ServerBuilder::{maxconn => max_concurrent_connections}`. [#407]
- Deprecate crate-level `new` shortcut for server builder. [#408]
- Minimum supported Rust version (MSRV) is now 1.52. - Minimum supported Rust version (MSRV) is now 1.52.
[#407]: https://github.com/actix/actix-net/pull/407 ## 2.0.0-beta.6
[#408]: https://github.com/actix/actix-net/pull/408
## 2.0.0-beta.6 - 2021-10-11 - Add experimental (semver-exempt) `io-uring` feature for enabling async file I/O on linux.
- Server no long listens to `SIGHUP` signal. Previously, the received was not used but did block subsequent exit signals from working.
- Remove `config` module. `ServiceConfig`, `ServiceRuntime` public types are removed due to this change.
- Remove `ServerBuilder::configure`.
- Add experimental (semver-exempt) `io-uring` feature for enabling async file I/O on linux. [#374] ## 2.0.0-beta.5
- Server no long listens to `SIGHUP` signal. Previously, the received was not used but did block subsequent exit signals from working. [#389]
- Remove `config` module. `ServiceConfig`, `ServiceRuntime` public types are removed due to this change. [#349]
- Remove `ServerBuilder::configure` [#349]
[#374]: https://github.com/actix/actix-net/pull/374 - Server shutdown notifies all workers to exit regardless if shutdown is graceful. This causes all workers to shutdown immediately in force shutdown case.
[#349]: https://github.com/actix/actix-net/pull/349
[#389]: https://github.com/actix/actix-net/pull/389
## 2.0.0-beta.5 - 2021-04-20 ## 2.0.0-beta.4
- 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
## 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 ## 2.0.0-beta.3
## 2.0.0-beta.3 - 2021-02-06 - Hidden `ServerBuilder::start` method has been removed. Use `ServerBuilder::run`.
- Add retry for EINTR signal (`io::Interrupted`) in `Accept`'s poll loop.
- Add `ServerBuilder::worker_max_blocking_threads` to customize blocking thread pool size.
- Update `actix-rt` to `2.0.0`.
- Hidden `ServerBuilder::start` method has been removed. Use `ServerBuilder::run`. [#246] ## 2.0.0-beta.2
- 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]
- Update `actix-rt` to `2.0.0`. [#273]
[#246]: https://github.com/actix/actix-net/pull/246 - Merge `actix-testing` to `actix-server` as `test_server` mod.
[#264]: https://github.com/actix/actix-net/pull/264
[#265]: https://github.com/actix/actix-net/pull/265
[#273]: https://github.com/actix/actix-net/pull/273
## 2.0.0-beta.2 - 2021-01-03 ## 2.0.0-beta.1
- Merge `actix-testing` to `actix-server` as `test_server` mod. [#242] - Added explicit info log message on accept queue pause.
- Prevent double registration of sockets when back-pressure is resolved.
- Update `mio` dependency to `0.7.3`.
- Remove `socket2` dependency.
- `ServerBuilder::backlog` now accepts `u32` instead of `i32`.
- Remove `AcceptNotify` type and pass `WakerQueue` to `Worker` to wake up `Accept`'s `Poll`.
- Convert `mio::net::TcpStream` to `actix_rt::net::TcpStream`(`UnixStream` for uds) using `FromRawFd` and `IntoRawFd`(`FromRawSocket` and `IntoRawSocket` on windows).
- Remove `AsyncRead` and `AsyncWrite` trait bound for `socket::FromStream` trait.
[#242]: https://github.com/actix/actix-net/pull/242 ## 1.0.4
## 2.0.0-beta.1 - 2020-12-28
- Added explicit info log message on accept queue pause. [#215]
- Prevent double registration of sockets when back-pressure is resolved. [#223]
- Update `mio` dependency to `0.7.3`. [#239]
- Remove `socket2` dependency. [#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]
- Convert `mio::net::TcpStream` to `actix_rt::net::TcpStream`(`UnixStream` for uds) using `FromRawFd` and `IntoRawFd`(`FromRawSocket` and `IntoRawSocket` on windows). [#239]
- Remove `AsyncRead` and `AsyncWrite` trait bound for `socket::FromStream` trait. [#239]
[#215]: https://github.com/actix/actix-net/pull/215
[#223]: https://github.com/actix/actix-net/pull/223
[#239]: https://github.com/actix/actix-net/pull/239
## 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]: https://github.com/actix/actix-net/pull/167 ## 1.0.3
## 1.0.3 - 2020-05-19 - Replace deprecated `net2` crate with `socket2`.
- Replace deprecated `net2` crate with `socket2` [#140] ## 1.0.2
[#140]: https://github.com/actix/actix-net/pull/140 - Avoid error by calling `reregister()` on Windows.
## 1.0.2 - 2020-02-26 ## 1.0.1
- Avoid error by calling `reregister()` on Windows [#103]
[#103]: https://github.com/actix/actix-net/pull/103
## 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
- Use actix-net releases - Use actix-net releases
## 1.0.0-alpha.4 - 2019-12-08 ## 1.0.0-alpha.4
- 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
- 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
- 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
- Migrate to `std::future` - Migrate to `std::future`
## 0.7.0 - 2019-10-04 ## 0.7.0
- 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
- Add UDS listening support to `ServerBuilder` - Add UDS listening support to `ServerBuilder`
## 0.6.0 - 2019-07-18 ## 0.6.0
- Support Unix domain sockets #3 - Support Unix domain sockets #3
## 0.5.1 - 2019-05-18 ## 0.5.1
- ServerBuilder::shutdown_timeout() accepts u64 - ServerBuilder::shutdown_timeout() accepts u64
## 0.5.0 - 2019-05-12 ## 0.5.0
- 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
- 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
- Fix SIGINT force shutdown - Fix SIGINT force shutdown
## 0.4.1 - 2019-03-14 ## 0.4.1
- `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
- 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
- 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
- Use new `NewService` trait - Use new `NewService` trait
## 0.2.1 - 2019-02-09 ## 0.2.1
- Drop service response - Drop service response
## 0.2.0 - 2019-02-01 ## 0.2.0
- 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
- Fix max concurrent connections handling - Fix max concurrent connections handling
## 0.1.2 - 2018-12-12 ## 0.1.2
- 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
- Fix signal handling on windows - Fix signal handling on windows
## 0.1.0 - 2018-12-09 ## 0.1.0
- Move server to separate crate - Move server to separate crate

37
actix-server/Cargo.toml Executable file → Normal file
View File

@ -1,49 +1,50 @@
[package] [package]
name = "actix-server" name = "actix-server"
version = "2.2.0" version = "2.5.1"
authors = [ authors = [
"Nikolay Kim <fafhrd91@gmail.com>", "Nikolay Kim <fafhrd91@gmail.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>",
] ]
description = "General purpose TCP server built for the Actix ecosystem" description = "General purpose TCP server built for the Actix ecosystem"
keywords = ["network", "tcp", "server", "framework", "async"] keywords = ["network", "tcp", "server", "framework", "async"]
categories = ["network-programming", "asynchronous"] categories = ["network-programming", "asynchronous"]
homepage = "https://actix.rs" homepage = "https://actix.rs"
repository = "https://github.com/actix/actix-net.git" repository = "https://github.com/actix/actix-net/tree/master/actix-server"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
edition = "2018" edition.workspace = true
rust-version.workspace = true
[lib] [package.metadata.cargo_check_external_types]
name = "actix_server" allowed_external_types = ["tokio::*"]
path = "src/lib.rs"
[features] [features]
default = [] default = []
io-uring = ["tokio-uring", "actix-rt/io-uring"] io-uring = ["tokio-uring", "actix-rt/io-uring"]
[dependencies] [dependencies]
actix-rt = { version = "2.8", default-features = false } actix-rt = { version = "2.10", default-features = false }
actix-service = "2" actix-service = "2"
actix-utils = "3" actix-utils = "3"
futures-core = { version = "0.3.17", default-features = false, features = ["alloc"] } futures-core = { version = "0.3.17", default-features = false, features = ["alloc"] }
futures-util = { version = "0.3.17", 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 = "1", features = ["os-poll", "net"] }
num_cpus = "1.13" socket2 = "0.5"
socket2 = "0.4.2" tokio = { version = "1.23.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.4", optional = true } tokio-uring = { version = "0.5", optional = true }
[dev-dependencies] [dev-dependencies]
actix-codec = "0.5" actix-codec = "0.5"
actix-rt = "2.8" actix-rt = "2.8"
bytes = "1" bytes = "1"
env_logger = "0.10"
futures-util = { version = "0.3.17", 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.18.4", features = ["io-util", "rt-multi-thread", "macros", "fs"] } pretty_env_logger = "0.5"
tokio = { version = "1.23.1", features = ["io-util", "rt-multi-thread", "macros", "fs"] }
[lints]
workspace = true

View File

@ -2,14 +2,20 @@
> General purpose TCP server built for the Actix ecosystem. > General purpose TCP server built for the Actix ecosystem.
<!-- prettier-ignore-start -->
[![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.2.0)](https://docs.rs/actix-server/2.2.0) [![Documentation](https://docs.rs/actix-server/badge.svg?version=2.5.1)](https://docs.rs/actix-server/2.5.1)
[![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) ![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-server.svg)
[![Dependency Status](https://deps.rs/crate/actix-server/2.2.0/status.svg)](https://deps.rs/crate/actix-server/2.2.0) <br />
[![Dependency Status](https://deps.rs/crate/actix-server/2.5.1/status.svg)](https://deps.rs/crate/actix-server/2.5.1)
![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)
<!-- prettier-ignore-end -->
## Resources ## Resources
- [Library Documentation](https://docs.rs/actix-server) - [Library Documentation](https://docs.rs/actix-server)
- [Examples](/actix-server/examples) - [Examples](/actix-server/examples)

View File

@ -8,6 +8,8 @@
//! //!
//! Follow the prompt and enter a file path, relative or absolute. //! Follow the prompt and enter a file path, relative or absolute.
#![allow(missing_docs)]
use std::io; use std::io;
use actix_codec::{Framed, LinesCodec}; use actix_codec::{Framed, LinesCodec};
@ -18,7 +20,8 @@ use futures_util::{SinkExt as _, StreamExt as _};
use tokio::{fs::File, io::AsyncReadExt as _}; use tokio::{fs::File, io::AsyncReadExt as _};
async fn run() -> io::Result<()> { async fn run() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::default().default_filter_or("info")); pretty_env_logger::formatted_timed_builder()
.parse_env(pretty_env_logger::env_logger::Env::default().default_filter_or("info"));
let addr = ("127.0.0.1", 8080); let addr = ("127.0.0.1", 8080);
tracing::info!("starting server on port: {}", &addr.0); tracing::info!("starting server on port: {}", &addr.0);

View File

@ -25,7 +25,8 @@ use futures_util::future::ok;
use tokio::io::{AsyncReadExt as _, AsyncWriteExt as _}; use tokio::io::{AsyncReadExt as _, AsyncWriteExt as _};
async fn run() -> io::Result<()> { async fn run() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::default().default_filter_or("info")); pretty_env_logger::formatted_timed_builder()
.parse_env(pretty_env_logger::env_logger::Env::default().default_filter_or("info"));
let count = Arc::new(AtomicUsize::new(0)); let count = Arc::new(AtomicUsize::new(0));

View File

@ -1,19 +1,34 @@
use std::{io, time::Duration}; use std::{io, num::NonZeroUsize, time::Duration};
use actix_rt::net::TcpStream; use actix_rt::net::TcpStream;
use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender}; use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender};
use tracing::{info, trace};
use crate::{ use crate::{
server::ServerCommand, server::ServerCommand,
service::{InternalServiceFactory, ServerServiceFactory, StreamNewService}, service::{InternalServiceFactory, ServerServiceFactory, StreamNewService},
socket::{ socket::{create_mio_tcp_listener, MioListener, MioTcpListener, StdTcpListener, ToSocketAddrs},
create_mio_tcp_listener, MioListener, MioTcpListener, StdTcpListener, ToSocketAddrs,
},
worker::ServerWorkerConfig, worker::ServerWorkerConfig,
Server, Server,
}; };
/// Multipath TCP (MPTCP) preference.
///
/// Currently only useful on Linux.
///
#[cfg_attr(target_os = "linux", doc = "Also see [`ServerBuilder::mptcp()`].")]
#[derive(Debug, Clone)]
pub enum MpTcp {
/// MPTCP will not be used when binding sockets.
Disabled,
/// MPTCP will be attempted when binding sockets. If errors occur, regular TCP will be
/// attempted, too.
TcpFallback,
/// MPTCP will be used when binding sockets (with no fallback).
NoFallback,
}
/// [Server] builder. /// [Server] builder.
pub struct ServerBuilder { pub struct ServerBuilder {
pub(crate) threads: usize, pub(crate) threads: usize,
@ -21,6 +36,7 @@ pub struct ServerBuilder {
pub(crate) backlog: u32, pub(crate) backlog: u32,
pub(crate) factories: Vec<Box<dyn InternalServiceFactory>>, pub(crate) factories: Vec<Box<dyn InternalServiceFactory>>,
pub(crate) sockets: Vec<(usize, String, MioListener)>, pub(crate) sockets: Vec<(usize, String, MioListener)>,
pub(crate) mptcp: MpTcp,
pub(crate) exit: bool, pub(crate) exit: bool,
pub(crate) listen_os_signals: bool, pub(crate) listen_os_signals: bool,
pub(crate) cmd_tx: UnboundedSender<ServerCommand>, pub(crate) cmd_tx: UnboundedSender<ServerCommand>,
@ -40,11 +56,12 @@ impl ServerBuilder {
let (cmd_tx, cmd_rx) = unbounded_channel(); let (cmd_tx, cmd_rx) = unbounded_channel();
ServerBuilder { ServerBuilder {
threads: num_cpus::get_physical(), threads: std::thread::available_parallelism().map_or(2, NonZeroUsize::get),
token: 0, token: 0,
factories: Vec::new(), factories: Vec::new(),
sockets: Vec::new(), sockets: Vec::new(),
backlog: 2048, backlog: 2048,
mptcp: MpTcp::Disabled,
exit: false, exit: false,
listen_os_signals: true, listen_os_signals: true,
cmd_tx, cmd_tx,
@ -53,13 +70,19 @@ impl ServerBuilder {
} }
} }
/// Set number of workers to start. /// Sets number of workers to start.
///
/// See [`bind()`](Self::bind()) for more details on how worker count affects the number of
/// server factory instantiations.
///
/// The default worker count is the determined by [`std::thread::available_parallelism()`]. See
/// its documentation to determine what behavior you should expect when server is run.
/// ///
/// `num` must be greater than 0. /// `num` must be greater than 0.
/// ///
/// The default worker count is the number of physical CPU cores available. If your benchmark /// # Panics
/// testing indicates that simultaneous multi-threading is beneficial to your app, you can use ///
/// the [`num_cpus`] crate to acquire the _logical_ core count instead. /// Panics if `num` is 0.
pub fn workers(mut self, num: usize) -> Self { pub fn workers(mut self, num: usize) -> Self {
assert_ne!(num, 0, "workers must be greater than 0"); assert_ne!(num, 0, "workers must be greater than 0");
self.threads = num; self.threads = num;
@ -98,6 +121,24 @@ impl ServerBuilder {
self self
} }
/// Sets MultiPath TCP (MPTCP) preference on bound sockets.
///
/// Multipath TCP (MPTCP) builds on top of TCP to improve connection redundancy and performance
/// by sharing a network data stream across multiple underlying TCP sessions. See [mptcp.dev]
/// for more info about MPTCP itself.
///
/// MPTCP is available on Linux kernel version 5.6 and higher. In addition, you'll also need to
/// ensure the kernel option is enabled using `sysctl net.mptcp.enabled=1`.
///
/// This method will have no effect if called after a `bind()`.
///
/// [mptcp.dev]: https://www.mptcp.dev
#[cfg(target_os = "linux")]
pub fn mptcp(mut self, mptcp_enabled: MpTcp) -> Self {
self.mptcp = mptcp_enabled;
self
}
/// Sets the maximum per-worker number of concurrent connections. /// Sets the maximum per-worker number of concurrent connections.
/// ///
/// All socket listeners will stop accepting connections when this limit is reached for /// All socket listeners will stop accepting connections when this limit is reached for
@ -115,13 +156,15 @@ impl ServerBuilder {
self.max_concurrent_connections(num) self.max_concurrent_connections(num)
} }
/// Stop Actix `System` after server shutdown. /// Sets flag to stop Actix `System` after server shutdown.
///
/// This has no effect when server is running in a Tokio-only runtime.
pub fn system_exit(mut self) -> Self { pub fn system_exit(mut self) -> Self {
self.exit = true; self.exit = true;
self self
} }
/// Disable OS signal handling. /// Disables OS signal handling.
pub fn disable_signals(mut self) -> Self { pub fn disable_signals(mut self) -> Self {
self.listen_os_signals = false; self.listen_os_signals = false;
self self
@ -139,25 +182,49 @@ impl ServerBuilder {
self self
} }
/// Add new service to the server. /// Adds new service to the server.
pub fn bind<F, U, N>(mut self, name: N, addr: U, factory: F) -> io::Result<Self> ///
/// Note that, if a DNS lookup is required, resolving hostnames is a blocking operation.
///
/// # Worker Count
///
/// The `factory` will be instantiated multiple times in most scenarios. The number of
/// instantiations is number of [`workers`](Self::workers()) × number of sockets resolved by
/// `addrs`.
///
/// For example, if you've manually set [`workers`](Self::workers()) to 2, and use `127.0.0.1`
/// as the bind `addrs`, then `factory` will be instantiated twice. However, using `localhost`
/// as the bind `addrs` can often resolve to both `127.0.0.1` (IPv4) _and_ `::1` (IPv6), causing
/// the `factory` to be instantiated 4 times (2 workers × 2 bind addresses).
///
/// Using a bind address of `0.0.0.0`, which signals to use all interfaces, may also multiple
/// the number of instantiations in a similar way.
///
/// # Errors
///
/// Returns an `io::Error` if:
/// - `addrs` cannot be resolved into one or more socket addresses;
/// - all the resolved socket addresses are already bound.
pub fn bind<F, U, N>(mut self, name: N, addrs: U, factory: F) -> io::Result<Self>
where where
F: ServerServiceFactory<TcpStream>, F: ServerServiceFactory<TcpStream>,
U: ToSocketAddrs, U: ToSocketAddrs,
N: AsRef<str>, N: AsRef<str>,
{ {
let sockets = bind_addr(addr, self.backlog)?; let sockets = bind_addr(addrs, self.backlog, &self.mptcp)?;
trace!("binding server to: {:?}", &sockets); tracing::trace!("binding server to: {sockets:?}");
for lst in sockets { for lst in sockets {
let token = self.next_token(); let token = self.next_token();
self.factories.push(StreamNewService::create( self.factories.push(StreamNewService::create(
name.as_ref().to_string(), name.as_ref().to_string(),
token, token,
factory.clone(), factory.clone(),
lst.local_addr()?, lst.local_addr()?,
)); ));
self.sockets self.sockets
.push((token, name.as_ref().to_string(), MioListener::Tcp(lst))); .push((token, name.as_ref().to_string(), MioListener::Tcp(lst)));
} }
@ -165,7 +232,12 @@ impl ServerBuilder {
Ok(self) Ok(self)
} }
/// Add new service to the server. /// Adds service to the server using a socket listener already bound.
///
/// # Worker Count
///
/// The `factory` will be instantiated multiple times in most scenarios. The number of
/// instantiations is: number of [`workers`](Self::workers()).
pub fn listen<F, N: AsRef<str>>( pub fn listen<F, N: AsRef<str>>(
mut self, mut self,
name: N, name: N,
@ -197,7 +269,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); tracing::info!("starting {} workers", self.threads);
Server::new(self) Server::new(self)
} }
} }
@ -211,7 +283,12 @@ impl ServerBuilder {
#[cfg(unix)] #[cfg(unix)]
impl ServerBuilder { impl ServerBuilder {
/// Add new unix domain service to the server. /// Adds new service to the server using a UDS (unix domain socket) address.
///
/// # Worker Count
///
/// The `factory` will be instantiated multiple times in most scenarios. The number of
/// instantiations is: number of [`workers`](Self::workers()).
pub fn bind_uds<F, U, N>(self, name: N, addr: U, factory: F) -> io::Result<Self> pub fn bind_uds<F, U, N>(self, name: N, addr: U, factory: F) -> io::Result<Self>
where where
F: ServerServiceFactory<actix_rt::net::UnixStream>, F: ServerServiceFactory<actix_rt::net::UnixStream>,
@ -231,9 +308,14 @@ impl ServerBuilder {
self.listen_uds(name, lst, factory) self.listen_uds(name, lst, factory)
} }
/// Add new unix domain service to the server. /// Adds new service to the server using a UDS (unix domain socket) listener already bound.
/// ///
/// Useful when running as a systemd service and a socket FD is acquired externally. /// Useful when running as a systemd service and a socket FD is acquired externally.
///
/// # Worker Count
///
/// The `factory` will be instantiated multiple times in most scenarios. The number of
/// instantiations is: number of [`workers`](Self::workers()).
pub fn listen_uds<F, N: AsRef<str>>( pub fn listen_uds<F, N: AsRef<str>>(
mut self, mut self,
name: N, name: N,
@ -244,18 +326,22 @@ impl ServerBuilder {
F: ServerServiceFactory<actix_rt::net::UnixStream>, F: ServerServiceFactory<actix_rt::net::UnixStream>,
{ {
use std::net::{IpAddr, Ipv4Addr}; use std::net::{IpAddr, Ipv4Addr};
lst.set_nonblocking(true)?; lst.set_nonblocking(true)?;
let token = self.next_token(); let token = self.next_token();
let addr = let addr = crate::socket::StdSocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
crate::socket::StdSocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
self.factories.push(StreamNewService::create( self.factories.push(StreamNewService::create(
name.as_ref().to_string(), name.as_ref().to_string(),
token, token,
factory, factory,
addr, addr,
)); ));
self.sockets self.sockets
.push((token, name.as_ref().to_string(), MioListener::from(lst))); .push((token, name.as_ref().to_string(), MioListener::from(lst)));
Ok(self) Ok(self)
} }
} }
@ -263,13 +349,14 @@ impl ServerBuilder {
pub(super) fn bind_addr<S: ToSocketAddrs>( pub(super) fn bind_addr<S: ToSocketAddrs>(
addr: S, addr: S,
backlog: u32, backlog: u32,
mptcp: &MpTcp,
) -> io::Result<Vec<MioTcpListener>> { ) -> io::Result<Vec<MioTcpListener>> {
let mut opt_err = None; let mut opt_err = None;
let mut success = false; let mut success = false;
let mut sockets = Vec::new(); let mut sockets = Vec::new();
for addr in addr.to_socket_addrs()? { for addr in addr.to_socket_addrs()? {
match create_mio_tcp_listener(addr, backlog) { match create_mio_tcp_listener(addr, backlog, mptcp) {
Ok(lst) => { Ok(lst) => {
success = true; success = true;
sockets.push(lst); sockets.push(lst);

View File

@ -1,7 +1,5 @@
//! General purpose TCP server. //! General purpose TCP server.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")] #![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")] #![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
@ -18,13 +16,15 @@ mod test_server;
mod waker_queue; mod waker_queue;
mod worker; mod worker;
pub use self::builder::ServerBuilder;
pub use self::handle::ServerHandle;
pub use self::server::Server;
pub use self::service::ServerServiceFactory;
#[doc(hidden)] #[doc(hidden)]
pub use self::socket::FromStream; pub use self::socket::FromStream;
pub use self::test_server::TestServer; pub use self::{
builder::{MpTcp, ServerBuilder},
handle::ServerHandle,
server::Server,
service::ServerServiceFactory,
test_server::TestServer,
};
/// Start server building process /// Start server building process
#[doc(hidden)] #[doc(hidden)]

View File

@ -183,11 +183,6 @@ impl ServerInner {
} }
fn run_sync(mut builder: ServerBuilder) -> io::Result<(Self, ServerEventMultiplexer)> { fn run_sync(mut builder: ServerBuilder) -> io::Result<(Self, ServerEventMultiplexer)> {
let sockets = mem::take(&mut builder.sockets)
.into_iter()
.map(|t| (t.0, t.2))
.collect();
// Give log information on what runtime will be used. // Give log information on what runtime will be used.
let is_actix = actix_rt::System::try_current().is_some(); let is_actix = actix_rt::System::try_current().is_some();
let is_tokio = tokio::runtime::Handle::try_current().is_ok(); let is_tokio = tokio::runtime::Handle::try_current().is_ok();
@ -207,6 +202,11 @@ impl ServerInner {
); );
} }
let sockets = mem::take(&mut builder.sockets)
.into_iter()
.map(|t| (t.0, t.2))
.collect();
let (waker_queue, worker_handles, accept_handle) = Accept::start(sockets, &builder)?; let (waker_queue, worker_handles, accept_handle) = Accept::start(sockets, &builder)?;
let mux = ServerEventMultiplexer { let mux = ServerEventMultiplexer {

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

@ -8,10 +8,11 @@ pub(crate) use mio::net::TcpListener as MioTcpListener;
use mio::{event::Source, Interest, Registry, Token}; use mio::{event::Source, Interest, Registry, Token};
#[cfg(unix)] #[cfg(unix)]
pub(crate) use { pub(crate) use {
mio::net::UnixListener as MioUnixListener, mio::net::UnixListener as MioUnixListener, std::os::unix::net::UnixListener as StdUnixListener,
std::os::unix::net::UnixListener as StdUnixListener,
}; };
use crate::builder::MpTcp;
pub(crate) enum MioListener { pub(crate) enum MioListener {
Tcp(MioTcpListener), Tcp(MioTcpListener),
#[cfg(unix)] #[cfg(unix)]
@ -105,7 +106,7 @@ impl fmt::Debug for MioListener {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self { match *self {
MioListener::Tcp(ref lst) => write!(f, "{:?}", lst), MioListener::Tcp(ref lst) => write!(f, "{:?}", lst),
#[cfg(all(unix))] #[cfg(unix)]
MioListener::Uds(ref lst) => write!(f, "{:?}", lst), MioListener::Uds(ref lst) => write!(f, "{:?}", lst),
} }
} }
@ -125,7 +126,7 @@ pub(crate) enum SocketAddr {
Unknown, Unknown,
Tcp(StdSocketAddr), Tcp(StdSocketAddr),
#[cfg(unix)] #[cfg(unix)]
Uds(mio::net::SocketAddr), Uds(std::os::unix::net::SocketAddr),
} }
impl fmt::Display for SocketAddr { impl fmt::Display for SocketAddr {
@ -159,6 +160,7 @@ pub enum MioStream {
/// Helper trait for converting a Mio stream into a Tokio stream. /// Helper trait for converting a Mio stream into a Tokio stream.
pub trait FromStream: Sized { pub trait FromStream: Sized {
/// Creates stream from a `mio` stream.
fn from_mio(sock: MioStream) -> io::Result<Self>; fn from_mio(sock: MioStream) -> io::Result<Self>;
} }
@ -224,10 +226,30 @@ mod unix_impl {
pub(crate) fn create_mio_tcp_listener( pub(crate) fn create_mio_tcp_listener(
addr: StdSocketAddr, addr: StdSocketAddr,
backlog: u32, backlog: u32,
mptcp: &MpTcp,
) -> io::Result<MioTcpListener> { ) -> io::Result<MioTcpListener> {
use socket2::{Domain, Protocol, Socket, Type}; use socket2::{Domain, Protocol, Socket, Type};
let socket = Socket::new(Domain::for_address(addr), Type::STREAM, Some(Protocol::TCP))?; #[cfg(not(target_os = "linux"))]
let protocol = Protocol::TCP;
#[cfg(target_os = "linux")]
let protocol = if matches!(mptcp, MpTcp::Disabled) {
Protocol::TCP
} else {
Protocol::MPTCP
};
let socket = match Socket::new(Domain::for_address(addr), Type::STREAM, Some(protocol)) {
Ok(sock) => sock,
Err(err) if matches!(mptcp, MpTcp::TcpFallback) => {
tracing::warn!("binding socket as MPTCP failed: {err}");
tracing::warn!("falling back to TCP");
Socket::new(Domain::for_address(addr), Type::STREAM, Some(Protocol::TCP))?
}
Err(err) => return Err(err),
};
socket.set_reuse_address(true)?; socket.set_reuse_address(true)?;
socket.set_nonblocking(true)?; socket.set_nonblocking(true)?;
@ -248,7 +270,7 @@ mod tests {
assert_eq!(format!("{}", addr), "127.0.0.1:8080"); assert_eq!(format!("{}", addr), "127.0.0.1:8080");
let addr: StdSocketAddr = "127.0.0.1:0".parse().unwrap(); let addr: StdSocketAddr = "127.0.0.1:0".parse().unwrap();
let lst = create_mio_tcp_listener(addr, 128).unwrap(); let lst = create_mio_tcp_listener(addr, 128, &MpTcp::Disabled).unwrap();
let lst = MioListener::Tcp(lst); let lst = MioListener::Tcp(lst);
assert!(format!("{:?}", lst).contains("TcpListener")); assert!(format!("{:?}", lst).contains("TcpListener"));
assert!(format!("{}", lst).contains("127.0.0.1")); assert!(format!("{}", lst).contains("127.0.0.1"));

View File

@ -117,13 +117,15 @@ impl TestServerHandle {
/// Stop server. /// Stop server.
fn stop(&mut self) { fn stop(&mut self) {
let _ = self.server_handle.stop(false); drop(self.server_handle.stop(false));
self.thread_handle.take().unwrap().join().unwrap().unwrap(); self.thread_handle.take().unwrap().join().unwrap().unwrap();
} }
/// Connect to server, returning a Tokio `TcpStream`. /// Connect to server, returning a Tokio `TcpStream`.
pub fn connect(&self) -> io::Result<TcpStream> { pub fn connect(&self) -> io::Result<TcpStream> {
TcpStream::from_std(net::TcpStream::connect(self.addr)?) let stream = net::TcpStream::connect(self.addr)?;
stream.set_nonblocking(true)?;
TcpStream::from_std(stream)
} }
} }

View File

@ -1,6 +1,7 @@
use std::{ use std::{
future::Future, future::Future,
io, mem, io, mem,
num::NonZeroUsize,
pin::Pin, pin::Pin,
rc::Rc, rc::Rc,
sync::{ sync::{
@ -249,8 +250,11 @@ pub(crate) struct ServerWorkerConfig {
impl Default for ServerWorkerConfig { impl Default for ServerWorkerConfig {
fn default() -> Self { fn default() -> Self {
// 512 is the default max blocking thread count of tokio runtime. let parallelism = std::thread::available_parallelism().map_or(2, NonZeroUsize::get);
let max_blocking_threads = std::cmp::max(512 / num_cpus::get_physical(), 1);
// 512 is the default max blocking thread count of a Tokio runtime.
let max_blocking_threads = std::cmp::max(512 / parallelism, 1);
Self { Self {
shutdown_timeout: Duration::from_secs(30), shutdown_timeout: Duration::from_secs(30),
max_blocking_threads, max_blocking_threads,
@ -621,12 +625,13 @@ impl Future for ServerWorker {
self.poll(cx) self.poll(cx)
} }
}, },
WorkerState::Restarting(ref mut restart) => { WorkerState::Restarting(ref mut restart) => {
let factory_id = restart.factory_id; let factory_id = restart.factory_id;
let token = restart.token; let token = restart.token;
let (token_new, service) = ready!(restart.fut.as_mut().poll(cx)) let (token_new, service) =
.unwrap_or_else(|_| { ready!(restart.fut.as_mut().poll(cx)).unwrap_or_else(|_| {
panic!( panic!(
"Can not restart {:?} service", "Can not restart {:?} service",
this.factories[factory_id].name(token) this.factories[factory_id].name(token)
@ -645,6 +650,7 @@ impl Future for ServerWorker {
self.poll(cx) self.poll(cx)
} }
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)) = this.conn_rx.poll_recv(cx) { while let Poll::Ready(Some(conn)) = this.conn_rx.poll_recv(cx) {
@ -678,6 +684,7 @@ impl Future for ServerWorker {
shutdown.timer.as_mut().poll(cx) shutdown.timer.as_mut().poll(cx)
} }
} }
// actively poll stream and handle worker command // actively poll stream and handle worker command
WorkerState::Available => loop { WorkerState::Available => loop {
match this.check_readiness(cx) { match this.check_readiness(cx) {
@ -697,7 +704,10 @@ impl Future for ServerWorker {
match ready!(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))
.into_inner();
} }
None => return Poll::Ready(()), None => return Poll::Ready(()),
}; };
@ -706,9 +716,7 @@ impl Future for ServerWorker {
} }
} }
fn wrap_worker_services( fn wrap_worker_services(services: Vec<(usize, usize, BoxedServerService)>) -> Vec<WorkerService> {
services: Vec<(usize, usize, BoxedServerService)>,
) -> Vec<WorkerService> {
services services
.into_iter() .into_iter()
.fold(Vec::new(), |mut services, (idx, token, service)| { .fold(Vec::new(), |mut services, (idx, token, service)| {

View File

@ -1,3 +1,5 @@
#![allow(clippy::let_underscore_future, missing_docs)]
use std::{ use std::{
net, net,
sync::{ sync::{

View File

@ -1,3 +1,5 @@
#![allow(missing_docs)]
use std::net; use std::net;
use actix_rt::net::TcpStream; use actix_rt::net::TcpStream;
@ -69,5 +71,7 @@ async fn new_with_builder() {
srv.connect().unwrap(); srv.connect().unwrap();
// connect to alt service defined in custom ServerBuilder // connect to alt service defined in custom ServerBuilder
TcpStream::from_std(net::TcpStream::connect(alt_addr).unwrap()).unwrap(); let stream = net::TcpStream::connect(alt_addr).unwrap();
stream.set_nonblocking(true).unwrap();
TcpStream::from_std(stream).unwrap();
} }

View File

@ -1,28 +1,30 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased
- Minimum supported Rust version (MSRV) is now 1.59. ## 2.0.3
## 2.0.2 - 2021-12-18 - Minimum supported Rust version (MSRV) is now 1.71.
## 2.0.2
- 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
- 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
- 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
- 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]
@ -30,7 +32,7 @@
[#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
- `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]
@ -39,17 +41,17 @@
[#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
- 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
- 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
- `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]
@ -62,82 +64,82 @@
[#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
- 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
- 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
- Revert 1.0.3 change - Revert 1.0.3 change
## 1.0.3 - 2020-01-15 ## 1.0.3
- Fixed unsoundness in `AndThenService` impl. - Fixed unsoundness in `AndThenService` impl.
## 1.0.2 - 2020-01-08 ## 1.0.2
- Add `into_service` helper function. - Add `into_service` helper function.
## 1.0.1 - 2019-12-22 ## 1.0.1
- `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
- 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
- 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
- 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
- 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
- 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
- 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
- Add `new_apply_cfg` function - Add `new_apply_cfg` function
## 0.4.0 - 2019-05-12 ## 0.4.0
- 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
- Poll boxed service call result immediately - Poll boxed service call result immediately
## 0.3.5 - 2019-03-29 ## 0.3.5
- 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
- Add `Transform::from_err()` combinator - Add `Transform::from_err()` combinator
- Add `apply_fn` helper - Add `apply_fn` helper
@ -145,37 +147,37 @@
- 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
- 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
- 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
- Simplify Transform trait - Simplify Transform trait
## 0.3.0 - 2019-03-02 ## 0.3.0
- 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
- 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
- Generalize `.apply` combinator with Transform trait - Generalize `.apply` combinator with Transform trait
## 0.2.0 - 2019-02-01 ## 0.2.0
- Use associated type instead of generic for Service definition. - Use associated type instead of generic for Service definition.
- Before: - Before:
@ -194,31 +196,31 @@
} }
``` ```
## 0.1.6 - 2019-01-24 ## 0.1.6
- 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
- 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
- Use `FnMut` instead of `Fn` for `FnService` - Use `FnMut` instead of `Fn` for `FnService`
## 0.1.3 - 2018-12-12 ## 0.1.3
- Split service combinators to separate trait - Split service combinators to separate trait
## 0.1.2 - 2018-12-12 ## 0.1.2
- 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
- Added Service impl for `Box<S: Service>` - Added Service impl for `Box<S: Service>`
## 0.1.0 - 2018-12-09 ## 0.1.0
- Initial import - Initial import

View File

@ -1,27 +1,23 @@
[package] [package]
name = "actix-service" name = "actix-service"
version = "2.0.2" version = "2.0.3"
authors = [ authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.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"]
categories = ["network-programming", "asynchronous", "no-std"] categories = ["network-programming", "asynchronous", "no-std"]
repository = "https://github.com/actix/actix-net" repository = "https://github.com/actix/actix-net"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
edition = "2018" edition.workspace = true
rust-version.workspace = true
[lib]
name = "actix_service"
path = "src/lib.rs"
[dependencies] [dependencies]
futures-core = { version = "0.3.17", default-features = false } futures-core = { version = "0.3.17", default-features = false }
paste = "1"
pin-project-lite = "0.2" pin-project-lite = "0.2"
[dev-dependencies] [dev-dependencies]
actix-rt = "2" actix-rt = "2"
actix-utils = "3" actix-utils = "3"
futures-util = { version = "0.3.17", default-features = false } futures-util = { version = "0.3.17", default-features = false }
[lints]
workspace = true

View File

@ -3,10 +3,10 @@
> Service trait and combinators for representing asynchronous request/response operations. > Service trait and combinators for representing asynchronous request/response operations.
[![crates.io](https://img.shields.io/crates/v/actix-service?label=latest)](https://crates.io/crates/actix-service) [![crates.io](https://img.shields.io/crates/v/actix-service?label=latest)](https://crates.io/crates/actix-service)
[![Documentation](https://docs.rs/actix-service/badge.svg?version=2.0.2)](https://docs.rs/actix-service/2.0.2) [![Documentation](https://docs.rs/actix-service/badge.svg?version=2.0.3)](https://docs.rs/actix-service/2.0.3)
[![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)
![License](https://img.shields.io/crates/l/actix-service.svg) ![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-service.svg)
[![Dependency Status](https://deps.rs/crate/actix-service/2.0.2/status.svg)](https://deps.rs/crate/actix-service/2.0.2) [![Dependency Status](https://deps.rs/crate/actix-service/2.0.3/status.svg)](https://deps.rs/crate/actix-service/2.0.3)
![Download](https://img.shields.io/crates/d/actix-service.svg) ![Download](https://img.shields.io/crates/d/actix-service.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

@ -1,3 +1,5 @@
#![allow(missing_docs)]
use std::{future::Future, sync::mpsc, time::Duration}; use std::{future::Future, sync::mpsc, time::Duration};
async fn oracle<F, Fut>(f: F) -> (u32, u32) async fn oracle<F, Fut>(f: F) -> (u32, u32)

View File

@ -121,12 +121,7 @@ pub struct AndThenServiceFactory<A, B, Req>
where where
A: ServiceFactory<Req>, A: ServiceFactory<Req>,
A::Config: Clone, A::Config: Clone,
B: ServiceFactory< B: ServiceFactory<A::Response, Config = A::Config, Error = A::Error, InitError = A::InitError>,
A::Response,
Config = A::Config,
Error = A::Error,
InitError = A::InitError,
>,
{ {
inner: Rc<(A, B)>, inner: Rc<(A, B)>,
_phantom: PhantomData<Req>, _phantom: PhantomData<Req>,
@ -136,12 +131,7 @@ impl<A, B, Req> AndThenServiceFactory<A, B, Req>
where where
A: ServiceFactory<Req>, A: ServiceFactory<Req>,
A::Config: Clone, A::Config: Clone,
B: ServiceFactory< B: ServiceFactory<A::Response, Config = A::Config, Error = A::Error, InitError = A::InitError>,
A::Response,
Config = A::Config,
Error = A::Error,
InitError = A::InitError,
>,
{ {
/// Create new `AndThenFactory` combinator /// Create new `AndThenFactory` combinator
pub(crate) fn new(a: A, b: B) -> Self { pub(crate) fn new(a: A, b: B) -> Self {
@ -156,12 +146,7 @@ impl<A, B, Req> ServiceFactory<Req> for AndThenServiceFactory<A, B, Req>
where where
A: ServiceFactory<Req>, A: ServiceFactory<Req>,
A::Config: Clone, A::Config: Clone,
B: ServiceFactory< B: ServiceFactory<A::Response, Config = A::Config, Error = A::Error, InitError = A::InitError>,
A::Response,
Config = A::Config,
Error = A::Error,
InitError = A::InitError,
>,
{ {
type Response = B::Response; type Response = B::Response;
type Error = A::Error; type Error = A::Error;
@ -184,12 +169,7 @@ impl<A, B, Req> Clone for AndThenServiceFactory<A, B, Req>
where where
A: ServiceFactory<Req>, A: ServiceFactory<Req>,
A::Config: Clone, A::Config: Clone,
B: ServiceFactory< B: ServiceFactory<A::Response, Config = A::Config, Error = A::Error, InitError = A::InitError>,
A::Response,
Config = A::Config,
Error = A::Error,
InitError = A::InitError,
>,
{ {
fn clone(&self) -> Self { fn clone(&self) -> Self {
Self { Self {
@ -334,9 +314,8 @@ mod tests {
async fn test_new_service() { async fn test_new_service() {
let cnt = Rc::new(Cell::new(0)); let cnt = Rc::new(Cell::new(0));
let cnt2 = cnt.clone(); let cnt2 = cnt.clone();
let new_srv = let new_srv = pipeline_factory(fn_factory(move || ready(Ok::<_, ()>(Srv1(cnt2.clone())))))
pipeline_factory(fn_factory(move || ready(Ok::<_, ()>(Srv1(cnt2.clone()))))) .and_then(move || ready(Ok(Srv2(cnt.clone()))));
.and_then(move || ready(Ok(Srv2(cnt.clone()))));
let srv = new_srv.new_service(()).await.unwrap(); let srv = new_srv.new_service(()).await.unwrap();
let res = srv.call("srv1").await; let res = srv.call("srv1").await;

View File

@ -140,8 +140,7 @@ where
} }
} }
impl<SF, F, Fut, Req, In, Res, Err> ServiceFactory<Req> impl<SF, F, Fut, Req, In, Res, Err> ServiceFactory<Req> for ApplyFactory<SF, F, Req, In, Res, Err>
for ApplyFactory<SF, F, Req, In, Res, Err>
where where
SF: ServiceFactory<In, Error = Err>, SF: ServiceFactory<In, Error = Err>,
F: Fn(Req, &SF::Service) -> Fut + Clone, F: Fn(Req, &SF::Service) -> Fut + Clone,
@ -209,15 +208,13 @@ where
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use core::task::Poll;
use futures_util::future::lazy; use futures_util::future::lazy;
use super::*; use super::*;
use crate::{ use crate::{
ok, ok,
pipeline::{pipeline, pipeline_factory}, pipeline::{pipeline, pipeline_factory},
Ready, Service, ServiceFactory, Ready,
}; };
#[derive(Clone)] #[derive(Clone)]

View File

@ -198,8 +198,7 @@ pin_project! {
} }
} }
impl<SF, Req, F, Cfg, Fut, S> Future impl<SF, Req, F, Cfg, Fut, S> Future for ApplyConfigServiceFactoryResponse<SF, Req, F, Cfg, Fut, S>
for ApplyConfigServiceFactoryResponse<SF, Req, F, Cfg, Fut, S>
where where
SF: ServiceFactory<Req, Config = ()>, SF: ServiceFactory<Req, Config = ()>,
SF::InitError: From<SF::Error>, SF::InitError: From<SF::Error>,

View File

@ -3,36 +3,38 @@
use alloc::{boxed::Box, rc::Rc}; use alloc::{boxed::Box, rc::Rc};
use core::{future::Future, pin::Pin}; use core::{future::Future, pin::Pin};
use paste::paste;
use crate::{Service, ServiceFactory}; use crate::{Service, ServiceFactory};
/// A boxed future with no send bound or lifetime parameters. /// A boxed future with no send bound or lifetime parameters.
pub type BoxFuture<T> = Pin<Box<dyn Future<Output = T>>>; pub type BoxFuture<T> = Pin<Box<dyn Future<Output = T>>>;
macro_rules! service_object { /// Type alias for service trait object using [`Box`].
($name: ident, $type: tt, $fn_name: ident) => { pub type BoxService<Req, Res, Err> =
paste! { Box<dyn Service<Req, Response = Res, Error = Err, Future = BoxFuture<Result<Res, Err>>>>;
#[doc = "Type alias for service trait object using `" $type "`."]
pub type $name<Req, Res, Err> = $type<
dyn Service<Req, Response = Res, Error = Err, Future = BoxFuture<Result<Res, Err>>>,
>;
#[doc = "Wraps service as a trait object using [`" $name "`]."] /// Wraps service as a trait object using [`BoxService`].
pub fn $fn_name<S, Req>(service: S) -> $name<Req, S::Response, S::Error> pub fn service<S, Req>(service: S) -> BoxService<Req, S::Response, S::Error>
where where
S: Service<Req> + 'static, S: Service<Req> + 'static,
Req: 'static, Req: 'static,
S::Future: 'static, S::Future: 'static,
{ {
$type::new(ServiceWrapper::new(service)) Box::new(ServiceWrapper::new(service))
}
}
};
} }
service_object!(BoxService, Box, service); /// Type alias for service trait object using [`Rc`].
service_object!(RcService, Rc, rc_service); pub type RcService<Req, Res, Err> =
Rc<dyn Service<Req, Response = Res, Error = Err, Future = BoxFuture<Result<Res, Err>>>>;
/// Wraps service as a trait object using [`RcService`].
pub fn rc_service<S, Req>(service: S) -> RcService<Req, S::Response, S::Error>
where
S: Service<Req> + 'static,
Req: 'static,
S::Future: 'static,
{
Rc::new(ServiceWrapper::new(service))
}
struct ServiceWrapper<S> { struct ServiceWrapper<S> {
inner: S, inner: S,
@ -91,8 +93,7 @@ type Inner<C, Req, Res, Err, InitErr> = Box<
>, >,
>; >;
impl<C, Req, Res, Err, InitErr> ServiceFactory<Req> impl<C, Req, Res, Err, InitErr> ServiceFactory<Req> for BoxServiceFactory<C, Req, Res, Err, InitErr>
for BoxServiceFactory<C, Req, Res, Err, InitErr>
where where
Req: 'static, Req: 'static,
Res: 'static, Res: 'static,

View File

@ -44,7 +44,7 @@ pub trait ServiceExt<Req>: Service<Req> {
/// Call another service after call to this one has resolved successfully. /// Call another service after call to this one has resolved successfully.
/// ///
/// This function can be used to chain two services together and ensure that the second service /// This function can be used to chain two services together and ensure that the second service
/// isn't called until call to the fist service have finished. Result of the call to the first /// isn't called until call to the first service have finished. Result of the call to the first
/// service is used as an input parameter for the second service's call. /// service is used as an input parameter for the second service's call.
/// ///
/// Note that this function consumes the receiving service and returns a wrapped version of it. /// Note that this function consumes the receiving service and returns a wrapped version of it.

View File

@ -3,9 +3,7 @@ use core::{future::Future, marker::PhantomData};
use crate::{ok, IntoService, IntoServiceFactory, Ready, Service, ServiceFactory}; use crate::{ok, IntoService, IntoServiceFactory, Ready, Service, ServiceFactory};
/// Create `ServiceFactory` for function that can act as a `Service` /// Create `ServiceFactory` for function that can act as a `Service`
pub fn fn_service<F, Fut, Req, Res, Err, Cfg>( pub fn fn_service<F, Fut, Req, Res, Err, Cfg>(f: F) -> FnServiceFactory<F, Fut, Req, Res, Err, Cfg>
f: F,
) -> FnServiceFactory<F, Fut, Req, Res, Err, Cfg>
where where
F: Fn(Req) -> Fut + Clone, F: Fn(Req) -> Fut + Clone,
Fut: Future<Output = Result<Res, Err>>, Fut: Future<Output = Result<Res, Err>>,
@ -48,9 +46,7 @@ where
/// Ok(()) /// Ok(())
/// } /// }
/// ``` /// ```
pub fn fn_factory<F, Cfg, Srv, Req, Fut, Err>( pub fn fn_factory<F, Cfg, Srv, Req, Fut, Err>(f: F) -> FnServiceNoConfig<F, Cfg, Srv, Req, Fut, Err>
f: F,
) -> FnServiceNoConfig<F, Cfg, Srv, Req, Fut, Err>
where where
F: Fn() -> Fut, F: Fn() -> Fut,
Fut: Future<Output = Result<Srv, Err>>, Fut: Future<Output = Result<Srv, Err>>,
@ -265,8 +261,7 @@ where
} }
} }
impl<F, Fut, Cfg, Srv, Req, Err> ServiceFactory<Req> impl<F, Fut, Cfg, Srv, Req, Err> ServiceFactory<Req> for FnServiceConfig<F, Fut, Cfg, Srv, Req, Err>
for FnServiceConfig<F, Fut, Cfg, Srv, Req, Err>
where where
F: Fn(Cfg) -> Fut, F: Fn(Cfg) -> Fut,
Fut: Future<Output = Result<Srv, Err>>, Fut: Future<Output = Result<Srv, Err>>,
@ -356,7 +351,6 @@ mod tests {
use futures_util::future::lazy; use futures_util::future::lazy;
use super::*; use super::*;
use crate::{ok, Service, ServiceFactory};
#[actix_rt::test] #[actix_rt::test]
async fn test_fn_service() { async fn test_fn_service() {
@ -404,9 +398,8 @@ mod tests {
ok::<_, Rc<u8>>(fn_service(|_: Rc<u8>| ok::<_, Rc<u8>>(Rc::new(0u8)))) ok::<_, Rc<u8>>(fn_service(|_: Rc<u8>| ok::<_, Rc<u8>>(Rc::new(0u8))))
}); });
let fac_2 = fn_factory(|| { let fac_2 =
ok::<_, Rc<u8>>(fn_service(|_: Rc<u8>| ok::<_, Rc<u8>>(Rc::new(0u8)))) fn_factory(|| ok::<_, Rc<u8>>(fn_service(|_: Rc<u8>| ok::<_, Rc<u8>>(Rc::new(0u8)))));
});
fn is_send<T: Send + Sync + Clone>(_: &T) {} fn is_send<T: Send + Sync + Clone>(_: &T) {}

View File

@ -1,8 +1,6 @@
//! See [`Service`] docs for information on this crate's foundational trait. //! See [`Service`] docs for information on this crate's foundational trait.
#![no_std] #![no_std]
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible, missing_docs)]
#![allow(clippy::type_complexity)] #![allow(clippy::type_complexity)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")] #![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")] #![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
@ -33,14 +31,16 @@ mod then;
mod transform; mod transform;
mod transform_err; mod transform_err;
pub use self::apply::{apply_fn, apply_fn_factory};
pub use self::apply_cfg::{apply_cfg, apply_cfg_factory};
pub use self::ext::{ServiceExt, ServiceFactoryExt, TransformExt};
pub use self::fn_service::{fn_factory, fn_factory_with_config, fn_service};
pub use self::map_config::{map_config, unit_config};
#[allow(unused_imports)] #[allow(unused_imports)]
use self::ready::{err, ok, ready, Ready}; use self::ready::{err, ok, ready, Ready};
pub use self::transform::{apply, ApplyTransform, Transform}; pub use self::{
apply::{apply_fn, apply_fn_factory},
apply_cfg::{apply_cfg, apply_cfg_factory},
ext::{ServiceExt, ServiceFactoryExt, TransformExt},
fn_service::{fn_factory, fn_factory_with_config, fn_service},
map_config::{map_config, unit_config},
transform::{apply, ApplyTransform, Transform},
};
/// An asynchronous operation from `Request` to a `Response`. /// An asynchronous operation from `Request` to a `Response`.
/// ///

View File

@ -202,9 +202,7 @@ mod tests {
use futures_util::future::lazy; use futures_util::future::lazy;
use super::*; use super::*;
use crate::{ use crate::{ok, IntoServiceFactory, Ready, ServiceExt, ServiceFactoryExt};
ok, IntoServiceFactory, Ready, Service, ServiceExt, ServiceFactory, ServiceFactoryExt,
};
struct Srv; struct Srv;

View File

@ -205,10 +205,7 @@ mod tests {
use futures_util::future::lazy; use futures_util::future::lazy;
use super::*; use super::*;
use crate::{ use crate::{err, ok, IntoServiceFactory, Ready, ServiceExt, ServiceFactoryExt};
err, ok, IntoServiceFactory, Ready, Service, ServiceExt, ServiceFactory,
ServiceFactoryExt,
};
struct Srv; struct Srv;

View File

@ -6,12 +6,14 @@ use core::{
task::{Context, Poll}, task::{Context, Poll},
}; };
use crate::and_then::{AndThenService, AndThenServiceFactory}; use crate::{
use crate::map::{Map, MapServiceFactory}; and_then::{AndThenService, AndThenServiceFactory},
use crate::map_err::{MapErr, MapErrServiceFactory}; map::{Map, MapServiceFactory},
use crate::map_init_err::MapInitErr; map_err::{MapErr, MapErrServiceFactory},
use crate::then::{ThenService, ThenServiceFactory}; map_init_err::MapInitErr,
use crate::{IntoService, IntoServiceFactory, Service, ServiceFactory}; then::{ThenService, ThenServiceFactory},
IntoService, IntoServiceFactory, Service, ServiceFactory,
};
/// Construct new pipeline with one service in pipeline chain. /// Construct new pipeline with one service in pipeline chain.
pub(crate) fn pipeline<I, S, Req>(service: I) -> Pipeline<S, Req> pub(crate) fn pipeline<I, S, Req>(service: I) -> Pipeline<S, Req>
@ -50,7 +52,7 @@ where
/// Call another service after call to this one has resolved successfully. /// Call another service after call to this one has resolved successfully.
/// ///
/// This function can be used to chain two services together and ensure that /// This function can be used to chain two services together and ensure that
/// the second service isn't called until call to the fist service have /// the second service isn't called until call to the first service have
/// finished. Result of the call to the first service is used as an /// finished. Result of the call to the first service is used as an
/// input parameter for the second service's call. /// input parameter for the second service's call.
/// ///
@ -252,10 +254,7 @@ where
} }
/// Map this service's error to a different error, returning a new service. /// Map this service's error to a different error, returning a new service.
pub fn map_err<F, E>( pub fn map_err<F, E>(self, f: F) -> PipelineFactory<MapErrServiceFactory<SF, Req, F, E>, Req>
self,
f: F,
) -> PipelineFactory<MapErrServiceFactory<SF, Req, F, E>, Req>
where where
Self: Sized, Self: Sized,
F: Fn(SF::Error) -> E + Clone, F: Fn(SF::Error) -> E + Clone,

View File

@ -226,9 +226,9 @@ mod tests {
use actix_utils::future::{ready, Ready}; use actix_utils::future::{ready, Ready};
use super::*; use super::*;
use crate::Service;
// pseudo-doctest for Transform trait // pseudo-doctest for Transform trait
#[allow(unused)]
pub struct TimeoutTransform { pub struct TimeoutTransform {
timeout: Duration, timeout: Duration,
} }
@ -250,6 +250,7 @@ mod tests {
} }
// pseudo-doctest for Transform trait // pseudo-doctest for Transform trait
#[allow(unused)]
pub struct Timeout<S> { pub struct Timeout<S> {
service: S, service: S,
_timeout: Duration, _timeout: Duration,

View File

@ -1,40 +1,67 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased
- Minimum supported Rust version (MSRV) is now 1.59. - Minimum supported Rust version (MSRV) is now 1.71.
## 3.0.4 - 2022-03-15 ## 3.4.0
- Add `rustls-0_23`, `rustls-0_23-webpki-roots`, and `rustls-0_23-native-roots` crate features.
- Minimum supported Rust version (MSRV) is now 1.70.
## 3.3.0
- Add `rustls-0_22` crate feature which excludes any root certificate methods or re-exports.
## 3.2.0
- Support Rustls v0.22.
- Add `{accept, connect}::rustls_0_22` modules.
- Add `rustls-0_21-native-roots` and `rustls-0_20-native-roots` crate features which utilize the `rustls-native-certs` crate to enable a `native_roots_cert_store()` functions in each rustls-based `connect` module.
- Implement `Host` for `http::Uri` (`http` crate version `1`).
## 3.1.1
- Fix `rustls` v0.21 version requirement.
## 3.1.0
- Support Rustls v0.21.
- Add `{accept, connect}::rustls_0_21` modules.
- Add `{accept, connect}::rustls_0_20` alias for `{accept, connect}::rustls` modules.
- Minimum supported Rust version (MSRV) is now 1.65.
## 3.0.4
- 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
- No significant changes since `3.0.2`. - No significant changes since `3.0.2`.
## 3.0.2 - 2022-01-28 ## 3.0.2
- 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
- No significant changes since `3.0.0`. - No significant changes since `3.0.0`.
## 3.0.0 - 2021-12-26 ## 3.0.0
- 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
- 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
### Added ### Added
@ -72,7 +99,7 @@
[#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
- 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]
@ -82,20 +109,20 @@
[#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
- 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
- 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
- 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]
@ -103,7 +130,7 @@
[#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
- 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]
@ -117,7 +144,7 @@
[#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
- 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]
@ -125,7 +152,7 @@
[#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
- 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]
@ -139,13 +166,13 @@
[#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
- 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
- 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]
@ -153,7 +180,7 @@
[#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
- `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".
@ -161,28 +188,28 @@
- `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
- 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]
- 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]
- 1.0.0 release - 1.0.0 release
## [1.0.0-alpha.3] - 2019-12-07 ## [1.0.0-alpha.3]
- 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]
- Split openssl acceptor from actix-server package - Split openssl acceptor from actix-server package

110
actix-tls/Cargo.toml Executable file → Normal file
View File

@ -1,24 +1,27 @@
[package] [package]
name = "actix-tls" name = "actix-tls"
version = "3.0.4" version = "3.4.0"
authors = [ authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
description = "TLS acceptor and connector services for Actix ecosystem" description = "TLS acceptor and connector services for Actix ecosystem"
keywords = ["network", "tls", "ssl", "async", "transport"] keywords = ["network", "tls", "ssl", "async", "transport"]
repository = "https://github.com/actix/actix-net.git" repository = "https://github.com/actix/actix-net.git"
categories = ["network-programming", "asynchronous", "cryptography"] categories = ["network-programming", "asynchronous", "cryptography"]
license = "MIT OR Apache-2.0" license.workspace = true
edition = "2018" edition.workspace = true
rust-version.workspace = true
[package.metadata.docs.rs] [package.metadata.docs.rs]
all-features = true all-features = true
rustdoc-args = ["--cfg", "docsrs"] rustdoc-args = ["--cfg", "docsrs"]
[lib] [package.metadata.cargo_check_external_types]
name = "actix_tls" allowed_external_types = ["actix_service::*", "actix_utils::*", "futures_core::*", "tokio::*"]
path = "src/lib.rs"
[package.metadata.cargo-machete]
ignored = [
"rustls_021", # specified to force version with add_trust_anchors method
"rustls_webpki_0101", # specified to force secure version
]
[features] [features]
default = ["accept", "connect"] default = ["accept", "connect"]
@ -30,56 +33,103 @@ accept = []
connect = [] connect = []
# use openssl impls # use openssl impls
openssl = ["tls-openssl", "tokio-openssl"] openssl = ["dep:tls-openssl", "dep:tokio-openssl"]
# use rustls impls # alias for backwards compat
rustls = ["tokio-rustls", "webpki-roots"] rustls = ["rustls-0_20"]
# use rustls v0.20 impls
rustls-0_20 = ["rustls-0_20-webpki-roots"]
rustls-0_20-webpki-roots = ["tokio-rustls-023", "webpki-roots-022"]
rustls-0_20-native-roots = ["tokio-rustls-023", "dep:rustls-native-certs-06"]
# use rustls v0.21 impls
rustls-0_21 = ["rustls-0_21-webpki-roots"]
rustls-0_21-webpki-roots = ["tokio-rustls-024", "webpki-roots-025"]
rustls-0_21-native-roots = ["tokio-rustls-024", "dep:rustls-native-certs-06"]
# use rustls v0.22 impls
rustls-0_22 = ["dep:tokio-rustls-025", "dep:rustls-pki-types-1"]
rustls-0_22-webpki-roots = ["rustls-0_22", "dep:webpki-roots-026"]
rustls-0_22-native-roots = ["rustls-0_22", "dep:rustls-native-certs-07"]
# use rustls v0.23 impls
rustls-0_23 = ["dep:tokio-rustls-026", "dep:rustls-pki-types-1"]
rustls-0_23-webpki-roots = ["rustls-0_23", "dep:webpki-roots-026"]
rustls-0_23-native-roots = ["rustls-0_23", "dep:rustls-native-certs-07"]
# use native-tls impls # use native-tls impls
native-tls = ["tokio-native-tls"] native-tls = ["dep:tokio-native-tls"]
# support http::Uri as connect address # support http::Uri as connect address
uri = ["http"] uri = ["dep:http-0_2", "dep:http-1"]
[dependencies] [dependencies]
actix-rt = { version = "2.2.0", default-features = false } actix-rt = { version = "2.2", 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.7", default-features = false, features = ["alloc"] }
impl-more = "0.1" impl-more = "0.1"
pin-project-lite = "0.2.7" pin-project-lite = "0.2.7"
tokio = "1.18.4" tokio = "1.23.1"
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"] }
# uri # uri
http = { version = "0.2.3", optional = true } http-0_2 = { package = "http", version = "0.2.3", optional = true }
http-1 = { package = "http", version = "1", optional = true }
# openssl # openssl
tls-openssl = { package = "openssl", version = "0.10.9", optional = true } tls-openssl = { package = "openssl", version = "0.10.55", optional = true }
tokio-openssl = { version = "0.6", optional = true } tokio-openssl = { version = "0.6", optional = true }
# rustls # rustls PKI types
tokio-rustls = { version = "0.23", optional = true } rustls-pki-types-1 = { package = "rustls-pki-types", version = "1", optional = true }
webpki-roots = { version = "0.22", optional = true }
# rustls v0.20
tokio-rustls-023 = { package = "tokio-rustls", version = "0.23", optional = true }
# rustls v0.21
tokio-rustls-024 = { package = "tokio-rustls", version = "0.24", optional = true }
# rustls v0.22
tokio-rustls-025 = { package = "tokio-rustls", version = "0.25", optional = true }
# rustls v0.23
tokio-rustls-026 = { package = "tokio-rustls", version = "0.26", default-features = false, optional = true }
# webpki-roots used with rustls features
webpki-roots-022 = { package = "webpki-roots", version = "0.22", optional = true }
webpki-roots-025 = { package = "webpki-roots", version = "0.25", optional = true }
webpki-roots-026 = { package = "webpki-roots", version = "0.26", optional = true }
# native root certificates for rustls impls
rustls-native-certs-06 = { package = "rustls-native-certs", version = "0.6", optional = true }
rustls-native-certs-07 = { package = "rustls-native-certs", version = "0.7", optional = true }
# native-tls # native-tls
tokio-native-tls = { version = "0.3", optional = true } tokio-native-tls = { version = "0.3", optional = true }
[target.'cfg(any())'.dependencies]
rustls-021 = { package = "rustls", version = "0.21.6", optional = true } # force version with add_trust_anchors method
rustls-webpki-0101 = { package = "rustls-webpki", version = "0.101.4", optional = true } # force secure version
[dev-dependencies] [dev-dependencies]
actix-codec = "0.5" actix-codec = "0.5"
actix-rt = "2.2" actix-rt = "2.2"
actix-server = "2" actix-server = "2"
bytes = "1" bytes = "1"
env_logger = "0.10"
futures-util = { version = "0.3.17", default-features = false, features = ["sink"] } futures-util = { version = "0.3.17", default-features = false, features = ["sink"] }
log = "0.4" itertools = "0.14"
rcgen = "0.10" pretty_env_logger = "0.5"
rustls-pemfile = "1" rcgen = "0.13"
tokio-rustls = { version = "0.23", features = ["dangerous_configuration"] } rustls-pemfile = "2"
trust-dns-resolver = "0.22" tokio-rustls-026 = { package = "tokio-rustls", version = "0.26" }
trust-dns-resolver = "0.23"
[[example]] [[example]]
name = "accept-rustls" name = "accept-rustls"
required-features = ["accept", "rustls"] required-features = ["accept", "rustls-0_23"]
[lints]
workspace = true

21
actix-tls/README.md Normal file
View File

@ -0,0 +1,21 @@
# `actix-tls`
> TLS acceptor and connector services for the Actix ecosystem.
<!-- prettier-ignore-start -->
[![crates.io](https://img.shields.io/crates/v/actix-tls?label=latest)](https://crates.io/crates/actix-tls)
[![Documentation](https://docs.rs/actix-tls/badge.svg?version=3.4.0)](https://docs.rs/actix-tls/3.4.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)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-tls.svg)
<br />
[![Dependency Status](https://deps.rs/crate/actix-tls/3.4.0/status.svg)](https://deps.rs/crate/actix-tls/3.4.0)
![Download](https://img.shields.io/crates/d/actix-tls.svg)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)
<!-- prettier-ignore-end -->
## Resources
- [Library Documentation](https://docs.rs/actix-tls)
- [Examples](/actix-tls/examples)

View File

@ -15,15 +15,12 @@
//! http --verify=false https://127.0.0.1:8443 //! http --verify=false https://127.0.0.1:8443
//! ``` //! ```
#[rustfmt::skip]
// this `use` is only exists because of how we have organised the crate // this `use` is only exists because of how we have organised the crate
// it is not necessary for your actual code; you should import from `rustls` directly // it is not necessary for your actual code; you should import from `rustls` normally
use tokio_rustls::rustls;
use std::{ use std::{
env,
fs::File, fs::File,
io::{self, BufReader}, io::{self, BufReader},
path::PathBuf,
sync::{ sync::{
atomic::{AtomicUsize, Ordering}, atomic::{AtomicUsize, Ordering},
Arc, Arc,
@ -33,31 +30,40 @@ use std::{
use actix_rt::net::TcpStream; use actix_rt::net::TcpStream;
use actix_server::Server; use actix_server::Server;
use actix_service::ServiceFactoryExt as _; use actix_service::ServiceFactoryExt as _;
use actix_tls::accept::rustls::{Acceptor as RustlsAcceptor, TlsStream}; use actix_tls::accept::rustls_0_23::{Acceptor as RustlsAcceptor, TlsStream};
use futures_util::future::ok; use futures_util::future::ok;
use rustls::{server::ServerConfig, Certificate, PrivateKey}; use itertools::Itertools as _;
use rustls::server::ServerConfig;
use rustls_pemfile::{certs, rsa_private_keys}; use rustls_pemfile::{certs, rsa_private_keys};
use rustls_pki_types_1::PrivateKeyDer;
use tokio_rustls_026::rustls;
use tracing::info; use tracing::info;
#[actix_rt::main] #[actix_rt::main]
async fn main() -> io::Result<()> { async fn main() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::default().default_filter_or("info")); pretty_env_logger::formatted_timed_builder()
.parse_env(pretty_env_logger::env_logger::Env::default().default_filter_or("info"));
let root_path = env!("CARGO_MANIFEST_DIR")
.parse::<PathBuf>()
.unwrap()
.join("examples");
let cert_path = root_path.clone().join("cert.pem");
let key_path = root_path.clone().join("key.pem");
// 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(cert_path).unwrap());
let key_file = &mut BufReader::new(File::open("./examples/key.pem").unwrap()); let key_file = &mut BufReader::new(File::open(key_path).unwrap());
let cert_chain = certs(cert_file) let cert_chain = certs(cert_file);
.unwrap() let mut keys = rsa_private_keys(key_file);
.into_iter()
.map(Certificate)
.collect();
let mut keys = rsa_private_keys(key_file).unwrap();
let tls_config = ServerConfig::builder() let tls_config = ServerConfig::builder()
.with_safe_defaults()
.with_no_client_auth() .with_no_client_auth()
.with_single_cert(cert_chain, PrivateKey(keys.remove(0))) .with_single_cert(
cert_chain.try_collect::<_, Vec<_>, _>()?,
PrivateKeyDer::Pkcs1(keys.next().unwrap()?),
)
.unwrap(); .unwrap();
let tls_acceptor = RustlsAcceptor::new(tls_config); let tls_acceptor = RustlsAcceptor::new(tls_config);
@ -65,7 +71,7 @@ async fn main() -> io::Result<()> {
let count = Arc::new(AtomicUsize::new(0)); let count = Arc::new(AtomicUsize::new(0));
let addr = ("127.0.0.1", 8443); let addr = ("127.0.0.1", 8443);
info!("starting server on port: {}", &addr.0); info!("starting server at: {addr:?}");
Server::build() Server::build()
.bind("tls-example", addr, move || { .bind("tls-example", addr, move || {

View File

@ -10,20 +10,37 @@ use std::{
use actix_utils::counter::Counter; use actix_utils::counter::Counter;
#[cfg(feature = "openssl")] #[cfg(feature = "openssl")]
#[cfg_attr(docsrs, doc(cfg(feature = "openssl")))]
pub mod openssl; pub mod openssl;
#[cfg(feature = "rustls")] #[cfg(feature = "rustls-0_20")]
#[cfg_attr(docsrs, doc(cfg(feature = "rustls")))] pub mod rustls_0_20;
pub mod rustls;
#[doc(hidden)]
#[cfg(feature = "rustls-0_20")]
pub use rustls_0_20 as rustls;
#[cfg(feature = "rustls-0_21")]
pub mod rustls_0_21;
#[cfg(feature = "rustls-0_22")]
pub mod rustls_0_22;
#[cfg(feature = "rustls-0_23")]
pub mod rustls_0_23;
#[cfg(feature = "native-tls")] #[cfg(feature = "native-tls")]
#[cfg_attr(docsrs, doc(cfg(feature = "native-tls")))]
pub mod native_tls; pub mod native_tls;
pub(crate) static MAX_CONN: AtomicUsize = AtomicUsize::new(256); pub(crate) static MAX_CONN: AtomicUsize = AtomicUsize::new(256);
#[cfg(any(feature = "openssl", feature = "rustls", feature = "native-tls"))] #[cfg(any(
feature = "openssl",
feature = "rustls-0_20",
feature = "rustls-0_21",
feature = "rustls-0_22",
feature = "rustls-0_23",
feature = "native-tls",
))]
pub(crate) const DEFAULT_TLS_HANDSHAKE_TIMEOUT: std::time::Duration = pub(crate) const DEFAULT_TLS_HANDSHAKE_TIMEOUT: std::time::Duration =
std::time::Duration::from_secs(3); std::time::Duration::from_secs(3);
@ -59,6 +76,25 @@ pub enum TlsError<TlsErr, SvcErr> {
Service(SvcErr), Service(SvcErr),
} }
impl<TlsErr> TlsError<TlsErr, Infallible> {
/// Casts the infallible service error type returned from acceptors into caller's type.
///
/// # Examples
/// ```
/// # use std::convert::Infallible;
/// # use actix_tls::accept::TlsError;
/// let a: TlsError<u32, Infallible> = TlsError::Tls(42);
/// let _b: TlsError<u32, u64> = a.into_service_error();
/// ```
pub fn into_service_error<SvcErr>(self) -> TlsError<TlsErr, SvcErr> {
match self {
Self::Timeout => TlsError::Timeout,
Self::Tls(err) => TlsError::Tls(err),
Self::Service(err) => match err {},
}
}
}
impl<TlsErr, SvcErr> fmt::Display for TlsError<TlsErr, SvcErr> { impl<TlsErr, SvcErr> fmt::Display for TlsError<TlsErr, SvcErr> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self { match self {
@ -83,25 +119,6 @@ where
} }
} }
impl<TlsErr> TlsError<TlsErr, Infallible> {
/// Casts the infallible service error type returned from acceptors into caller's type.
///
/// # Examples
/// ```
/// # use std::convert::Infallible;
/// # use actix_tls::accept::TlsError;
/// let a: TlsError<u32, Infallible> = TlsError::Tls(42);
/// let _b: TlsError<u32, u64> = a.into_service_error();
/// ```
pub fn into_service_error<SvcErr>(self) -> TlsError<TlsErr, SvcErr> {
match self {
Self::Timeout => TlsError::Timeout,
Self::Tls(err) => TlsError::Tls(err),
Self::Service(err) => match err {},
}
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;

View File

@ -73,17 +73,17 @@ impl<IO: ActixStream> AsyncWrite for TlsStream<IO> {
} }
fn is_write_vectored(&self) -> bool { fn is_write_vectored(&self) -> bool {
(&**self).is_write_vectored() (**self).is_write_vectored()
} }
} }
impl<IO: ActixStream> ActixStream for TlsStream<IO> { impl<IO: ActixStream> ActixStream for TlsStream<IO> {
fn poll_read_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> { fn poll_read_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_read_ready((&**self).get_ref().get_ref().get_ref(), cx) IO::poll_read_ready((**self).get_ref().get_ref().get_ref(), cx)
} }
fn poll_write_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> { fn poll_write_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_write_ready((&**self).get_ref().get_ref().get_ref(), cx) IO::poll_write_ready((**self).get_ref().get_ref().get_ref(), cx)
} }
} }

View File

@ -76,17 +76,17 @@ impl<IO: ActixStream> AsyncWrite for TlsStream<IO> {
} }
fn is_write_vectored(&self) -> bool { fn is_write_vectored(&self) -> bool {
(&**self).is_write_vectored() (**self).is_write_vectored()
} }
} }
impl<IO: ActixStream> ActixStream for TlsStream<IO> { impl<IO: ActixStream> ActixStream for TlsStream<IO> {
fn poll_read_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> { fn poll_read_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_read_ready((&**self).get_ref(), cx) IO::poll_read_ready((**self).get_ref(), cx)
} }
fn poll_write_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> { fn poll_write_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_write_ready((&**self).get_ref(), cx) IO::poll_write_ready((**self).get_ref(), cx)
} }
} }

View File

@ -1,4 +1,4 @@
//! `rustls` based TLS connection acceptor service. //! `rustls` v0.20 based TLS connection acceptor service.
//! //!
//! See [`Acceptor`] for main service factory docs. //! See [`Acceptor`] for main service factory docs.
@ -23,15 +23,15 @@ use actix_utils::{
}; };
use pin_project_lite::pin_project; use pin_project_lite::pin_project;
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
use tokio_rustls::rustls::ServerConfig;
use tokio_rustls::{Accept, TlsAcceptor}; use tokio_rustls::{Accept, TlsAcceptor};
use tokio_rustls_023 as tokio_rustls;
use super::{TlsError, DEFAULT_TLS_HANDSHAKE_TIMEOUT, MAX_CONN_COUNTER}; use super::{TlsError, DEFAULT_TLS_HANDSHAKE_TIMEOUT, MAX_CONN_COUNTER};
pub mod reexports { pub mod reexports {
//! Re-exports from `rustls` that are useful for acceptors. //! Re-exports from `rustls` that are useful for acceptors.
pub use tokio_rustls::rustls::ServerConfig; pub use tokio_rustls_023::rustls::ServerConfig;
} }
/// Wraps a `rustls` based async TLS stream in order to implement [`ActixStream`]. /// Wraps a `rustls` based async TLS stream in order to implement [`ActixStream`].
@ -76,29 +76,29 @@ impl<IO: ActixStream> AsyncWrite for TlsStream<IO> {
} }
fn is_write_vectored(&self) -> bool { fn is_write_vectored(&self) -> bool {
(&**self).is_write_vectored() (**self).is_write_vectored()
} }
} }
impl<IO: ActixStream> ActixStream for TlsStream<IO> { impl<IO: ActixStream> ActixStream for TlsStream<IO> {
fn poll_read_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> { fn poll_read_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_read_ready((&**self).get_ref().0, cx) IO::poll_read_ready((**self).get_ref().0, cx)
} }
fn poll_write_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> { fn poll_write_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_write_ready((&**self).get_ref().0, cx) IO::poll_write_ready((**self).get_ref().0, cx)
} }
} }
/// Accept TLS connections via the `rustls` crate. /// Accept TLS connections via the `rustls` crate.
pub struct Acceptor { pub struct Acceptor {
config: Arc<ServerConfig>, config: Arc<reexports::ServerConfig>,
handshake_timeout: Duration, handshake_timeout: Duration,
} }
impl Acceptor { impl Acceptor {
/// Constructs `rustls` based acceptor service factory. /// Constructs `rustls` based acceptor service factory.
pub fn new(config: ServerConfig) -> Self { pub fn new(config: reexports::ServerConfig) -> Self {
Acceptor { Acceptor {
config: Arc::new(config), config: Arc::new(config),
handshake_timeout: DEFAULT_TLS_HANDSHAKE_TIMEOUT, handshake_timeout: DEFAULT_TLS_HANDSHAKE_TIMEOUT,

View File

@ -0,0 +1,198 @@
//! `rustls` v0.21 based TLS connection acceptor service.
//!
//! See [`Acceptor`] for main service factory docs.
use std::{
convert::Infallible,
future::Future,
io::{self, IoSlice},
pin::Pin,
sync::Arc,
task::{Context, Poll},
time::Duration,
};
use actix_rt::{
net::{ActixStream, Ready},
time::{sleep, Sleep},
};
use actix_service::{Service, ServiceFactory};
use actix_utils::{
counter::{Counter, CounterGuard},
future::{ready, Ready as FutReady},
};
use pin_project_lite::pin_project;
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
use tokio_rustls::{Accept, TlsAcceptor};
use tokio_rustls_024 as tokio_rustls;
use super::{TlsError, DEFAULT_TLS_HANDSHAKE_TIMEOUT, MAX_CONN_COUNTER};
pub mod reexports {
//! Re-exports from `rustls` that are useful for acceptors.
pub use tokio_rustls_024::rustls::ServerConfig;
}
/// Wraps a `rustls` based async TLS stream in order to implement [`ActixStream`].
pub struct TlsStream<IO>(tokio_rustls::server::TlsStream<IO>);
impl_more::impl_from!(<IO> in tokio_rustls::server::TlsStream<IO> => TlsStream<IO>);
impl_more::impl_deref_and_mut!(<IO> in TlsStream<IO> => tokio_rustls::server::TlsStream<IO>);
impl<IO: ActixStream> AsyncRead for TlsStream<IO> {
fn poll_read(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &mut ReadBuf<'_>,
) -> Poll<io::Result<()>> {
Pin::new(&mut **self.get_mut()).poll_read(cx, buf)
}
}
impl<IO: ActixStream> AsyncWrite for TlsStream<IO> {
fn poll_write(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &[u8],
) -> Poll<io::Result<usize>> {
Pin::new(&mut **self.get_mut()).poll_write(cx, buf)
}
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
Pin::new(&mut **self.get_mut()).poll_flush(cx)
}
fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
Pin::new(&mut **self.get_mut()).poll_shutdown(cx)
}
fn poll_write_vectored(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
bufs: &[IoSlice<'_>],
) -> Poll<io::Result<usize>> {
Pin::new(&mut **self.get_mut()).poll_write_vectored(cx, bufs)
}
fn is_write_vectored(&self) -> bool {
(**self).is_write_vectored()
}
}
impl<IO: ActixStream> ActixStream for TlsStream<IO> {
fn poll_read_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_read_ready((**self).get_ref().0, cx)
}
fn poll_write_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_write_ready((**self).get_ref().0, cx)
}
}
/// Accept TLS connections via the `rustls` crate.
pub struct Acceptor {
config: Arc<reexports::ServerConfig>,
handshake_timeout: Duration,
}
impl Acceptor {
/// Constructs `rustls` based acceptor service factory.
pub fn new(config: reexports::ServerConfig) -> Self {
Acceptor {
config: Arc::new(config),
handshake_timeout: DEFAULT_TLS_HANDSHAKE_TIMEOUT,
}
}
/// Limit the amount of time that the acceptor will wait for a TLS handshake to complete.
///
/// Default timeout is 3 seconds.
pub fn set_handshake_timeout(&mut self, handshake_timeout: Duration) -> &mut Self {
self.handshake_timeout = handshake_timeout;
self
}
}
impl Clone for Acceptor {
fn clone(&self) -> Self {
Self {
config: self.config.clone(),
handshake_timeout: self.handshake_timeout,
}
}
}
impl<IO: ActixStream> ServiceFactory<IO> for Acceptor {
type Response = TlsStream<IO>;
type Error = TlsError<io::Error, Infallible>;
type Config = ();
type Service = AcceptorService;
type InitError = ();
type Future = FutReady<Result<Self::Service, Self::InitError>>;
fn new_service(&self, _: ()) -> Self::Future {
let res = MAX_CONN_COUNTER.with(|conns| {
Ok(AcceptorService {
acceptor: self.config.clone().into(),
conns: conns.clone(),
handshake_timeout: self.handshake_timeout,
})
});
ready(res)
}
}
/// Rustls based acceptor service.
pub struct AcceptorService {
acceptor: TlsAcceptor,
conns: Counter,
handshake_timeout: Duration,
}
impl<IO: ActixStream> Service<IO> for AcceptorService {
type Response = TlsStream<IO>;
type Error = TlsError<io::Error, Infallible>;
type Future = AcceptFut<IO>;
fn poll_ready(&self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
if self.conns.available(cx) {
Poll::Ready(Ok(()))
} else {
Poll::Pending
}
}
fn call(&self, req: IO) -> Self::Future {
AcceptFut {
fut: self.acceptor.accept(req),
timeout: sleep(self.handshake_timeout),
_guard: self.conns.get(),
}
}
}
pin_project! {
/// Accept future for Rustls service.
#[doc(hidden)]
pub struct AcceptFut<IO: ActixStream> {
fut: Accept<IO>,
#[pin]
timeout: Sleep,
_guard: CounterGuard,
}
}
impl<IO: ActixStream> Future for AcceptFut<IO> {
type Output = Result<TlsStream<IO>, TlsError<io::Error, Infallible>>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let mut this = self.project();
match Pin::new(&mut this.fut).poll(cx) {
Poll::Ready(Ok(stream)) => Poll::Ready(Ok(TlsStream(stream))),
Poll::Ready(Err(err)) => Poll::Ready(Err(TlsError::Tls(err))),
Poll::Pending => this.timeout.poll(cx).map(|_| Err(TlsError::Timeout)),
}
}
}

View File

@ -0,0 +1,198 @@
//! `rustls` v0.22 based TLS connection acceptor service.
//!
//! See [`Acceptor`] for main service factory docs.
use std::{
convert::Infallible,
future::Future,
io::{self, IoSlice},
pin::Pin,
sync::Arc,
task::{Context, Poll},
time::Duration,
};
use actix_rt::{
net::{ActixStream, Ready},
time::{sleep, Sleep},
};
use actix_service::{Service, ServiceFactory};
use actix_utils::{
counter::{Counter, CounterGuard},
future::{ready, Ready as FutReady},
};
use pin_project_lite::pin_project;
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
use tokio_rustls::{Accept, TlsAcceptor};
use tokio_rustls_025 as tokio_rustls;
use super::{TlsError, DEFAULT_TLS_HANDSHAKE_TIMEOUT, MAX_CONN_COUNTER};
pub mod reexports {
//! Re-exports from `rustls` that are useful for acceptors.
pub use tokio_rustls_025::rustls::ServerConfig;
}
/// Wraps a `rustls` based async TLS stream in order to implement [`ActixStream`].
pub struct TlsStream<IO>(tokio_rustls::server::TlsStream<IO>);
impl_more::impl_from!(<IO> in tokio_rustls::server::TlsStream<IO> => TlsStream<IO>);
impl_more::impl_deref_and_mut!(<IO> in TlsStream<IO> => tokio_rustls::server::TlsStream<IO>);
impl<IO: ActixStream> AsyncRead for TlsStream<IO> {
fn poll_read(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &mut ReadBuf<'_>,
) -> Poll<io::Result<()>> {
Pin::new(&mut **self.get_mut()).poll_read(cx, buf)
}
}
impl<IO: ActixStream> AsyncWrite for TlsStream<IO> {
fn poll_write(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &[u8],
) -> Poll<io::Result<usize>> {
Pin::new(&mut **self.get_mut()).poll_write(cx, buf)
}
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
Pin::new(&mut **self.get_mut()).poll_flush(cx)
}
fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
Pin::new(&mut **self.get_mut()).poll_shutdown(cx)
}
fn poll_write_vectored(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
bufs: &[IoSlice<'_>],
) -> Poll<io::Result<usize>> {
Pin::new(&mut **self.get_mut()).poll_write_vectored(cx, bufs)
}
fn is_write_vectored(&self) -> bool {
(**self).is_write_vectored()
}
}
impl<IO: ActixStream> ActixStream for TlsStream<IO> {
fn poll_read_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_read_ready((**self).get_ref().0, cx)
}
fn poll_write_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_write_ready((**self).get_ref().0, cx)
}
}
/// Accept TLS connections via the `rustls` crate.
pub struct Acceptor {
config: Arc<reexports::ServerConfig>,
handshake_timeout: Duration,
}
impl Acceptor {
/// Constructs `rustls` based acceptor service factory.
pub fn new(config: reexports::ServerConfig) -> Self {
Acceptor {
config: Arc::new(config),
handshake_timeout: DEFAULT_TLS_HANDSHAKE_TIMEOUT,
}
}
/// Limit the amount of time that the acceptor will wait for a TLS handshake to complete.
///
/// Default timeout is 3 seconds.
pub fn set_handshake_timeout(&mut self, handshake_timeout: Duration) -> &mut Self {
self.handshake_timeout = handshake_timeout;
self
}
}
impl Clone for Acceptor {
fn clone(&self) -> Self {
Self {
config: self.config.clone(),
handshake_timeout: self.handshake_timeout,
}
}
}
impl<IO: ActixStream> ServiceFactory<IO> for Acceptor {
type Response = TlsStream<IO>;
type Error = TlsError<io::Error, Infallible>;
type Config = ();
type Service = AcceptorService;
type InitError = ();
type Future = FutReady<Result<Self::Service, Self::InitError>>;
fn new_service(&self, _: ()) -> Self::Future {
let res = MAX_CONN_COUNTER.with(|conns| {
Ok(AcceptorService {
acceptor: self.config.clone().into(),
conns: conns.clone(),
handshake_timeout: self.handshake_timeout,
})
});
ready(res)
}
}
/// Rustls based acceptor service.
pub struct AcceptorService {
acceptor: TlsAcceptor,
conns: Counter,
handshake_timeout: Duration,
}
impl<IO: ActixStream> Service<IO> for AcceptorService {
type Response = TlsStream<IO>;
type Error = TlsError<io::Error, Infallible>;
type Future = AcceptFut<IO>;
fn poll_ready(&self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
if self.conns.available(cx) {
Poll::Ready(Ok(()))
} else {
Poll::Pending
}
}
fn call(&self, req: IO) -> Self::Future {
AcceptFut {
fut: self.acceptor.accept(req),
timeout: sleep(self.handshake_timeout),
_guard: self.conns.get(),
}
}
}
pin_project! {
/// Accept future for Rustls service.
#[doc(hidden)]
pub struct AcceptFut<IO: ActixStream> {
fut: Accept<IO>,
#[pin]
timeout: Sleep,
_guard: CounterGuard,
}
}
impl<IO: ActixStream> Future for AcceptFut<IO> {
type Output = Result<TlsStream<IO>, TlsError<io::Error, Infallible>>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let mut this = self.project();
match Pin::new(&mut this.fut).poll(cx) {
Poll::Ready(Ok(stream)) => Poll::Ready(Ok(TlsStream(stream))),
Poll::Ready(Err(err)) => Poll::Ready(Err(TlsError::Tls(err))),
Poll::Pending => this.timeout.poll(cx).map(|_| Err(TlsError::Timeout)),
}
}
}

View File

@ -0,0 +1,198 @@
//! `rustls` v0.23 based TLS connection acceptor service.
//!
//! See [`Acceptor`] for main service factory docs.
use std::{
convert::Infallible,
future::Future,
io::{self, IoSlice},
pin::Pin,
sync::Arc,
task::{Context, Poll},
time::Duration,
};
use actix_rt::{
net::{ActixStream, Ready},
time::{sleep, Sleep},
};
use actix_service::{Service, ServiceFactory};
use actix_utils::{
counter::{Counter, CounterGuard},
future::{ready, Ready as FutReady},
};
use pin_project_lite::pin_project;
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
use tokio_rustls::{Accept, TlsAcceptor};
use tokio_rustls_026 as tokio_rustls;
use super::{TlsError, DEFAULT_TLS_HANDSHAKE_TIMEOUT, MAX_CONN_COUNTER};
pub mod reexports {
//! Re-exports from `rustls` that are useful for acceptors.
pub use tokio_rustls_026::rustls::ServerConfig;
}
/// Wraps a `rustls` based async TLS stream in order to implement [`ActixStream`].
pub struct TlsStream<IO>(tokio_rustls::server::TlsStream<IO>);
impl_more::impl_from!(<IO> in tokio_rustls::server::TlsStream<IO> => TlsStream<IO>);
impl_more::impl_deref_and_mut!(<IO> in TlsStream<IO> => tokio_rustls::server::TlsStream<IO>);
impl<IO: ActixStream> AsyncRead for TlsStream<IO> {
fn poll_read(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &mut ReadBuf<'_>,
) -> Poll<io::Result<()>> {
Pin::new(&mut **self.get_mut()).poll_read(cx, buf)
}
}
impl<IO: ActixStream> AsyncWrite for TlsStream<IO> {
fn poll_write(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &[u8],
) -> Poll<io::Result<usize>> {
Pin::new(&mut **self.get_mut()).poll_write(cx, buf)
}
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
Pin::new(&mut **self.get_mut()).poll_flush(cx)
}
fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
Pin::new(&mut **self.get_mut()).poll_shutdown(cx)
}
fn poll_write_vectored(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
bufs: &[IoSlice<'_>],
) -> Poll<io::Result<usize>> {
Pin::new(&mut **self.get_mut()).poll_write_vectored(cx, bufs)
}
fn is_write_vectored(&self) -> bool {
(**self).is_write_vectored()
}
}
impl<IO: ActixStream> ActixStream for TlsStream<IO> {
fn poll_read_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_read_ready((**self).get_ref().0, cx)
}
fn poll_write_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<Ready>> {
IO::poll_write_ready((**self).get_ref().0, cx)
}
}
/// Accept TLS connections via the `rustls` crate.
pub struct Acceptor {
config: Arc<reexports::ServerConfig>,
handshake_timeout: Duration,
}
impl Acceptor {
/// Constructs `rustls` based acceptor service factory.
pub fn new(config: reexports::ServerConfig) -> Self {
Acceptor {
config: Arc::new(config),
handshake_timeout: DEFAULT_TLS_HANDSHAKE_TIMEOUT,
}
}
/// Limit the amount of time that the acceptor will wait for a TLS handshake to complete.
///
/// Default timeout is 3 seconds.
pub fn set_handshake_timeout(&mut self, handshake_timeout: Duration) -> &mut Self {
self.handshake_timeout = handshake_timeout;
self
}
}
impl Clone for Acceptor {
fn clone(&self) -> Self {
Self {
config: self.config.clone(),
handshake_timeout: self.handshake_timeout,
}
}
}
impl<IO: ActixStream> ServiceFactory<IO> for Acceptor {
type Response = TlsStream<IO>;
type Error = TlsError<io::Error, Infallible>;
type Config = ();
type Service = AcceptorService;
type InitError = ();
type Future = FutReady<Result<Self::Service, Self::InitError>>;
fn new_service(&self, _: ()) -> Self::Future {
let res = MAX_CONN_COUNTER.with(|conns| {
Ok(AcceptorService {
acceptor: self.config.clone().into(),
conns: conns.clone(),
handshake_timeout: self.handshake_timeout,
})
});
ready(res)
}
}
/// Rustls based acceptor service.
pub struct AcceptorService {
acceptor: TlsAcceptor,
conns: Counter,
handshake_timeout: Duration,
}
impl<IO: ActixStream> Service<IO> for AcceptorService {
type Response = TlsStream<IO>;
type Error = TlsError<io::Error, Infallible>;
type Future = AcceptFut<IO>;
fn poll_ready(&self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
if self.conns.available(cx) {
Poll::Ready(Ok(()))
} else {
Poll::Pending
}
}
fn call(&self, req: IO) -> Self::Future {
AcceptFut {
fut: self.acceptor.accept(req),
timeout: sleep(self.handshake_timeout),
_guard: self.conns.get(),
}
}
}
pin_project! {
/// Accept future for Rustls service.
#[doc(hidden)]
pub struct AcceptFut<IO: ActixStream> {
fut: Accept<IO>,
#[pin]
timeout: Sleep,
_guard: CounterGuard,
}
}
impl<IO: ActixStream> Future for AcceptFut<IO> {
type Output = Result<TlsStream<IO>, TlsError<io::Error, Infallible>>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let mut this = self.project();
match Pin::new(&mut this.fut).poll(cx) {
Poll::Ready(Ok(stream)) => Poll::Ready(Ok(TlsStream(stream))),
Poll::Ready(Err(err)) => Poll::Ready(Err(TlsError::Tls(err))),
Poll::Pending => this.timeout.poll(cx).map(|_| Err(TlsError::Timeout)),
}
}
}

View File

@ -118,6 +118,7 @@ impl<R: Host> ConnectInfo<R> {
/// let mut addrs = conn.addrs(); /// let mut addrs = conn.addrs();
/// assert_eq!(addrs.next().unwrap(), addr); /// assert_eq!(addrs.next().unwrap(), addr);
/// ``` /// ```
#[allow(clippy::implied_bounds_in_impls)]
pub fn addrs( pub fn addrs(
&self, &self,
) -> impl Iterator<Item = SocketAddr> ) -> impl Iterator<Item = SocketAddr>
@ -149,6 +150,7 @@ impl<R: Host> ConnectInfo<R> {
/// let mut addrs = conn.take_addrs(); /// let mut addrs = conn.take_addrs();
/// assert_eq!(addrs.next().unwrap(), addr); /// assert_eq!(addrs.next().unwrap(), addr);
/// ``` /// ```
#[allow(clippy::implied_bounds_in_impls)]
pub fn take_addrs( pub fn take_addrs(
&mut self, &mut self,
) -> impl Iterator<Item = SocketAddr> ) -> impl Iterator<Item = SocketAddr>

View File

@ -22,25 +22,45 @@ mod resolver;
pub mod tcp; pub mod tcp;
#[cfg(feature = "uri")] #[cfg(feature = "uri")]
#[cfg_attr(docsrs, doc(cfg(feature = "uri")))]
mod uri; mod uri;
#[cfg(feature = "openssl")] #[cfg(feature = "openssl")]
#[cfg_attr(docsrs, doc(cfg(feature = "openssl")))]
pub mod openssl; pub mod openssl;
#[cfg(feature = "rustls")] #[cfg(any(
#[cfg_attr(docsrs, doc(cfg(feature = "rustls")))] feature = "rustls-0_20-webpki-roots",
pub mod rustls; feature = "rustls-0_20-native-roots",
))]
pub mod rustls_0_20;
#[doc(hidden)]
#[cfg(any(
feature = "rustls-0_20-webpki-roots",
feature = "rustls-0_20-native-roots",
))]
pub use rustls_0_20 as rustls;
#[cfg(any(
feature = "rustls-0_21-webpki-roots",
feature = "rustls-0_21-native-roots",
))]
pub mod rustls_0_21;
#[cfg(feature = "rustls-0_22")]
pub mod rustls_0_22;
#[cfg(feature = "rustls-0_23")]
pub mod rustls_0_23;
#[cfg(feature = "native-tls")] #[cfg(feature = "native-tls")]
#[cfg_attr(docsrs, doc(cfg(feature = "native-tls")))]
pub mod native_tls; pub mod native_tls;
pub use self::connection::Connection; pub use self::{
pub use self::connector::{Connector, ConnectorService}; connection::Connection,
pub use self::error::ConnectError; connector::{Connector, ConnectorService},
pub use self::host::Host; error::ConnectError,
pub use self::info::ConnectInfo; host::Host,
pub use self::resolve::Resolve; info::ConnectInfo,
pub use self::resolver::{Resolver, ResolverService}; resolve::Resolve,
resolver::{Resolver, ResolverService},
};

View File

@ -19,8 +19,7 @@ use crate::connect::{Connection, Host};
pub mod reexports { pub mod reexports {
//! Re-exports from `native-tls` and `tokio-native-tls` that are useful for connectors. //! Re-exports from `native-tls` and `tokio-native-tls` that are useful for connectors.
pub use tokio_native_tls::native_tls::TlsConnector; pub use tokio_native_tls::{native_tls::TlsConnector, TlsStream as AsyncTlsStream};
pub use tokio_native_tls::TlsStream as AsyncTlsStream;
} }
/// Connector service and factory using `native-tls`. /// Connector service and factory using `native-tls`.

View File

@ -22,9 +22,7 @@ use crate::connect::{Connection, Host};
pub mod reexports { pub mod reexports {
//! Re-exports from `openssl` and `tokio-openssl` that are useful for connectors. //! Re-exports from `openssl` and `tokio-openssl` that are useful for connectors.
pub use openssl::ssl::{ pub use openssl::ssl::{Error, HandshakeError, SslConnector, SslConnectorBuilder, SslMethod};
Error, HandshakeError, SslConnector, SslConnectorBuilder, SslMethod,
};
pub use tokio_openssl::SslStream as AsyncSslStream; pub use tokio_openssl::SslStream as AsyncSslStream;
} }

View File

@ -3,7 +3,6 @@
//! See [`TlsConnector`] for main connector service factory docs. //! See [`TlsConnector`] for main connector service factory docs.
use std::{ use std::{
convert::TryFrom,
future::Future, future::Future,
io, io,
pin::Pin, pin::Pin,
@ -15,27 +14,50 @@ use actix_rt::net::ActixStream;
use actix_service::{Service, ServiceFactory}; use actix_service::{Service, ServiceFactory};
use actix_utils::future::{ok, Ready}; use actix_utils::future::{ok, Ready};
use futures_core::ready; use futures_core::ready;
use tokio_rustls::rustls::{client::ServerName, OwnedTrustAnchor, RootCertStore}; use tokio_rustls::{
use tokio_rustls::{client::TlsStream as AsyncTlsStream, rustls::ClientConfig}; client::TlsStream as AsyncTlsStream,
use tokio_rustls::{Connect as RustlsConnect, TlsConnector as RustlsTlsConnector}; rustls::{client::ServerName, ClientConfig, RootCertStore},
use tracing::trace; Connect as RustlsConnect, TlsConnector as RustlsTlsConnector,
use webpki_roots::TLS_SERVER_ROOTS; };
use tokio_rustls_023 as tokio_rustls;
use crate::connect::{Connection, Host}; use crate::connect::{Connection, Host};
pub mod reexports { pub mod reexports {
//! Re-exports from `rustls` and `webpki_roots` that are useful for connectors. //! Re-exports from the `rustls` v0.20 ecosystem that are useful for connectors.
pub use tokio_rustls::client::TlsStream as AsyncTlsStream; pub use tokio_rustls_023::{client::TlsStream as AsyncTlsStream, rustls::ClientConfig};
pub use tokio_rustls::rustls::ClientConfig; #[cfg(feature = "rustls-0_20-webpki-roots")]
pub use webpki_roots::TLS_SERVER_ROOTS; pub use webpki_roots_022::TLS_SERVER_ROOTS;
}
/// Returns root certificates via `rustls-native-certs` crate as a rustls certificate store.
///
/// See [`rustls_native_certs::load_native_certs()`] for more info on behavior and errors.
///
/// [`rustls_native_certs::load_native_certs()`]: rustls_native_certs_06::load_native_certs()
#[cfg(feature = "rustls-0_20-native-roots")]
pub fn native_roots_cert_store() -> io::Result<RootCertStore> {
let mut root_certs = RootCertStore::empty();
for cert in rustls_native_certs_06::load_native_certs()? {
root_certs
.add(&tokio_rustls_023::rustls::Certificate(cert.0))
.unwrap();
}
Ok(root_certs)
} }
/// Returns standard root certificates from `webpki-roots` crate as a rustls certificate store. /// Returns standard root certificates from `webpki-roots` crate as a rustls certificate store.
#[cfg(feature = "rustls-0_20-webpki-roots")]
pub fn webpki_roots_cert_store() -> RootCertStore { pub fn webpki_roots_cert_store() -> RootCertStore {
use tokio_rustls_023::rustls;
let mut root_certs = RootCertStore::empty(); let mut root_certs = RootCertStore::empty();
for cert in TLS_SERVER_ROOTS.0 {
let cert = OwnedTrustAnchor::from_subject_spki_name_constraints( for cert in webpki_roots_022::TLS_SERVER_ROOTS.0 {
let cert = rustls::OwnedTrustAnchor::from_subject_spki_name_constraints(
cert.subject, cert.subject,
cert.spki, cert.spki,
cert.name_constraints, cert.name_constraints,
@ -43,6 +65,7 @@ pub fn webpki_roots_cert_store() -> RootCertStore {
let certs = vec![cert].into_iter(); let certs = vec![cert].into_iter();
root_certs.add_server_trust_anchors(certs); root_certs.add_server_trust_anchors(certs);
} }
root_certs root_certs
} }
@ -101,12 +124,13 @@ 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!("TLS handshake start for: {:?}", connection.hostname()); tracing::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()) {
Ok(host) => ConnectFut::Future { Ok(host) => ConnectFut::Future {
connect: RustlsTlsConnector::from(self.connector.clone()).connect(host, stream), connect: RustlsTlsConnector::from(Arc::clone(&self.connector))
.connect(host, stream),
connection: Some(connection), connection: Some(connection),
}, },
Err(_) => ConnectFut::InvalidDns, Err(_) => ConnectFut::InvalidDns,
@ -116,6 +140,7 @@ where
/// Connect future for Rustls service. /// Connect future for Rustls service.
#[doc(hidden)] #[doc(hidden)]
#[allow(clippy::large_enum_variant)]
pub enum ConnectFut<R, IO> { pub enum ConnectFut<R, IO> {
/// See issue <https://github.com/briansmith/webpki/issues/54> /// See issue <https://github.com/briansmith/webpki/issues/54>
InvalidDns, InvalidDns,
@ -130,17 +155,23 @@ where
R: Host, R: Host,
IO: ActixStream, IO: ActixStream,
{ {
type Output = Result<Connection<R, AsyncTlsStream<IO>>, io::Error>; type Output = io::Result<Connection<R, AsyncTlsStream<IO>>>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
match self.get_mut() { match self.get_mut() {
Self::InvalidDns => Poll::Ready(Err( Self::InvalidDns => Poll::Ready(Err(io::Error::new(
io::Error::new(io::ErrorKind::Other, "rustls currently only handles hostname-based connections. See https://github.com/briansmith/webpki/issues/54") io::ErrorKind::Other,
)), "Rustls v0.20 can only handle hostname-based connections. Enable the `rustls-0_21` \
Self::Future { connect, connection } => { feature and use the Rustls v0.21 utilities to gain this feature.",
))),
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!("TLS handshake success: {:?}", connection.hostname()); tracing::trace!("TLS handshake success: {:?}", connection.hostname());
Poll::Ready(Ok(connection.replace_io(stream).1)) Poll::Ready(Ok(connection.replace_io(stream).1))
} }
} }

View File

@ -0,0 +1,177 @@
//! Rustls based connector service.
//!
//! See [`TlsConnector`] for main connector service factory docs.
use std::{
future::Future,
io,
pin::Pin,
sync::Arc,
task::{Context, Poll},
};
use actix_rt::net::ActixStream;
use actix_service::{Service, ServiceFactory};
use actix_utils::future::{ok, Ready};
use futures_core::ready;
use tokio_rustls::{
client::TlsStream as AsyncTlsStream,
rustls::{client::ServerName, ClientConfig, RootCertStore},
Connect as RustlsConnect, TlsConnector as RustlsTlsConnector,
};
use tokio_rustls_024 as tokio_rustls;
use crate::connect::{Connection, Host};
pub mod reexports {
//! Re-exports from the `rustls` v0.21 ecosystem that are useful for connectors.
pub use tokio_rustls_024::{client::TlsStream as AsyncTlsStream, rustls::ClientConfig};
#[cfg(feature = "rustls-0_21-webpki-roots")]
pub use webpki_roots_025::TLS_SERVER_ROOTS;
}
/// Returns root certificates via `rustls-native-certs` crate as a rustls certificate store.
///
/// See [`rustls_native_certs::load_native_certs()`] for more info on behavior and errors.
///
/// [`rustls_native_certs::load_native_certs()`]: rustls_native_certs_06::load_native_certs()
#[cfg(feature = "rustls-0_21-native-roots")]
pub fn native_roots_cert_store() -> io::Result<RootCertStore> {
let mut root_certs = RootCertStore::empty();
for cert in rustls_native_certs_06::load_native_certs()? {
root_certs
.add(&tokio_rustls_024::rustls::Certificate(cert.0))
.unwrap();
}
Ok(root_certs)
}
/// Returns standard root certificates from `webpki-roots` crate as a rustls certificate store.
#[cfg(feature = "rustls-0_21-webpki-roots")]
pub fn webpki_roots_cert_store() -> RootCertStore {
use tokio_rustls_024::rustls;
let mut root_certs = RootCertStore::empty();
for cert in webpki_roots_025::TLS_SERVER_ROOTS {
let cert = rustls::OwnedTrustAnchor::from_subject_spki_name_constraints(
cert.subject,
cert.spki,
cert.name_constraints,
);
let certs = vec![cert].into_iter();
root_certs.add_trust_anchors(certs);
}
root_certs
}
/// Connector service factory using `rustls`.
#[derive(Clone)]
pub struct TlsConnector {
connector: Arc<ClientConfig>,
}
impl TlsConnector {
/// Constructs new connector service factory from a `rustls` client configuration.
pub fn new(connector: Arc<ClientConfig>) -> Self {
TlsConnector { connector }
}
/// Constructs new connector service from a `rustls` client configuration.
pub fn service(connector: Arc<ClientConfig>) -> TlsConnectorService {
TlsConnectorService { connector }
}
}
impl<R, IO> ServiceFactory<Connection<R, IO>> for TlsConnector
where
R: Host,
IO: ActixStream + 'static,
{
type Response = Connection<R, AsyncTlsStream<IO>>;
type Error = io::Error;
type Config = ();
type Service = TlsConnectorService;
type InitError = ();
type Future = Ready<Result<Self::Service, Self::InitError>>;
fn new_service(&self, _: ()) -> Self::Future {
ok(TlsConnectorService {
connector: self.connector.clone(),
})
}
}
/// Connector service using `rustls`.
#[derive(Clone)]
pub struct TlsConnectorService {
connector: Arc<ClientConfig>,
}
impl<R, IO> Service<Connection<R, IO>> for TlsConnectorService
where
R: Host,
IO: ActixStream,
{
type Response = Connection<R, AsyncTlsStream<IO>>;
type Error = io::Error;
type Future = ConnectFut<R, IO>;
actix_service::always_ready!();
fn call(&self, connection: Connection<R, IO>) -> Self::Future {
tracing::trace!("TLS handshake start for: {:?}", connection.hostname());
let (stream, connection) = connection.replace_io(());
match ServerName::try_from(connection.hostname()) {
Ok(host) => ConnectFut::Future {
connect: RustlsTlsConnector::from(Arc::clone(&self.connector))
.connect(host, stream),
connection: Some(connection),
},
Err(_) => ConnectFut::InvalidServerName,
}
}
}
/// Connect future for Rustls service.
#[doc(hidden)]
#[allow(clippy::large_enum_variant)]
pub enum ConnectFut<R, IO> {
InvalidServerName,
Future {
connect: RustlsConnect<IO>,
connection: Option<Connection<R, ()>>,
},
}
impl<R, IO> Future for ConnectFut<R, IO>
where
R: Host,
IO: ActixStream,
{
type Output = io::Result<Connection<R, AsyncTlsStream<IO>>>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
match self.get_mut() {
Self::InvalidServerName => Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"connection parameters specified invalid server name",
))),
Self::Future {
connect,
connection,
} => {
let stream = ready!(Pin::new(connect).poll(cx))?;
let connection = connection.take().unwrap();
tracing::trace!("TLS handshake success: {:?}", connection.hostname());
Poll::Ready(Ok(connection.replace_io(stream).1))
}
}
}
}

View File

@ -0,0 +1,163 @@
//! Rustls based connector service.
//!
//! See [`TlsConnector`] for main connector service factory docs.
use std::{
future::Future,
io,
pin::Pin,
sync::Arc,
task::{Context, Poll},
};
use actix_rt::net::ActixStream;
use actix_service::{Service, ServiceFactory};
use actix_utils::future::{ok, Ready};
use futures_core::ready;
use rustls_pki_types_1::ServerName;
use tokio_rustls::{
client::TlsStream as AsyncTlsStream, rustls::ClientConfig, Connect as RustlsConnect,
TlsConnector as RustlsTlsConnector,
};
use tokio_rustls_025 as tokio_rustls;
use crate::connect::{Connection, Host};
pub mod reexports {
//! Re-exports from the `rustls` v0.22 ecosystem that are useful for connectors.
pub use tokio_rustls_025::{client::TlsStream as AsyncTlsStream, rustls::ClientConfig};
#[cfg(feature = "rustls-0_22-webpki-roots")]
pub use webpki_roots_026::TLS_SERVER_ROOTS;
}
/// Returns root certificates via `rustls-native-certs` crate as a rustls certificate store.
///
/// See [`rustls_native_certs::load_native_certs()`] for more info on behavior and errors.
///
/// [`rustls_native_certs::load_native_certs()`]: rustls_native_certs_07::load_native_certs()
#[cfg(feature = "rustls-0_22-native-roots")]
pub fn native_roots_cert_store() -> io::Result<tokio_rustls::rustls::RootCertStore> {
let mut root_certs = tokio_rustls::rustls::RootCertStore::empty();
for cert in rustls_native_certs_07::load_native_certs()? {
root_certs.add(cert).unwrap();
}
Ok(root_certs)
}
/// Returns standard root certificates from `webpki-roots` crate as a rustls certificate store.
#[cfg(feature = "rustls-0_22-webpki-roots")]
pub fn webpki_roots_cert_store() -> tokio_rustls::rustls::RootCertStore {
let mut root_certs = tokio_rustls::rustls::RootCertStore::empty();
root_certs.extend(webpki_roots_026::TLS_SERVER_ROOTS.to_owned());
root_certs
}
/// Connector service factory using `rustls`.
#[derive(Clone)]
pub struct TlsConnector {
connector: Arc<ClientConfig>,
}
impl TlsConnector {
/// Constructs new connector service factory from a `rustls` client configuration.
pub fn new(connector: Arc<ClientConfig>) -> Self {
TlsConnector { connector }
}
/// Constructs new connector service from a `rustls` client configuration.
pub fn service(connector: Arc<ClientConfig>) -> TlsConnectorService {
TlsConnectorService { connector }
}
}
impl<R, IO> ServiceFactory<Connection<R, IO>> for TlsConnector
where
R: Host,
IO: ActixStream + 'static,
{
type Response = Connection<R, AsyncTlsStream<IO>>;
type Error = io::Error;
type Config = ();
type Service = TlsConnectorService;
type InitError = ();
type Future = Ready<Result<Self::Service, Self::InitError>>;
fn new_service(&self, _: ()) -> Self::Future {
ok(TlsConnectorService {
connector: self.connector.clone(),
})
}
}
/// Connector service using `rustls`.
#[derive(Clone)]
pub struct TlsConnectorService {
connector: Arc<ClientConfig>,
}
impl<R, IO> Service<Connection<R, IO>> for TlsConnectorService
where
R: Host,
IO: ActixStream,
{
type Response = Connection<R, AsyncTlsStream<IO>>;
type Error = io::Error;
type Future = ConnectFut<R, IO>;
actix_service::always_ready!();
fn call(&self, connection: Connection<R, IO>) -> Self::Future {
tracing::trace!("TLS handshake start for: {:?}", connection.hostname());
let (stream, conn) = connection.replace_io(());
match ServerName::try_from(conn.hostname()) {
Ok(host) => ConnectFut::Future {
connect: RustlsTlsConnector::from(Arc::clone(&self.connector))
.connect(host.to_owned(), stream),
connection: Some(conn),
},
Err(_) => ConnectFut::InvalidServerName,
}
}
}
/// Connect future for Rustls service.
#[doc(hidden)]
#[allow(clippy::large_enum_variant)]
pub enum ConnectFut<R, IO> {
InvalidServerName,
Future {
connect: RustlsConnect<IO>,
connection: Option<Connection<R, ()>>,
},
}
impl<R, IO> Future for ConnectFut<R, IO>
where
R: Host,
IO: ActixStream,
{
type Output = io::Result<Connection<R, AsyncTlsStream<IO>>>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
match self.get_mut() {
Self::InvalidServerName => Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"connection parameters specified invalid server name",
))),
Self::Future {
connect,
connection,
} => {
let stream = ready!(Pin::new(connect).poll(cx))?;
let connection = connection.take().unwrap();
tracing::trace!("TLS handshake success: {:?}", connection.hostname());
Poll::Ready(Ok(connection.replace_io(stream).1))
}
}
}
}

View File

@ -0,0 +1,163 @@
//! Rustls based connector service.
//!
//! See [`TlsConnector`] for main connector service factory docs.
use std::{
future::Future,
io,
pin::Pin,
sync::Arc,
task::{Context, Poll},
};
use actix_rt::net::ActixStream;
use actix_service::{Service, ServiceFactory};
use actix_utils::future::{ok, Ready};
use futures_core::ready;
use rustls_pki_types_1::ServerName;
use tokio_rustls::{
client::TlsStream as AsyncTlsStream, rustls::ClientConfig, Connect as RustlsConnect,
TlsConnector as RustlsTlsConnector,
};
use tokio_rustls_026 as tokio_rustls;
use crate::connect::{Connection, Host};
pub mod reexports {
//! Re-exports from the `rustls` v0.23 ecosystem that are useful for connectors.
pub use tokio_rustls_026::{client::TlsStream as AsyncTlsStream, rustls::ClientConfig};
#[cfg(feature = "rustls-0_23-webpki-roots")]
pub use webpki_roots_026::TLS_SERVER_ROOTS;
}
/// Returns root certificates via `rustls-native-certs` crate as a rustls certificate store.
///
/// See [`rustls_native_certs::load_native_certs()`] for more info on behavior and errors.
///
/// [`rustls_native_certs::load_native_certs()`]: rustls_native_certs_07::load_native_certs()
#[cfg(feature = "rustls-0_23-native-roots")]
pub fn native_roots_cert_store() -> io::Result<tokio_rustls::rustls::RootCertStore> {
let mut root_certs = tokio_rustls::rustls::RootCertStore::empty();
for cert in rustls_native_certs_07::load_native_certs()? {
root_certs.add(cert).unwrap();
}
Ok(root_certs)
}
/// Returns standard root certificates from `webpki-roots` crate as a rustls certificate store.
#[cfg(feature = "rustls-0_23-webpki-roots")]
pub fn webpki_roots_cert_store() -> tokio_rustls::rustls::RootCertStore {
let mut root_certs = tokio_rustls::rustls::RootCertStore::empty();
root_certs.extend(webpki_roots_026::TLS_SERVER_ROOTS.to_owned());
root_certs
}
/// Connector service factory using `rustls`.
#[derive(Clone)]
pub struct TlsConnector {
connector: Arc<ClientConfig>,
}
impl TlsConnector {
/// Constructs new connector service factory from a `rustls` client configuration.
pub fn new(connector: Arc<ClientConfig>) -> Self {
TlsConnector { connector }
}
/// Constructs new connector service from a `rustls` client configuration.
pub fn service(connector: Arc<ClientConfig>) -> TlsConnectorService {
TlsConnectorService { connector }
}
}
impl<R, IO> ServiceFactory<Connection<R, IO>> for TlsConnector
where
R: Host,
IO: ActixStream + 'static,
{
type Response = Connection<R, AsyncTlsStream<IO>>;
type Error = io::Error;
type Config = ();
type Service = TlsConnectorService;
type InitError = ();
type Future = Ready<Result<Self::Service, Self::InitError>>;
fn new_service(&self, _: ()) -> Self::Future {
ok(TlsConnectorService {
connector: self.connector.clone(),
})
}
}
/// Connector service using `rustls`.
#[derive(Clone)]
pub struct TlsConnectorService {
connector: Arc<ClientConfig>,
}
impl<R, IO> Service<Connection<R, IO>> for TlsConnectorService
where
R: Host,
IO: ActixStream,
{
type Response = Connection<R, AsyncTlsStream<IO>>;
type Error = io::Error;
type Future = ConnectFut<R, IO>;
actix_service::always_ready!();
fn call(&self, connection: Connection<R, IO>) -> Self::Future {
tracing::trace!("TLS handshake start for: {:?}", connection.hostname());
let (stream, conn) = connection.replace_io(());
match ServerName::try_from(conn.hostname()) {
Ok(host) => ConnectFut::Future {
connect: RustlsTlsConnector::from(Arc::clone(&self.connector))
.connect(host.to_owned(), stream),
connection: Some(conn),
},
Err(_) => ConnectFut::InvalidServerName,
}
}
}
/// Connect future for Rustls service.
#[doc(hidden)]
#[allow(clippy::large_enum_variant)]
pub enum ConnectFut<R, IO> {
InvalidServerName,
Future {
connect: RustlsConnect<IO>,
connection: Option<Connection<R, ()>>,
},
}
impl<R, IO> Future for ConnectFut<R, IO>
where
R: Host,
IO: ActixStream,
{
type Output = io::Result<Connection<R, AsyncTlsStream<IO>>>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
match self.get_mut() {
Self::InvalidServerName => Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"connection parameters specified invalid server name",
))),
Self::Future {
connect,
connection,
} => {
let stream = ready!(Pin::new(connect).poll(cx))?;
let connection = connection.take().unwrap();
tracing::trace!("TLS handshake success: {:?}", connection.hostname());
Poll::Ready(Ok(connection.replace_io(stream).1))
}
}
}
}

View File

@ -1,8 +1,19 @@
use http::Uri;
use super::Host; use super::Host;
impl Host for Uri { impl Host for http_0_2::Uri {
fn hostname(&self) -> &str {
self.host().unwrap_or("")
}
fn port(&self) -> Option<u16> {
match self.port_u16() {
Some(port) => Some(port),
None => scheme_to_port(self.scheme_str()),
}
}
}
impl Host for http_1::Uri {
fn hostname(&self) -> &str { fn hostname(&self) -> &str {
self.host().unwrap_or("") self.host().unwrap_or("")
} }

View File

@ -1,20 +1,15 @@
//! TLS acceptor and connector services for the Actix ecosystem. //! TLS acceptor and connector services for the Actix ecosystem.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible, missing_docs)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")] #![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")] #![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
// enable unstable doc_cfg feature only on on docs.rs where nightly compiler is used #![cfg_attr(docsrs, feature(doc_auto_cfg))]
#![cfg_attr(docsrs, feature(doc_cfg))]
#[cfg(feature = "openssl")] #[cfg(feature = "openssl")]
#[allow(unused_extern_crates)] #[allow(unused_extern_crates)]
extern crate tls_openssl as openssl; extern crate tls_openssl as openssl;
#[cfg(feature = "accept")] #[cfg(feature = "accept")]
#[cfg_attr(docsrs, doc(cfg(feature = "accept")))]
pub mod accept; pub mod accept;
#[cfg(feature = "connect")] #[cfg(feature = "connect")]
#[cfg_attr(docsrs, doc(cfg(feature = "connect")))]
pub mod connect; pub mod connect;

View File

@ -3,28 +3,30 @@
#![cfg(all( #![cfg(all(
feature = "accept", feature = "accept",
feature = "connect", feature = "connect",
feature = "rustls", feature = "rustls-0_23",
feature = "openssl" feature = "openssl"
))] ))]
use std::{convert::TryFrom, io::Write, sync::Arc}; use std::{io::Write as _, sync::Arc};
use actix_rt::net::TcpStream; use actix_rt::net::TcpStream;
use actix_server::TestServer; use actix_server::TestServer;
use actix_service::ServiceFactoryExt as _; use actix_service::ServiceFactoryExt as _;
use actix_tls::accept::openssl::{Acceptor, TlsStream}; use actix_tls::{
accept::openssl::{Acceptor, TlsStream},
connect::rustls_0_23::reexports::ClientConfig,
};
use actix_utils::future::ok; use actix_utils::future::ok;
use tokio_rustls::rustls::{Certificate, ClientConfig, RootCertStore, ServerName}; use rustls_pki_types_1::ServerName;
use tokio_rustls_026::rustls::RootCertStore;
fn new_cert_and_key() -> (String, String) { fn new_cert_and_key() -> (String, String) {
let cert = rcgen::generate_simple_self_signed(vec![ let rcgen::CertifiedKey { cert, key_pair } =
"127.0.0.1".to_owned(), rcgen::generate_simple_self_signed(vec!["127.0.0.1".to_owned(), "localhost".to_owned()])
"localhost".to_owned(), .unwrap();
])
.unwrap();
let key = cert.serialize_private_key_pem(); let key = key_pair.serialize_pem();
let cert = cert.serialize_pem().unwrap(); let cert = cert.pem();
(cert, key) (cert, key)
} }
@ -47,30 +49,48 @@ fn openssl_acceptor(cert: String, key: String) -> tls_openssl::ssl::SslAcceptor
builder.build() builder.build()
} }
#[allow(dead_code)]
mod danger { mod danger {
use std::time::SystemTime; use rustls_pki_types_1::{CertificateDer, ServerName, UnixTime};
use tokio_rustls_026::rustls;
use tokio_rustls::rustls::{
self,
client::{ServerCertVerified, ServerCertVerifier},
};
use super::*;
/// Disables certificate verification to allow self-signed certs from rcgen.
#[derive(Debug)]
pub struct NoCertificateVerification; pub struct NoCertificateVerification;
impl ServerCertVerifier for NoCertificateVerification { impl rustls::client::danger::ServerCertVerifier for NoCertificateVerification {
fn verify_server_cert( fn verify_server_cert(
&self, &self,
_end_entity: &Certificate, _end_entity: &CertificateDer<'_>,
_intermediates: &[Certificate], _intermediates: &[CertificateDer<'_>],
_server_name: &ServerName, _server_name: &ServerName<'_>,
_scts: &mut dyn Iterator<Item = &[u8]>, _ocsp: &[u8],
_ocsp_response: &[u8], _now: UnixTime,
_now: SystemTime, ) -> Result<rustls::client::danger::ServerCertVerified, rustls::Error> {
) -> Result<ServerCertVerified, rustls::Error> { Ok(rustls::client::danger::ServerCertVerified::assertion())
Ok(ServerCertVerified::assertion()) }
fn verify_tls12_signature(
&self,
_message: &[u8],
_cert: &rustls_pki_types_1::CertificateDer<'_>,
_dss: &rustls::DigitallySignedStruct,
) -> Result<rustls::client::danger::HandshakeSignatureValid, rustls::Error> {
Ok(rustls::client::danger::HandshakeSignatureValid::assertion())
}
fn verify_tls13_signature(
&self,
_message: &[u8],
_cert: &rustls_pki_types_1::CertificateDer<'_>,
_dss: &rustls::DigitallySignedStruct,
) -> Result<rustls::client::danger::HandshakeSignatureValid, rustls::Error> {
Ok(rustls::client::danger::HandshakeSignatureValid::assertion())
}
fn supported_verify_schemes(&self) -> Vec<rustls::SignatureScheme> {
rustls::crypto::aws_lc_rs::default_provider()
.signature_verification_algorithms
.supported_schemes()
} }
} }
} }
@ -78,7 +98,6 @@ mod danger {
#[allow(dead_code)] #[allow(dead_code)]
fn rustls_connector(_cert: String, _key: String) -> ClientConfig { fn rustls_connector(_cert: String, _key: String) -> ClientConfig {
let mut config = ClientConfig::builder() let mut config = ClientConfig::builder()
.with_safe_defaults()
.with_root_certificates(RootCertStore::empty()) .with_root_certificates(RootCertStore::empty())
.with_no_client_auth(); .with_no_client_auth();
@ -92,6 +111,10 @@ fn rustls_connector(_cert: String, _key: String) -> ClientConfig {
#[actix_rt::test] #[actix_rt::test]
async fn accepts_connections() { async fn accepts_connections() {
tokio_rustls_026::rustls::crypto::aws_lc_rs::default_provider()
.install_default()
.unwrap();
let (cert, key) = new_cert_and_key(); let (cert, key) = new_cert_and_key();
let srv = TestServer::start({ let srv = TestServer::start({
@ -118,13 +141,13 @@ async fn accepts_connections() {
let config = rustls_connector(cert, key); let config = rustls_connector(cert, key);
let config = Arc::new(config); let config = Arc::new(config);
let mut conn = tokio_rustls::rustls::ClientConnection::new( let mut conn = tokio_rustls_026::rustls::ClientConnection::new(
config, config,
ServerName::try_from("localhost").unwrap(), ServerName::try_from("localhost").unwrap(),
) )
.unwrap(); .unwrap();
let mut stream = tokio_rustls::rustls::Stream::new(&mut conn, &mut sock); let mut stream = tokio_rustls_026::rustls::Stream::new(&mut conn, &mut sock);
stream.flush().expect("TLS handshake failed"); stream.flush().expect("TLS handshake failed");
} }

View File

@ -3,7 +3,7 @@
#![cfg(all( #![cfg(all(
feature = "accept", feature = "accept",
feature = "connect", feature = "connect",
feature = "rustls", feature = "rustls-0_23",
feature = "openssl" feature = "openssl"
))] ))]
@ -14,39 +14,40 @@ use std::io::{BufReader, Write};
use actix_rt::net::TcpStream; use actix_rt::net::TcpStream;
use actix_server::TestServer; use actix_server::TestServer;
use actix_service::ServiceFactoryExt as _; use actix_service::ServiceFactoryExt as _;
use actix_tls::accept::rustls::{Acceptor, TlsStream}; use actix_tls::{
use actix_tls::connect::openssl::reexports::SslConnector; accept::rustls_0_23::{reexports::ServerConfig, Acceptor, TlsStream},
connect::openssl::reexports::SslConnector,
};
use actix_utils::future::ok; use actix_utils::future::ok;
use rustls_pemfile::{certs, pkcs8_private_keys}; use rustls_pemfile::{certs, pkcs8_private_keys};
use rustls_pki_types_1::PrivateKeyDer;
use tls_openssl::ssl::SslVerifyMode; use tls_openssl::ssl::SslVerifyMode;
use tokio_rustls::rustls::{self, Certificate, PrivateKey, ServerConfig};
fn new_cert_and_key() -> (String, String) { fn new_cert_and_key() -> (String, String) {
let cert = rcgen::generate_simple_self_signed(vec![ let rcgen::CertifiedKey { cert, key_pair } =
"127.0.0.1".to_owned(), rcgen::generate_simple_self_signed(vec!["127.0.0.1".to_owned(), "localhost".to_owned()])
"localhost".to_owned(), .unwrap();
])
.unwrap();
let key = cert.serialize_private_key_pem(); let key = key_pair.serialize_pem();
let cert = cert.serialize_pem().unwrap(); let cert = cert.pem();
(cert, key) (cert, key)
} }
fn rustls_server_config(cert: String, key: String) -> rustls::ServerConfig { fn rustls_server_config(cert: String, key: String) -> ServerConfig {
// Load TLS key and cert files // Load TLS key and cert files
let cert = &mut BufReader::new(cert.as_bytes()); let cert = &mut BufReader::new(cert.as_bytes());
let key = &mut BufReader::new(key.as_bytes()); let key = &mut BufReader::new(key.as_bytes());
let cert_chain = certs(cert).unwrap().into_iter().map(Certificate).collect(); let cert_chain = certs(cert).collect::<Result<Vec<_>, _>>().unwrap();
let mut keys = pkcs8_private_keys(key).unwrap(); let mut keys = pkcs8_private_keys(key)
.collect::<Result<Vec<_>, _>>()
.unwrap();
let mut config = ServerConfig::builder() let mut config = ServerConfig::builder()
.with_safe_defaults()
.with_no_client_auth() .with_no_client_auth()
.with_single_cert(cert_chain, PrivateKey(keys.remove(0))) .with_single_cert(cert_chain, PrivateKeyDer::Pkcs8(keys.remove(0)))
.unwrap(); .unwrap();
config.alpn_protocols = vec![b"http/1.1".to_vec()]; config.alpn_protocols = vec![b"http/1.1".to_vec()];
@ -72,6 +73,10 @@ fn openssl_connector(cert: String, key: String) -> SslConnector {
#[actix_rt::test] #[actix_rt::test]
async fn accepts_connections() { async fn accepts_connections() {
tokio_rustls_026::rustls::crypto::aws_lc_rs::default_provider()
.install_default()
.unwrap();
let (cert, key) = new_cert_and_key(); let (cert, key) = new_cert_and_key();
let srv = TestServer::start({ let srv = TestServer::start({

View File

@ -1,3 +1,4 @@
#![allow(missing_docs)]
#![cfg(feature = "connect")] #![cfg(feature = "connect")]
use std::{ use std::{
@ -11,7 +12,7 @@ use actix_server::TestServer;
use actix_service::{fn_service, Service, ServiceFactory}; use actix_service::{fn_service, Service, ServiceFactory};
use actix_tls::connect::{ConnectError, ConnectInfo, Connection, Connector, Host}; use actix_tls::connect::{ConnectError, ConnectInfo, Connection, Connector, Host};
use bytes::Bytes; use bytes::Bytes;
use futures_util::sink::SinkExt; use futures_util::sink::SinkExt as _;
#[cfg(feature = "openssl")] #[cfg(feature = "openssl")]
#[actix_rt::test] #[actix_rt::test]
@ -30,7 +31,7 @@ async fn test_string() {
assert_eq!(con.peer_addr().unwrap(), srv.addr()); assert_eq!(con.peer_addr().unwrap(), srv.addr());
} }
#[cfg(feature = "rustls")] #[cfg(feature = "rustls-0_23")]
#[actix_rt::test] #[actix_rt::test]
async fn test_rustls_string() { async fn test_rustls_string() {
let srv = TestServer::start(|| { let srv = TestServer::start(|| {
@ -98,8 +99,6 @@ async fn service_factory() {
#[cfg(all(feature = "openssl", feature = "uri"))] #[cfg(all(feature = "openssl", feature = "uri"))]
#[actix_rt::test] #[actix_rt::test]
async fn test_openssl_uri() { async fn test_openssl_uri() {
use std::convert::TryFrom;
let srv = TestServer::start(|| { let srv = TestServer::start(|| {
fn_service(|io: TcpStream| async { fn_service(|io: TcpStream| async {
let mut framed = Framed::new(io, BytesCodec); let mut framed = Framed::new(io, BytesCodec);
@ -109,16 +108,14 @@ async fn test_openssl_uri() {
}); });
let connector = Connector::default().service(); let connector = Connector::default().service();
let addr = http::Uri::try_from(format!("https://localhost:{}", srv.port())).unwrap(); let addr = http_0_2::Uri::try_from(format!("https://localhost:{}", srv.port())).unwrap();
let con = connector.call(addr.into()).await.unwrap(); let con = connector.call(addr.into()).await.unwrap();
assert_eq!(con.peer_addr().unwrap(), srv.addr()); assert_eq!(con.peer_addr().unwrap(), srv.addr());
} }
#[cfg(all(feature = "rustls", feature = "uri"))] #[cfg(all(feature = "rustls-0_23", feature = "uri"))]
#[actix_rt::test] #[actix_rt::test]
async fn test_rustls_uri() { async fn test_rustls_uri_http1() {
use std::convert::TryFrom;
let srv = TestServer::start(|| { let srv = TestServer::start(|| {
fn_service(|io: TcpStream| async { fn_service(|io: TcpStream| async {
let mut framed = Framed::new(io, BytesCodec); let mut framed = Framed::new(io, BytesCodec);
@ -128,7 +125,24 @@ async fn test_rustls_uri() {
}); });
let conn = Connector::default().service(); let conn = Connector::default().service();
let addr = http::Uri::try_from(format!("https://localhost:{}", srv.port())).unwrap(); let addr = http_1::Uri::try_from(format!("https://localhost:{}", srv.port())).unwrap();
let con = conn.call(addr.into()).await.unwrap();
assert_eq!(con.peer_addr().unwrap(), srv.addr());
}
#[cfg(all(feature = "rustls-0_23", feature = "uri"))]
#[actix_rt::test]
async fn test_rustls_uri() {
let srv = TestServer::start(|| {
fn_service(|io: TcpStream| async {
let mut framed = Framed::new(io, BytesCodec);
framed.send(Bytes::from_static(b"test")).await?;
Ok::<_, io::Error>(())
})
});
let conn = Connector::default().service();
let addr = http_1::Uri::try_from(format!("https://localhost:{}", srv.port())).unwrap();
let con = conn.call(addr.into()).await.unwrap(); let con = conn.call(addr.into()).await.unwrap();
assert_eq!(con.peer_addr().unwrap(), srv.addr()); assert_eq!(con.peer_addr().unwrap(), srv.addr());
} }

View File

@ -1,3 +1,4 @@
#![allow(missing_docs)]
#![cfg(feature = "connect")] #![cfg(feature = "connect")]
use std::{ use std::{
@ -51,8 +52,7 @@ async fn custom_resolver_connect() {
use trust_dns_resolver::TokioAsyncResolver; use trust_dns_resolver::TokioAsyncResolver;
let srv = let srv = TestServer::start(|| fn_service(|_io: TcpStream| async { Ok::<_, io::Error>(()) }));
TestServer::start(|| fn_service(|_io: TcpStream| async { Ok::<_, io::Error>(()) }));
struct MyResolver { struct MyResolver {
trust_dns: TokioAsyncResolver, trust_dns: TokioAsyncResolver,

View File

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

View File

@ -5,23 +5,25 @@ authors = ["Rajasekharan Vengalil <avranju@gmail.com>"]
description = "Support for tokio tracing with Actix services" description = "Support for tokio tracing with Actix services"
keywords = ["network", "framework", "tracing"] keywords = ["network", "framework", "tracing"]
homepage = "https://actix.rs" homepage = "https://actix.rs"
repository = "https://github.com/actix/actix-net.git" repository = "https://github.com/actix/actix-net/tree/master/actix-tracing"
documentation = "https://docs.rs/actix-tracing" documentation = "https://docs.rs/actix-tracing"
categories = ["network-programming", "asynchronous"] categories = ["network-programming", "asynchronous"]
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
edition = "2018" edition.workspace = true
rust-version.workspace = true
[lib] [package.metadata.cargo_check_external_types]
name = "actix_tracing" allowed_external_types = ["actix_service::*", "actix_utils::*", "tracing::*", "tracing_futures::*"]
path = "src/lib.rs"
[dependencies] [dependencies]
actix-service = "2" actix-service = "2"
actix-utils = "3" actix-utils = "3"
tracing = "0.1.35" tracing = "0.1.35"
tracing-futures = "0.2" tracing-futures = "0.2"
[dev_dependencies] [dev-dependencies]
actix-rt = "2" actix-rt = "2"
slab = "0.4" slab = "0.4"
[lints]
workspace = true

View File

@ -1,7 +1,5 @@
//! Actix tracing - support for tokio tracing with Actix services. //! Actix tracing - support for tokio tracing with Actix services.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")] #![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")] #![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
@ -22,6 +20,7 @@ pub struct TracingService<S, F> {
} }
impl<S, F> TracingService<S, F> { impl<S, F> TracingService<S, F> {
/// Constructs new tracing middleware.
pub fn new(inner: S, make_span: F) -> Self { pub fn new(inner: S, make_span: F) -> Self {
TracingService { inner, make_span } TracingService { inner, make_span }
} }
@ -63,6 +62,7 @@ pub struct TracingTransform<S, U, F> {
} }
impl<S, U, F> TracingTransform<S, U, F> { impl<S, U, F> TracingTransform<S, U, F> {
/// Constructs new tracing middleware.
pub fn new(make_span: F) -> Self { pub fn new(make_span: F) -> Self {
TracingTransform { TracingTransform {
make_span, make_span,
@ -118,9 +118,11 @@ where
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use std::cell::RefCell; use std::{
use std::collections::{BTreeMap, BTreeSet}; cell::RefCell,
use std::sync::{Arc, RwLock}; collections::{BTreeMap, BTreeSet},
sync::{Arc, RwLock},
};
use actix_service::{fn_factory, fn_service}; use actix_service::{fn_factory, fn_service};
use slab::Slab; use slab::Slab;
@ -129,7 +131,7 @@ mod test {
use super::*; use super::*;
thread_local! { thread_local! {
static SPAN: RefCell<Vec<span::Id>> = RefCell::new(Vec::new()); static SPAN: RefCell<Vec<span::Id>> = const { RefCell::new(Vec::new()) };
} }
#[derive(Default)] #[derive(Default)]

View File

@ -1,24 +1,24 @@
# Changes # Changes
## Unreleased - 2022-xx-xx ## Unreleased
- Minimum supported Rust version (MSRV) is now 1.59. - Minimum supported Rust version (MSRV) is now 1.71.
## 3.0.1 - 2022-10-21 ## 3.0.1
- Minimum supported Rust version (MSRV) is now 1.57. - Minimum supported Rust version (MSRV) is now 1.57.
## 3.0.0 - 2021-04-16 ## 3.0.0
- 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
- 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
- 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]
@ -28,13 +28,13 @@
[#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
- 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
- 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]
@ -43,139 +43,139 @@
[#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
- No changes from beta 1. - No changes from beta 1.
## 2.0.0-beta.1 - 2020-08-19 ## 2.0.0-beta.1
- 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
- Add `Clone` impl for `condition::Waiter`. - Add `Clone` impl for `condition::Waiter`.
## 1.0.5 - 2020-01-08 ## 1.0.5
- 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
- Add methods to check `LocalWaker` registration state. - Add methods to check `LocalWaker` registration state.
## 1.0.3 - 2019-12-11 ## 1.0.3
- Revert InOrder service changes - Revert InOrder service changes
## 1.0.2 - 2019-12-11 ## 1.0.2
- 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
- Optimize InOrder service. - Optimize InOrder service.
## 1.0.0 - 2019-12-11 ## 1.0.0
- Simplify oneshot and mpsc implementations. - Simplify oneshot and mpsc implementations.
## 1.0.0-alpha.3 - 2019-12-07 ## 1.0.0-alpha.3
- 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
- Migrate to `std::future`. - Migrate to `std::future`.
## 0.4.7 - 2019-10-14 ## 0.4.7
- 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
- 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
- Deprecated `CloneableService` as it is not safe. - Deprecated `CloneableService` as it is not safe.
## 0.4.4 - 2019-07-17 ## 0.4.4
- Undeprecate `FramedTransport` as it is actually useful. - Undeprecate `FramedTransport` as it is actually useful.
## 0.4.3 - 2019-07-17 ## 0.4.3
- 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
- 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
- Change `Either` constructor. - Change `Either` constructor.
## 0.4.0 - 2019-05-11 ## 0.4.0
- 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
- 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
- `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
- 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
- Use IntoFuture for new services. - Use IntoFuture for new services.
## 0.3.1 - 2019-03-04 ## 0.3.1
- Use new type of transform trait. - Use new type of transform trait.
## 0.3.0 - 2019-03-02 ## 0.3.0
- Use new `NewService` trait - Use new `NewService` trait
- BoxedNewService`and`BoxedService` types moved to actix-service crate. - BoxedNewService`and`BoxedService` types moved to actix-service crate.
## 0.2.4 - 2019-02-21 ## 0.2.4
- Custom `BoxedNewService` implementation. - Custom `BoxedNewService` implementation.
## 0.2.3 - 2019-02-21 ## 0.2.3
- Add `BoxedNewService` and `BoxedService`. - Add `BoxedNewService` and `BoxedService`.
## 0.2.2 - 2019-02-11 ## 0.2.2
- 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
- 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
- Fix framed transport error handling. - Fix framed transport error handling.
- Added Clone impl for Either service. - Added Clone impl for Either service.
@ -183,6 +183,6 @@
- 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
- Move utils services to separate crate. - Move utils services to separate crate.

View File

@ -1,26 +1,23 @@
[package] [package]
name = "actix-utils" name = "actix-utils"
version = "3.0.1" version = "3.0.1"
authors = [ authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
description = "Various utilities used in the Actix ecosystem" description = "Various utilities used in the Actix ecosystem"
keywords = ["network", "framework", "async", "futures"] keywords = ["network", "framework", "async", "futures"]
categories = ["network-programming", "asynchronous"] categories = ["network-programming", "asynchronous"]
repository = "https://github.com/actix/actix-net" repository = "https://github.com/actix/actix-net"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
edition = "2018" edition.workspace = true
rust-version.workspace = true
[lib]
name = "actix_utils"
path = "src/lib.rs"
[dependencies] [dependencies]
pin-project-lite = "0.2"
local-waker = "0.1" local-waker = "0.1"
pin-project-lite = "0.2"
[dev-dependencies] [dev-dependencies]
actix-rt = "2" actix-rt = "2"
futures-util = { version = "0.3.17", default-features = false } futures-util = { version = "0.3.17", default-features = false }
static_assertions = "1.1" static_assertions = "1.1"
[lints]
workspace = true

View File

@ -29,7 +29,7 @@ impl Counter {
/// Returns true if counter is below capacity. Otherwise, register to wake task when it is. /// Returns true if counter is below capacity. Otherwise, register to wake task when it is.
#[inline] #[inline]
pub fn available(&self, cx: &mut task::Context<'_>) -> bool { pub fn available(&self, cx: &task::Context<'_>) -> bool {
self.0.available(cx) self.0.available(cx)
} }
@ -59,7 +59,7 @@ impl CounterInner {
} }
} }
fn available(&self, cx: &mut task::Context<'_>) -> bool { fn available(&self, cx: &task::Context<'_>) -> bool {
if self.count.get() < self.capacity { if self.count.get() < self.capacity {
true true
} else { } else {

View File

@ -4,6 +4,8 @@ mod either;
mod poll_fn; mod poll_fn;
mod ready; mod ready;
pub use self::either::Either; pub use self::{
pub use self::poll_fn::{poll_fn, PollFn}; either::Either,
pub use self::ready::{err, ok, ready, Ready}; poll_fn::{poll_fn, PollFn},
ready::{err, ok, ready, Ready},
};

View File

@ -62,6 +62,7 @@ where
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
// SAFETY: we are not moving out of the pinned field // SAFETY: we are not moving out of the pinned field
// see https://github.com/rust-lang/rust/pull/102737 // see https://github.com/rust-lang/rust/pull/102737
#[allow(clippy::needless_borrow)]
(unsafe { &mut self.get_unchecked_mut().f })(cx) (unsafe { &mut self.get_unchecked_mut().f })(cx)
} }
} }
@ -102,6 +103,7 @@ mod tests {
#[allow(dead_code)] #[allow(dead_code)]
fn require_sync<T: Sync>(_t: &T) {} fn require_sync<T: Sync>(_t: &T) {}
#[allow(unused)]
trait AmbiguousIfUnpin<A> { trait AmbiguousIfUnpin<A> {
fn some_item(&self) {} fn some_item(&self) {}
} }

View File

@ -1,7 +1,5 @@
//! Various utilities used in the Actix ecosystem. //! Various utilities used in the Actix ecosystem.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible, missing_docs)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")] #![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")] #![doc(html_favicon_url = "https://actix.rs/favicon.ico")]

Some files were not shown because too many files have changed in this diff Show More