1
0
Fork 0
mirror of https://github.com/actix/actix-web.git synced 2024-06-02 21:39:26 +00:00

Compare commits

...

4338 commits

Author SHA1 Message Date
Rob Ede 3ce97effa2
ci: delete upload doc workflow 2024-05-28 01:21:23 +01:00
dependabot[bot] 26efa64278
build(deps): bump taiki-e/install-action from 2.33.26 to 2.33.34 (#3380)
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 00:58:18 +00:00
dependabot[bot] cc06fd6a5e
build(deps): bump codecov/codecov-action from 4.4.0 to 4.4.1 (#3381)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.4.0 to 4.4.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.4.0...v4.4.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-27 00:57:59 +00:00
dependabot[bot] 1b214bc5f5
build(deps): bump codecov/codecov-action from 4.3.1 to 4.4.0 (#3374)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.3.1 to 4.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/v4.3.1...v4.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>
2024-05-20 09:30:48 +00:00
dependabot[bot] d4bcdf28f2
build(deps): bump JamesIves/github-pages-deploy-action from 4.6.0 to 4.6.1 (#3375)
build(deps): bump JamesIves/github-pages-deploy-action

Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.6.0 to 4.6.1.
- [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)
- [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.6.0...v4.6.1)

---
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 09:30:27 +00:00
dependabot[bot] 4f7b334d80
build(deps): bump taiki-e/install-action from 2.33.22 to 2.33.26 (#3376)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.33.22 to 2.33.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.33.22...v2.33.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-05-20 09:27:44 +00:00
Rob Ede fdff3775a8
ci: use mold linker (#3370) 2024-05-19 20:24:33 +01:00
Rob Ede b342b8fc82
chore(actix-router): prepare release 0.5.3 2024-05-19 12:09:46 +01:00
Rob Ede 804a344565
ci: limit cargo hack concurrency 2024-05-19 12:06:20 +01:00
Rob Ede acb740584c
fix: correct aws rustls v0.23 feature gating 2024-05-19 11:55:12 +01:00
Rob Ede 9a437fe835
chore(awc): prepare release 3.5.0 2024-05-19 10:16:16 +01:00
Rob Ede 59115bca49
chore(actix-web): prepare release 4.6.0 2024-05-19 10:15:48 +01:00
Rob Ede fe7268487a
chore(actix-http): prepare release 3.7.0 2024-05-19 10:14:30 +01:00
Rob Ede e8262da138
chore: update rcgen to 0.13 2024-05-19 10:12:32 +01:00
Rob Ede 18e02b83d5
docs: fix middleware docs warning 2024-05-18 20:35:12 +01:00
asonix 2e63ff5928
actix-web: Add rustls 0.23 (#3363)
* Fix type confusion in some scenarios

When the feature for rustls 0.22 is enabled, and rustls 0.23 is also
present in a project, there suddently exist multiple paths for errors
when building middleware chains due to the use of two consecutive `?`
operators without specifying the intermediate error type.

This commit addresses the issue by removing the first `?`, so that the
first error type will always be known, and the second `?` always has a
well defined implementation.

* Add CHANGES entry about type confusion

* actix-http: add rustls 0.23 support

* actix-http: update ws example, tests for rustls 0.23

* actix-http: add rustls 0.23 to changelog

* Update comments to mention 0.23 instead of 0.22

* awc: add rustls 0.23 support

This also fixes certificate lookup when native-roots is enabled for rustls 0.22.

* awc: update changelog for rustls 0.23

* awc: Add base rustls-0_23 feature without roots to better enable custom config

* actix-test: add rustls-0.23

* actix-test: add rustls 0.23 to changelog

* awc: update changelog with rustls 0.23 tweaks

* actix-web: add rustls 0.23

* Add rustls-0_23 to CI

* Update tls_rustls.rs

* review nits

* review nits part 2

* fix doc test

---------

Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-05-18 19:05:58 +00:00
Raphael C 48d7adb7bf
Documentation for actix multipart (#3344)
example for actix-multipart readme & crate docs

Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-05-18 19:02:00 +00:00
Matt Palmer 0a2788d662
actix-test: re-export types from awc (#3349)
This allows us to pass these types around in functions, without having
to add `awc` as a direct (dev-)dependency.

Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-05-18 18:57:35 +00:00
asonix 2d035c066e
actix-http: Add rustls 0.23 (#3361)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-05-18 19:22:53 +01:00
dependabot[bot] fff45b28f4
build(deps): update brotli requirement from 3.3.3 to 6.0.0 (#3353)
* build(deps): update brotli requirement from 3.3.3 to 6.0.0

Updates the requirements on [brotli](https://github.com/dropbox/rust-brotli) to permit the latest version.
- [Release notes](https://github.com/dropbox/rust-brotli/releases)
- [Commits](https://github.com/dropbox/rust-brotli/compare/3.3.3...6.0.0)

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

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

* docs: update changelogs

---------

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-05-14 08:58:05 +00:00
dependabot[bot] c20603fc83
build(deps): bump taiki-e/install-action from 2.33.16 to 2.33.22 (#3364)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.33.16 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.16...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-14 05:50:32 +00:00
asonix 33c47c0ba9
Fix type confusion in some scenarios (#3348)
* Fix type confusion in some scenarios

When the feature for rustls 0.22 is enabled, and rustls 0.23 is also
present in a project, there suddently exist multiple paths for errors
when building middleware chains due to the use of two consecutive `?`
operators without specifying the intermediate error type.

This commit addresses the issue by removing the first `?`, so that the
first error type will always be known, and the second `?` always has a
well defined implementation.

* Add CHANGES entry about type confusion

---------

Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-05-14 05:45:35 +00:00
Rob Ede 3c9a930bd1
ci: rely more on justfiles (#3365) 2024-05-14 06:30:58 +01:00
asonix 44f502e050
awc: gate TlsConnectorService behind any feature that uses it (#3350) 2024-05-14 05:57:58 +01:00
Rob Ede c1a6388614
refactor: address clippy warnings 2024-05-06 06:03:44 +01:00
dependabot[bot] bb65628de5
build(deps): bump taiki-e/install-action from 2.33.12 to 2.33.16 (#3355)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-06 03:28:35 +01:00
dependabot[bot] e4b9d17355
build(deps): bump codecov/codecov-action from 4.3.0 to 4.3.1 (#3354)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-06 03:27:31 +01:00
dependabot[bot] babac131d4
build(deps): bump taiki-e/install-action from 2.32.17 to 2.33.12 (#3347)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.32.17 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.32.17...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:39:28 +00:00
dependabot[bot] 7f15a95d8e
build(deps): bump JamesIves/github-pages-deploy-action from 4.5.0 to 4.6.0 (#3339)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-02 03:22:59 +01:00
Rob Ede 7fc73d58a9
ci: fix public api 2024-05-02 03:22:20 +01:00
dependabot[bot] ba7fd048b6
build(deps): bump codecov/codecov-action from 4.2.0 to 4.3.0 (#3331)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.2.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.2.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-04-15 01:02:44 +00:00
dependabot[bot] d98938b125
build(deps): bump taiki-e/install-action from 2.32.9 to 2.32.17 (#3332)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.32.9 to 2.32.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.32.9...v2.32.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-04-15 01:02:30 +00:00
dependabot[bot] 5a5486b484
build(deps): bump taiki-e/install-action from 2.32.0 to 2.32.9 (#3325)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.32.0 to 2.32.9.
- [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.32.0...v2.32.9)

---
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-04-08 07:19:03 +00:00
dependabot[bot] 76b2b2734b
build(deps): bump codecov/codecov-action from 4.1.1 to 4.2.0 (#3326)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.1.1 to 4.2.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.1...v4.2.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-04-08 07:17:45 +00:00
dependabot[bot] ccfa8d3817
build(deps): bump codecov/codecov-action from 4.1.0 to 4.1.1 (#3321)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.1.0 to 4.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/v4.1.0...v4.1.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-04-01 01:41:43 +00:00
dependabot[bot] 09851f4a54
build(deps): bump taiki-e/install-action from 2.29.7 to 2.32.0 (#3322)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.29.7 to 2.32.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.29.7...v2.32.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-04-01 01:38:30 +00:00
dependabot[bot] db76ad0f61
build(deps): bump taiki-e/install-action from 2.28.16 to 2.29.7 (#3316)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-25 15:03:40 +00:00
dependabot[bot] 0383f4bdd1
build(deps): bump taiki-e/install-action from 2.28.10 to 2.28.16 (#3312)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.28.10 to 2.28.16.
- [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.10...v2.28.16)

---
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-03-18 02:47:10 +00:00
dependabot[bot] 9c3b4c61f7
build(deps): bump taiki-e/install-action from 2.28.0 to 2.28.10 (#3305)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-16 11:14:22 +00:00
LoveSy 52b0d5fbf9
CI: Free space before test (#3303) 2024-03-11 15:34:04 +00:00
Nelson Dominguez ba7bddeadc
docs(actix-web): add missing 'that' to doc comments for Compress middleware (#3304)
docs(actix-web): add missing 'that' in doc comments for Compress middleware
2024-03-06 00:17:18 +00:00
dependabot[bot] d2150a3312
build(deps): bump taiki-e/install-action from 2.27.9 to 2.28.0 (#3301)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.27.9 to 2.28.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.27.9...v2.28.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-03-04 02:18:50 +00:00
dependabot[bot] 58dd00bccf
build(deps): bump codecov/codecov-action from 4.0.2 to 4.1.0 (#3302)
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-04 02:18:38 +00:00
Rob Ede a4df623b0c
chore: bump env_logger to v0.11 2024-03-03 23:43:54 +00:00
Rob Ede 49020e79ae
chore: update base64 to v0.22 2024-03-03 22:18:29 +00:00
LoveSy c10f05a867
Add unicode feature to switch between regex and regex-lite crates as a trade-off between full unicode support and binary size (#3291)
* - Add `unicode` feature to switch between `regex` and `regex-lite`

as a trade-off between full unicode support and binary size.

* Update CHANGES.md

* Update CHANGES.md

* refactor: move regexset code selection to own module

* docs: add docs within RegexSet module

* chore: restore manifests

* test: ensure all actix-router codepaths are tested

---------

Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-03-03 15:50:16 +00:00
dependabot[bot] 994ea45d91
build(deps): bump codecov/codecov-action from 4.0.1 to 4.0.2 (#3296)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.0.1 to 4.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.0.1...v4.0.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>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-03-02 18:40:38 +00:00
dependabot[bot] f8a0f3e188
build(deps): bump taiki-e/install-action from 2.27.2 to 2.27.9 (#3297)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.27.2 to 2.27.9.
- [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.2...v2.27.9)

---
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>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-03-02 18:24:18 +00:00
Rob Ede 7f0504e32b
chore: temp allow #[allow(non_local_definitions)] 2024-03-01 18:11:30 +00:00
dependabot[bot] 8c31d137aa
build(deps): bump taiki-e/install-action from 2.26.18 to 2.27.2 (#3294)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-02-19 12:31:10 +00:00
dependabot[bot] 289f749e9f
build(deps): bump taiki-e/install-action from 2.26.12 to 2.26.18 (#3289)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-16 13:38:38 +00:00
Rob Ede 82f8ddc38f
feat: multipart testing utilities (#3288) 2024-02-14 22:22:07 +00:00
Rob Ede 3819767fa0
test: fix trybuild tests 2024-02-13 02:14:03 +00:00
Rob Ede 9ce5e33b72
ci: workaround clap MSRV in dev deps 2024-02-13 01:42:54 +00:00
Rob Ede 1e08ebabf9
build: bump MSRV to 1.72 2024-02-13 01:24:34 +00:00
Rob Ede 022b052bd9
chore: clippy 2024-02-12 23:02:45 +00:00
Rob Ede 1e2ef6f92f
perf: remove unnecessary allocation when writing http dates (#3261) 2024-02-07 03:47:30 +00:00
dependabot[bot] 7e4e12b0aa
build(deps): bump taiki-e/install-action from 2.26.8 to 2.26.12 (#3280)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-05 14:38:02 +00:00
dependabot[bot] 373d4ca970
build(deps): bump codecov/codecov-action from 4.0.0 to 4.0.1 (#3279)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-05 01:27:57 +00:00
Rob Ede e518170a30
test: fix test_server 2024-02-04 03:40:58 +00:00
Rob Ede f5f6132f94
test: update rustls for test_server 2024-02-04 03:30:16 +00:00
Rob Ede d9b31b80ac
fix: standardize body stream error reporting 2024-02-04 03:11:48 +00:00
Rob Ede 2b8c528e54
chore(actix-web): prepare release 4.5.1 2024-02-04 01:22:36 +00:00
Rob Ede 59bc85fe0e
chore(actix-http-test): prepare release 3.2.0 2024-02-04 00:34:00 +00:00
Rob Ede 3f2fd2d59f
chore(actix-test): prepare release 0.1.3 2024-02-04 00:33:42 +00:00
Rob Ede 17ed73b33e
chore(actix-web-actors): prepare release 4.3.0 2024-02-04 00:33:38 +00:00
Rob Ede 73fa1184f1
chore(awc): prepare release 3.4.0 2024-02-04 00:32:57 +00:00
Rob Ede 8e9e9fbcdd
chore(actix-web): prepare release 4.5.0 2024-02-04 00:32:28 +00:00
Rob Ede 8db3de6ede
chore(actix-http): prepare release 3.6.0 2024-02-04 00:31:14 +00:00
Rob Ede 2125aca2c5
Rustls v0.22 support (#3275) 2024-02-03 23:55:01 +00:00
Dylan DPC b1eb57ac4f
Update Cargo.toml (#3276) 2024-02-03 16:20:07 +00:00
SleeplessOne1917 ae7736f134
Implement From<&HeaderMap> for http::HeaderMap (#3230)
* Add From impl for header map references

* Add From impl for header map references

* Remove Into<HeaderMap> via http::HeaderMap

* fix changelog

---------

Co-authored-by: SleeplessOne1917 <insomnia-void@protonmail.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-02-01 12:52:35 +00:00
dependabot[bot] c1f88f718b
build(deps): bump codecov/codecov-action from 3.1.4 to 4.0.0 (#3272)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-02-01 07:34:23 +00:00
dependabot[bot] 7a76ba7340
build(deps): bump taiki-e/install-action from 2.24.1 to 2.26.8 (#3271)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-01 07:34:11 +00:00
Rob Ede 8e458b34b7
chore: remove set -e 2024-02-01 06:33:58 +00:00
Rob Ede e89c881624
ci: use cargo-ci-cache-clean 2024-02-01 06:27:22 +00:00
Rob Ede 5246d24aba
ci: force openssl version 3.2.1 2024-02-01 06:01:28 +00:00
Rob Ede 643a80bff2
ci: workaround half crate msrv 2024-02-01 05:41:28 +00:00
Bruno Paulino 891ab083c6
actix-http: Bump h2 to fix a resource exhaustion vulnerability (#3262)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-01-24 14:17:42 +00:00
Rob Ede a7375b6876
ci: faster cargo-public-api install (#3255) 2024-01-22 02:19:19 +00:00
dependabot[bot] ea8cd6e976
build(deps): bump taiki-e/install-action from 2.25.1 to 2.25.9 (#3252)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-22 01:06:55 +00:00
Vojtech Kral d453b15ddd
docs: mention result is wrapped in Data in data_factory() docs (#3251) 2024-01-18 12:32:27 +00:00
John Vandenberg 2915bb7d90
chore: fix typos (#3248) 2024-01-16 11:29:06 +00:00
dependabot[bot] e442b00c8c
build(deps): bump taiki-e/install-action from 2.24.1 to 2.25.1 (#3246)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-15 01:24:48 +00:00
dependabot[bot] ba53c4f875
build(deps): bump actions-rust-lang/setup-rust-toolchain from 1.6.0 to 1.8.0 (#3247)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-15 01:24:21 +00:00
Rob Ede 08a9c66568
docs(files: update readme from crate docs 2024-01-10 04:03:29 +00:00
Rob Ede 83be07d77d
chore(actix-files): prepare release 0.6.5 2024-01-10 04:01:14 +00:00
Rob Ede 33da480709
format project 2024-01-10 04:00:20 +00:00
Dialga fcfc727295
actix-files: fix handling linebreaks in filenames (#3237)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2024-01-10 03:56:15 +00:00
Rob Ede ac04d80d8e
docs: better docs for peer_addr methods 2024-01-08 15:17:40 +00:00
dependabot[bot] d2bd549eec
build(deps): bump taiki-e/install-action from 2.23.7 to 2.24.1 (#3239)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.23.7 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.23.7...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 01:25:54 +00:00
Rob Ede 46dde69d50
chore(actix-files): prepare release 0.6.4 2024-01-06 10:19:15 +00:00
Sven-Hendrik Haase febba786fa
actix-files: Properly handle newlines in file names (#3235) 2024-01-06 10:11:40 +00:00
dependabot[bot] 561cc440b2
build(deps): bump taiki-e/install-action from 2.23.0 to 2.23.7 (#3232)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.23.0 to 2.23.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.23.0...v2.23.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-01-01 14:10:13 +00:00
Rob Ede ccb90dd5a1
docs: update changelog 2023-12-25 02:36:17 +00:00
Rob Ede 1c88af50c0
docs: fix changelog 2023-12-25 02:35:22 +00:00
Rob Ede f4f459d420
chore(actix-http): prepare release 3.5.1 2023-12-25 02:30:14 +00:00
Rob Ede d14e98b62b
prevent hang when compressing Sized(0) bodies
fixes #3229
2023-12-25 02:27:51 +00:00
Rob Ede f4851b3914
chore(actix-router): prepare release 0.5.2 2023-12-24 16:47:58 +00:00
dependabot[bot] 68597b5426
build(deps): bump taiki-e/install-action from 2.22.0 to 2.23.0 (#3228)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.22.0 to 2.23.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.22.0...v2.23.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-23 19:54:02 +00:00
Rob Ede 9dc3ad754e
chore(actix-web): prepare release 4.4.1 2023-12-23 19:19:10 +00:00
Rob Ede 17060ed993
chore(awc): prepare release 3.3.0 2023-12-23 19:18:29 +00:00
Rob Ede 0d9ca4d939
chore(actix-http): prepare release 3.5.0 2023-12-23 19:17:56 +00:00
Rob Ede ff2904ee78
ci: prevent cargo-cache install failing MSRV builds 2023-12-23 19:13:11 +00:00
Rob Ede fdef224a06
docs: document internal Path fields 2023-12-23 18:49:17 +00:00
Rob Ede ede0201aa4
docs: fix derive readme version 2023-12-16 10:42:16 +00:00
Rob Ede 271edafd4d
docs: add router readme 2023-12-16 10:37:19 +00:00
Rob Ede 5e5e5d8315
chore: remove allow(uninlined_format_args) 2023-12-16 10:33:00 +00:00
Rob Ede c7a0af31d3
docs: doc and metadata tweaks 2023-12-16 10:33:00 +00:00
SleeplessOne1917 eefe8b0733
Implement From<HeaderMap> for http::HeaderMap (#3222)
* Implement From<HeaderMap> for http::HeaderMap

* Update changelog

* Apply clippy fix

* doc tweak

---------

Co-authored-by: SleeplessOne1917 <insomnia-void@protonmail.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-12-16 10:08:45 +00:00
dependabot[bot] 1114a51b22
build(deps): bump taiki-e/install-action from 2.21.26 to 2.22.0 (#3219)
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 01:11:53 +00:00
Hangyuan 0a312037ea
Corrected a typo in mod.rs (#3218) 2023-12-10 15:53:05 +00:00
dependabot[bot] 37d304b0f2
build(deps): bump taiki-e/install-action from 2.21.19 to 2.21.26 (#3210)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.21.19 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.19...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 01:20:11 +00:00
dependabot[bot] 039f8fb193
build(deps): bump JamesIves/github-pages-deploy-action from 4.4.3 to 4.5.0 (#3211)
build(deps): bump JamesIves/github-pages-deploy-action

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 01:03:29 +00:00
dependabot[bot] 929ceb5eb5
build(deps): bump actions-rust-lang/setup-rust-toolchain from 1.5.0 to 1.6.0 (#3212)
build(deps): bump actions-rust-lang/setup-rust-toolchain

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 01:02:25 +00:00
dependabot[bot] e95c8fe5a6
build(deps): bump taiki-e/install-action from 2.21.17 to 2.21.19 (#3205)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.21.17 to 2.21.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.21.17...v2.21.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>
2023-11-27 02:54:42 +00:00
Paul 2fe5189954
Do not encode zero-sized response bodies (#3199)
* Do not encode zero-sized response bodies

* Test empty response remains empty after compression
2023-11-26 20:57:19 +00:00
dependabot[bot] 4accfab196
build(deps): bump taiki-e/install-action from 2.21.11 to 2.21.17 (#3195)
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 00:29:35 +00:00
Amit Upadhyay c0615f28ed
Make compression middleware prefer brotli over zstd over gzip (#3189)
* AcceptEncoding.preference() prefers brotli > zstd > gzip

* AcceptEncoding.{ranked,negotiate}() prefers brotli > zstd > gzip

* changelog entry

* use browser-realistic encoding tests

* fix choosing identity when q=0

---------

Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-11-19 18:54:08 +00:00
Marcio Ordonez 9d1f75d349
fix: content type required flag (#3168)
* fix: content type required flag

* clarify comments for invalid json mime type

* remove pr reference

---------

Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-11-19 11:22:55 +00:00
dependabot[bot] e50bceb914
build(deps): bump taiki-e/install-action from 2.21.7 to 2.21.11 (#3185)
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 02:00:08 +00:00
Rob Ede f5655721aa
ci: rename lint workflow 2023-11-10 14:06:38 +00:00
Rob Ede 989548e36a
chore: remove git from repo URLs 2023-11-10 14:06:38 +00:00
dependabot[bot] 7d2349afb9
build(deps): bump taiki-e/install-action from 2.21.3 to 2.21.7 (#3183)
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 02:17:07 +00:00
dependabot[bot] b78f6da05f
build(deps): update zstd requirement from 0.12 to 0.13 (#3165)
* build(deps): update zstd requirement from 0.12 to 0.13

Updates the requirements on [zstd](https://github.com/gyscos/zstd-rs) to permit the latest version.
- [Release notes](https://github.com/gyscos/zstd-rs/releases)
- [Commits](https://github.com/gyscos/zstd-rs/compare/v0.12.0...v0.13.0)

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

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

* chore: update changelogs

---------

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>
2023-10-30 01:18:45 +00:00
dependabot[bot] 3b8d4de0e0
build(deps): bump taiki-e/install-action from 2.20.14 to 2.21.3 (#3179)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.20.14 to 2.21.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.20.14...v2.21.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>
2023-10-30 01:12:42 +00:00
dependabot[bot] 40196f16be
build(deps): bump taiki-e/cache-cargo-install-action from 1.2.2 to 1.3.0 (#3167)
Bumps [taiki-e/cache-cargo-install-action](https://github.com/taiki-e/cache-cargo-install-action) from 1.2.2 to 1.3.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.2.2...v1.3.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>
2023-10-30 00:05:50 +00:00
Rob Ede 32ddf972c6
docs: add guarded-listings example 2023-10-30 00:03:22 +00:00
Rob Ede ce18f35e03
docs: improve HttpServer docs on worker / bind relationship wrt factory instantiations 2023-10-29 18:48:03 +00:00
Rob Ede d3d0208cbd
chore: fmt workflows 2023-10-29 01:56:10 +00:00
Rob Ede 9e51116da2
chore: remove unusable re-export 2023-10-29 01:53:03 +00:00
dependabot[bot] 3193b81a3e
build(deps): bump taiki-e/install-action from 2.20.2 to 2.20.14 (#3173)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.20.2 to 2.20.14.
- [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.20.2...v2.20.14)

---
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-10-23 01:21:06 +00:00
Rob Ede 3acdda48e0
ci: reduce dependabot rate for Cargo updater 2023-10-13 17:41:25 +02:00
dependabot[bot] 935d36c441
build(deps): bump taiki-e/install-action from 2.20.1 to 2.20.2 (#3163)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.20.1 to 2.20.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.20.1...v2.20.2)

---
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-10-12 08:41:10 +00:00
Rob Ede 05b4c4964f
update handler failure mode docs 2023-10-11 16:07:18 +02:00
dependabot[bot] fba766b4be
build(deps): bump taiki-e/install-action from 2.19.4 to 2.20.1 (#3160)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.19.4 to 2.20.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.19.4...v2.20.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>
2023-10-09 01:48:46 +00:00
dependabot[bot] 76a0385f94
build(deps): bump taiki-e/install-action from 2.19.3 to 2.19.4 (#3159)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-06 02:51:36 +01:00
dependabot[bot] f1c9b93b87
build(deps): bump taiki-e/install-action from 2.19.2 to 2.19.3 (#3156)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.19.2 to 2.19.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.19.2...v2.19.3)

---
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-10-03 09:45:32 +00:00
dependabot[bot] 55ddded315
build(deps): bump taiki-e/install-action from 2.19.1 to 2.19.2 (#3154)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.19.1 to 2.19.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.19.1...v2.19.2)

---
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-10-02 00:43:19 +00:00
dependabot[bot] 2cfe257fc2
build(deps): bump taiki-e/install-action from 2.18.17 to 2.19.1 (#3151)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.18.17 to 2.19.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.18.17...v2.19.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>
2023-09-29 01:58:58 +00:00
dependabot[bot] ccabcd83c0
build(deps): bump taiki-e/install-action from 2.18.16 to 2.18.17 (#3149)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.18.16 to 2.18.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.18.16...v2.18.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-09-27 01:25:32 +00:00
dependabot[bot] 13fed45bfa
build(deps): bump taiki-e/install-action from 2.18.14 to 2.18.16 (#3144)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.18.14 to 2.18.16.
- [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.18.14...v2.18.16)

---
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-09-25 01:28:45 +00:00
dependabot[bot] 8bd4b36ffe
build(deps): bump taiki-e/install-action from 2.18.13 to 2.18.14 (#3142)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.18.13 to 2.18.14.
- [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.18.13...v2.18.14)

---
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-09-22 04:36:18 +00:00
dependabot[bot] 801a51b312
build(deps): bump taiki-e/cache-cargo-install-action from 1.2.1 to 1.2.2 (#3139)
Bumps [taiki-e/cache-cargo-install-action](https://github.com/taiki-e/cache-cargo-install-action) from 1.2.1 to 1.2.2.
- [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.2.1...v1.2.2)

---
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>
2023-09-18 01:17:47 +00:00
dependabot[bot] b28e0fff4b
build(deps): bump taiki-e/install-action from 2.18.9 to 2.18.13 (#3138)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.18.9 to 2.18.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.18.9...v2.18.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>
2023-09-18 01:15:19 +00:00
Rob Ede 043bc88f73
docs: add note about rt::spawn compat with tokio::main 2023-09-15 22:20:48 +01:00
dependabot[bot] e1c48dba26
build(deps): bump taiki-e/install-action from 2.13.4 to 2.18.9 (#3133)
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.13.4 to 2.18.9.
- [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.13.4...v2.18.9)

---
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-09-13 01:06:53 +00:00
dependabot[bot] 835a57afc6
build(deps): bump actions/checkout from 3 to 4 (#3130)
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  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>
2023-09-12 04:44:47 +00:00
Rob Ede 81ac30f3df
ci: overspecify actions versions 2023-09-12 05:24:55 +01:00
Rob Ede d50eccb3f7
ci: workaround anstyle msrv 2023-09-12 05:16:41 +01:00
Rob Ede a7983351be
docs: fix Data doc 2023-09-12 04:45:36 +01:00
Rob Ede 215a52f565
chore: avoid single char error bindings 2023-09-03 19:09:42 +01:00
dependabot[bot] d445742974
Update trust-dns-resolver requirement from 0.22 to 0.23 (#3121)
* Update trust-dns-resolver requirement from 0.22 to 0.23

Updates the requirements on [trust-dns-resolver](https://github.com/bluejekyll/trust-dns) to permit the latest version.
- [Release notes](https://github.com/bluejekyll/trust-dns/releases)
- [Changelog](https://github.com/bluejekyll/trust-dns/blob/main/CHANGELOG.md)
- [Commits](https://github.com/bluejekyll/trust-dns/compare/v0.22.0...v0.23.0)

---
updated-dependencies:
- dependency-name: trust-dns-resolver
  dependency-type: direct:production
...

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

* fixup post-upgrade

---------

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>
2023-09-03 04:40:41 +00:00
Rob Ede 76f6106f8f
fix: wrap attribute codegen regression when using expression (#3119) 2023-08-29 21:27:36 +01:00
Rob Ede 39abe3ae5e
docs: fix -http changelog 2023-08-29 01:57:19 +01:00
Rob Ede e6636f1279
chore(actix-test): prepare release 0.1.2 2023-08-29 01:55:17 +01:00
Rob Ede 2b40033a9c
chore(actix-web): prepare release 4.4.0 2023-08-29 01:54:40 +01:00
Rob Ede d2c0d472e9
chore(awc): prepare release 3.2.0 2023-08-29 01:53:14 +01:00
Rob Ede 45fdc08788
chore(actix-http): prepare release 3.4.0 2023-08-29 01:51:54 +01:00
Rob Ede a12d39c93e
chore(actix-web-codegen): prepare release 4.2.1 2023-08-29 01:19:56 +01:00
Rob Ede b422745b6c
chore(actix-multipart): prepare release 0.6.1 2023-08-29 01:18:37 +01:00
Rob Ede 4ed61466e7
chore(actix-multipart-derive): prepare release 0.6.1 2023-08-29 01:17:32 +01:00
Rob Ede ac95362340
refactor: simplify connector feature combos 2023-08-29 01:14:54 +01:00
Rob Ede 84eb8b306c
chore: remove broken links from changelogs 2023-08-29 01:14:33 +01:00
Rob Ede 384ca0a2cd
chore: remove dates from changelogs 2023-08-29 01:14:33 +01:00
Rob Ede 905c30af86
Actix Web Rustls v0.21 support (#3116) 2023-08-29 01:11:11 +01:00
Wyatt Herkamp cbf5e948db
Implement Deserialize and Default for actix_web::Data (#3109)
* Implement Default and Deserialize for Data

* FMT

* Change Log

* tweak changelog

* chore: whitespace

---------

Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-08-27 22:47:05 +00:00
Rob Ede 55c15f5bbf
minimum viable rustls v0.21 support (#3112) 2023-08-27 00:07:11 +01:00
Rob Ede 14355b9442
ci: name msrv jobs (#3114) 2023-08-26 18:19:32 +01:00
Rob Ede d8df60bf4c
build: add justfile 2023-08-03 07:03:42 +01:00
Rob Ede eaabe7e686
ci: reinstate coverage 2023-08-03 06:58:31 +01:00
Rob Ede 12dbda986e
test: fix test_h2_connection_drop spurious hang
fixes #3061
2023-08-03 06:54:50 +01:00
Rob Ede 1c60978a89
chore: move codecov file 2023-08-03 06:28:45 +01:00
Rob Ede b4fcdffdc3
chore: update msrv to 1.68 (#3094) 2023-08-01 19:33:32 +01:00
Rob Ede 605cd7c540
add startup logging to basic example 2023-08-01 18:06:59 +01:00
Rob Ede 75a97f6b32
chore: remove clippy config file 2023-07-24 03:29:56 +01:00
Rob Ede ff8fd2f7b5
modernize ContentLength 2023-07-22 18:01:59 +01:00
Rob Ede 6a0ea51b15
add ContentLength typed header (#2490) 2023-07-22 03:16:01 +01:00
Rob Ede 8cdbab3416
refactor: remove web dev dep from http-test 2023-07-22 02:02:37 +01:00
Rob Ede 146011018e
add payload to_bytes helpers (#3083) 2023-07-22 02:02:29 +01:00
Rob Ede 3eb5a059ad
chore: address clippy warnings 2023-07-20 11:42:20 +01:00
cyqsimon 1040bc3d17
Add missing status code constructor methods on HttpResponse (#3042) 2023-07-20 10:36:49 +00:00
Rob Ede d22c9f9fb1
update syn to 2 in web codegen (#3081) 2023-07-20 10:49:01 +01:00
dependabot[bot] e25f3f8f1d
Bump JamesIves/github-pages-deploy-action from 4.4.1 to 4.4.3 (#3076)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-19 23:43:25 +01:00
dependabot[bot] 6d452d4977
Bump codecov/codecov-action from 1 to 3 (#3077)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-07-19 23:42:40 +01:00
Vasiliy Taranov 67cee2915d
set up dependabot (#3019)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-07-19 23:37:48 +01:00
Rob Ede db99da5daf
do not compress media types (#3075)
* misc: add temporary nix file

* Add test to check content type image/*

* misc: add unit test for expected behaviour jpeg

* feat(compress): add compress function to middleware

* feat(compress): use response content type to decide compress

* feat(compress): give more control to the user

* misc: improve default compress function

* add Compress::with_predicate

* remove predicate options

* assert auto traits on Compress

* fix changelog

---------

Co-authored-by: William R. Arellano <arellanowr@gmail.com>
2023-07-19 20:24:32 +01:00
Nathan Shaaban 80185ce741
Hide authorization header in httprequest debug output (#2953)
Co-authored-by: Nathan Shaaban <86252985+nshaaban-cPacket@users.noreply.github.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-07-19 18:51:17 +00:00
Rob Ede 4272510261
doc amendments 2023-07-19 19:27:20 +01:00
Kristian Gaylord 908fb2606e
allow configuring number of test server workers (#3069)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-07-19 16:48:43 +00:00
nerix b061f00421
Provide documentation in the middleware module (#3070)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-07-19 10:24:14 +00:00
Rob Ede 3b9b38c44e
fix tempfile dep spec 2023-07-18 02:22:09 +01:00
Rob Ede a4c9361791
ci: fix windows openssl 2023-07-18 02:18:43 +01:00
James Rowe bf03207ca9
Add http2 optional feature (#3072)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-07-17 20:59:10 +00:00
Rob Ede 79a38e0628
apply standard formatting 2023-07-17 02:38:12 +01:00
Rob Ede 60c76c5e10
revert http2 feature flag change 2023-07-17 02:19:26 +01:00
Rob Ede e4e839f4d1
only enable actix-http's http2 feature when TLS features are enabled
closes #3071
2023-07-17 01:51:10 +01:00
Rob Ede c34a18f64a
changelog file is optional in bump script 2023-07-17 01:47:26 +01:00
mitsubosh ce3af777a0
Fix typo (#3062) 2023-07-05 16:29:10 +00:00
Dylan DPC 0e8ed50e3a
align awc's h2 version (#3051)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-07-02 00:56:12 +00:00
Raminder Singh 4eeb01415c
Fix failing test on Windows (#3037) 2023-07-02 00:36:06 +00:00
Rob Ede 241da6e081
update MSRV to 1.65 (#3059) 2023-07-02 01:09:15 +01:00
Rob Ede 1072d0dacf
address lints 2023-06-09 15:15:09 +01:00
Imamuzzaki Abu Salam 58c19b817f
docs(actix-web/README.md): update benchmark link (#3046)
Round 20 doesn't have actix score, but round 21 has. So I changed it to the round 21 link for everyone to see this is one of the best frameworks for Web/API.
2023-06-09 14:29:10 +01:00
moh-eulith 17218dc6c8
minor optimization: reserve buffer once length is known (ws) (#2950) 2023-05-07 15:13:10 +00:00
Rob Ede 6fdda45ca3
update bitflags to v2 2023-05-06 11:38:51 +01:00
Rob Ede 8b2b755cde
fix guard mod docs 2023-05-06 11:37:11 +01:00
Yuki Okushi de1efa673f
Refine GHA workflows (#3023) 2023-04-24 04:46:57 +09:00
Surya 5d4f591875
fix RUSTSEC-2023-0034 by updating h2 (#3022) 2023-04-22 12:53:35 +00:00
Rob Ede e81dc768dc
expose h2c methods on HttpServer (#2999
* expose h2c methods on HttpServer

* update h2c docs
2023-04-06 03:11:28 +01:00
Rob Ede 97399e8c8c
simplify CI 2023-04-02 03:27:14 +01:00
Elijah 8dee8a1426
docs(actix-http-test): update test server example (#3007) 2023-03-31 18:09:13 +00:00
Rob Ede e68f87f84f
add API diff to CI (#3002) 2023-03-15 13:32:55 +00:00
Rob Ede 0f3068f488
ci(windows): use choco to install openssl (#3003
ci: remove openssl install on windows
2023-03-15 05:39:02 +00:00
Rob Ede 5e29726c4f
standardize error messages in actix-http 2023-03-13 17:17:02 +00:00
Rob Ede 442fa279da
uncomment error variant 2023-03-13 14:30:21 +00:00
Rob Ede bfdc29ebb8
normalize actix-files error messages 2023-03-13 14:22:50 +00:00
Rob Ede 0e7380659f
implement Error for BodyLimitExceeded 2023-03-13 13:40:09 +00:00
Rob Ede 44c5cdaa10
bound initial allocation in to_bytes_limited 2023-03-13 13:40:07 +00:00
Rob Ede 9e7a6fe57b
add body::to_bytes_limited (#3000
* add body::to_body_limit

* rename to_bytes_limited
2023-03-13 13:31:48 +00:00
Rob Ede dfaca18584
add compression_responses benchmark (#3001) 2023-03-12 15:32:07 +00:00
Rob Ede 19c9d858f2
support 16 extractors 2023-03-12 04:29:22 +00:00
Rob Ede 4131786127
remove old benchmarks 2023-03-11 23:20:02 +00:00
Rob Ede 0ba147ef71
update actions/checkout to v3 2023-03-11 23:19:03 +00:00
Rob Ede 3fc01c4887
refactor server binding 2023-03-11 22:17:52 +00:00
Rob Ede 4c4024c949
fix minimal version specs for mime 2023-03-11 22:14:58 +00:00
Rob Ede e0939a01fc
prepare actix-http release 3.3.1 2023-03-02 17:09:26 +00:00
Rob Ede 20c7c07dc0
fix http version req 2023-03-02 16:21:13 +00:00
Rob Ede d7c6774ad5
add resource method helpers (#2978) 2023-03-02 08:22:22 +00:00
Rob Ede 67efa4a4db
migrate to doc_auto_cfg 2023-02-26 21:55:25 +00:00
Rob Ede d77bcb0b7c
update date in unreleased changelog sections 2023-02-26 21:45:36 +00:00
Rob Ede c4db9a1ae2
prepare actix-multipart release 0.6.0 2023-02-26 21:44:57 +00:00
Rob Ede 740d0c0c9d
prepare actix-multipart-derive release 0.6.0 2023-02-26 21:44:14 +00:00
Rob Ede f27584046c
add todo for header names in next breaking release 2023-02-26 16:31:40 +00:00
Rob Ede 129b78f9c7
prepare actix-test release 0.1.1 2023-02-26 14:20:48 +00:00
Rob Ede ad27150c5f
fix doc tests 2023-02-26 14:14:04 +00:00
Rob Ede 8d5d6a2598
tweak err handlers docs 2023-02-26 13:28:19 +00:00
Rob Ede e97329eb2a
bump socket2 dep to 0.5 2023-02-26 13:28:19 +00:00
Kristian Gaylord fbfff3e751
actix-test: allow dynamic port setting (#2960)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-02-26 05:25:36 +00:00
Rob Ede fdfb3d45db
remove direct dep on ahash for client pool 2023-02-26 03:50:36 +00:00
Rob Ede 4e05629368
specify safe tokio version range 2023-02-26 03:47:25 +00:00
Rob Ede e35ec28cd2
prepare actix-web release 4.3.1 2023-02-26 03:44:34 +00:00
Rob Ede 35006e9cae
prepare actix-web-codegen release 4.2.0 2023-02-26 03:42:27 +00:00
Rob Ede 115701eb86
prepare awc release 3.1.1 2023-02-26 03:34:47 +00:00
Rob Ede e2fed91efd
format markdown with prettier 2023-02-26 03:26:51 +00:00
Jacob Halsey d4b833ccf0
actix-multipart: Feature: Add typed multipart form extractor (#2883)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-02-26 03:26:06 +00:00
Rob Ede 358c1cf85b
improve docs for app_config methods 2023-02-22 23:06:23 +00:00
Lioness100 42193bee29
fix typos (#2982) 2023-02-20 08:11:16 +00:00
Rob Ede dc08ea044b
clippy 2023-02-13 21:09:28 +00:00
Roy Wellington Ⅳ 85d88ffada
Fix minor typo in Markdown (#2977) 2023-02-12 02:47:42 +00:00
yinho999 bf19a0e761
added body manipulation example for error handlers (#2973)
Closes https://github.com/actix/actix-web/issues/2856
2023-02-09 20:37:01 +00:00
Joel Wurtz bf1f169be2
[awc] change client::Connect to be public (#2690) 2023-02-09 09:32:04 +00:00
Rob Ede 359d5d5c80
refactor codegen route guards 2023-02-06 17:06:47 +00:00
edgerunnergit 65c0545a7a
added support for creating custom methods with route macro (#2969)
Co-authored-by: Rob Ede <robjtede@icloud.com>
Closes https://github.com/actix/actix-web/issues/2893
2023-02-06 12:40:41 +00:00
Rob Ede b933ed4456
add tests for files_listing_renderer 2023-02-03 21:04:07 -05:00
Rob Ede 4bff1d0abe
require safe tokio version range
see https://rustsec.org/advisories/RUSTSEC-2023-0005
2023-02-03 20:35:19 -05:00
Rob Ede fa106da555
refactor: move Host guard into own module 2023-01-30 11:36:12 -05:00
Rob Ede c15016dafb
prepare actix-files release 0.6.3 2023-01-21 19:03:19 +00:00
Rob Ede 74688843ba
prepare actix-http-test release 3.1.0 2023-01-21 19:01:14 +00:00
Rob Ede 845156da85
prepare actix-web-actors release 4.2.0 2023-01-21 19:01:08 +00:00
Rob Ede 98752c053c
prepare actix-multipart release 0.5.0 2023-01-21 18:59:13 +00:00
Rob Ede df6fde883c
prepare actix-web release 4.3.0 2023-01-21 18:57:42 +00:00
Rob Ede 8d4cb8c69a
prepare awc release 3.1.0 2023-01-21 18:54:58 +00:00
Rob Ede dd9ac4d9b8
prepare actix-http release 3.3.0 2023-01-21 18:52:57 +00:00
Rob Ede 72c80f9107
update tokio-uring support to 0.4 2023-01-21 18:46:44 +00:00
citreae535 b00fe72cf6
Update base64 to 0.21 (#2966)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-01-21 01:36:08 +00:00
cumtyc 2f0b8a264a
fix non-empty body of http2 HEAD response (#2920)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-01-21 00:51:49 +00:00
Rob Ede b9f0faafde
add cache-status and cdn-cache-control header names (#2968)
* add cache-status and cdn-cache-control header names

* fix changelog

* update docs with rfc numbers
2023-01-21 00:02:54 +00:00
Zach 6627109984
Add fallible versions of test_utils helpers to actix-test (#2961)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2023-01-11 11:43:51 +00:00
Rob Ede b9f54c8796
use secure tokio version range
see RUSTSEC-2023-0001

fixes #2962
2023-01-10 08:58:38 +00:00
Nikolai Vazquez cfd40b4f15
Implement MessageBody for Cow<'static, {[u8], str}> (#2959) 2023-01-06 21:56:16 +00:00
Rob Ede 08c2cdf641
http service finalizer for automatic h2c detection (#2957)
* http service finalizer for automatic h2c detection

* update changelog

* add h2c auto test
2023-01-03 14:43:02 +00:00
Rob Ede fbd0e5dd0a
add headermap::retain (#2955)
* add headermap::retain

* update changelog and docs

* fix retain doc test
2023-01-02 13:38:07 +00:00
Rob Ede 7b936bc443
add some useful header name constants (#2956) 2023-01-02 13:33:31 +00:00
Rob Ede d2364c80c4
improve error handling on new new example 2023-01-02 00:16:59 +00:00
Rob Ede 77459ec415
add h2c example 2023-01-02 00:14:25 +00:00
Rob Ede 6f0a6bd1bb
address clippy lints
For intrepid commit message readers:
The choice to add allows for the inlined format args lint instead of actually
inlining them is not very clear because our actual real world MSRV is not clear.
We currently claim 1.60 is our MSRV but this is mainly due to dependencies. I'm
fairly sure that we could support < 1.58 if those deps are outdated in a users
lockfile. We'll remove these allows again at some point soon.
2023-01-01 20:56:34 +00:00
Rob Ede 06c3513bc0
add Allow header to resource's default 405 handler (#2949) 2022-12-21 20:28:45 +00:00
Rob Ede 29bd6a1dd5
fix version requirement for futures_util 2022-12-18 01:34:48 +00:00
Rob Ede 17f7cd2aae
bump zstd to 0.12 2022-12-18 01:31:06 +00:00
Rob Ede ede645ee4e
bump criterion to 0.4 2022-12-18 01:11:04 +00:00
Rob Ede 6d48593a60
fix doc tests 2022-11-25 23:28:31 +00:00
Rob Ede 3c69d078b2
add redirect service (#1961) 2022-11-25 21:44:52 +00:00
Rob Ede e7c34f2e45
tweak form docs 2022-11-25 21:38:57 +00:00
Rob Ede d708a4de6d
add acceptable guard (#2265) 2022-11-25 21:04:24 +00:00
Rob Ede d97bd7ec17
fix msrv CI 2022-11-25 17:37:23 +00:00
Rob Ede fcd06c9896
workaround zstd msrv issue 2022-11-25 17:28:06 +00:00
Rob Ede 1065043528
ci: use dtolnay's rust-toolchain action 2022-11-25 17:00:59 +00:00
Alex 45b77c6819
GitHub Workflows security hardening (#2923) 2022-11-04 00:42:22 +00:00
Rob Ede a2e2c30d59
use tokio-util deps directly where possible 2022-10-30 19:47:49 +00:00
fakeshadow 83cd061c86
remove fakeshadow from author lists (#2921) 2022-10-25 16:37:04 +01:00
Alex 068909f1b3
Replace deprecated twoway with memchr (#2909) 2022-10-14 11:52:13 +00:00
Rob Ede f8cb71e789
remove incomplete doc comment 2022-10-14 13:20:38 +02:00
kkocdko 73b94e902d
fix xhtml pages' content-disposition (#2903)
Co-authored-by: Yuki Okushi <jtitor@2k36.org>
2022-10-09 12:44:10 +01:00
Benny Nazimov ad7e67f940
add middleware::logger::custom_response_replace (#2631)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-09-26 18:44:51 +00:00
Rob Ede 1519ae7772
clarify tokio::main docs 2022-09-26 12:29:57 +01:00
Rob Ede cc7145d41d
rust 1.64 clippy run (#2891) 2022-09-25 20:54:17 +01:00
Rob Ede 172c4c7a0a
use noop hasher in extensions (#2890) 2022-09-25 15:32:26 +01:00
Jacob Halsey fd63305859
Fix actix-multipart field content_type() to return an Option (#2885)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-09-23 17:06:40 +00:00
david-monroe ef64d6a27c
update derive_more dependency to 0.99.8 (#2888) 2022-09-23 12:39:18 +00:00
e-rhodes 4d3689db5e
Remove unnecesary clones in extractor configs (#2884)
Co-authored-by: erhodes <erik@space-nav.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-09-20 23:17:58 +00:00
Rob Ede 894effb856
prepare actix-router release 0.5.1 2022-09-19 18:52:16 +01:00
Torin Cooper-Bennun 07a7290432
Fix typo in error string for i32 parse in router deserialization (#2876)
* fix typo in error string for i32 parse

* update actix-router changelog for #2876

* Update CHANGES.md

Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-09-19 18:44:52 +01:00
e-rhodes bd5c0af0a6
Add ability to set default error handlers to the ErrorHandler middleware (#2784)
Co-authored-by: erhodes <erik@space-nav.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-09-15 13:06:34 +00:00
Rob Ede c73fba16ce
implement MessageBody for mut B (#2868) 2022-09-14 11:23:22 +01:00
Rob Ede 909461087c
add ContentDisposition::attachment constructor (#2867) 2022-09-13 01:19:25 +01:00
Rob Ede 40f7ab38d2
prepare actix-web release 4.2.1 2022-09-12 10:43:03 +01:00
Rob Ede a9e44bcf07
fix -http version to 3.2.2 (#2871)
fixes #2869
2022-09-12 10:42:22 +01:00
Rob Ede 7767cf3071
prepare actix-web release 4.2.0 2022-09-11 16:44:46 +01:00
Rob Ede b59a96d9d7
prepare actix-web-codegen release 4.1.0 2022-09-11 16:42:28 +01:00
Rob Ede 037740bf62
prepare actix-http release 3.2.2 2022-09-11 16:41:29 +01:00
Rob Ede 386258c285
clarify worker_max_blocking_threads default 2022-09-06 10:13:10 +01:00
Rob Ede 99bf774e94
update gh-pages deploy action 2022-09-03 22:15:59 +01:00
Rob Ede 35b0fd1a85
specify branch in doc job 2022-09-03 22:05:28 +01:00
Rob Ede 0b5b4dcbf3
reduce size of docs branch 2022-09-03 21:56:37 +01:00
Juan Aguilar c993055fc8
replace askama_escape in favor of v_htmlescape (#2824) 2022-08-30 09:34:46 +01:00
Rob Ede 679f61cf37
bump msrv to 1.59 2022-08-27 13:14:16 +01:00
Rob Ede 056de320f0
fix scope doc example
fixes #2843
2022-08-25 03:17:48 +01:00
Rob Ede f220719fae
prepare awc release 3.0.1 2022-08-25 03:13:31 +01:00
liushuyu c9f91796df
awc: correctly handle redirections that begins with // (#2840) 2022-08-25 03:12:58 +01:00
Rob Ede ea764b1d57
add feature annotations to docs 2022-07-31 23:40:09 +01:00
Rob Ede 19aa14a9d6
re-order HttpServer methods for better docs 2022-07-31 22:10:51 +01:00
Rob Ede 10746fb2fb
improve HttpServer docs 2022-07-31 21:58:15 +01:00
Rob Ede 4bbe60b609
document h2 ping-pong 2022-07-24 16:42:35 +01:00
Rob Ede 8ff489aa90
apply fix from #2369 2022-07-24 16:35:00 +01:00
Rob Ede e0a88cea8d
remove unwindsafe assertions 2022-07-24 02:47:12 +01:00
Rob Ede d78ff283af
prepare actix-test release 0.1.0 2022-07-24 02:13:46 +01:00
Rob Ede ce6d520215
prepare actix-http-test release 3.0.0 2022-07-24 02:11:21 +01:00
Rob Ede 3e25742a41
prepare actix-files release 0.6.2 2022-07-23 16:37:59 +01:00
Rob Ede 20f4cfe6b5
fix partial ranges for video content (#2817)
fixes #2815
2022-07-23 16:27:01 +01:00
Rob Ede 6408291ab0
appease clippy by deriving Eq on a bunch of items (#2818) 2022-07-23 16:26:48 +01:00
Rob Ede 8d260e599f
clippy 2022-07-23 02:48:28 +01:00
Rob Ede 14bcf72ec1
web utilizes const header names 2022-07-22 20:21:58 +01:00
Rob Ede 6485434a33
update bump script 2022-07-22 20:19:15 +01:00
Rob Ede 16c7c16463
reduce scope of once_cell change 2022-07-22 20:19:02 +01:00
Expyron 9b0fdca6e9
Remove some unnecessary uses of once_cell::sync::Lazy (#2816) 2022-07-22 20:18:38 +01:00
Roland Fredenhagen 8759d79b03
routes macro allowing multiple paths per handler (#2718)
* WIP: basic implementation for `routes` macro

* chore: changelog, docs, tests

* error on missing methods

* Apply suggestions from code review

Co-authored-by: Igor Aleksanov <popzxc@yandex.ru>

* update test stderr expectation

* add additional tests

* fix stderr output

* remove useless ResourceType

this is dead code from back when .to and .to_async were different ways to add a service

Co-authored-by: Igor Aleksanov <popzxc@yandex.ru>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-07-04 04:31:49 +00:00
Rob Ede c0d5d7bdb5
add octal-ish CL test 2022-07-02 21:04:37 +01:00
Rob Ede 40eab1f091
simplify simple decoder tests 2022-07-02 20:07:27 +01:00
Rob Ede 75517cce82
install cargo hack in CI faster 2022-07-02 20:00:59 +01:00
Rob Ede 9b51624b27
update cargo-cache to 0.8.2 2022-07-02 18:43:19 +01:00
Rob Ede 8e2ae8cd40
install nextest faster 2022-07-02 18:38:08 +01:00
Rob Ede 9a2f8450e0
install older cargo-edit 2022-07-02 17:40:03 +01:00
Rob Ede 23ef51609e
s/cargo-add/cargo-edit 2022-07-02 17:29:06 +01:00
Rob Ede f7d629a61a
fix cargo-add in CI 2022-07-02 17:20:46 +01:00
Rob Ede e0845d9ad9
add msrv workarounds to ci 2022-07-02 17:12:24 +01:00
Rob Ede 2f79daec16
only run tests on stable 2022-07-02 17:05:48 +01:00
Rob Ede f3f41a0cc7
prepare actix-http release 3.2.1 2022-07-02 16:50:54 +01:00
Rob Ede 987067698b
use sparse registry in CI 2022-07-01 12:45:26 +01:00
Rob Ede b62f1b4ef7
migrate deprecated method in docs 2022-07-01 12:40:00 +01:00
Rob Ede df5257c373
update trust dns resolver 2022-07-01 10:21:46 +01:00
Rob Ede 226ea696ce
update dev deps 2022-07-01 10:19:28 +01:00
Rob Ede e524fc86ea
add HTTP/0.9 rejection test 2022-07-01 09:03:57 +01:00
Rob Ede 7e990e423f
add http/1.0 GET parsing tests 2022-07-01 08:24:45 +01:00
Rob Ede 8f9a12ed5d
fix parsing ambiguities for HTTP/1.0 requests (#2794)
* fix HRS vuln when first CL header is 0

* ignore TE headers in http/1.0 reqs

* update changelog

* disallow HTTP/1.0 requests without a CL header

* fix test

* broken fix for http1.0 post requests
2022-07-01 08:23:40 +01:00
Rob Ede c6eba2da9b
prepare actix-http release 3.2.0 (#2801) 2022-07-01 06:16:17 +01:00
Rob Ede 06c7945801
retain previously set vary headers when using compress (#2798)
* retain previously set vary headers when using compress
2022-06-30 09:19:16 +01:00
Ulf Lilleengen 0dba6310c6
Expose option for setting TLS handshake timeout (#2752)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-06-27 02:57:21 +00:00
Rob Ede f7d7d92984
address clippy lints 2022-06-27 03:12:36 +01:00
nerix 3d6ea7fe9b
Improve documentation for actix-web-actors (#2788) 2022-06-26 16:45:02 +00:00
PeterPierinakos 8dbf7da89f
Fix common grammar mistakes and add small documentation for AppConfig's Default implementation (#2793) 2022-06-25 14:01:06 +00:00
oatoam de92b3be2e
fix unrecoverable Err(Overflow) in websocket frame parser (#2790) 2022-06-24 03:46:17 +00:00
e-rhodes 5d0e8138ee
Add getters for &ServiceRequest (#2786) 2022-06-22 21:02:03 +01:00
Yuki Okushi 6b7196225e
Bump up MSRV to 1.57 (#2789) 2022-06-22 12:08:06 +01:00
Isabel Atkinson 265fa0d050
Add link to MongoDB example in README (#2783) 2022-06-15 22:38:10 +01:00
Yuki Okushi 062127a210
Revert "actix-http: Pull actix-web dev-dep from Git repo"
This reverts commit 3926416580.
2022-06-12 00:55:06 +09:00
Yuki Okushi 3926416580
actix-http: Pull actix-web dev-dep from Git repo
The published version of actix-web depends on a buggy version of zstd crate,
temporarily use actix-web on git repo to avoid the build failure.

Signed-off-by: Yuki Okushi <jtitor@2k36.org>
2022-06-12 00:48:08 +09:00
Rob Ede 43671ae4aa
release 4.1 group (#2781) 2022-06-12 00:15:43 +09:00
Rob Ede 264a703d94
revert broken fix in #2624 (#2779)
* revert broken fix in #2624

* update changelog
2022-06-11 13:43:13 +01:00
Rob Ede 498fb954b3
migrate from deprecated sha-1 to sha1 (#2780)
closes #2778
2022-06-11 04:53:58 +01:00
Rob Ede 2253eae2bb
update msrv to 1.56 (#2777)
* update msrv to 1.56

* remove transitive dashmap dependency

closes #2747
2022-06-11 04:03:26 +01:00
JY Choi 8e76a1c775
Allow a path as a guard in route handler macro (#2771)
* Allow a path as a guard in route handler macro

* Update CHANGES.md

Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-06-06 18:53:23 +01:00
Sabrina Jewson dce57a79c9
Implement ResponseError for Infallible (#2769) 2022-05-30 20:52:48 +01:00
cui fliter 6a5b370206
fix some typos (#2744)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-04-24 22:01:20 +00:00
Rob Ede b1c85ba85b
Add ServiceConfig::default_service (#2743)
* Add `ServiceConfig::default_service`

based on https://github.com/actix/actix-web/pull/2338

* update changelog
2022-04-23 22:11:45 +01:00
Matt Fellenz 9aab911600
Improve documentation for FromRequest::Future (#2734)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-04-23 20:57:11 +00:00
Rob Ede 017e40f733
update optional extractor impl docs 2022-04-23 21:02:24 +01:00
Rob Ede 45592b37b6
add Route::wrap (#2725)
* add `Route::wrap`

* add tests

* fix clippy

* fix doctests
2022-04-23 21:01:55 +01:00
Rob Ede 8abcb94512
fix tokio-uring version 2022-04-23 14:37:03 +01:00
Rob Ede f2cacc4c9d
clear conn_data on HttpRequest drop (#2742)
* clear conn_data on HttpRequest drop

fixes #2740

* update changelog

* fix doc test
2022-04-23 13:35:41 +01:00
Rob Ede 56b9c0d08e
remove payload unwindsafe impl assert 2022-04-23 12:31:32 +01:00
Luca Palmieri de9e41484a
Add ServiceRequest::extract (#2647)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-04-02 19:46:26 +01:00
Rob Ede 2fed978597
remove -http TestRequest doc test 2022-03-28 22:44:32 +01:00
Ali MJ Al-Nasrawy 40048a5811
rework actix_router::Quoter (#2709)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-03-28 20:58:35 +00:00
Rob Ede e942d3e3b1
update migration guide 2022-03-26 13:26:12 +00:00
mellowagain 09cffc093c
Bump zstd to 0.11 (#2694)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-03-22 15:30:06 +00:00
nikstur c58f287044
Removed random superfluous whitespace (#2705) 2022-03-20 21:36:19 +00:00
Rob Ede 7b27493e4c
move coverage to own workflow 2022-03-10 16:17:49 +00:00
Rob Ede 478b33b8a3
remove nightly io-uring job 2022-03-10 16:00:15 +00:00
Rob Ede 592b40f914
move io-uring tests to own job 2022-03-10 15:03:55 +00:00
Rob Ede fe5279c77a
use tracing in actix-router 2022-03-10 03:14:14 +00:00
Rob Ede 80d222aa78
use tracing in actix-http 2022-03-10 03:12:29 +00:00
Rob Ede a03a2a0076
deprecate NamedFile::set_status_code 2022-03-10 02:54:06 +00:00
Rob Ede 745e738955
fix negative impl assertion on 1.60+
see https://github.com/rust-lang/rust/issues/94791
2022-03-10 02:36:57 +00:00
Rob Ede 1fd90f0b10
Implement getters for named file fields (#2689)
Co-authored-by: Janis Goldschmidt <github@aberrat.io>
2022-03-10 01:29:26 +00:00
Rob Ede a35804b89f
update files tokio-uring to 0.3 2022-03-10 01:05:03 +00:00
Rob Ede 5611b98c0d
prepare actix-http release 3.0.4 2022-03-09 18:13:39 +00:00
Rob Ede dce9438518
document with ws feature 2022-03-09 18:11:12 +00:00
Dylan DPC be986d96b3
bump regex requirement to 1.5.5 due to security advisory (#2687) 2022-03-08 17:42:42 +00:00
Rob Ede 8ddb24b49b
prepare awc release 3.0.0 (#2684) 2022-03-08 16:51:40 +00:00
Rob Ede 87f627cd5d
improve servicerequest docs 2022-03-07 16:48:04 +00:00
Rob Ede 03456b8a33
update actix-web-in-http example 2022-03-05 23:43:31 +00:00
Rob Ede 8c2fad3164
align hello-world examples 2022-03-05 23:15:33 +00:00
Rob Ede 62fbd225bc
prepare actix-http release 3.0.2 2022-03-05 22:26:19 +00:00
Santiago 0fa4d999d9
fix(actix-http): encode correctly camel case header with n+2 hyphens (#2683)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-03-05 22:24:21 +00:00
Rob Ede da4c849f62
prepare actix-http release 3.0.1 2022-03-04 03:16:02 +00:00
Rob Ede 49cd303c3b
fix dispatcher panic when conbining pipelining and keepalive
fixes #2678
2022-03-04 03:12:38 +00:00
Clément Nerma 955c3ac0c4
Add support for audio files streaming (#2645) 2022-03-03 00:29:59 +00:00
Rob Ede 56e5c19b85
add actix 0.13 support (#2675) 2022-03-02 17:53:47 +00:00
Rob Ede 3f03af1c59
clippy 2022-03-02 03:25:30 +00:00
Rob Ede 25c0673278
Update MIGRATION-4.0.md 2022-03-02 02:20:48 +00:00
Daze e7a05f9892
fix(docs): TestRequest example fixed (#2643)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-03-01 00:02:08 +00:00
Rob Ede 2f13e5f675
Update MIGRATION-4.0.md 2022-02-26 17:13:42 +00:00
Rob Ede 9f964751f6
tweak migration doc 2022-02-25 21:40:23 +00:00
Rob Ede fcca515387
prepare actix-multipart release 0.4.0 2022-02-25 20:41:57 +00:00
Rob Ede 075932d823
prepare actix-web-actors release 4.0.0 2022-02-25 20:41:33 +00:00
Rob Ede cb379c0e0c
prepare actix-files release 0.6.0 2022-02-25 20:36:16 +00:00
Rob Ede d4a5d450de
prepare actix-web release 4.0.1 2022-02-25 20:31:46 +00:00
Rob Ede 542200cbc2
update readme 2022-02-25 19:11:46 +00:00
Rob Ede d0c08dbb7d
prepare releases: actix-http 3.0.0 and actix-web 4.0.0 (#2663) 2022-02-25 18:46:35 +00:00
Rob Ede d0b5fb18d2
update migration guide on middleware 2022-02-22 17:40:38 +00:00
Rob Ede 12fb3412a5
remove concurrency groups 2022-02-22 12:52:07 +00:00
Rob Ede 2665357a0c
fix ci groups 2022-02-22 12:47:57 +00:00
Rob Ede 693271e571
add CI job concurrency groups 2022-02-22 12:41:08 +00:00
Rob Ede 10ef9b0751
remove useless doctest main fns 2022-02-22 12:32:06 +00:00
Rob Ede ce00c88963
fix changelog typo 2022-02-22 11:46:51 +00:00
Rob Ede 75e6ffb057
prepare actix-router release 0.5.0 (#2658) 2022-02-22 11:38:25 +00:00
Rob Ede ad38973767
move blocking error to web (#2660) 2022-02-22 08:45:28 +00:00
Rob Ede 1c1d6477ef
remove legacy ws test 2022-02-22 07:11:16 +00:00
Rob Ede 53509a5361
ignore all http1 connection headers in h2 2022-02-22 07:07:12 +00:00
Rob Ede a6f27baff1
flesh out Responder docs 2022-02-22 07:07:12 +00:00
Rob Ede 218e34ee17
fix http error debug impl 2022-02-22 07:07:12 +00:00
Rob Ede 11bfa84926
rename simple_service to status_service (#2659) 2022-02-22 07:06:36 +00:00
Rob Ede 5aa6f713c7
update errorhandlers migration guide 2022-02-22 06:23:01 +00:00
Rob Ede 151a15da74
prepare actix-http release 3.0.0-rc.4 2022-02-22 00:21:49 +00:00
Rob Ede 1ce58ecb30
fix dispatcher panic on pending flush
fixes thread panic in actix-http-3.0.0-rc.3 #2655
2022-02-22 00:19:48 +00:00
Luca Palmieri f940653981
Edits to the migration notes (#2654) 2022-02-19 17:05:54 +00:00
Rob Ede b291e29882
fix links 2022-02-18 03:41:10 +00:00
Xavier Lange f843776f36
Fix links in README (#2653) 2022-02-18 03:34:12 +00:00
Rob Ede 52f7d96358
tweak migration document 2022-02-17 19:13:03 +00:00
Rob Ede 51e573b888
prepare actix-test release 0.1.0-beta.13 2022-02-16 03:13:41 +00:00
Rob Ede 38e015432b
prepare actix-http-test release 3.0.0-beta.13 2022-02-16 03:13:22 +00:00
Rob Ede f5895d5eff
prepare actix-web-actors release 4.0.0-beta.12 2022-02-16 03:11:22 +00:00
Rob Ede a0c4bf8d1b
prepare awc release 3.0.0-beta.21 2022-02-16 03:10:01 +00:00
Rob Ede 594e3a6ef1
prepare actix-http release 3.0.0-rc.3 2022-02-16 03:07:12 +00:00
Rob Ede a808a26d8c
bump actix-codec to 0.5 2022-02-15 20:49:10 +00:00
Rob Ede de62e8b025
add nextest to post-merge ci 2022-02-15 14:40:26 +00:00
Rob Ede 3486edabcf
update migrations guide re tokio v1 2022-02-15 00:54:12 +00:00
Ibraheem Ahmed 4c59a34513
Remove clone implementation for Path (#2639) 2022-02-10 10:29:00 +00:00
Rob Ede 1b706b3069
update body type migration guide 2022-02-09 16:12:39 +00:00
Rob Ede a9f445875a
update migration guide 2022-02-09 12:31:06 +00:00
Rob Ede e0f02c1d9e
update migration guide 2022-02-08 16:53:09 +00:00
Rob Ede 092dbba5b9
update migration guide 2022-02-08 15:24:35 +00:00
Rob Ede ff4b2d251f
fix impl assertions 2022-02-08 14:32:57 +00:00
Rob Ede 98faa61afe
fix impl assertions 2022-02-08 13:37:01 +00:00
Rob Ede 3f2db9e75c
fix doc tests 2022-02-08 12:25:13 +00:00
Rob Ede 074d18209d
better document relationship with tokio 2022-02-08 10:21:47 +00:00
Rob Ede 593fbde46a
prepare actix-web release 4.0.0-rc.3 2022-02-08 09:31:48 +00:00
Rob Ede 161861997c
prepare actix-http release 3.0.0-rc.2 2022-02-08 09:31:20 +00:00
Rob Ede 3d621677a5
clippy 2022-02-08 08:00:47 +00:00
Ali MJ Al-Nasrawy 0c144054cb
make Condition generic over body type (#2635)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-02-08 07:50:05 +00:00
Rob Ede b0fbe0dfd8
fix workers doc 2022-02-08 06:58:33 +00:00
Darin Gordon b653bf557f
added note to v4 migration guide about worker thread update (#2634) 2022-02-07 19:04:03 +00:00
Rob Ede 1d1a65282f
RC refinements (#2625) 2022-02-04 20:37:33 +00:00
Rob Ede b0a363a7ae
add migration note about fromrequest::configure 2022-02-04 18:48:22 +00:00
Rob Ede b4d3c2394d
clean up migration guide 2022-02-04 18:22:38 +00:00
Rob Ede 5ca42df89a
fix stuck connection when handler doesn't read payload (#2624) 2022-02-03 07:03:39 +00:00
Rob Ede fc5ecdc30b
fix changelog 2022-02-02 03:55:43 +00:00
Rob Ede 7fe800c3ff
prepare actix-web release 4.0.0-rc.2 2022-02-02 03:54:26 +00:00
Rob Ede 075df88a07
update 4.0 migration guide 2022-02-02 03:42:07 +00:00
Rob Ede 391d8a744a
update 4.0 migratio guide 2022-02-02 03:13:11 +00:00
Rob Ede 5b6cb681b9
update 4.0 migration guide 2022-02-02 03:09:33 +00:00
Rob Ede 0957ec40b4
split migration file 2022-02-02 02:46:37 +00:00
Rob Ede ccf430d74a
disable coverage job 2022-02-01 15:24:35 +00:00
Rob Ede c84c1f0f15
simplify macros feature 2022-02-01 14:39:49 +00:00
Tomáš Hromada e9279dfbb8
Fix deprecated notice about client_shutdown (#2621) 2022-02-01 13:44:56 +00:00
Rob Ede a68239adaa
bump zstd to 0.10 2022-02-01 13:35:32 +00:00
Rob Ede 40a4b1ccd5
add macro feature (#2619)
Co-authored-by: Ibraheem Ahmed <ibrah1440@gmail.com>
2022-02-01 02:35:05 +00:00
Rob Ede 7f5a8c0851
fix vmanifest 2022-02-01 00:33:41 +00:00
Rob Ede bcdde1d4ea
move actix-web to own dir 2022-02-01 00:30:41 +00:00
Rob Ede 30aa64ea32
update dep graphs 2022-02-01 00:23:58 +00:00
Rob Ede 5469b02638
prepare actix-web-codegen release 0.5.0-rc.2 2022-02-01 00:12:42 +00:00
Rob Ede a66cd38ec5
prepare actix-web-actors release 4.0.0-beta.11 2022-01-31 22:35:18 +00:00
Rob Ede 20609e93fd
prepare actix-test release 0.1.0-beta.12 2022-01-31 22:34:59 +00:00
Rob Ede bf282472ab
prepare actix-http-test release 3.0.0-beta.12 2022-01-31 22:33:38 +00:00
Rob Ede 7f4b44c258
prepare actix-multipart release 0.4.0-beta.13 2022-01-31 22:33:11 +00:00
Rob Ede 66243717b3
prepare actix-files release 0.6.0-beta.16 2022-01-31 22:32:52 +00:00
Rob Ede 102720d398
prepare awc release 3.0.0-beta.20 2022-01-31 22:32:09 +00:00
Rob Ede c3c7eb8df9
prepare actix-web release 4.0.0-rc.1 2022-01-31 22:23:33 +00:00
Rob Ede 21f57caf4a
prepare actix-http release 3.0.0-rc.1 2022-01-31 22:22:40 +00:00
Rob Ede 47f5faf26e
prepare actix-router release 0.5.0-rc.3 2022-01-31 22:21:30 +00:00
Rob Ede 9777653dc0
prep readme for rc release 2022-01-31 22:20:53 +00:00
Ali MJ Al-Nasrawy 9fde5b30db
tweak and document router (#2612)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-01-31 22:12:48 +00:00
Ali MJ Al-Nasrawy fd412a8223
Quoter::requote returns Vec<u8> (#2613) 2022-01-31 21:26:34 +00:00
Rob Ede cd511affd5
add ws and http2 feature flags (#2618) 2022-01-31 21:22:23 +00:00
Rob Ede 3200de3f34
fix request head timeout (#2611) 2022-01-31 17:30:34 +00:00
Rob Ede b3e84b5c4b
tweak default_service docs 2022-01-28 20:53:51 +00:00
Luca Palmieri a3416112a5
Improve the documentation for default_service (#2614) 2022-01-28 20:31:54 +00:00
Rob Ede 21a08ca796
tweak set_content_encoding docs 2022-01-28 20:27:16 +00:00
Luca Palmieri a9f497d05f
Guard against broken intra-doc links in CI (#2616) 2022-01-28 17:28:16 +00:00
Rob Ede cc9ba162f7
add late request dispatcher test 2022-01-27 17:00:07 +00:00
Rob Ede 37799df978
add basic dispatcher test 2022-01-27 06:42:54 +00:00
Rob Ede 0d93a8c273
add examples readme 2022-01-27 06:32:28 +00:00
Rob Ede 3ae4f0a629
add keep-alive dispatcher tests 2022-01-27 06:29:46 +00:00
Rob Ede 14a4f325d3
move dispatcher tests to own file 2022-01-27 06:06:55 +00:00
Rob Ede 1bd2076b35
prevent drive traversal in windows 2022-01-25 16:44:05 +00:00
Rob Ede 5454699bab
propagate response error in all necessary places 2022-01-24 11:56:23 +00:00
Rob Ede d7c5c966d2
remove impl Future for HttpResponse (#2601) 2022-01-24 11:56:01 +00:00
Rob Ede 50894e392e
document new body map types 2022-01-23 23:26:35 +00:00
Rob Ede 008753f07a
improve body docs 2022-01-23 03:57:08 +00:00
Rob Ede c92aa31f91
document full percent-decoding of web::Path 2022-01-22 16:17:46 +00:00
Rob Ede c25dd23820
move path impls to derives 2022-01-22 04:02:34 +00:00
Rob Ede acacb90b2e
add actix-http 2.2.2 changelog 2022-01-21 21:24:09 +00:00
Rob Ede 8459f566a8
fix brotli encoding buffer size 2022-01-21 21:17:07 +00:00
Rob Ede 232a14dc8b
prepare actix-files release 0.6.0-beta.15 2022-01-21 20:27:29 +00:00
Rob Ede 6e9f5fba24
prepare awc release 3.0.0-beta.19 2022-01-21 20:25:46 +00:00
Rob Ede c5d6df0078
prepare actix-web release 4.0.0-beta.21 2022-01-21 20:23:29 +00:00
Rob Ede 8865540f3b
prepare actix-http release 3.0.0-beta.19 2022-01-21 20:21:49 +00:00
Rob Ede 141790b200
use camel case in special headers
fixes #2595
2022-01-21 20:15:43 +00:00
Rob Ede 9668a2396f
prepare actix-router release 0.5.0-rc.2 2022-01-21 17:21:46 +00:00
Rob Ede cb7347216c
add Logger::log_target (#2594) 2022-01-21 17:19:17 +00:00
Rob Ede ae7f71e317
remove ambiguous HttpResponseBuilder::del_cookie (#2591) 2022-01-21 17:18:07 +00:00
Rob Ede bc89f0bfc2
s/example/examples 2022-01-21 16:56:33 +00:00
Rob Ede c959916346
fmt codegen 2022-01-20 01:54:57 +00:00
Rob Ede f227e880d7
refactor route codegen to be cleaner 2022-01-20 01:53:02 +00:00
Rob Ede 68ad81f989
remove debug logs 2022-01-20 01:30:33 +00:00
Rob Ede f2e736719a
add url_for test for conflicting named resources 2022-01-20 01:30:33 +00:00
Rob Ede 81ef12a0fd
add warn log to from_parts if given request is cloned
closes #2562
2022-01-19 22:23:53 +00:00
Rob Ede 1bc1538118
use tokio::main in client example 2022-01-19 21:36:14 +00:00
Rob Ede 1cc3e7b24c
deprecate Path::path (#2590) 2022-01-19 20:26:33 +00:00
Rob Ede 3dd98c308c
document Path::unprocessed panic 2022-01-19 18:33:23 +00:00
Rob Ede cb5d9a7e64
bump deps to stable actix-server v2 2022-01-19 16:58:11 +00:00
Rob Ede 5ee555462f
add HttpResponse::add_removal_cookie (#2586) 2022-01-19 16:36:11 +00:00
Rob Ede ad159f5219
fix ClientResponse::body doc
fixes #2589
2022-01-19 15:52:16 +00:00
Rob Ede 2ffc21dd4f
move response extensions out of head (#2585) 2022-01-19 02:09:25 +00:00
Rob Ede 7b8a392ef5
allow camel case response headers (#2587) 2022-01-16 03:16:26 +00:00
Rob Ede 3c7ccf5521
update http changelog 2022-01-15 15:43:18 +00:00
Rob Ede e7cae5a95b
migrate to brotli crate (#2538) 2022-01-15 14:03:16 +00:00
Rob Ede 455d5c460d
prepare actix-files release 0.6.0-beta.14 2022-01-14 20:01:11 +00:00
Rob Ede 8faca783fa
prepare actix-web release 4.0.0-beta.20 2022-01-14 20:00:26 +00:00
Rob Ede edbb9b047e
prepare actix-router release 0.5.0-rc.1 2022-01-14 19:59:36 +00:00
Ali MJ Al-Nasrawy 32742d0715
support opaque app in test helpers (#2584) 2022-01-14 19:45:32 +00:00
Ali MJ Al-Nasrawy d90c1a2331
convert error in Result extractor (#2581)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-01-12 18:59:22 +00:00
Ali MJ Al-Nasrawy 2a12b41456
fix support for 12 extractors (#2582)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-01-12 18:31:48 +00:00
Rob Ede 6c97d448b7
update tokio-uring to 0.2 (#2583) 2022-01-12 17:53:36 +00:00
Ali MJ Al-Nasrawy c3ce33df05
unify generics across App, Scope and Resource (#2572)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-01-05 15:02:28 +00:00
Rob Ede 4431c8da65
fix bench 2022-01-05 14:10:38 +00:00
Michael 2d11ab5977
Add ServiceConfig::configure (#1988)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-01-05 12:31:39 +00:00
Rob Ede 4ebf16890d
add GuardContext::header (#2569) 2022-01-05 11:47:14 +00:00
Ali MJ Al-Nasrawy fe0bbfb3da
optimize PathDeserializer (#2570) 2022-01-05 10:48:20 +00:00
Ali MJ Al-Nasrawy 2462b6dd5d
generalize impl Responder for HttpResponse (#2567)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-01-05 04:42:52 +00:00
Ali MJ Al-Nasrawy 49cfabeaf5
simplify Resource trait (#2568)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-01-05 04:34:13 +00:00
Rob Ede 0f7292c69a
remove readme msrv link 2022-01-05 04:24:40 +00:00
Rob Ede 8bbf2b5052
prepare actix-test release 0.1.0-beta.11 2022-01-04 15:37:48 +00:00
Rob Ede 8c975bcc1f
prepare actix-http-test release 3.0.0-beta.11 2022-01-04 15:37:33 +00:00
Rob Ede 742ad56d30
prepare actix-web-actors release 4.0.0-beta.10 2022-01-04 15:37:14 +00:00
Rob Ede bcc8d5c441
prepare actix-multipart release 0.4.0-beta.12 2022-01-04 15:36:56 +00:00
Rob Ede f659098d21
prepare awc release 3.0.0-beta.18 2022-01-04 15:35:21 +00:00
Rob Ede 8621ae12f8
prepare actix-web release 4.0.0-beta.19 2022-01-04 15:35:08 +00:00
Rob Ede b338eb8473
prepare actix-http release 3.0.0-beta.18 2022-01-04 15:34:52 +00:00
Rob Ede 5abd1c2c2c
prepare actix-web-codegen release 0.5.0-rc.1 2022-01-04 15:34:16 +00:00
Rob Ede 05336269f9
prepare actix-router release 0.5.0-beta.4 2022-01-04 15:33:44 +00:00
Rob Ede 86df295ee2
fully percent decode path segments when capturing (#2566) 2022-01-04 15:19:29 +00:00
Rob Ede 85c9b1a263
move quoter 2022-01-04 12:58:40 +00:00
Rob Ede 577597a80a
rename on-connect example 2022-01-04 12:54:20 +00:00
Ali MJ Al-Nasrawy 374dc9bfc9
files: percent-decode url path (#2398)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2022-01-04 12:54:11 +00:00
Rob Ede 93754f307f
try path config from Data as well 2022-01-04 04:08:46 +00:00
Rob Ede c7639bc3be
document quoter 2022-01-04 03:48:12 +00:00
Rob Ede 0bc4ae9158
remove BodyEncoding trait (#2565) 2022-01-03 18:46:04 +00:00
Rob Ede 19a46e3925
fix doc test 2022-01-03 15:35:47 +00:00
Rob Ede 68cd853aa2
improve docs for Compress 2022-01-03 14:59:01 +00:00
Rob Ede 25fe1bbaa5
add double compress layer test 2022-01-03 14:05:08 +00:00
Rob Ede e890307091
Fix AcceptEncoding header (#2501) 2022-01-03 13:17:57 +00:00
Rob Ede b708924590
only run nightly checks on master ci 2021-12-31 08:38:58 +00:00
Rob Ede 5dcb250237
fix doc test 2021-12-31 07:53:53 +00:00
Rob Ede b4ff6addfe
use match name if possible in data debug log 2021-12-30 07:15:57 +00:00
Rob Ede 231a24ef8d
improve application data docs 2021-12-30 07:11:35 +00:00
Rob Ede 6df4974234
prepare awc release 3.0.0-beta.17 2021-12-29 10:17:28 +00:00
Rob Ede a80e93d6db
prepare actix-web release 4.0.0-beta.18 2021-12-29 10:17:11 +00:00
Rob Ede 542c92c9a7
tweak changelogs 2021-12-29 10:06:36 +00:00
Luca Palmieri 74738c63a7
Upgrade time dependency (via cookie) (#2555) 2021-12-29 10:03:25 +00:00
Rob Ede a87e01f0d1
bump msrv to 1.54 2021-12-29 08:59:15 +00:00
Rob Ede 9779010a5a
prepare actix-files release 0.6.0-beta.12 2021-12-29 07:08:10 +00:00
Rob Ede 11d50d792b
prepare actix-web release 4.0.0-beta.17 2021-12-29 07:07:51 +00:00
Rob Ede 798e9911e9
prepare awc release 3.0.0-beta.16 2021-12-29 07:07:46 +00:00
Rob Ede 2b2de29800
never return port in realip_remote_addr (#2554) 2021-12-28 14:52:43 +00:00
Rob Ede 0f5c876c6b
tweak guard docs 2021-12-28 14:50:48 +00:00
Rob Ede 96a4dc9dec
use modern signatures for awc send_* and header methods (#2553) 2021-12-28 03:22:22 +00:00
Rob Ede 4616ca8ee6
rework Guard trait (#2552) 2021-12-28 02:37:13 +00:00
Rob Ede 36193b0a50
specify tokio dep to avoid RUSTSEC-2021-0124 warning 2021-12-27 18:54:10 +00:00
Rob Ede 76684a786e
update server dep to rc2 (#2550) 2021-12-27 18:45:31 +00:00
Rob Ede 2308f8afa4
use const header values where possible 2021-12-27 16:15:33 +00:00
Ali MJ Al-Nasrawy 554ae7a868
rework Handler trait (#2549) 2021-12-27 00:44:30 +00:00
Rob Ede ac0c4eb684
update actix-tls references to stable 3.0.0 2021-12-26 21:24:03 +00:00
Rob Ede 2e493cf791
remove crate level clippy allows 2021-12-25 04:53:51 +00:00
Rob Ede 5860fe5381
expose Handler trait 2021-12-25 04:43:59 +00:00
Rob Ede adf9935841
improve scope documentation
closes #2389
2021-12-25 03:44:09 +00:00
Mark Lodato 34e5c7c799
Improve module docs for error handler middleware (#2543) 2021-12-25 02:35:19 +00:00
Rob Ede 01cbfc5724
reduce -http re-exports in awc 2021-12-25 02:34:35 +00:00
Rob Ede 3756dfc2ce
move client to own module 2021-12-25 02:34:31 +00:00
Rob Ede d2590fd46c
ClientRequest::send_body takes impl MessageBody (#2546) 2021-12-25 02:33:37 +00:00
Rob Ede 1296e07c48
relax unpin bounds on payload types (#2545) 2021-12-24 17:47:47 +00:00
Ali MJ Al-Nasrawy 7b1512d863
allow any body type in Scope (#2523) 2021-12-22 15:48:59 +00:00
Rob Ede cd025f5c0b
allow any body type in Resource (#2526) 2021-12-22 15:00:32 +00:00
Rob Ede 1769812d0b
bump outdated deps 2021-12-22 08:43:38 +00:00
Rob Ede 324eba7e0b
tighten tokio version range to prevent RUSTSEC-2021-0124 2021-12-22 08:41:44 +00:00
Rob Ede b3ac918d70
update itoa to v1 2021-12-22 08:34:48 +00:00
Rob Ede de20d21703
use dash hyphenation in markdown 2021-12-22 08:21:30 +00:00
Rob Ede 212c6926f9
Revert "use dash hyphenation in changelogs"
This reverts commit 1ea619f2a1.
2021-12-22 08:18:44 +00:00
Rob Ede 1ea619f2a1
use dash hyphenation in changelogs 2021-12-22 08:17:35 +00:00
Rob Ede 40a0162074
add tests to scope and resource for returning from fns 2021-12-22 07:58:37 +00:00
Rob Ede f8488aff1e
upstream changelog for v3.3.3 2021-12-22 07:20:53 +00:00
Rob Ede 64c2e5e1cd
remove crate level clippy lint 2021-12-22 07:16:07 +00:00
Rob Ede 17f636a183
split request and response modules (#2530) 2021-12-19 17:05:27 +00:00
Rob Ede 2e00776d5e
Update FUNDING.yml 2021-12-19 04:18:57 +00:00
Rob Ede 7d507a41ee
Create FUNDING.yml 2021-12-19 03:58:29 +00:00
Rob Ede fb036264cc
only build SslConnectorBuilder once (#2503) 2021-12-18 16:44:30 +00:00
Rob Ede d2b9724010
update bump script to detect prerelease versions 2021-12-18 03:27:32 +00:00
Rob Ede 5c53db1e4d
remove hidden anybody 2021-12-18 01:48:16 +00:00
Thales 84ea9e7e88
http: Replace header::map::GetAll with std::slice::Iter (#2527) 2021-12-18 00:05:12 +00:00
Rob Ede 0bd5ccc432
update changelog 2021-12-17 21:39:15 +00:00
Rob Ede 9cd8526085
prepare actix-router release 0.5.0-beta.3 2021-12-17 21:24:34 +00:00
Rob Ede 73bbe56971
prepare actix-test release 0.1.0-beta.9 2021-12-17 21:00:15 +00:00
Rob Ede 8340b63b7b
prepare awc release 3.0.0-beta.14 2021-12-17 20:59:59 +00:00
Rob Ede 6c2c7b68e2
prepare actix-web release 4.0.0-beta.15 2021-12-17 20:59:01 +00:00
Rob Ede 7bf47967cc
prepare actix-http release 3.0.0-beta.16 2021-12-17 20:57:51 +00:00
Rob Ede ae47d96fc6
use body::None in encoder body 2021-12-17 20:56:54 +00:00
Rob Ede 5842a3279d
update messagebody documentation 2021-12-17 19:35:08 +00:00
Rob Ede 1d6f5ba6d6
improve codegen on BoxBody poll_next 2021-12-17 19:19:21 +00:00
Rob Ede aa31086af5
improve BoxBody Debug impl 2021-12-17 19:16:42 +00:00
Ali MJ Al-Nasrawy 57ea322ce5
simplify MessageBody::complete_body interface (#2522) 2021-12-17 19:09:08 +00:00
Rob Ede 2cf27863cb
remove direct dep on pin-project in -http (#2524) 2021-12-17 14:13:54 +00:00
Rob Ede 5359fa56c2
include source for dispatch body errors 2021-12-17 01:29:41 +00:00
Rob Ede a2467718ac
passthrough StreamLog error type 2021-12-17 01:27:27 +00:00
Ali MJ Al-Nasrawy 3c0d059d92
MessageBody::boxed (#2520)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-12-17 00:43:40 +00:00
Rob Ede 44b7302845
minimize futures-util dep in actix-http 2021-12-16 22:26:45 +00:00
Ali MJ Al-Nasrawy a6d5776481
various fixes to MessageBody::complete_body (#2519) 2021-12-16 22:25:10 +00:00
Rob Ede 156cc20ac8
refactor testing utils (#2518) 2021-12-15 01:44:51 +00:00
Rob Ede dd4a372613
allow error handler middleware to return different body type (#2515) 2021-12-14 21:17:50 +00:00
Rob Ede 05255c7f7c
remove either crate conversions (#2516) 2021-12-14 19:57:18 +00:00
Rob Ede fb091b2b88
split up router pattern and resource_path modules 2021-12-14 18:59:59 +00:00
Rob Ede 11ee8ec3ab
align remaining header map terminology (#2510) 2021-12-13 16:08:08 +00:00
Rob Ede 551a0d973c
doc tweaks 2021-12-13 02:58:19 +00:00
Rob Ede cea44be670
add test for returning App from function 2021-12-11 16:18:28 +00:00
Rob Ede b41b346c00
inline trivial body methods 2021-12-11 16:05:08 +00:00
Rob Ede 5b0a50249b
prepare actix-multipart release 0.4.0-beta.10 2021-12-11 00:35:26 +00:00
Rob Ede 60b030ff53
prepare actix-web-actors release 4.0.0-beta.8 2021-12-11 00:34:23 +00:00
Rob Ede fc4e9ff96b
prepare actix-web-codegen release 0.5.0-beta.6 2021-12-11 00:33:31 +00:00
Rob Ede 6481a5fb73
prepare actix-test release 0.1.0-beta.8 2021-12-11 00:32:26 +00:00
Rob Ede 0cd7c17682
prepare actix-http-test release 3.0.0-beta.9 2021-12-11 00:32:00 +00:00
Rob Ede ed2f5b40b9
prepare actix-files release 0.6.0-beta.10 2021-12-11 00:31:41 +00:00
Rob Ede cc37be9700
prepare actix-web release 4.0.0-beta.14 2021-12-11 00:30:12 +00:00
Rob Ede e1cdabe5cb
prepare awc release 3.0.0-beta.13 2021-12-11 00:28:38 +00:00
Rob Ede d0f4c809ca
prepare actix-http release 3.0.0-beta.15 2021-12-11 00:22:09 +00:00
Rob Ede 65dd5dfa7b
bump script updates referenced crate versions 2021-12-11 00:21:30 +00:00
Rob Ede f62383a975
unpin h2 2021-12-10 22:13:12 +00:00
Ali MJ Al-Nasrawy f9348d7129
add ServiceResponse::into_parts (#2499) 2021-12-09 14:57:27 +00:00
Rob Ede 774ac7fec4
provide optimisation path for single-chunk body types (#2497) 2021-12-09 13:52:35 +00:00
Rob Ede 69fa17f66f
clean future h2 dispatcher 2021-12-09 11:27:29 +00:00
Rob Ede 816d68dee8
pin h2 temporarily 2021-12-09 00:46:28 +00:00
Rob Ede 7dc034f0fb
Remove extensions from head (#2487) 2021-12-08 22:58:50 +00:00
Rob Ede 07f2fe385b
standardize crate level lints 2021-12-08 06:09:56 +00:00
Rob Ede 406f694095
standardize rustfmt max_width 2021-12-08 06:01:11 +00:00
Rob Ede e49e559f47
fix some docs 2021-12-08 05:43:50 +00:00
Rob Ede d35b7644dc
add connection level data container (#2491) 2021-12-07 17:23:34 +00:00
fakeshadow 069cf2da07
enable scope middleware with generic res body. (#2492)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-12-07 16:26:28 +00:00
fakeshadow 6460e67f84
remove generic body type in App. (#2493) 2021-12-07 15:53:04 +00:00
Rob Ede 9587261c20
add fakeshadow's actix-web in actix-http example 2021-12-07 15:31:15 +00:00
Rob Ede 606a371ec3
improve Data docs 2021-12-06 17:14:56 +00:00
Rob Ede bed72d9bb7
fix examples 2021-12-05 23:23:36 +00:00
Rob Ede c596f573a6
bump actix-server to rc.1 2021-12-05 21:25:15 +00:00
Ali MJ Al-Nasrawy 627c0dc22f
workaround rustdoc bug for Error (#2489) 2021-12-05 16:19:08 +00:00
Rob Ede 2d053b7036
remove actix_http::http module (#2488) 2021-12-05 14:37:20 +00:00
Ali MJ Al-Nasrawy 59be0c65c6
disallow query or fragements in url_for constructions (#2430)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-12-05 04:39:18 +00:00
Rob Ede e1a2d9c606
Quality / QualityItem improvements (#2486) 2021-12-05 03:38:08 +00:00
Rob Ede d89c706cd6
re-instate Range typed header (#2485)
Co-authored-by: RideWindX <ridewindx@gmail.com>
2021-12-05 00:02:25 +00:00
Mohammed Sazid Al Rashid 4c9ca7196d
Add WsResponseBuilder to build web socket session response (#1920)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-12-04 22:32:44 +00:00
Rob Ede fa7f3e6908
undeprecate App::data_factory (#2484) 2021-12-04 19:41:15 +00:00
Rob Ede c7c02ef99d
body ergonomics v3 (#2468) 2021-12-04 19:40:47 +00:00
fakeshadow a2d5c5a058
Use cilent time out for h2 handshake timeout. (#2483) 2021-12-02 18:16:34 +00:00
Rob Ede deece8d519
re-instate accept-encoding typed header (#2482) 2021-12-02 17:04:40 +00:00
Rob Ede 2a72bdae09
improve typed header macro (#2481) 2021-12-02 15:25:39 +00:00
Rob Ede 075d871e63
wrap LanguageTags type in new AnyOrSome type to support wildcards (#2480) 2021-12-02 13:59:25 +00:00
Rob Ede c4b20df56a
convert all remaining IETF RFC links to new format 2021-12-02 03:45:04 +00:00
Rob Ede 0df275c478
update all IETF RFC links to new URL format 2021-12-01 19:42:02 +00:00
Rob Ede 697238fadc
prepare actix-multipart release 0.4.0-beta.9 2021-12-01 00:26:07 +00:00
Rob Ede e045418038
prepare for actix-tls rc.1 (#2474) 2021-11-30 14:12:04 +00:00
Rob Ede a978b417f3
use actix ready future in remaining return types 2021-11-30 13:11:41 +00:00
fakeshadow fa82b698b7
remove pin-project from actix-web. (#2471) 2021-11-30 11:16:53 +00:00
Rob Ede fc4cdf81eb
expose header::map module (#2470) 2021-11-29 02:22:47 +00:00
Ali MJ Al-Nasrawy 654dc64a09
don't hang after dropping mutipart (#2463) 2021-11-29 02:00:24 +00:00
fakeshadow cf54388534
re-work from request macro. (#2469) 2021-11-29 01:23:27 +00:00
Rob Ede 39243095b5
guarantee ordering of header map get_all (#2467) 2021-11-28 19:23:29 +00:00
fakeshadow 89c6d62656
clean up multipart and field stream trait impl (#2462) 2021-11-25 00:10:53 +00:00
fakeshadow 52bbbd1d73
Mnior cleanup of multipart API. (#2461) 2021-11-24 20:53:11 +00:00
Rob Ede 3e6e9779dc
fix big5 charset parsing 2021-11-24 20:16:15 +00:00
Rob Ede 9bdd334bb4
add test for duplicate dynamic segent name 2021-11-23 15:57:18 +00:00
Rob Ede bcbbc115aa
fix awc changelog 2021-11-23 15:12:55 +00:00
Rob Ede ab5eb7c1aa
prepare actix-multipart release 0.4.0-beta.8 2021-11-22 18:48:14 +00:00
Rob Ede 18b8ef0765
prepare actix-test release 0.1.0-beta.7 2021-11-22 18:47:43 +00:00
Rob Ede b806b4773c
prepare actix-http-test release 3.0.0-beta.7 2021-11-22 18:46:58 +00:00
Rob Ede 0062d99b6f
prepare actix-files release 0.6.0-beta.9 2021-11-22 18:46:19 +00:00
Rob Ede 99e6a9c26d
prepare awc release 3.0.0-beta.11 2021-11-22 18:41:43 +00:00
Rob Ede 5f5bd2184e
prepare actix-web release 4.0.0-beta.12 2021-11-22 18:20:55 +00:00
Rob Ede 88e074879d
prepare actix-http release 3.0.0-beta.13 2021-11-22 18:19:09 +00:00
fakeshadow e7987e7429
awc: support http2 over plain tcp with feature flag (#2439)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-11-22 18:16:56 +00:00
Rob Ede a172f5968d
prepare for actix-tls v3 beta 9 (#2456) 2021-11-22 15:37:23 +00:00
Rob Ede a2a42ec152
use anybody in doc test 2021-11-22 01:35:33 +00:00
fakeshadow dd347e0bd0
implement io-uring for actix-files (#2408)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-11-22 01:19:09 +00:00
Rob Ede 194a691537
files: 304 Not Modified responses omit Content-Length header (#2453) 2021-11-19 14:04:12 +00:00
Rob Ede 56ee97f722
add files path traversal tests 2021-11-18 18:14:34 +00:00
Ali MJ Al-Nasrawy 66620a1012
simplify handler.rs (#2450) 2021-11-17 20:11:35 +00:00
Rob Ede e33618ed6d
ensure content disposition header in multipart (#2451)
Co-authored-by: Craig Pastro <craig.pastro@gmail.com>
2021-11-17 17:44:50 +00:00
Rob Ede 1fe309bcc6
increase ci test timeout 2021-11-17 15:32:42 +00:00
fakeshadow 168a7284d3
fix actix_http::Error conversion. (#2449) 2021-11-17 13:13:05 +00:00
Rob Ede 68a3acb9c2
bump zstd dep 2021-11-16 23:22:29 +00:00
Rob Ede 84c6d25fd3
bump env logger dep 2021-11-16 23:07:08 +00:00
Rob Ede 0a135c7dc9
bump actix-codec to 0.4.1 2021-11-16 22:41:24 +00:00
Rob Ede 668a33c793
remove internal usage of Body 2021-11-16 22:10:30 +00:00
Rob Ede d8cbb879dd
make AnyBody generic on Body type (#2448) 2021-11-16 21:41:35 +00:00
Rob Ede 13cf5a9e44
remove chunked encoding header for websockets 2021-11-16 16:55:45 +00:00
Rob Ede 4df1cd78b7
simplify AnyBody and BodySize (#2446) 2021-11-16 09:21:10 +00:00
Rob Ede e8a0e16863
run tarpaulin on workspace 2021-11-15 18:11:51 +00:00
Rob Ede a2f59c02f7
bump actix-server to beta 9 (#2442) 2021-11-15 04:03:33 +00:00
Rob Ede 2754608f3c
fix codegen tests 2021-11-08 02:46:43 +00:00
Ibraheem Ahmed c020cedb63
Log internal server errors (#2387) 2021-11-07 17:02:23 +00:00
fakeshadow 5e554dca35
fix awc clippy warning (#2431) 2021-11-04 15:57:55 +00:00
fakeshadow 6ec2d7b909
add keep alive to h2 through ping pong (#2433) 2021-11-04 15:15:23 +00:00
Ali MJ Al-Nasrawy ec6d284a8e
improve "data no configured" message (#2429) 2021-10-31 13:19:21 +00:00
fakeshadow be9530eb72
avoid building actix-tls with no-default-features (#2426) 2021-10-26 13:16:48 +01:00
Luca Palmieri 855e260fdb
Add html_utf8 content type. (#2423) 2021-10-26 09:24:38 +01:00
fakeshadow d13854505f
move actix_http::client module to awc (#2425) 2021-10-26 00:37:40 +01:00
fakeshadow d40b6748bc
remove dead dep (#2420) 2021-10-22 00:22:58 +01:00
Rob Ede c79b9a0df3
prepare actix-files release 0.6.0-beta.8 2021-10-20 23:32:46 +01:00
Rob Ede 4af414064b
prepare actix-multipart release 0.4.0-beta.7 2021-10-20 23:31:46 +01:00
Rob Ede 9abe166d52
actix-web beta 10 releases (#2417) 2021-10-20 22:32:05 +01:00
Rob Ede c09ec6af4c
split off coverage ci job 2021-10-20 02:27:30 +01:00
Rob Ede 37f2bf5625
clippy 2021-10-20 02:06:51 +01:00
Rob Ede 4f6f0b0137
chore: Bump rustls to 0.20.0 (#2416)
Co-authored-by: Kirill Mironov <vetrokm@gmail.com>
2021-10-20 02:00:11 +01:00
Rob Ede 591abc37c3
add test runtime macro (#2409) 2021-10-19 17:30:32 +01:00
Rob Ede ad22cc4e7f
bump msrv to 1.52.1 2021-10-19 01:59:28 +01:00
Rob Ede efdf3ab1c3
clippy 2021-10-19 01:32:58 +01:00
Rob Ede 6b3ea4fc61
copy original route macro input with compile errors (#2410) 2021-10-14 18:06:31 +01:00
James Rhodes 99985fc4ec
web: implement into_inner for Data<T: ?Sized> (#2407) 2021-10-12 18:35:33 +01:00
Omid Rad a6707fb7ee
Remove checked_expr (#2401) 2021-10-11 18:28:09 +01:00
Rob Ede a3806cde19
fix changelog 2021-09-12 22:41:08 +01:00
Jake efefa0d0ce
web: add option to not require content type header for Json (#2362)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-09-11 17:27:50 +01:00
Rob Ede 450ff5fa1d
improve extract docs (#2384) 2021-09-11 16:48:47 +01:00
Arniu Tseng 8ae278cb68
Remove FromRequest::Config (#2233)
Co-authored-by: Jonas Platte <jplatte@users.noreply.github.com>
Co-authored-by: Igor Aleksanov <popzxc@yandex.ru>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-09-11 01:11:16 +01:00
Rob Ede 46699e3429
remove time dep from actix-http (#2383) 2021-09-11 00:01:01 +01:00
Rob Ede ba88d3b4bf
prepare actix-web beta.9 releases (#2381)
* prepare actix-router release 0.5.0-beta.2

* prepare actix-web-codegen release 0.5.0-beta.4

* prepare actix-http release 3.0.0-beta.10

* prepare awc release 3.0.0-beta.8

* prepare actix-web release 4.0.0-beta.9

* prepare actix-http-test release 3.0.0-beta.6

* prepare actix-test release 0.1.0-beta.4

* prepare actix-files release 0.6.0-beta.7

* prepare actix-multipart release 0.4.0-beta.6

* prepare actix-web-actors release 4.0.0-beta.7

* fix http test version

* re-add patch

* update router repo url

* fix http test readme version
2021-09-09 01:35:41 +01:00
Ibraheem Ahmed 8dd30611fa
accept owned strings in TestRequest::param (#2172)
* accept owned strings in TestRequest::param

* bump actix-router to 0.4.0

* update changelog

Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-09-09 00:42:40 +01:00
Rob Ede 1383c7d701
speed up ci 2021-09-08 17:42:14 +01:00
Rob Ede d8a0f46f26
refactor web module (#2379) 2021-09-03 18:00:43 +01:00
Omid Rad 53ec66caf4
Send headers within the redirect requests. (#2310) 2021-09-01 20:16:41 +01:00
Rob Ede 93112644d3
non exhaustive content encoding (#2377) 2021-09-01 09:53:26 +01:00
Arthur Le Moigne ddc8c16cb3
Fix quality parse error in Accept-Encoding HTTP header (#2344) 2021-09-01 09:08:29 +01:00
Ali MJ Al-Nasrawy 373b3f91df
rework ResourceMap internals (#2337) 2021-09-01 04:48:43 +01:00
Ali MJ Al-Nasrawy 7d01ece355
ResourceDef: support multiple-patterns as prefix (#2356)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-08-31 14:15:22 +01:00
Rob Ede c50eef6166
"deprecate" calls to NormalizePath::default 2021-08-31 04:19:02 +01:00
Rob Ede dade818eba
add middleware composition tests (#2375) 2021-08-31 04:18:54 +01:00
Rob Ede ae35e69382
use rust 1.51 features 2021-08-31 02:52:29 +01:00
Rob Ede 5128b1bdfc
bump msrv to 1.51 2021-08-30 23:19:03 +01:00
Aravinth Manivannan 168b2f227d
compile time validation of path (#2350)
* compile time validation of path

* added trybuild err message

* Update Cargo.toml

* add changelog entry

* test more cases of path validation

* fmt

Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-08-30 21:50:40 +01:00
Sam De Roeck 4bb32fb19b
[fix] Bump actix-http dependency to 3.0.0-beta.9, up from 3.0.0-beta.8 (#2360)
Fixes https://rustsec.org/advisories/RUSTSEC-2021-0081
2021-08-30 20:07:12 +01:00
Ali MJ Al-Nasrawy f9da6e48e0
ResourceDef: define behavior for prefix with trailing slash (#2355)
* ResourceDef: define behavior

* fix tests

* add scope test

* revert firestorm bump

* update changelog

* fmt

Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-08-30 20:05:49 +01:00
fakeshadow ff07816b65
update httparse for uninit header parsing (#2374) 2021-08-29 01:42:22 +01:00
Rob Ede 5f412c67db
clippy 2021-08-13 18:49:58 +01:00
Thales a0c0bff944
Don't create a slice to potential uninit data on h1 encoder (#2364)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-08-13 18:41:19 +01:00
Rob Ede 384164cc14
update graphs 2021-08-12 21:04:26 +01:00
Rob Ede e965d8298f
HRS security fixes (#2363) 2021-08-12 20:18:09 +01:00
Rob Ede f6e69919ed
update to router 0.5.0 beta (#2339) 2021-08-06 22:42:31 +01:00
Rob Ede 293c52c3ef
re-export ServiceFactory (#2325) 2021-07-12 16:55:41 +01:00
Rob Ede 5a14ffeef2
clippy fixes (#2296) 2021-07-12 16:55:24 +01:00
CGMossa 7ae132cb68
Update MIGRATION.md (#2315)
Minor edit
2021-07-12 02:02:19 +01:00
Ali MJ Al-Nasrawy d8deed0475
fix tests with tokio 1.8.1 (#2317) 2021-07-09 23:57:21 +01:00
Ibraheem Ahmed 2504c2ecb0
Move dev module to separate file, update description (#2293) 2021-06-27 07:44:56 +01:00
Rob Ede 604be5495f
prepare beta.8 releases (#2292) 2021-06-26 16:33:36 +01:00
Igor Aleksanov 262c6bc828
Various refactorings (#2281)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-06-26 15:33:43 +01:00
Ibraheem Ahmed 5eba95b731
simplify ConnectionInfo::new (#2282) 2021-06-26 00:39:06 +01:00
Ali MJ Al-Nasrawy 09afd033fc
files: file path filtering closure (#2274)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-06-25 14:21:57 +01:00
Rob Ede 539697292a
fix scope and resource middleware data access (#2288) 2021-06-25 13:19:42 +01:00
Rob Ede 5a480d1d78
re-add serde error impls 2021-06-25 12:28:04 +01:00
Igor Aleksanov 9a26393375
Remove duplicated step from CI workflow (#2289) 2021-06-25 12:27:22 +01:00
Ibraheem Ahmed 2eacb735a4
Don't leak internal macros (#2290) 2021-06-25 12:25:50 +01:00
Ibraheem Ahmed 767e4efe22
Remove downcast macro from actix-http (#2291) 2021-06-25 10:53:53 +01:00
Rob Ede e559a197cc
remove comment 2021-06-24 15:30:11 +01:00
Rob Ede 93aa86e30b
clippy 2021-06-24 15:11:01 +01:00
Rob Ede 2d8d2f5ab0
app data doc improvements 2021-06-24 15:10:51 +01:00
Ibraheem Ahmed 083ee05d50
Route::service (#2262)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-06-23 21:30:06 +01:00
Rob Ede ed0516d724
try to fix doc test failures (#2284) 2021-06-23 20:47:17 +01:00
Jonas Malaco 7535a1ade8
Note that Form cannot require data ordering (#2283) 2021-06-23 16:54:25 +01:00
Ibraheem Ahmed 8846808804
ServiceRequest::parts_mut (#2177) 2021-06-23 00:42:00 +01:00
Luca Palmieri 3b6333e65f
Propagate error cause to middlewares (#2280) 2021-06-22 22:22:33 +01:00
Ibraheem Ahmed b1148fd735
Implement FromRequest for request parts (#2263)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-06-22 17:32:03 +01:00
Rob Ede 12f7720309
deprecate App::data and App::data_factory (#2271) 2021-06-22 15:50:58 +01:00
Grzegorz Baranski 2d8530feb3
chore: bump actix to 0.12.0 in actix-web-actors (#2277)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-06-22 14:00:28 +01:00
Rob Ede 7faeffc5ab
prepare actix-test release 0.1.0-beta.3 2021-06-20 19:47:42 +01:00
Rob Ede f81d4bdae7
remove unused private hidden methods 2021-06-19 23:40:30 +01:00
Ali MJ Al-Nasrawy 6893773280
files: allow show_files_listing() with index_file() (#2228) 2021-06-19 21:00:31 +01:00
Rob Ede 73a655544e
tweak compress feature docs 2021-06-19 20:23:06 +01:00
Arthur Le Moigne baa5a663c4
Select compression algorithm using features flags (#2250)
Add compress-* feature flags in actix-http / actix-web / awc.
This allow enable / disable not wanted compression algorithm.
2021-06-19 20:21:13 +01:00
Rob Ede c260fb1c48
beta.7 releases (#2266) 2021-06-19 11:51:20 +01:00
Rob Ede 532f7b9923
refined error model (#2253) 2021-06-17 17:57:58 +01:00
Rob Ede bb0331ae28
fix cargo cache on msrv 2021-06-17 16:49:31 +01:00
Ali MJ Al-Nasrawy 8d124713fc
files: inline disposition for common web app file types (#2257) 2021-06-16 20:33:22 +01:00
peter-formlogic fb2b362b60
Adjust JSON limit to 2MB and report on sizes (#2162)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-06-16 15:52:49 +01:00
Victor Pirat 75f65fea4f
Extends Rustls ALPN protocols instead of replacing them when creating Rustls based services (#2226) 2021-06-10 16:25:21 +01:00
Ali MJ Al-Nasrawy 812269d656
clarify docs for BodyEncoding::encoding() (#2258) 2021-06-10 15:38:35 +01:00
Ibraheem Ahmed e46cda5228
Deduplicate rt::main macro logic (#2255) 2021-06-08 22:44:56 +01:00
Ibraheem Ahmed 2e1d761854
add Seal argument to sealed AsHeaderName methods (#2252) 2021-06-08 12:57:19 +01:00
Thales b1e841f168
Don't normalize URIs with no valid path (#2246) 2021-06-05 17:19:45 +01:00
Yerkebulan Tulibergenov 0bb035cfa7
Add information about Actix discord server (#2247) 2021-06-04 02:54:40 +01:00
Arthur Le Moigne 3479293416
Add zstd ContentEncoding support (#2244)
Co-authored-by: Igor Aleksanov <popzxc@yandex.ru>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-06-03 21:32:52 +01:00
James Wright 136dac1352
Additional test coverage and tidyup (middleware::normalize) (#2243) 2021-06-03 03:28:09 +01:00
Ali MJ Al-Nasrawy e5b713b04a
files: Fix redirect_to_slash_directory() when used with show_files_listing() (#2225) 2021-05-26 10:42:29 +01:00
fakeshadow 3847429d00
Response::from_error take impl Into<Error> (#2214) 2021-05-26 13:41:48 +09:00
fakeshadow bb7d33c9d4
refactor h2 dispatcher to async/await.reduce duplicate code (#2211) 2021-05-25 03:21:20 +01:00
Yuki Okushi 4598a7c0cc
Only run UI tests on MSRV (#2232) 2021-05-25 00:09:38 +09:00
Keita Nonaka b1de196509
Fix clippy warnings (#2217) 2021-05-15 01:13:33 +01:00
Rob Ede 2a8c650f2c
move internalerror to actix web (#2215) 2021-05-14 16:40:00 +01:00
fakeshadow f277b128b6
cleanup ws test (#2213) 2021-05-13 12:24:32 +01:00
Rob Ede 4903950b22
update changelog 2021-05-09 20:15:49 +01:00
Rob Ede f55e8d7a11
remove error field from response 2021-05-09 20:15:48 +01:00
Rob Ede 900c9e270e
remove responsebody indirection from response (#2201) 2021-05-09 20:12:48 +01:00
Rob Ede a9dc1586a0
remove rogue eprintln 2021-05-07 10:14:25 +01:00
Rob Ede 947caa3599
examples use info log level by default 2021-05-06 20:24:18 +01:00
fakeshadow 7d1d5c8acd
Expose SererBuilder::worker_max_blocking_threads (#2200) 2021-05-06 18:35:04 +01:00
Rob Ede ddaf8c3e43
add associated error type to MessageBody (#2183) 2021-05-05 18:36:02 +01:00
Aaron Hill dd1a3e7675
Fix loophole in soundness of __private_get_type_id__ (#2199) 2021-05-05 11:16:12 +01:00
Luca Palmieri c17662fe39
Reduce the level of the emitted log line from error to debug. (#2196)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-05-03 00:58:14 +01:00
Ibraheem Ahmed 3a0fb3f89e
Static either extract future (#2184) 2021-05-01 03:02:56 +01:00
Voldracarno Draconor 1fcf92e11f
Update dependency "language-tags" (#2188) 2021-04-28 01:23:12 +01:00
Rob Ede 6a29a50f25
files doc wording 2021-04-22 18:37:45 +01:00
Rob Ede 75867bd073
clean up files service docs and rename method
follow on from #2046
2021-04-22 18:31:21 +01:00
tglman f44a0bc159
add support of filtering guards in Files of actix-files (#2046)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-04-22 18:13:13 +01:00
Ibraheem Ahmed 07036b5640
static form extract future (#2181) 2021-04-22 13:54:29 +01:00
Rob Ede a7cd4e85cf
use stable codec 0.4.0 2021-04-21 11:14:22 +01:00
Ibraheem Ahmed 6a9c4f1026
update awc docs link, formatting (#2180) 2021-04-20 19:57:27 +01:00
Rob Ede 427fe6bd82
improve responseerror trait docs 2021-04-19 23:16:04 +01:00
fakeshadow 2aa674c1fd
Fix perf drop in HttpResponseBuilder (#2174) 2021-04-19 23:15:57 +01:00
Rob Ede 52bb2b5daf
hide downcast macros 2021-04-19 03:42:53 +01:00
Rob Ede db97974dc1
make some http re-exports more accessible (#2171) 2021-04-19 03:29:38 +01:00
Rob Ede b9dbc58e20
content disposition methods take impl AsRef<str> 2021-04-19 02:31:11 +01:00
Rob Ede 35f8188410
restore cookie methods on ServiceRequest 2021-04-19 02:24:20 +01:00
Rob Ede 8ffb1f2011
update files changelog 2021-04-19 02:11:07 +01:00
Ibraheem Ahmed 26e9c80626
Named file service (#2135) 2021-04-18 23:34:51 +01:00
Rob Ede f462aaa7b6
prepare actix-test release 0.1.0-beta.2 2021-04-17 15:53:54 +01:00
Rob Ede 5a162932f3
prepare awc release 3.0.0-beta.5 2021-04-17 15:30:31 +01:00
Rob Ede b2d6b6a70c
prepare web release 4.0.0-beta.6 2021-04-17 15:28:13 +01:00
Rob Ede f743e885a3
prepare http release 3.0.0-beta.6 2021-04-17 15:24:18 +01:00
Rob Ede 5747f84736
bump utils to stable v3 2021-04-17 02:07:33 +01:00
Rob Ede 879a4cbcd8
re-export ready boilerplate macros in dev 2021-04-16 23:21:02 +01:00
Rob Ede 2449f2555c
missed one pipeline_factory 2021-04-16 20:48:37 +01:00
Rob Ede d8f56eee3e
bump service to stable v2 2021-04-16 20:28:21 +01:00
Rob Ede 8d88a0a9af
rename header generator macros 2021-04-16 19:15:10 +01:00
fakeshadow 845c02cb86
Add responder impl for Cow<str> (#2164) 2021-04-16 00:54:51 +01:00
D.Loh 64bed506c2
chore: update benchmaks to round 20 (#2163) 2021-04-15 19:11:30 +01:00
Rob Ede ff65f1d006
non exhaustive http errors (#2161) 2021-04-14 06:07:59 +01:00
fakeshadow a9f26286f9
reduce branches in h1 dispatcher poll_keepalive (#2089) 2021-04-14 05:20:45 +01:00
Rob Ede 037ac80a32
document messagebody trait items 2021-04-14 03:23:15 +01:00
Rob Ede 1bfdfd1f41
implement parts as assoc method 2021-04-14 02:57:28 +01:00
Rob Ede 5202bf03c1
add some doc examples to response builder 2021-04-14 02:45:58 +01:00
Rob Ede 387c229f28
move response builder code to own file 2021-04-14 02:12:47 +01:00
Rob Ede 23e0c9b6e0
remove http-codes builders from actix-http (#2159) 2021-04-14 02:00:14 +01:00
Rob Ede 02ced426fd
add body to_bytes helper (#2158) 2021-04-13 13:34:22 +01:00
Rob Ede 4442535a45
clippy 2021-04-13 12:44:38 +01:00
Rob Ede edd9f14752
remove unpin from body types (#2152) 2021-04-13 11:16:12 +01:00
Ali MJ Al-Nasrawy ce50cc9523
files: Don't use canonical path when serving file (#2156) 2021-04-13 05:28:30 +01:00
Rob Ede 981c54432c
remove json and url encoded form support from -http (#2148) 2021-04-12 10:30:28 +01:00
Rob Ede 44c55dd036
remove cookie support from -http (#2065) 2021-04-09 18:07:10 +01:00
Ibraheem Ahmed c72d77065d
derive debug where possible (#2142) 2021-04-09 03:22:51 +01:00
Ibraheem Ahmed 44a2d2214c
update year in MIT license (#2143) 2021-04-09 01:28:35 +01:00
Ibraheem Ahmed 3f5a73793a
make module/crate re-exports doc inline (#2141) 2021-04-08 20:51:16 +01:00
Rob Ede e0b2246c68
prepare test release 0.1.0-beta.1 2021-04-02 10:03:01 +01:00
Rob Ede e0ae8e59bf
prepare actors release 4.0.0-beta.4 2021-04-02 09:55:35 +01:00
Rob Ede a9641e475a
prepare http-test release 3.0.0-beta.4 2021-04-02 09:54:35 +01:00
Rob Ede 05c7505563
prepare multipart release 0.4.0-beta.4 2021-04-02 09:45:31 +01:00
Rob Ede 8561263545
prepare files release 0.6.0-beta.4 2021-04-02 09:43:51 +01:00
Rob Ede a32151525c
prepare awc release 3.0.0-beta.4 2021-04-02 09:40:36 +01:00
Rob Ede 546e7c5da4
prepare web release 4.0.0-beta.5 2021-04-02 09:37:51 +01:00
Rob Ede 6fb06a720a
prepare http release 3.0.0-beta.5 2021-04-02 09:27:11 +01:00
Rob Ede c54a0713de
migrate integration testing to new crate (#2112) 2021-04-02 08:26:59 +01:00
Ibraheem Ahmed 50dc13f280
move typed headers and implement FromRequest (#2094)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-04-01 16:42:18 +01:00
Rob Ede c8ed8dd1a4
migrate to -utils beta 4 (#2127) 2021-04-01 15:26:13 +01:00
Michał Pokrywka a807d33600
added TestServer::client_headers (#2097)
Co-authored-by: fakeshadow <24548779@qq.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-04-01 06:40:10 +01:00
fakeshadow 1f1be6fd3d
add Client::headers (#2114) 2021-03-31 11:43:56 +01:00
fakeshadow c49fe79207
Simplify lifetime annotation in HttpServiceBuilder. Simplify PlStream (#2129) 2021-03-30 15:46:09 +01:00
Rob Ede f66774e30b
remove From<OffsetDateTime> impl from HttpDate
fully removes time crate from public api of -http
2021-03-30 03:32:22 +01:00
fakeshadow 1281a748d0
merge H1ServiceHandler requests into HttpServiceHandler (#2126) 2021-03-30 03:06:16 +01:00
fakeshadow 222acfd070
Fix build for next actix-tls-beta release (#2122) 2021-03-29 13:45:48 +01:00
Rob Ede 980ecc5f07
fix openssl windows ci 2021-03-29 13:01:37 +01:00
Rob Ede e8ce73b496
update dep docs 2021-03-29 11:52:59 +01:00
Daniel Egger f954a30c34
Fix typo in CHANGES.md (#2124) 2021-03-29 10:18:05 +01:00
fakeshadow 60f9cfbb2a
Refactor actix_http::h2::service module. Reduce loc. (#2118) 2021-03-26 18:24:51 +00:00
fakeshadow 6822bf2f58
Refactor actix_http::h1::service (#2117) 2021-03-26 16:15:04 +00:00
fakeshadow 2f7f1fa97a
fix broken pipe for h2 when client is instantly dropped (#2113) 2021-03-26 00:05:31 +00:00
fakeshadow 8c2ce2dedb
fix awc compress feature (#2116) 2021-03-25 22:47:37 +00:00
Rob Ede 3188ef5731
don't use rust annotation on code doc blocks 2021-03-25 08:45:52 +00:00
fakeshadow 9704beddf8
Relax MessageBody limit to 2048kb (#2110)
* relax MessageBody limit to 2048kb

* fix clippy

* Update awc/src/response.rs

Co-authored-by: Rob Ede <robjtede@icloud.com>

* fix default body limit

Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-03-24 04:44:03 -07:00
Ibraheem Ahmed 1be54efbeb
Simplify service factory macro (#2108) 2021-03-23 13:42:46 +00:00
fakeshadow 746d983849
handle header error with CustomResponder (#2093) 2021-03-20 05:18:06 +00:00
Ibraheem Ahmed 8d9de76826
Simplify handler factory macro (#2086) 2021-03-19 16:30:53 +00:00
Thomas de Zeeuw 9488757c29
Update to socket2 v0.4 (#2092) 2021-03-19 12:17:06 +00:00
fakeshadow 351286486c
fix clippy warning on nightly (#2088)
* fix clippy warning on nightly
2021-03-19 19:25:35 +08:00
Ibraheem Ahmed 78fcd0237a
Format extract macro (#2087) 2021-03-19 04:08:23 +00:00
Rob Ede 81942d31d6
fix new dyn trait lint 2021-03-19 02:03:09 +00:00
fakeshadow b75b5114c3
refactor actix_http connection types and connector services (#2081) 2021-03-18 17:53:22 +00:00
obayemi abcb444dd9
fix routes in Path documentation (#2084) 2021-03-18 13:21:44 +00:00
Rob Ede 983b6904a7
unvendor openssl 2021-03-17 00:38:54 +00:00
Rob Ede 3dc2d145ef
import some traits as _ 2021-03-17 00:38:54 +00:00
fakeshadow c8f6d37290
rename client io trait. reduce duplicate code (#2079) 2021-03-16 16:31:14 +00:00
fakeshadow 69dd1a9bd6
Remove ConnectionLifetime trait. Simplify Acquired handling (#2072) 2021-03-16 02:56:23 +00:00
fakeshadow d93314a683
fix awc readme example (#2076) 2021-03-15 10:59:42 +00:00
fakeshadow a55e87faaa
refactor actix_http::helpers to generic over bufmut trait (#2069) 2021-03-15 02:33:51 +00:00
fakeshadow 515d0e3fb4
change behavior of default upgrade handler (#2071) 2021-03-13 22:20:18 +00:00
Ilya Averyanov 22dcc31193
Fix logger middleware properly escape %% (#2067) 2021-03-11 14:12:42 +00:00
Rob Ede 909ef0344b
document client mod removal
closes #2064
2021-03-11 00:43:03 +00:00
fakeshadow a2b0e86632
simplify connector generic type (#2063) 2021-03-10 23:57:32 +00:00
fakeshadow d0c1f1a84c
remove actix_http::client::pool::Protocol (#2061) 2021-03-10 01:31:50 +00:00
Rob Ede b62da7e86b
prepare actix-web-actors release 4.0.0-beta.3 2021-03-09 23:44:26 +00:00
Rob Ede 5e9a3eb6ae
prepare actix-multipart release 0.4.0-beta.3 2021-03-09 23:40:50 +00:00
Rob Ede 3451d6874f
prepare actix-files release 0.6.0-beta.3 2021-03-09 23:39:40 +00:00
Rob Ede 18c3783a1c
prepare actix-http-test release 3.0.0-beta.3 2021-03-09 23:35:42 +00:00
Rob Ede 4b46351d36
prepare actix-web release 4.0.0-beta.4 2021-03-09 23:31:44 +00:00
Rob Ede b7c406637d
prepare actix-web-codegen release 0.5.0-beta.2 2021-03-09 23:27:38 +00:00
Rob Ede c4e5651215
update docs 2021-03-08 23:49:12 +00:00
Rob Ede 23b0e64199
prepare awc release 3.0.0-beta.3 2021-03-08 23:15:53 +00:00
Rob Ede fc31b091e4
prepare http release 3.0.0-beta.4 2021-03-08 23:07:40 +00:00
Rob Ede effacf8fc8
fix ssl test 2021-03-08 20:51:50 +00:00
Rob Ede 95130fcfd0
address clippy warnings 2021-03-08 20:32:19 +00:00
fakeshadow 5e81105317
remove ka timer from h2 dispatcher (#2057) 2021-03-08 20:00:20 +00:00
fakeshadow 5b4105e1e6
Refactor/client builder (#2053) 2021-03-07 23:57:32 +00:00
Rob Ede 2d3a0d6038
json method receives plain serialize (#2052) 2021-03-07 22:11:39 +00:00
fakeshadow fe0b3f459f
remove localwaker from h1::payload (#2051) 2021-03-07 21:23:42 +00:00
Rob Ede ca69b6577e
use iota for more content-length insertions (#2050) 2021-03-07 19:29:02 +00:00
fakeshadow 880b863f95
fix h1 client for handling expect header request (#2049) 2021-03-07 18:33:16 +00:00
fakeshadow 78384c3ff5
make actix_http::ws::Codec::new const (#2043) 2021-03-04 19:19:01 +00:00
Rob Ede c1c4400c4a
fix h2 tests (#2034) 2021-03-04 13:27:54 +00:00
Richard Chien fc6f974617
Add "name" attribute to route macro (#1934) 2021-03-04 12:38:47 +00:00
fakeshadow 14b249b804
update to actix-0.11.0-beta.3 for actix-web-actors (#2042) 2021-03-04 11:39:29 +00:00
Rob Ede 0195824794
Update codecov.yml 2021-03-02 13:18:16 +00:00
Florian Dreschner fb019f15b4
test(files): Fix test and remove outdated case (#2037)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-02-28 23:01:59 +00:00
Daniel T. Rodrigues abc7fd374b
update example links (#2036)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-02-28 21:41:07 +00:00
Rob Ede cd652dca75
refactor websocket key hashing (#2035) 2021-02-28 19:55:34 +00:00
fakeshadow c836de44af
add client middleware (#2013) 2021-02-28 18:17:08 +00:00
fakeshadow badae2f8fd
add local_address bind for client builder (#2024) 2021-02-27 22:31:14 +00:00
fboulnois 1f34718ecd
Use once_cell instead of lazy_static (#2029) 2021-02-27 21:55:50 +00:00
fakeshadow ebda60fd6b
refactor boxed route (#2033) 2021-02-27 21:00:36 +00:00
Rob Ede d242f57758
fix tests for codecov 2021-02-27 20:58:44 +00:00
Rob Ede b95e1dda34
pin h2 to 0.3.0 2021-02-27 19:57:09 +00:00
Daniel T. Rodrigues 8f2a97c6e3
Update README example links (#2027)
The examples repo went through a folder restructuring. More info: https://github.com/actix/examples/pull/411
2021-02-26 01:21:56 +00:00
Baran Demirbaş ebaf25d55a
Fix typos in CHANGES.md (#2025)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-02-24 16:19:40 +00:00
Erik Johnston 42711c23d7
Port over doc comments in route macros. (#2022)
Co-authored-by: Jonas Platte <jplatte@users.noreply.github.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-02-24 12:26:56 +00:00
Rob Ede f6393728c7
remove usage of actix_utils::mpsc (#2023) 2021-02-24 09:08:56 +00:00
Ibraheem Ahmed d92ab7e8e0
add msrv to clippy config (#1862) 2021-02-22 15:39:31 +00:00
Alex Rebert 5845b3965c
actix-http-test: minimize features of dependencies (#2019) 2021-02-22 12:00:08 +00:00
fakeshadow aacec30ad1
reduce duplicate code (#2020) 2021-02-22 11:15:12 +00:00
Adam Chalmers 2dbdf61c37
Inner field of web::Query is public again (#2016) (#2017)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-02-20 17:59:09 +00:00
Dávid Szabó 83365058ce
Fix HTTP client link (#2011) 2021-02-18 21:56:24 +00:00
Richard Janis Goldschmidt 3b93c62e23
Fix Json extractor to be 32kB by default (#2010) 2021-02-18 15:20:20 +00:00
fakeshadow 946cccaa1a
refactor awc::ClientBuilder (#2008) 2021-02-18 12:30:09 +00:00
fakeshadow 1838d9cd0f
remove unused method. reduce leaf future type (#2009) 2021-02-18 11:24:10 +00:00
fakeshadow f62a982a51
simplify the match on h1 message type (#2006) 2021-02-18 10:38:27 +00:00
fakeshadow dfd9dc40ea
remove awc::connect::connect trait. (#2004) 2021-02-17 17:10:46 +00:00
fakeshadow 5efea652e3
add ClientResponse::timeout (#1931) 2021-02-17 11:55:11 +00:00
fakeshadow dfa795ff9d
return poll in poll_flush (#2005) 2021-02-17 11:18:31 +00:00
Luka Zakrajšek 2cc6b47fcf
Use http-range library for HttpRange (#2003) 2021-02-16 18:48:16 +00:00
fakeshadow 117025a96b
simplify client::connection::Connection trait (#1998) 2021-02-16 14:10:22 +00:00
Rob Ede 3e0a9b99ff
update rust-cache action 2021-02-16 09:28:14 +00:00
Rob Ede 17b3e7e225
pool doc nits (#1999) 2021-02-16 09:08:30 +00:00
fakeshadow c065729468
rework client connection pool (#1994) 2021-02-16 08:27:14 +00:00
Rob Ede 55db3ec65c
split up http body module 2021-02-15 12:20:43 +00:00
Rob Ede 0404b78b54
improve body size docs 2021-02-15 11:24:46 +00:00
fakeshadow 68d1bd88b1
remove unused flag upgrade (#1992) 2021-02-14 18:13:05 +00:00
fakeshadow 308b70b039
fix potential over read (#1991) 2021-02-14 17:36:18 +00:00
Rob Ede 7fa6333a0c
use rcgen for tls key generation (#1989) 2021-02-13 17:16:36 +00:00
Rob Ede 3279070f9f
optional cookies features (#1981) 2021-02-13 15:08:43 +00:00
fakeshadow b37669cb3b
fix notify on drop (#1987) 2021-02-13 04:23:37 +00:00
Rob Ede 1e538bf73e
rework ci (#1982) 2021-02-12 21:53:21 +00:00
fakeshadow 366c032c36
refactor DateService (#1983) 2021-02-12 21:52:58 +00:00
fakeshadow 95113ad12f
do not self wake up when have a payload (#1984) 2021-02-12 20:33:13 +00:00
fakeshadow ce9b2770e2
remove unused Dispatcher::new_timeout (#1985) 2021-02-12 10:37:28 +00:00
Rob Ede 4fc7d76759
s/websocket/WebSocket in docs 2021-02-12 00:27:20 +00:00
Rob Ede 81bef93e5e
add time parser year shift tests 2021-02-12 00:15:25 +00:00
Rob Ede 31d9ed81c5
change rustfmt line width to 96 2021-02-11 23:03:17 +00:00
Rob Ede c1af5089b9
add 431 and 451 status codes 2021-02-11 22:58:40 +00:00
Rob Ede 77efc09362
hide httpmessage mod 2021-02-11 22:58:40 +00:00
Rob Ede 871ca5e4ae
stop claiming actor support 2021-02-11 22:58:40 +00:00
fakeshadow ceace26ed4
remove unused flag POLLED (#1980) 2021-02-11 14:19:14 -08:00
fakeshadow 75a9a72e78
clean up poll_response. add comments (#1978) 2021-02-11 14:54:42 +00:00
fakeshadow d9d0d1d1a2
reduce unsafe (#1972) 2021-02-10 23:11:12 +00:00
Rob Ede ea5ce3befb
prepare actix-http 3.0.0-beta.3 release 2021-02-10 18:36:14 +00:00
Rob Ede e18464b274
bump actix web versions in deps 2021-02-10 12:57:13 +00:00
Rob Ede bd26083f33
prepare codegen 0.5.0-beta.1 release 2021-02-10 12:45:46 +00:00
Rob Ede 991363a104
consistent case s/web/Web 2021-02-10 12:12:03 +00:00
Rob Ede a290e58982
prepare beta 2 release set (#1975) 2021-02-10 12:10:03 +00:00
fakeshadow dcad9724bc
ensure poll_flush on h1 connection disconnect (#1974) 2021-02-10 10:11:53 +00:00
Rob Ede 949d14ae2b
clean up header map (#1964) 2021-02-09 22:59:17 +00:00
fakeshadow a6ed4aee84
add poll_flush after a non blocked write to h1 dispatcher (#1971) 2021-02-09 22:32:46 +00:00
fakeshadow 519d7f2b8a
add trust-dns optional feature for actix-http and awc (#1969) 2021-02-09 10:41:20 +00:00
fakeshadow dddb623a11
add services register for tuple and vec of services (#1933) 2021-02-07 23:47:51 +00:00
fakeshadow 266cf0622c
reduce branch.remove deadcode for h1 dispatcher (#1962) 2021-02-07 22:48:27 +00:00
Rob Ede 9604e249c9
use stable clippy (#1963) 2021-02-07 20:33:53 +00:00
fakeshadow dbc47c9122
optimize actix-http messages (#1914) 2021-02-07 20:19:10 +00:00
fakeshadow 4c243cbf89
simplify methods of awc::connect::Connect trait (#1941) 2021-02-07 18:56:39 +00:00
Alexander Jackson deafb7c8b8
Improve impl ResponseError documentation (#1939)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-02-07 04:54:41 +00:00
Jens Reidel 50309aa295
Use askama-escape for html escaping (#1953) 2021-02-07 04:50:23 +00:00
Rob Ede 9eaea6a2fd
tweak feature flags 2021-02-07 03:54:58 +00:00
fakeshadow 830fb2cdb2
properly drop h2 connection (#1926) 2021-02-07 03:51:36 +00:00
fakeshadow 7cfed73be8
fix memory usage for h1 and read bug on buffer size. (#1929) 2021-02-07 03:20:35 +00:00
fakeshadow 41bc04b1c4
Use immutable reference of service state. Update awc dns resolver. (#1905) 2021-02-07 01:00:40 +00:00
fakeshadow 20cf0094e5
fix master branch build. change web::block output type. (#1957) 2021-02-06 16:23:59 +00:00
fakeshadow 83fb4978ad
fix awc test_client test (#1960) 2021-02-06 16:05:33 +00:00
fakeshadow 51e54dac8b
fix limit not working on HttpMessageBody::limit (#1938) 2021-01-27 10:49:57 +00:00
Jonas Platte c201c15f8c
Improve documentation for PayloadConfig (#1923) 2021-01-24 00:32:10 +00:00
Logan Magee 0c8196f8b0
Remove HttpResponseBuilder::json2() (#1903)
It's not necessary to keep both json() and json2() around since the
former reduces the ownership of its parameter to a borrow only to pass
the reference to the latter. Users can instead borrow themselves when
passing an owned value: there doesn't need to be two separate functions.

This change also makes HttpResponseBuilder::json() take T: Deref so it
can accept both references and web extractors like web::Json.
2021-01-18 12:14:29 +00:00
Rob Ede ee10148444
revive commented out tests (#1912) 2021-01-17 05:19:32 +00:00
fakeshadow 1c95fc2654
Refactor poll_keepalive for readability (#1901) 2021-01-16 00:15:06 +00:00
Rob Ede da69bb4d12
implement App::data as App::app_data(Data::new(T))) (#1906) 2021-01-15 23:37:33 +00:00
Rob Ede 0a506bf2e9
cleanup top level doc comments 2021-01-15 05:38:50 +00:00
Rob Ede b2a9ba2ee4
Update PULL_REQUEST_TEMPLATE.md 2021-01-15 04:54:23 +00:00
Rob Ede f976150b67
return option item from Extensions::insert (#1904) 2021-01-15 04:22:42 +00:00
Rob Ede b1dd8d28bc
response header rework (#1869) 2021-01-15 02:11:10 +00:00
fakeshadow 4edeb5ce47
optimize ErrorHandler middleware (#1902) 2021-01-14 01:43:44 +00:00
fakeshadow d34a8689e5
Refactor h1 encoder (#1900) 2021-01-12 14:38:53 +00:00
Robin Schoonover a919d2de56
actix-files: Fix If-(Un)Modified to not consider sub-seconds (#1887) 2021-01-11 18:18:23 +00:00
fakeshadow 46a8f28b74
fix actix-files doc about thread pool (#1898) 2021-01-11 17:27:33 +00:00
fakeshadow 57398c6df1
Refactor/service request (#1893) 2021-01-11 01:29:16 +00:00
fakeshadow 7affc6878e
simplify h1 dispatcher (#1899)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-01-11 00:13:56 +00:00
fakeshadow 46b2f7eaaf
use a non leak pool for HttpRequestInner (#1889)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-01-10 22:59:44 +00:00
fakeshadow 9e401b6ef7
refactor Scope (#1895) 2021-01-09 18:06:49 +00:00
fakeshadow fe392abeb4
remove actix-threadpool.use actix_rt::task::spawn_blocking (#1878) 2021-01-09 16:04:19 +00:00
fakeshadow f6cc829758
remove leaked box in REQUEST_POOL and RESPONSE_POOL (#1896) 2021-01-09 15:40:20 +00:00
Rob Ede 6575ee93f2
big clean up and docs improvmenet of types mod (#1894) 2021-01-09 13:17:19 +00:00
fakeshadow 530d03791d
refactor Resource (#1883) 2021-01-09 03:36:58 +00:00
fakeshadow d40ae8c8ca
use sync method on Responder trait (#1891) 2021-01-08 22:17:19 +00:00
Rob Ede 2204614134
don't run awc doctests that rely on external public endpoints (#1888) 2021-01-08 12:00:58 +00:00
fakeshadow 188ee44f81
remove copyless dependency (#1884) 2021-01-07 21:55:00 +00:00
fakeshadow a4c9aaf337
fix extra branch in h1 dispatcher timer (#1882) 2021-01-07 20:42:09 +00:00
Rob Ede c09186a2c0
prepare v4 beta releases (#1881) 2021-01-07 20:02:08 +00:00
Rob Ede d3c476b8c2
use env_logger builders in examples 2021-01-07 02:41:05 +00:00
Rob Ede dc23559f23
address clippy lints 2021-01-07 02:04:26 +00:00
fakeshadow 6d710629af
fix bug where upgrade future is not reset properly (#1880) 2021-01-07 00:57:34 +00:00
Rob Ede 85753130d9
fmt 2021-01-07 00:35:19 +00:00
Rob Ede 00ba8d5549
add http3 variant to protocol enum 2021-01-06 18:58:24 +00:00
Rob Ede 51e9e1500b
add docs to recent additions 2021-01-06 18:52:06 +00:00
fakeshadow a03dbe2dcf
replace cloneable service with httpflow abstraction (#1876) 2021-01-06 18:43:52 +00:00
fakeshadow 57a3722146
More refactor of app_service (#1879) 2021-01-06 18:11:20 +00:00
fakeshadow 57da1d3c0f
refactor app_service (#1877) 2021-01-06 11:35:30 +00:00
Rob Ede 68117543ea
major cleanup of middleware module (#1875)
* major cleanup of middleware module

* update changelog
2021-01-05 09:51:58 +00:00
fakeshadow 4f5971d79e
add Compat middleware (#1865) 2021-01-05 00:22:57 +00:00
fakeshadow 93161df141
clean up body type (#1872) 2021-01-04 23:47:38 +00:00
fakeshadow e567873326
optimize message pool release (#1871) 2021-01-04 13:03:46 +00:00
Rob Ede 7d632d0b7b
use ByteString as container for websocket text message (#1864) 2021-01-04 11:27:32 +00:00
Rob Ede 36aee18c64
fmt 2021-01-04 04:33:15 +00:00
Rob Ede 007a145988
use ahash for internal hashmaps 2021-01-04 04:29:07 +00:00
Rob Ede 2d4a174420
fmt 2021-01-04 01:01:35 +00:00
Rob Ede 21f6c9d7a5
improve code readability 2021-01-04 00:49:02 +00:00
fakeshadow e1683313ec
optimize ServiceRequest methods (#1870)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-01-04 00:32:41 +00:00
fakeshadow 32de9f8840
Tokio 1.0 (#1813)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2021-01-03 23:47:04 +00:00
Rob Ede 1f202d40e4
optimize write_camel_case in h1 encoder (#1868) 2021-01-03 16:53:01 +00:00
fakeshadow ad608aa64e
optimize Resource and Scope service call (#1867) 2021-01-02 19:40:31 +00:00
Rob Ede a1b00b2cd0
change unreleased year 2021-01-02 00:12:18 +00:00
fakeshadow 3beb4cf2da
replace tinyvec with smallvec (#1866) 2021-01-01 23:18:25 +00:00
Rob Ede 522c9a5ea6
update CoC text 2020-12-31 03:24:18 +00:00
Rob Ede 102bb8f9ab
update dot dep graphs 2020-12-29 00:22:28 +00:00
Ibraheem Ahmed 20b46cdaf9
format factory_tuple macro invocations (#1859) 2020-12-28 21:04:02 +00:00
Rob Ede 2a2a20c3e7
bump msrv to 1.46 (#1858) 2020-12-28 00:44:15 +00:00
Rob Ede 093d3a6c59
remove deprecated on_connect methods (#1857) 2020-12-27 23:23:30 +00:00
Rob Ede 8c9ea43e23
address clippy warnings 2020-12-27 20:54:04 +00:00
fakeshadow f9fcf56d5c
reduce branch in actix_http::h1::codec (#1854) 2020-12-27 20:37:53 +00:00
Ibraheem Ahmed cbda928a33
Rename factory to handler (#1852) 2020-12-26 21:46:19 +00:00
fakeshadow 1032f04ded
remove unused actix_http::h1::OneRequest (#1853) 2020-12-26 12:46:36 +00:00
Rob Ede b373e1370d
prepare files 0.5.0 release 2020-12-26 04:05:45 +00:00
Edoardo Morandi 404b5a7709
Add optional support for hidden files/directories (#1811) 2020-12-26 03:36:15 +00:00
fakeshadow ecf08d5156
Remove boxed future from h1 Dispatcher (#1836) 2020-12-24 19:15:17 +00:00
fakeshadow 87655b3028
reduce one clone on Arc. (#1850) 2020-12-23 23:58:25 +00:00
fakeshadow 3a192400a6
Simplify handler (#1843) 2020-12-23 15:47:07 +00:00
Rob Ede 2a7f2c1d59
dispatcher internals testing (#1840) 2020-12-23 01:28:17 +00:00
Rob Ede 05f104c240
improve NormalizePath docs (#1839) 2020-12-23 00:19:20 +00:00
Logan Magee 4dccd092f3
Bump rand from 0.7.x to 0.8.x (#1845) 2020-12-22 23:45:31 +00:00
fakeshadow 95ccf1c9bc
replace actix_utils::oneshot with futures_channle::oneshot (#1844) 2020-12-21 16:42:20 +00:00
fakeshadow 6cbf27508a
simplify ExtractService's return type (#1842) 2020-12-20 02:20:29 +00:00
fakeshadow 79de04d862
optimise Extract service (#1841) 2020-12-19 16:33:34 +00:00
fakeshadow a4dbaa8ed1
remove boxed future in DefaultHeaders middleware (#1838) 2020-12-18 23:08:59 +00:00
Yuki Okushi c7b4c6edfa
Disable PR comment from codecov 2020-12-17 21:38:52 +09:00
fakeshadow 2a5215c1d6
Remove boxed future from HttpMessage (#1834) 2020-12-17 11:40:49 +00:00
fakeshadow 97f615c245
remove boxed futures on Json extract type (#1832) 2020-12-16 23:34:33 +00:00
Rob Ede 1a361273e7
optimize bytes and string payload extractors (#1831) 2020-12-16 22:40:26 +00:00
fakeshadow d7ce648445
remove boxed future for Option<T> and Result<T, E> extract type (#1829)
* remove boxed future for Option<T> and Result<T, E> extract type

* use ready macro

* fix fmt
2020-12-16 18:34:10 +00:00
Aravinth Manivannan fabc68659b
Intradoc links conversion (#1827)
* switching to nightly for intra-doc links

* actix-files intra-doc conversion

* more specific Result

* intradoc conversion complete

* rm blank comments and readme doc link fixes

* macros and broken links
2020-12-13 13:28:39 +00:00
Juan Aguilar 542db82282
Simplify wake up of task (#1826) 2020-12-12 20:07:06 +00:00
Rob Ede ae63eb8bb2
fix clippy warnings (#1806)
* fix clippy warnings

* prevent CI fail status caused by codecov
2020-12-09 11:22:19 +00:00
fakeshadow 7a3776b770
remove two unused generics on BoxedRouteFuture types. (#1820) 2020-12-09 10:47:59 +00:00
fakeshadow ff79c33fd4
remove a box (#1814) 2020-12-06 11:42:15 +00:00
Petar Dambovaliev b75a9b7a20
add error to message in test helper func (#1812) 2020-12-05 04:57:56 +09:00
Arniu Tseng d0c6ca7671
test-server => actix-http-test (#1807) 2020-12-02 17:23:30 +00:00
Rob Ede 24d525d978
prepare web 3.3.2 release 2020-12-01 22:22:46 +00:00
Joshua Parkin 1f70ef155d
Fix match_pattern() returning None for scope with resource of empty path (#1798)
* fix match_pattern function not returning pattern where scope has resource of path ""

* remove print in test

* make comparison on existing else if block

* add fix to changelog
2020-12-01 13:39:41 +00:00
Maciej Hirsz 7981e0068a
Remove a panic in normalize middleware (#1762)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-12-01 10:22:15 +09:00
Linus Färnstrand 32d59ca904
Upgrade socket2 dependency (#1803)
Upgrades to a version not making invalid assumptions about
the memory layout of std::net::SocketAddr
2020-12-01 04:18:02 +09:00
Rob Ede ea8bf36104
update web and awc changelogs 2020-11-29 16:35:35 +00:00
Rob Ede 0b5b463cfa
prepare web and awc releases
closes #1799
2020-11-29 16:33:45 +00:00
Rob Ede fe6ad816cc
update dotgraphs 2020-11-25 00:54:00 +00:00
Rob Ede e72b787ba7
prepare actix-web and actix-http-test releases 2020-11-25 00:53:48 +00:00
Rob Ede efc317d3b0
prepare actix-http and awc releases 2020-11-25 00:07:56 +00:00
Rob Ede 31057becca
prepare actix-files release 0.4.1 2020-11-24 20:33:23 +00:00
Rob Ede f1a9b45437
improve docs for Files::new 2020-11-24 20:23:09 +00:00
Rob Ede 5af46775b8
refactor quality and use TryFrom instead of custom trait (#1797) 2020-11-24 11:37:05 +00:00
Rob Ede 70f4747a23
add method for getting accept type preference (#1793) 2020-11-24 10:08:57 +00:00
Rob Ede 2f11ef089b
fix rustdoc uploads 2020-11-24 00:29:13 +00:00
Rob Ede 4100c50c70
add either extractor (#1788) 2020-11-20 18:02:41 +00:00
Aravinth Manivannan a929209967
actix-files intra-doc migration (#1785) 2020-11-10 23:54:38 +00:00
Aravinth 49e945c88f
switching to nightly for intra-doc links (#1783) 2020-11-09 14:01:36 +00:00
Pouya Mobasher Behrouz 9b42333fac
Fix typo in Query extractor docs (#1777) 2020-11-06 13:34:42 +00:00
Jonas Platte e5b86d189c
Fix typo in request_data.rs (#1774) 2020-11-05 17:46:17 +00:00
Yuki Okushi 4bfd5c2781
Upgrade serde_urlencoded to 0.7 (#1773) 2020-11-06 01:36:15 +09:00
fakeshadow 9b6a089b36
fix awc doc example (#1772)
* fix awc readme example

Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-11-05 06:20:01 +08:00
Rob Ede ceac97bb8d
Update config.yml 2020-11-04 15:08:12 +00:00
Rob Ede 61b65aa64a
add common 1xx http response builders (#1768)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-11-02 18:23:18 +09:00
Sebastian Mayr 5468c3c410
Drop content length headers from 101 responses (#1767)
Co-authored-by: Sebastian Mayr <smayr@atlassian.com>
2020-11-02 17:44:14 +09:00
Yuki Okushi b6385c2b4e Remove CoC on actix-http as duplicated 2020-10-31 12:12:19 +09:00
Yuki Okushi 5135c1e3a0 Update CoC contact information 2020-10-31 12:06:51 +09:00
Rob Ede 22b451cf2d
fix deps.rs badge 2020-10-31 02:39:54 +00:00
Rob Ede 42f51eb962
prepare web release 3.2.0 2020-10-30 03:15:22 +00:00
Rob Ede 156c97cef2
prepare awc release 2.0.1 2020-10-30 02:50:53 +00:00
Rob Ede 798d744eef
prepare http release 2.1.0 2020-10-30 02:19:56 +00:00
Rob Ede 4cb833616a
deprecate builder if-x methods (#1760) 2020-10-30 02:10:05 +00:00
Rob Ede 9963a5ef54
expose on_connect v2 (#1754)
Co-authored-by: Mikail Bagishov <bagishov.mikail@yandex.ru>
2020-10-30 02:03:26 +00:00
Joshua Parkin 4519db36b2
register fns for custom request-derived logging units (#1749)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-10-29 18:38:49 +00:00
Augusto César Dias 7030bf5fe8
Adding app_data to ServiceConfig (#1758)
Co-authored-by: Rob Ede <robjtede@icloud.com>
Co-authored-by: Augusto <augusto@flowciety.de>
2020-10-26 17:02:45 +00:00
ghizzo01 20078fe603
Bump pin-project to 1.0 (#1733) 2020-10-25 19:41:44 +09:00
Jonas 06e5042b94
use idenity encoding on client if no compression features are enabled (#1737)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-10-24 21:15:01 +01:00
Daniel Egger 41e7cec72f
Re-export bytes::Buf and bytes::BufMut as well (#1750)
Co-authored-by: Daniel Egger <daniel.egger@axiros.com>
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-10-24 20:31:23 +01:00
Rob Ede d45a1aa6b6
Add web::ReqData<T> extractor (#1748)
Co-authored-by: Jonas Platte <jonas@lumeo.com>
2020-10-24 18:49:50 +01:00
cquintana-verbio 98243db9f1
Print unconfigured Data<T> type when attempting extraction (#1743)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-10-20 17:35:34 +01:00
ghizzo01 f92742bdac
Bump base64 to 0.13 (#1744) 2020-10-19 18:24:22 +01:00
Rob Ede e563025b16
always construct shortslice using debug checked new constructor (#1741) 2020-10-19 12:51:30 +01:00
Matt Gathu cfd5b381f1
Implement Logger middleware regex exclude pattern (#1723)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-10-19 07:18:16 +01:00
Yuki Okushi 2f84914146
Skip some tests that cause ICE on nightly (#1740) 2020-10-19 11:52:05 +09:00
Jonas Platte d765e9099d
Fix clippy::rc_buffer (#1728) 2020-10-10 09:26:05 +09:00
Rob Ede 34b23f31c9
prepare files release 0.4.0 2020-10-06 22:08:33 +01:00
Rob Ede 26c1a901d9
add files preference for utf8 text responses (#1714) 2020-10-06 21:56:28 +01:00
Yuki Okushi c2c71cc626
Fix/suppress clippy warnings (#1720) 2020-10-01 18:19:09 +09:00
Rob Ede aa11231ee5
prepare web release 3.1.0 (#1716) 2020-09-30 11:07:35 +01:00
PeterUlb b5812b15f0
Remove Sized Bound for web::Data (#1712) 2020-09-29 22:44:12 +01:00
Matt Gathu b4e02fe29a
Fix cyclic references in ResourceMap (#1708) 2020-09-25 17:42:49 +01:00
Matt Gathu 37c76a39ab
Fix Multipart consuming payload before header checks (#1704)
* Fix Multipart consuming payload before header checks

What
--
Split up logic in the constructor into two functions:

- **from_boundary:** build Multipart from boundary and stream
- **from_error:** build Multipart for MultipartError

Also we make the `boundary`, `from_boundary`, `from_error`  methods public within the crate so that we can use them in the extractor.

The extractor is then able to perform header checks and only consume the
payload if the checks pass.

* Add tests

* Add payload consumption test

Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-09-25 14:50:37 +01:00
LIU An (劉安) 60e7e52276
Add TrailingSlash::MergeOnly behavior (#1695)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-09-25 12:50:59 +01:00
Rob Ede c53e9468bc
prepare codegen 0.4.0 release (#1702) 2020-09-24 23:54:01 +01:00
Arniu Tseng 162121bf8d
Unify route macros (#1705) 2020-09-22 22:42:51 +01:00
Rob Ede f7bcad9567
split up files lib (#1685) 2020-09-20 23:18:25 +01:00
Igor Aleksanov f9e3f78e45
eemove non-relevant comment from actix-http README.md (#1701) 2020-09-20 17:21:53 +01:00
Silentdoer 1596893ef7
update actix-http dev-dependencies (#1696)
Co-authored-by: luojinming <luojm@hxsmart.com>
2020-09-19 23:20:34 +09:00
Lokathor 2a2474ca09
Update tinyvec to 1.0 (#1689) 2020-09-17 18:09:42 +01:00
Matt Gathu 509b2e6eec
Provide attribute macro for multiple HTTP methods (#1674)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-09-16 22:37:41 +01:00
Rob Ede d707704556
prepare web release 3.0.2 (#1681) 2020-09-15 13:14:14 +01:00
Aleksandrov Vladimir a429ee6646
Add possibility to set address for test_server (#1645) 2020-09-15 12:09:16 +01:00
Rob Ede 7f8073233a
fix trimming to inaccessible root path (#1678) 2020-09-15 11:32:31 +01:00
Rob Ede 4b4c9d1b93
update migration guide
closes #1680
2020-09-14 22:26:03 +01:00
Rob Ede 3fde3be3d8
add trybuild tests to routing codegen (#1677) 2020-09-13 16:31:08 +01:00
Rob Ede f861508789
prepare web release 3.0.1 (#1676) 2020-09-13 03:24:44 +01:00
Damian Lesiuk a4546f02d2
make TrailingSlash enum accessible (#1673)
Co-authored-by: Damian Lesiuk <lesiuk@sabre.com>
2020-09-13 00:55:39 +01:00
Rob Ede 64a2c13cdf
the big three point oh (#1668) 2020-09-11 13:50:10 +01:00
Rob Ede bf53fe5a22
bump actix dependency to v0.10 (#1666) 2020-09-11 12:09:52 +01:00
Rob Ede cf5138e740
fix clippy async_yields_async lints (#1667) 2020-09-11 11:29:17 +01:00
Igor Aleksanov 121075c1ef
awc: Rename Client::build to Client::builder (#1665) 2020-09-11 09:24:39 +01:00
Robert Gabriel Jakabosky 22089aff87
Improve json, form and query extractor config docs (#1661) 2020-09-10 15:40:20 +01:00
Rob Ede 7787638f26
fix CI clippy warnings (#1664) 2020-09-10 14:46:35 +01:00
Rob Ede 2f6e9738c4
prepare multipart and actors releases (#1663) 2020-09-10 12:54:27 +01:00
Mufeed VH e39d166a17
Fix examples hyperlink in README (#1660) 2020-09-10 00:12:50 +01:00
Rob Ede 059d1671d7
prepare release beta 4 (#1659) 2020-09-09 22:14:11 +01:00
Igor Aleksanov 3a27580ebe
awc: improve module documentation (#1656)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-09-09 14:24:12 +01:00
Rob Ede 9d0534999d
bump connect and tls versions (#1655) 2020-09-09 09:20:54 +01:00
Igor Aleksanov c54d73e0bb
Improve awc websocket docs (#1654)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-09-07 12:04:54 +01:00
Rob Ede 9a9d4b182e
document all remaining unsafe usages (#1642)
adds some debug assertions where appropriate
2020-09-03 10:00:24 +01:00
Rob Ede 4e321595bc
extract more config types from Data<T> as well (#1641) 2020-09-02 22:12:07 +01:00
Matt Kantor 01cbef700f
Fix a small typo in a doc comment. (#1649) 2020-08-28 22:16:41 +01:00
Rob Ede 8497b5f490
integrate with updated actix-{codec, utils} (#1634) 2020-08-24 10:13:35 +01:00
LJ 75d86a6beb
Configurable trailing slash behaviour for NormalizePath (#1639)
Co-authored-by: ljoonal <ljoona@ljoonal.xyz>
2020-08-19 12:21:52 +01:00
Yuki Okushi 3892a95c11
Fix actix-web version to publish 2020-08-18 01:16:18 +09:00
Yuki Okushi 5802eb797f
awc,web: Bump up to next beta releases (#1638) 2020-08-18 01:08:40 +09:00
Yuki Okushi ff2ca0f420
Update rustls to 0.18 (#1637) 2020-08-18 00:28:39 +09:00
Yuki Okushi 59ad1738e9
web: Bump up to 3.0.0-beta.2 (#1636) 2020-08-17 11:32:38 +01:00
Yuki Okushi aa2bd6fbfb
http: Bump up to 2.0.0-beta.3 (#1630) 2020-08-14 19:42:14 +09:00
William Myers 5aad8e24c7
Re-export all error types from awc (#1621) 2020-08-14 01:24:35 +01:00
Yuki Okushi 6e97bc09f8
Use action to upload docs 2020-08-13 16:04:50 +09:00
fakeshadow 160995b8d4
fix awc pool leak (#1626) 2020-08-09 21:49:43 +01:00
Rob Ede 187646b2f9
match HttpRequest app_data behavior in ServiceRequest (#1618) 2020-08-09 15:51:38 +01:00
Rob Ede 46627be36f
add dep graph dot graphs (#1601) 2020-08-09 13:54:35 +01:00
Rob Ede a78380739e
require rustls feature for client example (#1625) 2020-08-09 13:32:37 +01:00
Rob Ede cf1c8abe62
prepare release http & awc (#1617) 2020-07-22 01:13:10 +01:00
Yuki Okushi 92b5bcd13f
Check format and tweak CI config (#1619) 2020-07-22 00:28:33 +01:00
masnagam 701bdacfa2
Fix illegal chunked encoding (#1615)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-07-21 17:24:56 +01:00
Rob Ede 6dc47c4093
fix soundness concern in h1 decoder (#1614)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-07-21 16:25:33 +01:00
Rob Ede 0ec335a39c
bump MSRV to 1.42 (#1616) 2020-07-21 16:40:30 +09:00
Jonas Platte f8d5ad6b53
Make web::Path a tuple struct with a public inner value (#1594)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-07-21 00:54:26 +01:00
Rob Ede 43c362779d
also try extracting payload config as Data<T> (#1610) 2020-07-20 17:40:58 +01:00
Rob Ede 971ba3eee1
fix continous growth of app data in pooled requests (#1609)
fixes #1606
fixes #1607
2020-07-18 16:17:00 +01:00
Rob Ede 2fd96c03e5
prepare beta.1 release for multipart/files/actors (#1605) 2020-07-16 11:38:57 +01:00
Rob Ede ad7c6d2633
prepare actix-web v3.0.0-beta.1 release (#1600) 2020-07-15 00:44:44 +01:00
Yuki Okushi 3362a3d61b
Merge pull request #1603 from JohnTitor/license
Avoid using deprecated `/` in license field
2020-07-14 15:25:48 +09:00
Yuki Okushi 769ea6bd5b
Merge pull request #1602 from actix/release/awc-beta-1
prepare awc v2.0.0-beta.1 release
2020-07-14 13:33:05 +09:00
Yuki Okushi 1382094c15
Avoid using deprecated / in license field 2020-07-14 11:19:56 +09:00
Rob Ede 78594a72bd
prepare awc v2.0.0-beta.1 release 2020-07-14 03:16:26 +01:00
Rob Ede 327e472e44
prepare http-2.0.0-beta.1 release (#1596) 2020-07-13 15:35:30 +01:00
Patrick Tescher e10eb648d9
Fix leaks with actix_http's client (#1580) 2020-07-10 22:35:22 +01:00
Rob Ede a2662b928b
Update PULL_REQUEST_TEMPLATE.md 2020-07-10 14:55:56 +01:00
Yuki Okushi 84583799be
Merge pull request #1592 from JohnTitor/fix-tarpaulin
Use tarpaulin 0.13 to avoid failure
2020-07-07 05:11:09 +09:00
Yuki Okushi 08f9a34075
Use tarpaulin 0.13 to avoid failure 2020-07-07 04:00:18 +09:00
Rob Ede 056803d534
revamp readme and root doc page (#1590) 2020-07-05 01:16:53 +01:00
Yuki Okushi deab634247
actix-http: Update sha-1 to 0.9 (#1586) 2020-07-03 01:08:24 +01:00
Yuki Okushi 0b641a2db2
Merge pull request #1585 from JohnTitor/v-htmlescape
Update `v_htmlescape` to 0.10
2020-07-03 07:46:26 +09:00
Yuki Okushi f2d641b772
Update v_htmlescape to 0.10 2020-07-02 17:52:42 +09:00
Takashi Idobe 23c8191cca
add method to extract matched resource name (#1577)
Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-06-27 16:22:16 +01:00
Rob Ede 487f90be5b
move pull request template (#1578) 2020-06-23 14:26:07 +09:00
Rob Ede fa28175a74
add method to extract matched resource pattern (#1566) 2020-06-23 00:58:20 +01:00
Rob Ede a70e599ff5
re-export rt in web and add main macro (#1575) 2020-06-22 20:09:48 +01:00
Rob Ede c11052f826
add PR template for bugs and features (#1570)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-06-22 18:28:06 +09:00
Yuki Okushi 73ec01e83b
Merge pull request #1576 from b4skyx/patch-1
Update benchmark url in README.md
2020-06-22 16:48:49 +09:00
Abhishek Yadav a7c8533291
Update benchmark url in README.md
Updated benchmark url from r18 to the latest r19.
2020-06-22 04:14:48 +00:00
Rob Ede eb0eda69c6
migrate cookie handling to cookie crate (#1558) 2020-06-19 14:34:14 +01:00
Rob Ede dc74db1f2f
re-export actix_rt::main macro (#1559) 2020-06-18 15:45:30 +01:00
Rob Ede 0ba73fc44c
exclude default -web features on -actors (#1562) 2020-06-18 11:23:36 +01:00
Fabianstelmach 9af07d66ae
Fix NormalizePath trailing slash behavior (#1548) 2020-06-17 10:54:20 +01:00
Andrew e72ee28232
Enforce HW_BUFFER_SIZE inside h1::dispatcher (#1550) 2020-06-17 08:58:23 +01:00
Yuki Okushi 4f9a1ac3b7
Merge pull request #1553 from taiki-e/pin-project
Remove uses of pin_project::project attribute
2020-06-07 02:00:01 +09:00
Taiki Endo 6c5c4ea230 Remove uses of pin_project::project attribute
pin-project will deprecate the project attribute due to some unfixable
limitations.

Refs: https://github.com/taiki-e/pin-project/issues/225
2020-06-06 06:44:14 +09:00
Yuki Okushi a79450482c
Merge pull request #1547 from JohnTitor/appveyor
Remove AppVeyor config
2020-06-03 10:43:01 +09:00
Yuki Okushi 5286b8aed7
Remove AppVeyor config 2020-06-03 03:39:35 +09:00
Stephen Stack 621ebec01a
Fix typo in timeout error display (#1552) 2020-06-02 18:04:49 +01:00
Yuki Okushi 5e5c8b1c83
Merge pull request #1544 from JohnTitor/remove-framed
Remove actix-framed from workspace
2020-05-31 16:10:46 +09:00
Yuki Okushi 322e7c15d1
Remove actix-framed from workspace 2020-05-31 05:50:32 +09:00
Yuki Okushi 7aa757ad5a
Merge pull request #1540 from JohnTitor/next-multipart
multipart: Bump up to 0.3.0-alpha.1
2020-05-25 22:04:07 +09:00
Yuki Okushi 482f74e409
multipart: Bump up to 0.3.0-alpha.1 2020-05-25 19:12:20 +09:00
Yuki Okushi 19967c41cc
Merge pull request #1538 from JohnTitor/codegen-meta
Tweak codegen metadata
2020-05-25 17:37:58 +09:00
Yuki Okushi 8a106c07b4
Tweak codegen metadata 2020-05-25 16:45:34 +09:00
Yuki Okushi 11a9fdad95
Merge pull request #1535 from JohnTitor/next-files
files: Bump up to 0.3.0-alpha.1
2020-05-24 11:52:19 +09:00
Yuki Okushi 75a34dc8bc
files: Bump up to 0.3.0-alpha.1 2020-05-23 18:47:08 +09:00
Yuki Okushi 5b60ee8cfd
Merge pull request #1534 from JohnTitor/next-codegen
codegen: Bump up to 0.2.2
2020-05-23 18:08:36 +09:00
Yuki Okushi bb89d04080
codegen: Bump up to 0.2.2 2020-05-23 17:22:30 +09:00
Yuki Okushi f57b5659da
Merge pull request #1533 from JohnTitor/next-test-server
http-test: Bump up to 2.0.0-alpha.1
2020-05-23 15:22:40 +09:00
Yuki Okushi 4a955c425d
Update actix-http-test dependency to 2.0.0-alpha.1 2020-05-23 12:14:17 +09:00
Yuki Okushi 905f86b540
http-test: Bump up to 2.0.0-alpha.1 2020-05-23 12:13:43 +09:00
Yuki Okushi 0348114ad8
Merge pull request #1532 from JohnTitor/issue-template
Add links to Gitter on the issue template
2020-05-23 12:11:59 +09:00
Yuki Okushi 9c5a2d6580
Add links to Gitter on the issue template 2020-05-22 13:14:01 +09:00
Yuki Okushi 2550f00702
Merge pull request #1530 from NickKolpinskiy/itoa
Use `itoa` in the content-length helper
2020-05-22 13:03:50 +09:00
Nick Kolpinskiy 7d8fb631a0 Use itoa in the content-length helper 2020-05-21 22:25:34 +03:00
Yuki Okushi b9e268e95f
Merge pull request #1529 from JohnTitor/next-web
web: Bump up to 3.0.0-alpha.3
2020-05-21 19:32:24 +09:00
Yuki Okushi 6dd78d9355
Run rustfmt 2020-05-21 17:56:53 +09:00
Yuki Okushi fe89ba7027
Update actix-web dependency to 3.0.0-alpha.3 2020-05-21 17:32:36 +09:00
Yuki Okushi 5d39110470
web: Bump up to 3.0.0-alpha.3 2020-05-21 17:31:22 +09:00
Yuki Okushi 5bde4e2529
Merge pull request #1528 from JohnTitor/next-awc
awc: Bump up to 2.0.0-alpha.2
2020-05-21 17:25:37 +09:00
Yuki Okushi 9b72d33b79
Update awc to 2.0.0-alpha.2 2020-05-21 16:48:20 +09:00
Yuki Okushi 0f826fd11a
awc: Bump up to 2.0.0-alpha.2 2020-05-21 16:47:16 +09:00
Yuki Okushi cf92cfa777
Merge pull request #1527 from JohnTitor/next-http
http: Bump up to 2.0.0-alpha.4
2020-05-21 16:35:34 +09:00
Yuki Okushi 9cfb32c780
Update actix-http to 2.0.0-alpha.4 2020-05-21 15:22:42 +09:00
Yuki Okushi 48fa78e182
http: Bump up to 2.0.0-alpha.4 2020-05-21 15:22:07 +09:00
Yuki Okushi 184683a698
Merge pull request #1525 from JohnTitor/deps
Update dependencies
2020-05-21 11:58:59 +09:00
Yuki Okushi 6c78f57a70
test-server: Update dependencies 2020-05-21 09:52:15 +09:00
Yuki Okushi 603973dede
awc: Update base64 to 0.12 2020-05-21 09:51:58 +09:00
Yuki Okushi 8391427905
http: Update base64 to 0.12 2020-05-21 09:51:32 +09:00
Yuki Okushi 2314dc30b5
Merge pull request #1519 from JohnTitor/sample-size
bench: Reduce sample count to remove warning
2020-05-21 01:49:17 +09:00
Yuki Okushi 864fc489ce
CI: Reduce sample size 2020-05-20 22:33:25 +09:00
Yuki Okushi c48af0c822
Merge pull request #1522 from actix/only-server-bench
CI: Only run the server benchmark to avoid SIGKILL
2020-05-20 15:22:13 +09:00
Yuki Okushi 50adbdecbe
CI: Only run the server benchmark to avoid SIGKILL 2020-05-20 13:12:08 +09:00
Yuki Okushi f8f5a82f40
Merge pull request #1518 from JohnTitor/replace-net2
Replace deprecated `net2` crate with `socket2`
2020-05-19 10:25:22 +09:00
Yuki Okushi 9a7f93610a
web: Replace net2 crate with socket2 2020-05-19 09:34:37 +09:00
Yuki Okushi 2dac9afc4e
test-server: Replace net2 crate with socket2 2020-05-19 09:25:51 +09:00
Yuki Okushi 74491dca59
Merge pull request #1515 from JohnTitor/minimize-futures
Minimize `futures` dependencies
2020-05-19 09:18:07 +09:00
Yuki Okushi 81b0c32062
test-server: Minimize futures dependencies 2020-05-19 08:29:12 +09:00
Yuki Okushi a98e53ecb8
web: Minimize futures dependencies 2020-05-19 08:29:12 +09:00
Yuki Okushi d7abbff3b0
awc: Minimize futures dependencies 2020-05-19 08:29:12 +09:00
Yuki Okushi 24372467d9
codegen: Minimize futures dependencies 2020-05-19 08:29:11 +09:00
Yuki Okushi fc8e07b947
actors: Minimize futures dependencies 2020-05-19 08:29:11 +09:00
Yuki Okushi ab4d8704f1
multipart: Minimize futures dependencies 2020-05-19 08:29:11 +09:00
Yuki Okushi 292af145cb
http: Minimize futures dependencies 2020-05-19 08:29:11 +09:00
Yuki Okushi 9bd6407730
framed: Minimize futures dependencies 2020-05-19 08:24:34 +09:00
Yuki Okushi 245dd471dd
files: Minimize futures dependencies 2020-05-19 08:24:34 +09:00
Omid Rad 32a37b7282
Remove content_length from ResponseBuilder (#1491)
* Remove content_length since it'll be overwritten by the response body. FIXES #1439

* Add setting of Content-Length to the no_chunking function

* Add changes and migration documentations

* Update MIGRATION.md

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>

Co-authored-by: Rob Ede <robjtede@icloud.com>
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-05-19 07:46:31 +09:00
Yuki Okushi 426a9b5d4d
Merge pull request #1514 from actix/remove/sized64
remove needless BodySize::Sized64 variant
2020-05-18 10:40:01 +09:00
Rob Ede 7e8ea44d5c
remove needless BodySize::Sized64 variant 2020-05-18 00:42:51 +01:00
Omid Rad b0866a8a0f
Actix-files will always send SizedStream (#1496)
* Fixes #1384

* There is no need to set no_chunking

* Test content-length for static files

* Update the tests

* Add Changelog

* Try to simply fix Windows test issues!

Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-05-18 06:54:42 +09:00
Yuki Okushi 7fe426f626
Merge pull request #1512 from JohnTitor/remove-outdated-members
Remove outdated members
2020-05-17 12:30:03 +09:00
Yuki Okushi 433a4563cf
Remove outdated members 2020-05-17 10:56:06 +09:00
Rob Ede f3b0233477
use mem::take where possible (#1507) 2020-05-17 10:54:42 +09:00
Sven Allers 201090d7a2
Provide impl<T> From<Arc<T>> for Data<T> (#1509) 2020-05-16 00:27:03 +01:00
pando85 4fc99d4a6f
Fix audit issue logging by default peer address (#1485)
* Fix audit issue logging by default peer address

By default log format include remote address that is taken from headers.
This is very easy to replace making log untrusted.

Changing default log format value `%a` to peer address we are getting
this trusted data always. Also, remote address option is maintianed and
relegated to `%{r}a` value.

Related  kanidm/kanidm#191.

* Rename peer/remote to remote_addr/realip_remote_addr

Change names to avoid naming confusions. I choose this accord to Nginx
variables and
[ngx_http_realip_module](https://nginx.org/en/docs/http/ngx_http_realip_module.html).

Add more specific documentation about security concerns of using Real IP
in logger.

* Rename security advertise header in doc

* Add fix audit issue logging by default peer adress to changelog

Co-authored-by: Rob Ede <robjtede@icloud.com>
2020-05-15 09:07:27 +09:00
Yuki Okushi 92ce975d87
Merge pull request #1506 from actix/chore/bump-140
bump msrv to 1.40
2020-05-13 23:46:13 +09:00
Rob Ede 996f1d7eae
bump msrv in ci and readme 2020-05-13 01:57:37 +01:00
Takeru Sato 63864ecf9e
support parsing of SameSite=None (#1503) 2020-05-12 17:48:35 +01:00
Yuki Okushi bbd4d19830
Merge pull request #1486 from actix/feat/data-cascade
allow parent data containers to be accessed from child scopes
2020-05-09 09:40:25 +09:00
Rob Ede 879cad9422
allow parent data containers to be accessed from child scopes 2020-05-09 00:31:26 +01:00
Yuki Okushi 6e8ff5c905
Merge pull request #1495 from JohnTitor/new-web
actix-web: Bump up to 3.0.0-alpha.2
2020-05-08 07:28:18 +09:00
Yuki Okushi b66c3083a5
Update the actix-web dependency to 3.0.0-alpha.2 2020-05-08 06:46:42 +09:00
Yuki Okushi b6b3481c6f
web: Bump up to 3.0.0-alpha.2 2020-05-08 06:46:13 +09:00
Yuki Okushi 574714d156
Merge pull request #1494 from JohnTitor/new-actors
actors: Bump up to 3.0.0-alpha.1
2020-05-08 06:17:15 +09:00
Yuki Okushi 54abf356d4
actors: Bump up to 3.0.0-alpha.1 2020-05-08 03:33:29 +09:00
Yuki Okushi 9cb3b0ef58
Merge pull request #1493 from JohnTitor/http-next
http: Bump up to 2.0.0-alpha.3
2020-05-08 03:09:52 +09:00
Yuki Okushi 9d0c80b6ce
Update actix-http deps 2020-05-08 02:35:45 +09:00
Yuki Okushi 0bc4a5e703
http: Bump up to 2.0.0-alpha.3 2020-05-08 02:35:45 +09:00
Rob Ede 9d94fb91b2
correct spelling of ConnectError::Unresolved (#1487)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-05-08 02:26:48 +09:00
Quentin de Quelen 9164ed1f0c
add resource middleware on actix-web-codegen (#1467)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-05-07 18:31:12 +09:00
Rob Ede b521e9b221
conditional test compilation [range, charset] (#1483)
* conditionally compile range and charset tests

* remove deprecated try macros

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-05-03 22:33:29 +09:00
Rob Ede f37cb6dd0b
refactor h1 status line helper to remove unsafe usage (#1484)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-05-03 17:37:40 +09:00
Mikail Bagishov d5ceae2074
Replace deprecated now with now_utc (#1481)
* Replace deprecated now with now_utc

* Update doctest
2020-05-02 10:14:50 +01:00
Rob Ede c27d3fad8e
clarify resource/scope app data overriding (#1476)
* relocate FnDataFactory

* clarify app data overriding in Scope and Resource

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-04-30 02:20:47 +09:00
Rob Ede bb17280f51
simplify data factory future polling (#1473)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-04-29 15:38:53 +09:00
Huston Bokinsky b047413b39
Small ws codec fix (#1465)
* Small ws codec fix

* Update actix-http/Changes.md

Co-authored-by: Huston Bokinsky <huston@deepgram.com>
2020-04-29 11:13:09 +09:00
Huy ce24630d31
Fix typos in MIGRATION.md (#1470)
* Fix typos in MIGRATION.md

Those are `crate` not `create`

* Update MIGRATION.md
2020-04-23 03:39:09 +09:00
Yuki Okushi 751253f23e
Merge pull request #1463 from actix/fix/doc-typos
fix spelling errors in doc comments
2020-04-21 13:47:03 +09:00
Rob Ede 5b0f7fff69
fix spelling errors in doc comments 2020-04-21 04:09:35 +01:00
Yuki Okushi 54619cb680
actix-http: Remove failure support (#1449) 2020-04-16 06:54:34 +09:00
Yuki Okushi 5b36381cb0
Merge pull request #1452 from actix/fix/default-service-data
set data container on default service calls
2020-04-16 06:01:56 +09:00
Rob Ede 45e2e40140
set data container on default service calls
closes #1450
2020-04-14 02:33:19 +01:00
Yuki Okushi df3f722589
Merge pull request #1451 from actix/cache
Remove cache config from GHA workflows
2020-04-13 06:06:45 +09:00
Yuki Okushi e7ba871bbf
Remove cache config from GHA workflows 2020-04-13 03:42:44 +09:00
Yuki Okushi ebc2e67015
Merge pull request #1442 from JohnTitor/workspace-doc
Deploy all the workspace crates' docs
2020-04-09 00:48:08 +09:00
Yuki Okushi 74ddc852c8
Tweak README 2020-04-08 04:48:01 +09:00
Yuki Okushi dfaa330a94
Deploy all the workspace crates' docs 2020-04-08 04:42:38 +09:00
Tore Pettersen 0ad02ee0e0
Add convenience functions for testing (#1401)
* Add convenience functions for testing

* Fix remarks from PR and add tests

* Add unpin to read_json_body

* Update changelog
2020-04-06 04:12:44 +09:00
Stephen Eckels aaff68bf05
Change NormalizePath to append trailing slash (#1433)
* Change NormalizePath to append trailing slash

* add tests

* Update CHANGES.md

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-04-05 03:26:40 +09:00
Yuki Okushi fcb1dec235
Merge pull request #1431 from OSSystems/topic/explicit-features-requirements
Add explicit feature requirements for examples and tests
2020-03-28 10:58:00 +09:00
Otavio Salvador 7b7daa75a4 Add explicit feature requirements for examples and tests
This allow us to build 'actix-web' without default features and run all
tests.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
2020-03-25 23:49:24 -03:00
Ivan Tham 2067331884
Refactor actix-codegen duplicate code (#1423)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-03-20 04:40:42 +09:00
Yuki Okushi bf630d9475
Merge pull request #1422 from OSSystems/topic/impl-error-more-types
Implement `std::error::Error` for our custom errors
2020-03-19 05:05:57 +09:00
Otavio Salvador 146ae4da18 Implement std::error::Error for our custom errors
For allowing a more ergonomic use and better integration on the
ecosystem, this adds the `std::error::Error` `impl` for our custom
errors.

We intent to drop this hand made code once `derive_more` finishes the
addition of the Error derive support[1]. Until that is available, we
need to live with that.

1. https://github.com/JelteF/derive_more/issues/92

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
2020-03-18 00:22:18 -03:00
Yuki Okushi 52c5755d56
Merge pull request #1421 from actix/JohnTitor-patch-1
Upload coverage on PRs
2020-03-18 06:16:41 +09:00
Yuki Okushi 5548c57a09
Upload coverage on PRs 2020-03-18 05:04:30 +09:00
Stig Johan Berggren 0d958fabd7
📝 Improve the code example for JsonConfig (#1418)
* 📝 Improve the code example for JsonConfig

* Remove a redundant comment
2020-03-17 08:23:54 +09:00
Oleg Nosov c67e4c1fe8
Refactored macros (#1333)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-03-15 07:23:28 +09:00
Yuki Okushi 4875dfbec7
Merge pull request #1416 from JohnTitor/fix-doc
Fix `read_body` doc
2020-03-13 07:06:57 +09:00
Yuki Okushi d602a7e386
Fix read_body doc 2020-03-13 05:52:58 +09:00
Yuki Okushi 9f196fe5a5
Merge pull request #1413 from OSSystems/topic/fix-warnings
Fix clippy warnings
2020-03-12 16:24:44 +09:00
Yuki Okushi e4adcd1935
Merge pull request #1411 from JohnTitor/patch
Clean-up metadata
2020-03-12 16:21:34 +09:00
Otavio Salvador 7e0d898d5a Fix clippy warnings
Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
2020-03-12 00:52:21 -03:00
Yuki Okushi 51518721e5
Add notes to READMEs 2020-03-12 07:57:38 +09:00
Yuki Okushi c02d3e205b
Clean-up metadata 2020-03-12 07:57:20 +09:00
Yuki Okushi a253d7d3ce
Merge pull request #1410 from JohnTitor/new-web
Release actix-web 3.0.0-alpha.1
2020-03-12 05:12:54 +09:00
Yuki Okushi 0152cedc5d
Update changelog 2020-03-12 03:24:15 +09:00
Yuki Okushi a6a47b95ee
Exclude actix-cors 2020-03-12 03:04:31 +09:00
Yuki Okushi 1b28a5d48b
Update actix-web dependency to 3.0.0-alpha.1 2020-03-12 03:03:50 +09:00
Yuki Okushi c147b94832
Bump up to 3.0.0-alpha.1 2020-03-12 03:03:22 +09:00
Yuki Okushi 95f9a12a5e
dev-deps: Update env_logger to 0.7 2020-03-12 02:58:22 +09:00
Yuki Okushi 73eeab0e90
Merge pull request #1391 from JohnTitor/new-awc
Release awc v2.0.0-alpha.1
2020-03-11 21:15:48 +09:00
Yuki Okushi ce1e996b41
Update release date 2020-03-11 20:42:45 +09:00
Yuki Okushi e718f65121
Update tests 2020-03-08 16:42:45 +09:00
Yuki Okushi a9a475d555
Make test_server async fn 2020-03-08 16:42:26 +09:00
Yuki Okushi b93e1555ec
Update actix-connect to 2.0.0-alpha.2 2020-03-08 15:27:40 +09:00
Yuki Okushi 6f33b7ea42
Update awc dependency 2020-03-08 15:27:40 +09:00
Yuki Okushi 294523a32f
Bump up to 2.0.0-alpha.1 2020-03-08 15:27:39 +09:00
Yuki Okushi 6b626c7d77
dev-deps: Update env_logger to 0.7 2020-03-08 03:07:53 +09:00
Yuki Okushi 5da9e277a2
Merge pull request #1399 from JohnTitor/new-http
Release actix-http 2.0.0-alpha.2
2020-03-08 01:47:40 +09:00
Yuki Okushi 0d5646a8b6
Run rustfmt 2020-03-08 00:52:39 +09:00
Yuki Okushi 7941594f94
Update actix-http dependency 2020-03-08 00:50:20 +09:00
Yuki Okushi 6f63acaf01
Bump up to 2.0.0-alpha.2 2020-03-08 00:48:45 +09:00
Yuki Okushi 7172885beb
Update changelog 2020-03-08 00:43:17 +09:00
Yuki Okushi cf721c5fff
Update README example 2020-03-08 00:43:01 +09:00
Maxim Vorobjov 10e3e72595
Http2 client configuration to improve performance (#1394)
* add defaults for http2 client configuration

* fix spaces

* Add changes text for extended H2 defaults buffers

* client: configurable H2 window sizes and max_http_version

* add H2 window size configuration and max_http_version to awc::ClientBuilder

* add awc::ClientBuilder H2 window sizes and max_http_version

* add test for H2 window size settings

* cleanup comment

* Apply code review fixes

* Code review fix for awc ClientBuilder

* Remove unnecessary comments on code review

* pin quote version to resolve build issue

* max_http_version to accept http::Version

* revert fix for quote broken build
2020-03-07 11:09:31 +09:00
Yuki Okushi a7d805aab7
Merge pull request #1396 from Aaron1011/fix/reapply-dispatcher
Re-apply commit 2cf7b3ad20
2020-03-05 02:48:20 +09:00
Aaron Hill e90950fee1
Re-apply commit 2cf7b3ad20
This ended up getting reverted by #1367, which re-introduced an unsound
use of `Pin::new_unchecked`

See my original PR #1374 for the reasoning behind this change.
2020-03-04 11:27:58 -05:00
Yuki Okushi c8f0672ef7
Merge pull request #1395 from JohnTitor/rustls
Update `rustls` to 0.17
2020-03-04 15:56:27 +09:00
Yuki Okushi 9d661dc4f3 Update changelog 2020-03-04 15:20:14 +09:00
Yuki Okushi 687dc609dd Update rustls to 0.17 2020-03-04 15:11:31 +09:00
Yuki Okushi b9b52079e0 Update actix-tls to 2.0.0-alpha.1 2020-03-04 15:10:23 +09:00
Yuki Okushi 117d28f7ba Update actix-connect to 2.0.0-alpha.1 2020-03-04 15:09:31 +09:00
Yuki Okushi 795a575fc5
Merge pull request #1386 from JohnTitor/deny-to-warn
Demote lint level to warn
2020-02-28 14:17:11 +09:00
Yuki Okushi b4d63667df Demote lint level to warn 2020-02-27 22:39:11 +09:00
__JM_Joy__ 3dc859af58
Fix missing std::error::Error implement for MultipartError. (#1382)
* Fix missing `std::error::Error` implement for `MultipartError`.

* Update actix-multipart CHANGES.md.
2020-02-27 22:34:06 +09:00
Yuki Okushi 1fa02b5f1c
Merge pull request #1385 from JohnTitor/http-2-alpha
Release actix-http 2.0.0-alpha.1
2020-02-27 14:47:32 +09:00
Yuki Okushi c9fdcc596d Update actix to 0.10.0-alpha.1 2020-02-27 12:46:29 +09:00
Yuki Okushi 6cc83dbb67 Allow clippy lint for compatibility 2020-02-27 12:45:11 +09:00
Yuki Okushi 3b675c9125 Update actix-http to 2.0.0-alpha.1 2020-02-27 12:39:04 +09:00
Yuki Okushi 15a2587887 Bump up to 2.0.0-alpha.1 2020-02-27 12:39:04 +09:00
Yuki Okushi 0173f99726 Update changelog 2020-02-27 12:39:04 +09:00
Yuki Okushi f27dd19093 Fix Clippy warnings 2020-02-27 12:39:04 +09:00
Yuki Okushi 7ba14fd113 Run rustfmt 2020-02-27 11:10:55 +09:00
Yuki Okushi 903ae47baa dev-deps: Update env_logger to 0.7 2020-02-27 11:08:45 +09:00
Yuki Okushi 95c18dbdf3
Merge pull request #1367 from actix/msg-body
Merge `MessageBody` improvements
2020-02-27 10:42:14 +09:00
Yuki Okushi d3ccf46e92 Clean-up metadata 2020-02-27 09:53:27 +09:00
Yuki Okushi cd1765035c Avoid re-definition 2020-02-27 09:42:32 +09:00
Maksym Vorobiov ea28219d0f reenable actix-http test-ws 2020-02-27 09:42:32 +09:00
Maksym Vorobiov 77058ef779 adopt MessageBody Pin changes to actix-web root 2020-02-27 09:42:32 +09:00
Maksym Vorobiov e5f2feec45 reenable actix-http from local path 2020-02-27 09:42:32 +09:00
Maksym Vorobiov 0a86907dd2 use mem::replace instead of mem::take rust 1.40+ 2020-02-27 09:37:05 +09:00
Maksym Vorobiov 78749a4b7e rollback actix-http version change 2020-02-27 09:37:05 +09:00
Maksym Vorobiov de815dd99c Fixed condition for finishing transfer of response 2020-02-27 09:37:05 +09:00
Maksym Vorobiov e6078bf792 Fix EncoderBody enum to align with Body::Message 2020-02-27 09:37:05 +09:00
Maksym Vorobiov a84b37199a Add Unpin to Body to get rid of unsafe in MessageBody 2020-02-27 09:37:05 +09:00
Maksym Vorobiov c05f9475c5 refactor dispatcher to avoid possible UB with DispatcherState Pin 2020-02-27 09:37:05 +09:00
Maksym Vorobiov 69dab0063c Get rid of one more unsafe 2020-02-27 09:37:05 +09:00
Maksym Vorobiov ec5c779732 unlink MessageBody from Unpin 2020-02-27 09:37:05 +09:00
Maksym Vorobiov 2e2ea7ab80 remove extra whitespaces and Unpins 2020-02-27 09:37:05 +09:00
Maksym Vorobiov eeebc653fd change actix-http version to alpha 2020-02-27 09:37:05 +09:00
Maksym Vorobiov 835a00599c rollback missed dependencies and CHANGES in crates except actix-http 2020-02-27 09:37:05 +09:00
Maksym Vorobiov d9c415e540 disable weird poll test until actix-web based on actix-http:2 2020-02-27 09:37:05 +09:00
Maksym Vorobiov 09a391a3ca rollback changes to actix-web, awc and test-server for now 2020-02-27 09:37:05 +09:00
Maksym Vorobiov 62aba424e2 Rollback actix-http-test dependency to show the issue 2020-02-27 09:37:05 +09:00
Maksym Vorobiov 9d04b250f9 This is a squashed commit:
- Convert MessageBody to accept Pin in poll_next

- add CHANGES and increase versions aligned to semver

- update crates to accomodate MessageBody Pin change

- fix tests and dependencies
2020-02-27 09:37:05 +09:00
Maksym Vorobiov a4148de226 add test crashing with segfault according to #1321 2020-02-27 09:36:30 +09:00
Maxim Vorobjov 48ef4d7a26
Add actix-http support for actix error messages (#1379)
* Moved actix-http for actix from actix crate

* remove resolver feature

* renamed actix feature to actor

* fixed doc attr for actors, add documentation
2020-02-27 09:34:49 +09:00
Aaron Hill 71c4bd1b30
Remove uses of Pin::new_unchecked in h1 Dispatcher (#1374)
This removes the last uses of unsafe `Pin` functions in actix-web.

This PR adds a `Pin<Box<_>>` wrapper to `DispatcherState::Upgrade`,
`State::ExpectCall`, and `State::ServiceCall`.

The previous uses of the futures `State::ExpectCall` and `State::ServiceCall`
were Undefined Behavior - a future was obtained from `self.expect.call`
or `self.service.call`, pinned on the stack, and then immediately
returned from `handle_request`. The only alternative to using `Box::pin`
would be to refactor `handle_request` to write the futures directly into
their final location, or avoid polling them before they are returned.

The previous use of `DispatcherState::Upgrade` doesn't seem to be
unsound. However, having data pinned inside an enum that we
`std::mem::replace` would require some careful `unsafe` code to ensure
that we never call `std::mem::replace` when the active variant contains
pinned data. By using `Box::pin`, we any possibility of future
refactoring accidentally introducing undefined behavior.

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-02-26 08:21:05 +09:00
Yuki Okushi de1d6ad5cb
Merge pull request #1344 from actix/replace-unsafe-content-length-helper
Replace unsafe content length helper
2020-02-25 17:02:22 +09:00
Yuki Okushi 2a72e8d119
Merge branch 'master' into replace-unsafe-content-length-helper 2020-02-25 14:30:04 +09:00
Yuki Okushi 2a8e5fdc73
Merge pull request #1370 from mattgathu/feat/helper-function-for-trace-method
Create helper function for HTTP Trace Method
2020-02-25 14:24:09 +09:00
Yuki Okushi b213c07799
Merge branch 'master' into feat/helper-function-for-trace-method 2020-02-25 12:36:20 +09:00
Yuki Okushi 3d6b8686ad
Merge pull request #1373 from JohnTitor/new-codegen
Release `actix-web-codegen` v0.2.1
2020-02-25 09:32:48 +09:00
Yuki Okushi a4f87a53da
Update CHANGES.md 2020-02-25 08:42:39 +09:00
Yuki Okushi 08f172a0aa
Merge branch 'master' into new-codegen 2020-02-25 08:29:31 +09:00
Yuki Okushi 7792eaa16e
Merge pull request #1378 from JohnTitor/fix-doc
Fix doc comment
2020-02-25 08:29:14 +09:00
Yuki Okushi 845ce3cf34 Fix doc comment 2020-02-25 07:46:03 +09:00
Yuki Okushi 7daef22e24
Merge branch 'master' into new-codegen 2020-02-25 06:58:49 +09:00
Yuki Okushi 1249262c35
Merge pull request #1372 from JohnTitor/time-0.2.7
Update `time` to 0.2.7
2020-02-25 06:58:33 +09:00
Rob Ede 94da08f506
increase content-length fast path to responses up to 1MB 2020-02-24 20:58:41 +00:00
Matt Gathu d143c44130
Update the ChangeLog 2020-02-23 09:33:28 +01:00
Matt Gathu 8ec8ccf4fb
Create helper function for HTTP Trace Method
Create *route* with `TRACE` method guard.
2020-02-23 09:25:55 +01:00
Yuki Okushi c8ccc69b93 actix-http: update time to 0.2.7 2020-02-23 07:09:00 +09:00
Yuki Okushi f9f9fb4c84 actix-http-test: update time to 0.2.7 2020-02-23 07:08:50 +09:00
Yuki Okushi 1b77963aac actix-web: update time to 0.2.7 2020-02-23 07:08:22 +09:00
Yuki Okushi 036ffd43f9 Prepare for new release 2020-02-23 06:40:02 +09:00
Yuki Okushi bdccccd536
Merge pull request #1368 from mattgathu/add-missing-docs-attr-to-codegen-structs
Add`#[allow(missing_docs)]` attribute to generated structs
2020-02-23 06:26:42 +09:00
Matt Gathu 060c392c67
Add missing_docs attribute to generated structs 2020-02-22 10:32:12 +01:00
Daniel YU 245f96868a
impl downcast_ref for MessageBody (#1287)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-02-21 13:31:51 +09:00
Yuki Okushi b3f1071aaf
Merge pull request #1361 from Aaron1011/fix/connector-pool-support
Use #[pin_project] with `ConnectorPoolSupport`
2020-02-21 06:01:26 +09:00
Aaron Hill e6811e8818
Use #[pin_project] with ConnectorPoolSupport
This removes a use of `Pin::get_unchecked_mut`
2020-02-19 21:42:53 -05:00
Elliot Jackson 809930d36e
Add dependencies to docs example (#1343)
* Add dependencies to docs example

* Change codeblock type to toml

* Clarify the need for actix-rt

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-02-20 05:13:10 +09:00
Rob Ede f266b44cb0
replace unsafe blocks in write_usize helper 2020-02-16 15:20:25 +00:00
Rob Ede 31a3515e90
add safe vs unsafe benchmarks 2020-02-16 14:31:06 +00:00
Rob Ede 82b2786d6b
replace unsafe content length implementation 2020-02-16 14:31:05 +00:00
Masayuki Nagamachi 6ab7cfa2be
Remove descriptions about undefined uds feature from docs (#1356) 2020-02-16 04:18:31 +09:00
Yuki Okushi 9b3f7248a8
Merge pull request #1354 from actix/JohnTitor-patch-1
Disable coverage for PRs
2020-02-14 08:18:09 +09:00
Yuki Okushi a1835d6510
Disable coverage for PRs 2020-02-14 07:31:29 +09:00
Yuki Okushi 4484b3f66e
Merge pull request #1347 from actix/bye-travis
Use Actions fully
2020-02-12 05:54:32 +09:00
Yuki Okushi cde3ae5f61 Remove Travis config 2020-02-08 05:36:11 +09:00
Yuki Okushi 7d40b66300 Add some Actions workflows 2020-02-08 04:28:34 +09:00
Yuki Okushi 63730c1f73
Merge pull request #1345 from JohnTitor/fix-warnings
Fix warnings
2020-02-08 04:17:04 +09:00
Yuki Okushi 53ff3ad099 More ignore test causes timeout 2020-02-08 02:20:01 +09:00
Yuki Okushi 6406f56ca2 Fix/suppress warnings 2020-02-08 02:20:01 +09:00
zero-systems 728b944360
Extensions module improvement and tests. (#1297)
* replace get.is_some to contains_key

* Add tests

* remove unnecessary box cast

* fix missing uints

* asserts fix

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-02-07 16:08:25 +09:00
Levi Notik 3851a377df
Fix minor grammatical errors (#1341) 2020-02-07 03:00:22 +09:00
Aaron Hill fe13789345
Use Pin<Box<S>> in BodyStream and SizedStream (#1328)
Fixes #1321

A better fix would be to change `MessageBody` to take a `Pin<&mut
Self>`, rather than a `Pin<&mut Self>`. This will avoid requiring the
use of `Box` for all consumers by allowing the caller to determine how
to pin the `MessageBody` implementation (e.g. via stack pinning).

However, doing so is a breaking change that will affect every user of
`MessageBody`. By pinning the inner stream ourselves, we can fix the
undefined behavior without breaking the API.

I've included @sebzim4500's reproduction case as a new test case.
However, due to the nature of undefined behavior, this could pass (and
not segfault) even if underlying issue were to regress.

Unfortunately, until rust-lang/unsafe-code-guidelines#148 is resolved,
it's not even possible to write a Miri test that will pass when the bug
is fixed.

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-31 09:39:34 +09:00
Aaron Hill 3033f187d2
Enforce safety of downcast_ref at compile time. (#1326)
* Enforce safety of `downcast_ref` at compile time.

The safety of `downcast_ref` requires that `__private_get_type_id__` not
be overriden by callers, since the returned `TypeId` is used to check if
the cast is safe. However, all trait methods in Rust are public, so
users can override `__private_get_type_id__` despite it being
`#[doc(hidden)]`.

This commit makes `__private_get_type_id__` return a type with a private
constructor, ensuring that the only possible implementation is the
default implementation. A more detailed explanation is provided in the
comments added to the file.

Note that the standard library was affected by this type of issue with
the `Error::type_id` function: see https://blog.rust-lang.org/2019/05/14/Rust-1.34.2.html#whats-in-1.34.2-stable

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-30 23:43:35 +09:00
Aaron Hill 276a5a3ee4
Replace UnsafeCell with Cell in DateServiceInner (#1325)
* Replace `UnsafeCell` with `Cell` in `DateServiceInner`

This ensures that it's impossible to cause undefined behavior by
accidentally violating Rust's aliasing rules (e.g. passing a closure to
`set_date` which ends up invoking `reset` or `update` on the inner
`DateServiceInner`).

There might be a tiny amount of overhead from copying the `Option<(Date,
Instant)>` rather than taking a reference, but it shouldn't be
measurable.

Since the wrapped type is `Copy`, a `Cell` can be used, avoiding the
runtime overhead of a `RefCell`.

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-29 21:05:08 +09:00
Andrey Kutejko 664f9a8b2d
Long lasting auto-prolonged session (#1292)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-29 10:26:39 +09:00
Yuki Okushi c73c2dc12c
Don't use cache in Windows CI (#1327) 2020-01-29 09:00:04 +09:00
kevinpoitra e634e64847 Upgrade time to 0.2.5 (#1254)
* Use `OffsetDateTime` instead of `PrimitiveDateTime`

* Parse time strings with `PrimitiveDateTime::parse` instead of `OffsetDateTime::parse`

* Remove unused `time` dependency from actix-multipart

* Fix a few errors with time related tests from the `time` upgrade

* Implement logic to convert a RFC 850 two-digit year into a full length year, and organize time parsing related functions

* Upgrade `time` to 0.2.2

* Correctly parse C's asctime time format using time 0.2's new format patterns

* Update CHANGES.md

* Use `time` without any of its deprecated functions

* Enforce a UTC time offset when converting an `OffsetDateTime` into a Header value

* Use the more readable version of `Duration::seconds(0)`, `Duration::zero()`

* Remove unneeded conversion of time::Duration to std::time::Duration

* Use `OffsetDateTime::as_seconds_f64` instead of manually calculating the amount of seconds from nanoseconds

* Replace a few additional instances of `Duration::seconds(0)` with `Duration::zero()`

* Truncate any nanoseconds from a supplied `Duration` within `Cookie::set_max_age` to ensure two Cookies with the same amount whole seconds equate to one another

* Fix the actix-http:🍪:do_not_panic_on_large_max_ages test

* Convert `Cookie::max_age` and `Cookie::expires` examples to `time` 0.2

Mainly minor  changes. Type inference can be used alongside the new
`time::parse` method, such that the type doesn't need to be specified.
This will be useful if a refactoring takes place that changes the type.
There are also new macros, which are used where possible.

One change that is not immediately obvious, in `HttpDate`, there was an
unnecessary conditional. As the time crate allows for negative durations
(and can perform arithmetic with such), the if/else can be removed
entirely.

Time v0.2.3 also has some bug fixes, which is why I am not using a more
general v0.2 in Cargo.toml.

v0.2.3 has been yanked, as it was backwards imcompatible. This version
reverts the breaking change, while still supporting rustc back to
1.34.0.

* Add missing `time::offset` macro import

* Fix type confusion when using `time::parse` followed by `using_offset`

* Update `time` to 0.2.5

* Update CHANGES.md

Co-authored-by: Jacob Pratt <the.z.cuber@gmail.com>
2020-01-28 20:44:22 +09:00
Kai Ren cdba30d45f Skip empty chucks for BodyStream and SizedStream (#1308)
* Skip empty chucks for BodyStream and SizedStream when streaming response (#1267)

* Fix tests to fail on previous implementation

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-28 18:28:09 +09:00
Aaron Hill 74dcc7366d Remove several uses of Pin::new_unchecked (#1294)
Most of the relevant struct already had a `#[pin_project]` attribute,
but it wasn't being used.

The remaining uses of `Pin::new_unchecked` all involve going from a
`&mut T` to a `Pin<&mut T>`, without directly observing a `Pin<&mut T>`
first. As such, they cannot be replaced by `pin_project`

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-28 12:35:51 +09:00
Aaron Hill d137a8635b Replace Pin::new_unchecked with #[pin_project] in tuple_from_req! (#1293)
Using some module trickery, we can generate a tuple struct for each
invocation of the macro. This allows us to use `pin_project` to project
through to the tuple fields, removing the need to use
`Pin::new_unchecked`

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-28 10:45:25 +09:00
Yuki Okushi a2d4ff157e
Update call_service documentation (#1302)
Co-authored-by: Christian Battaglia <christian.d.battaglia@gmail.com>
2020-01-28 08:09:46 +09:00
Andrey Torsunov 71d11644a7 Add ability to name a handler function as 'config' (#1290)
* eliminate handler naming restrictions #1277

* Update actix-web-codegen/CHANGES.md

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-26 07:22:40 +09:00
Maxim Vorobjov 8888520d83 Add benchmark for full stack request lifecycle (#1298)
* add benchmark for full stack request lifecycle

* add direct service benchmarks

* fix newline

* add cloneable service benchmarks

* remove cloneable bench experiments + cargo fmt

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-25 08:05:25 +09:00
Yuki Okushi cf3577550c
Tweak caches (#1319)
* Try to use `cargo-cache`

* Tweak issue template
2020-01-25 02:27:13 +09:00
Maxim Vorobjov 58844874a0 Fixing #1295 convert UnsafeCell to RefCell in CloneableService (#1303)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-24 14:51:38 +09:00
cetra3 78f24dda03 Initial Issue template (#1311)
* Initial Issue template

* First round of changes for the bug report

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-24 07:32:34 +09:00
godofdream e17b3accb9 Remove codecoverage for tests and examples (#1299)
* Ignore Tests & Examples for CodeCoverage

Ignore Tests & Examples for CodeCoverage
2020-01-24 05:10:02 +09:00
Yuki Okushi c6fa007e72
Fix vcpkg cache (#1312) 2020-01-23 11:27:34 +09:00
Rob Ede a3287948d1 allow explicit SameSite=None cookies (#1282)
fixes #1035
2020-01-23 10:08:23 +09:00
Yuki Okushi 2e9ab0625e
Tweak actions (#1305)
* Add benchmark action

* Fix Windows build
2020-01-23 06:23:53 +09:00
Yuki Okushi 3a5b62b550
Add dependencies instruction (#1281) 2020-01-16 23:17:17 +09:00
Adam Kewley 412e54ce10 Fixed documentation typo for actix-files (#1278) 2020-01-15 11:09:58 -08:00
Peter Hall bca41f8d40 Changes to Cors builder (#1266)
Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-11 04:53:17 +09:00
Jacob Brown 7c974ee668 Update doc comment for HttpRequest::app_data (#1265)
* update doc comment for `HttpRequest::app_data`

* add `no_run` to doc comment

* add `ignore` to doc comment

* Update src/request.rs

Co-Authored-By: Yuki Okushi <huyuumi.dev@gmail.com>

Co-authored-by: Yuki Okushi <huyuumi.dev@gmail.com>
2020-01-11 03:55:20 +09:00
linkmauve abb462ef85 Replace sha1 dependency with sha-1 (#1258)
* Replace sha1 dependency with sha-1

This other crate is being maintained, and it offers better performances
when using the `asm` feature (especially [on
AArch64](https://github.com/RustCrypto/hashes/pull/97)).

* Update CHANGES.md with the sha-1 migration

* Add a test for hash_key()
2020-01-11 02:34:31 +09:00
Nikolay Kim e66312b664 add extra constraints 2020-01-10 11:36:59 +06:00
Nikolay Kim 39f4b2b39e Merge branch 'master' of github.com:actix/actix-web 2020-01-10 11:28:58 +06:00
Nikolay Kim f6ff056b8a Fix panic with already borrowed: BorrowMutError #1263 2020-01-10 11:26:54 +06:00
Yuki Okushi 51ab4fb73d
Tweak actions to use cache and not to be stuck on the way (#1264) 2020-01-10 03:30:45 +09:00
linkmauve f5fd6bc49f Fix actix-http examples (#1259)
Fix actix-http examples
2020-01-07 00:15:04 +09:00
Jeremy Wright 2803fcbe22 Small grammaritical update to lib.rs (#1248) 2020-01-03 08:45:17 +06:00
Nikolay Kim 67793c5d92 add ssl feature migration 2019-12-30 21:22:04 +06:00
Jonathan Brookins bcb5086c91 Added 2.0.0 rustls feature name change (#1244) 2019-12-30 21:16:04 +06:00
wojciechkepka 7bd2270290 Fix link to example in readme.md (#1236)
* Fix link to example in readme.md

* Add links to openssl and rustls examples

* Rustls should be uppercase
2019-12-26 19:42:07 +09:00
Nikolay Kim a4ad5e6b69 update timeouts for test server 2019-12-25 20:52:20 +04:00
Nikolay Kim 6db909a3e7 update migration 2019-12-25 20:27:30 +04:00
Nikolay Kim 642ae161c0 prep actix-web release 2019-12-25 20:21:00 +04:00
Nikolay Kim 7b3c99b933 prep actix-framed release 2019-12-25 20:17:22 +04:00
Nikolay Kim f86ce0390e allow to specify multi pattern for resources 2019-12-25 20:14:44 +04:00
Nikolay Kim 7882f545e5 Allow to gracefully stop test server via TestServer::stop() 2019-12-25 12:10:48 +04:00
Nikolay Kim 1c75e6876b update migration 2019-12-22 17:16:07 +04:00
Nikolay Kim 6a0cd2dced Rename HttpServer::start() to HttpServer::run() 2019-12-22 17:12:22 +04:00
Nikolay Kim c7f3915779 update actix-service dep 2019-12-22 16:39:25 +04:00
Yuki Okushi f45db1f909
Enable GitHub Actions and fix file URL behavior (#1232)
* Use GitHub Actions

* Fix unused imports on Windows

* Fix test for Windows

* Stop to run CI for i686-pc-windows-msvc for now

* Use `/` instead of `\` on Windows

* Add entry to changelog

* Prepare actix-files release
2019-12-22 16:43:41 +09:00
Darin 3751a4018e fixed test::init_service api docs (missing await) (#1230) 2019-12-21 08:47:18 +06:00
Nikolay Kim 0cb1b0642f add test server data test 2019-12-20 23:18:59 +06:00
Nikolay Kim 48476362a3 update changes 2019-12-20 17:59:34 +06:00
Nikolay Kim 2b4256baab add links to configs 2019-12-20 17:49:05 +06:00
Nikolay Kim e5a50f423d Make web::Data deref to Arc<T> #1214 2019-12-20 17:45:35 +06:00
Nikolay Kim 8b8a9a995d bump ver 2019-12-20 17:36:48 +06:00
Nikolay Kim 74fa4060c2 fix awc tests 2019-12-20 17:27:32 +06:00
Nikolay Kim c877840c07 rename App::register_data to App::app_data and HttpRequest::app_data returns Option<&T> instead of Option<&Data<T>> 2019-12-20 17:13:09 +06:00
Nikolay Kim 20248daeda Allow to set peer_addr for TestRequest #1074 2019-12-20 16:11:51 +06:00
Nikolay Kim a08d8dab70 AppConfig::secure() is always false. #1202 2019-12-20 16:04:51 +06:00
tglman fbbb4a86e9 feat: add access to the session also from immutable references (#1225) 2019-12-20 13:59:07 +06:00
Nikolay Kim 1d12ba9d5f Replace brotli with brotli2 #1224 2019-12-20 13:50:07 +06:00
Nikolay Kim 8c54054844 Use .advance() intead of .split_to() 2019-12-19 09:56:14 +06:00
Nikolay Kim 1732ae8c79 fix Bodyencoding trait usage 2019-12-18 09:30:14 +06:00
Rajasekharan Vengalil 3b860ebdc7 Fix poll_ready call for WebSockets upgrade (#1219)
* Fix poll_ready call for WebSockets upgrade

* Poll upgrade service from H1ServiceHandler too
2019-12-17 13:34:25 +06:00
Nikolay Kim 29ac6463e1 Merge branch 'master' of github.com:actix/actix-web 2019-12-16 17:22:49 +06:00
Nikolay Kim 01613f334b Move BodyEncoding to dev module #1220 2019-12-16 17:22:26 +06:00
Andrii Radyk 30dcaf9da0 fix deprecated Error::description (#1218) 2019-12-16 07:43:19 +06:00
Nikolay Kim b0aa9395da prep actix-web alpha.6 release 2019-12-15 22:51:14 +06:00
Nikolay Kim a153374b61 migrate actix-web-actors 2019-12-15 22:45:38 +06:00
Nikolay Kim a791aab418 prep awc release 2019-12-15 13:36:05 +06:00
Nikolay Kim cb705317b8 compile with default-features off 2019-12-15 13:28:54 +06:00
Nikolay Kim e8e0f98f96 fix docs.rs features list 2019-12-13 12:41:48 +06:00
Nikolay Kim c878f66d05 fix docs.rs features list 2019-12-13 12:40:22 +06:00
Nikolay Kim fac6dec3c9 update deps 2019-12-13 12:36:15 +06:00
Nikolay Kim 232f71b3b5 update changes 2019-12-13 12:18:30 +06:00
Nikolay Kim 8881c13e60 update changes 2019-12-13 12:16:43 +06:00
Nikolay Kim d006a7b31f update changes 2019-12-13 12:10:45 +06:00
Nikolay Kim 3d64d565d9 fix warnings 2019-12-13 11:46:02 +06:00
Nikolay Kim c1deaaeb2f cleanup imports 2019-12-13 11:24:57 +06:00
Nikolay Kim b81417c2fa fix warnings 2019-12-13 10:59:02 +06:00
Nikolay Kim 4937c9f9c2 refactor http-test server 2019-12-12 23:08:38 +06:00
Nikolay Kim db1d6b7963 refactor test server impl 2019-12-12 22:28:47 +06:00
Nikolay Kim fa07415721 Replace flate2-xxx features with compress 2019-12-12 15:08:08 +06:00
Nikolay Kim b4b3350b3e Add websockets continuation frame support 2019-12-12 14:06:54 +06:00
Jonathan Speiser 4a1695f719 fixes missing import in example (#1210) 2019-12-12 07:06:22 +06:00
0x1793d1 1b8d747937 Fix extra line feed (#1209) 2019-12-12 07:05:39 +06:00
Emilio González a43a005f59 Log path if it is not a directory (#1208) 2019-12-12 07:04:53 +06:00
Alexander Larsson a612b74aeb actix-multipart: Fix multipart boundary reading (#1205)
* actix-multipart: Fix multipart boundary reading

If we're not ready to read the first line after the multipart field
(which should be a "\r\n" line) then return Pending instead of Ready(None)
so that we will get called again to read that line.

Without this I was getting MultipartError::Boundary from read_boundary()
because it got the "\r\n" line instead of the boundary.

Also tweaks the test_stream test to test partial reads.

This is a forward port of #1189 from 1.0

* actix-multipart: Update changes for boundary fix
2019-12-12 07:03:44 +06:00
Nikolay Kim 131c897099 upgrade to actix-net release 2019-12-11 19:20:20 +06:00
Nikolay Kim ef3a33b9d6 use std mutext instead of parking_lot 2019-12-10 09:00:51 +06:00
Nikolay Kim 5132257b0d Fix buffer remaining capacity calcualtion 2019-12-09 21:55:22 +06:00
Nikolay Kim 0c1f5f9edc Check Upgrade service readiness before calling it 2019-12-09 17:40:15 +06:00
Sameer Dhar e4382e4fc1 Fix broken docs (#1204)
Fixed un escaped brackets in lib.rs, and reflowed links to ConnectionInfo in app, config, and server.rs
2019-12-09 10:02:43 +06:00
Nikolay Kim a3ce371312 ws ping and pong uses bytes #1049 2019-12-09 07:01:22 +06:00
Nikolay Kim 42258ee289 deps 2019-12-08 20:22:39 +06:00
Nikolay Kim b92eafb839 prepare actix-http release 2019-12-08 20:15:51 +06:00
Nikolay Kim 3b2e78db47 add link to chat 2019-12-08 19:27:06 +06:00
Nikolay Kim 63da1a5560 Merge branch 'master' of github.com:actix/actix-web 2019-12-08 19:26:12 +06:00
Nikolay Kim 1f3ffe38e8 update actix-service dep 2019-12-08 19:25:24 +06:00
krircc c23b6b3879
Merge pull request #1192 from krircc/master
Add rich project metadata
2019-12-08 16:03:39 +08:00
Yuki Okushi 909c7c8b5b
Merge branch 'master' into master 2019-12-08 16:26:35 +09:00
Nikolay Kim 4a8a9ef405 update tests and clippy warnings 2019-12-08 12:31:16 +06:00
Nikolay Kim 6c9f9fff73 clippy warnings 2019-12-08 00:46:51 +06:00
Nikolay Kim 8df33f7a81 remove HttpServer::run() as it is not useful with async/await 2019-12-08 00:06:04 +06:00
Nikolay Kim 7ec5ca88a1 update changes 2019-12-07 22:01:55 +06:00
daxpedda e5f3d88a4e Switch brotli compressor to rust. (#1197)
* Switch to a rustified version of brotli.

* Some memory optimizations.

* Make brotli not optional anymore.
2019-12-07 21:55:41 +06:00
Nikolay Kim 0ba125444a Add impl ResponseBuilder for Error 2019-12-07 21:41:34 +06:00
Nikolay Kim 6c226e47bd prepare actix-web-actors release 2019-12-07 20:10:36 +06:00
Vlad Frolov 8c3f58db9d Allow comma-separated websocket subprotocols without spaces (#1172)
* Allow comma-separated websocket subprotocols without spaces

* [CHANGES] Added an entry to CHANGES.md
2019-12-07 20:08:06 +06:00
daxpedda 4921243add Fix rustls build. (#1195) 2019-12-07 16:14:09 +06:00
daxpedda 91b3fcf85c Fix dependency features. (#1196) 2019-12-07 16:13:26 +06:00
Nikolay Kim 1729a52f8b prepare alpha.3 release 2019-12-07 13:00:03 +06:00
Nikolay Kim ed2f3fe80d use actix-net alpha.3 release 2019-12-07 12:28:26 +06:00
Yuki Okushi f2ba389496
Merge branch 'master' into master 2019-12-06 16:57:42 +09:00
krircc 439f02b6b1
Update README.md 2019-12-06 14:59:11 +08:00
krircc e32da08a26
Update README.md 2019-12-06 14:34:14 +08:00
krircc 82110e0927
Update README.md 2019-12-06 14:29:10 +08:00
krircc 7b3354a9ad
Update README.md 2019-12-06 14:26:23 +08:00
krircc 5243e8baca
Update README.md 2019-12-06 14:23:28 +08:00
krircc 98903028c7
Update README.md 2019-12-06 14:22:29 +08:00
Nikolay Kim 7dd676439c update changes for actix-session 2019-12-06 11:24:25 +06:00
tglman fbead137f0 feat: add access to UserSession from RequestHead (#1164)
* feat: add access to UserSession from RequestHead

* add test case for session from RequestHead and changes entry for the new feature
2019-12-06 11:21:43 +06:00
Nikolay Kim 205a964d8f upgrade to tokio 0.2 2019-12-05 23:35:43 +06:00
Nikolay Kim b45c6cd66b replace hashbrown with std hashmap 2019-12-04 18:33:43 +06:00
Nikolay Kim 0015a204aa update version 2019-12-03 19:03:53 +06:00
Nikolay Kim c7ed6d3428 update version 2019-12-03 16:35:31 +06:00
Nikolay Kim cf30eafb49 update md 2019-12-03 00:49:12 +06:00
Nikolay Kim 14075ebf7f use released versions of actix-net 2019-12-02 23:33:39 +06:00
Nikolay Kim 068f047dd5 update service factory config 2019-12-02 21:37:13 +06:00
Nikolay Kim f4c01384ec update to latest actix-net 2019-12-02 17:33:11 +06:00
krircc b7d44d6c4c
Merge pull request #1 from actix/master
git pull
2019-12-01 16:56:42 +08:00
Yuki Okushi 33574403b5 Remove rustls from package.metadata.docs.rs (#1182) 2019-11-28 06:25:21 +06:00
Nikolay Kim dcc6efa3e6 Merge branch 'master' of github.com:actix/actix-web 2019-11-27 21:08:13 +06:00
Nikolay Kim 56b9f11c98 disable rustls 2019-11-27 21:07:49 +06:00
Folyd f43a706364 Set name for each generated resource 2019-11-26 19:25:28 +06:00
Nikolay Kim f2b3dc5625 update examples 2019-11-26 17:16:33 +06:00
Nikolay Kim f73f97353b refactor ResponseError trait 2019-11-26 16:07:39 +06:00
Nikolay Kim 4dc31aac93 use actix_rt::test for test setup 2019-11-26 11:25:50 +06:00
Nikolay Kim c1c44a7dd6 upgrade derive_more 2019-11-25 17:59:14 +06:00
Jim Blandy c5907747ad Remove implementation of Responder for (). Fixes #1108.
Rationale:

- In Rust, one can omit a semicolon after a function's final expression to make
  its value the function's return value. It's common for people to include a
  semicolon after the last expression by mistake - common enough that the Rust
  compiler suggests removing the semicolon when there's a type mismatch between
  the function's signature and body. By implementing Responder for (), Actix makes
  this common mistake a silent error in handler functions.

- Functions returning an empty body should return HTTP status 204 ("No Content"),
  so the current Responder impl for (), which returns status 200 ("OK"), is not
  really what one wants anyway.

- It's not much of a burden to ask handlers to explicitly return
  `HttpResponse::Ok()` if that is what they want; all the examples in the
  documentation do this already.
2019-11-23 21:10:02 +06:00
Martell Malone 525c22de15 fix typos from updating to futures 0.3 2019-11-22 13:25:55 +06:00
Nikolay Kim 57981ca04a update tests to async handlers 2019-11-22 11:49:35 +06:00
Nikolay Kim e668acc596 update travis config 2019-11-22 10:13:32 +06:00
Nikolay Kim 512dd2be63 disable rustls support 2019-11-22 07:01:05 +06:00
Nikolay Kim 8683ba8bb0 rename .to_async() to .to() 2019-11-21 21:36:35 +06:00
Nikolay Kim 0b9e3d381b add test with custom connector 2019-11-21 17:36:18 +06:00
Nikolay Kim 1f0577f8d5 cleanup api doc examples 2019-11-21 16:02:17 +06:00
Nikolay Kim 53c5151692 use response instead of result for asyn c handlers 2019-11-21 16:02:17 +06:00
Nikolay Kim 55698f2524 migrade rest of middlewares 2019-11-21 16:02:17 +06:00
Nikolay Kim 471f82f0e0 migrate actix-multipart 2019-11-21 16:02:17 +06:00
Nikolay Kim 60ada97b3d migrate actix-session 2019-11-21 16:02:17 +06:00
Nikolay Kim 0de101bc4d update actix-web-codegen tests 2019-11-21 16:02:17 +06:00
Nikolay Kim 95e2a0ef2e migrate actix-framed 2019-11-21 16:02:17 +06:00
Nikolay Kim 69cadcdedb migrate actix-files 2019-11-21 16:02:17 +06:00
Nikolay Kim 6ac4ac66b9 migrate actix-cors 2019-11-21 16:02:17 +06:00
Nikolay Kim 3646725cf6 migrate actix-identity 2019-11-21 16:02:17 +06:00
Nikolay Kim ff62facc0d disable unmigrated crates 2019-11-21 16:02:17 +06:00
Nikolay Kim b510527a9f update awc tests 2019-11-21 16:02:17 +06:00
Nikolay Kim 3127dd4db6 migrate actix-web to std::future 2019-11-21 16:02:17 +06:00
Nikolay Kim d081e57316 fix h2 client send body 2019-11-21 16:02:17 +06:00
Nikolay Kim 1ffa7d18d3 drop unpin constraint 2019-11-21 16:02:17 +06:00
Nikolay Kim 687884fb94 update test-server tests 2019-11-21 16:02:17 +06:00
Nikolay Kim 5ab29b2e62 migrate awc and test-server to std::future 2019-11-21 16:02:17 +06:00
Nikolay Kim a6a2d2f444 update ssl impls 2019-11-21 16:02:17 +06:00
Nikolay Kim 9e95efcc16 migrate client to std::future 2019-11-21 16:02:17 +06:00
Nikolay Kim 8cba1170e6 make actix-http compile with std::future 2019-11-21 16:02:17 +06:00
Nikolay Kim 5cb2d500d1 update actix-web-actors 2019-11-14 08:58:24 +06:00
Nikolay Kim 0212c618c6 prepare actix-web release 2019-11-14 08:55:37 +06:00
Feiko Nanninga 88110ed268 Add security note to ConnectionInfo::remote() (#1158) 2019-11-14 08:32:47 +06:00
Nikolay Kim fba02fdd8c prep awc release 2019-11-06 11:33:25 -08:00
Nikolay Kim b2934ad8d2 prep actix-file release 2019-11-06 11:25:26 -08:00
Nikolay Kim f7f410d033 fix test order dep 2019-11-06 11:20:47 -08:00
Nikolay Kim 885ff7396e prepare actox-http release 2019-11-06 10:35:13 -08:00
Erlend Langseth 61b38e8d0d Increase timeouts in test-server (#1153) 2019-11-06 06:09:22 -08:00
Hung-I Wang edcde67076 Fix escaping/encoding problems in Content-Disposition header (#1151)
* Fix filename encoding in Content-Disposition of acitx_files::NamedFile

* Add more comments on how to use Content-Disposition header properly & Fix some trivial problems

* Improve Content-Disposition filename(*) parameters of actix_files::NamedFile

* Tweak Content-Disposition parse to accept empty param value in quoted-string

* Fix typos in comments in .../content_disposition.rs (pointed out by @JohnTitor)

* Update CHANGES.md

* Update CHANGES.md again
2019-11-06 06:08:37 -08:00
Jonathas Conceição f0612f7570 awc: Add support for setting query from Serialize type for client request (#1130)
Signed-off-by: Jonathas-Conceicao <jadoliveira@inf.ufpel.edu.br>
2019-10-26 08:27:14 +03:00
Anton Lazarev ace98e3a1e support Host guards when Host header is unset (#1129) 2019-10-15 05:05:54 +06:00
Nikolay Kim 1ca9d87f0a prep actix-web-codegen release 2019-10-14 21:35:53 +06:00
DanSnow 967f965405 Update syn & quote to 1.0 (#1133)
* chore(actix-web-codegen): Upgrade syn and quote to 1.0

* feat(actix-web-codegen): Generate better error message

* doc(actix-web-codegen): Update CHANGES.md

* fix: Build with stable rust
2019-10-14 21:34:17 +06:00
Nikolay Kim 062e51e8ce prep actix-file release 2019-10-14 21:26:26 +06:00
Roberto Huertas a48e616def feat(files): add possibility to redirect to slash-ended path (#1134)
When accessing to a folder without a final slash, the index file will be loaded ok, but if it has
references (like a css or an image in an html file) these resources won't be loaded correctly if
they are using relative paths. In order to solve this, this PR adds the possibility to detect
folders without a final slash and make a 302 redirect to mitigate this issue. The behavior is off by
default. We're adding a new method called `redirect_to_slash_directory` which can be used to enable
this behavior.
2019-10-14 21:23:15 +06:00
MaySantucci effa96f5e4 Removed httpcode 'MovedPermanenty'. (#1128) 2019-10-12 06:45:12 +06:00
Nathan cc0b4be5b7 Fix typo in response.rs body() comment (#1126)
Fixes https://github.com/actix/actix-web/issues/1125
2019-10-09 19:11:55 +06:00
Nikolay Kim a464ffc23d prepare actix-files release 2019-10-08 10:13:16 +06:00
Naim A 4de2e8a898 [actix-files] Allow user defined guards for NamedFile (actix#1113) (#1115)
* [actix-files] remove request method checks from NamedFile

* [actix-files] added custom guard checks to FilesService

* [actix-files] modify method check tests (NamedFile -> Files)

* [actix-files] add test for custom guards in Files

* [actix-files] update changelog
2019-10-08 10:09:40 +06:00
Priit Laes 0f09415469 Convert documentation examples to Rust 2018 edition (#1120)
* Convert types::query examples to rust-2018 edition

* Convert types::json examples to rust-2018 edition

* Convert types::path examples to rust-2018 edition

* Convert types::form examples to rust-2018 edition

* Convert rest of the examples to rust-2018 edition.
2019-10-07 11:29:11 +06:00
SuperHacker-liuan f089cf185b Let ResponseError render w/ 'text/plain; charset=utf-8' header (#1118) (#1119)
* Let ResponseError render w/ 'text/plain; charset=utf-8' header (#1118)

Trait ResponseError originally render Error messages with header
`text/plain` , which causes browsers (i.e. Firefox 70.0) with
Non-English locale unable to render UTF-8 responses with non-English
characters correctly. i.e. emoji.

This fix solved this problem by specifying the charset of `text/plain`
as utf-8, which is the default charset in rust.

Before actix-web consider to support other charsets, this hotfix is
 enough.

Test case:

fn test() -> Result<String, actix_web::Error> {
    Err(actix_web::error::ErrorForbidden("😋test"))
}

* Update actix-http/CHANGES.md for #1118
2019-10-07 10:56:24 +06:00
Koen Hoeijmakers 15d3c1ae81 Update docs of guard.rs (#1116)
* Update guard.rs
2019-10-07 12:05:17 +09:00
Zac Pullar-Strecker fba31d4e0a Expose ContentDisposition in actix-multipart to fix broken doc link (#1114)
* Expose ContentDisposition in actix-multipart to fix broken doc link

* Revert "Expose ContentDisposition in actix-multipart to fix broken doc link"

This reverts commit e90d71d16c.

* Unhide actix-http::header::common docs

These types are used in other exported documented interfaces and create
broken links if not documented.
See `actix_multipart::Field.content_disposition`
2019-10-02 09:48:25 +06:00
Igor Aleksanov f81ae37677 Add From<Payload> for crate::dev::Payload (#1110)
* Add From<Payload> for crate::dev::Payload

* Make dev::Payload field of Payload public and add into_inner method

* Add changelog entry
2019-10-01 14:05:38 +06:00
Nikolay Kim 5169d306ae update ConnectionInfo.remote() doc string 2019-09-27 07:03:12 +06:00
Nikolay Kim 4f3e97fff8 prepare actix-web release 2019-09-25 15:39:09 +06:00
Sven-Hendrik Haase 3ff01a9fc4 Add changelog entry for #1101 (#1102) 2019-09-25 15:35:28 +06:00
Nikolay Kim 3d4e45a0e5 prepare release 2019-09-25 15:30:20 +06:00
karlri c659c33919 Feature uds: Add listen_uds to ServerBuilder (#1085)
Allows using an existing Unix Listener instead of binding to a path.
Useful for when running as a daemon under systemd.

Change-Id: I54a0e78c321d8b7a9ded381083217af590e9a7fa
2019-09-25 15:16:51 +06:00
Sven-Hendrik Haase 959f7754b2
Merge pull request #1101 from actix/add-awc-get-head-methods
Add remaining getter methods from private head field
2019-09-25 10:23:23 +02:00
Sven-Hendrik Haase 23f04c4f38 Add remaining getter methods from private head field 2019-09-25 08:50:45 +02:00
Nikolay Kim d9af8f66ba Use actix-testing for testing utils 2019-09-25 10:28:41 +06:00
Sarfaraz Nawaz aa39b8ca6f Add support for serde_json::Value to be passed as argument to ResponseBuilder.body() (#1096)
* Add support for serde_json::Value to be passed as argument to ResponseBuilder.body()

* Update actix-http/CHANGES.md
2019-09-25 09:33:52 +06:00
Jim Blandy 58c7065f08 Implement register_data method on Resource and Scope. (#1094)
* Implement `register_data` method on `Resource` and `Scope`.

* Split Scope::register_data tests out from Scope::data tests.

* CHANGES.md: Mention {Scope,Resource}::register_data.
2019-09-18 06:36:39 +06:00
Nikolay Kim b3783b403e Merge branch 'master' of github.com:actix/actix-web 2019-09-17 21:46:45 +06:00
Nikolay Kim e4503046de Do not override current System 2019-09-17 21:45:06 +06:00
Jos van den Oever 32a1c36597 Make UrlencodedError::Overflow more informative (#1089) 2019-09-17 06:58:04 +06:00
nWacky 7c9f9afc46 Add ability to use Infallible as HttpResponse error type (#1093)
* Add `std::convert::Infallible` implementantion for `ResponseError`

* Add from `std::convert::Infallible` to `Error`

* Remove `ResponseError` implementantion for `Infallible`

* Remove useless docs

* Better comment

* Update changelog

* Update actix_http::changelog
2019-09-17 06:57:38 +06:00
Yuki Okushi c1f99e0775
Remove mem::uninitialized() (#1090) 2019-09-16 07:52:23 +09:00
Nikolay Kim a32573bb58 Allow to re-construct ServiceRequest from HttpRequest and Payload #1088 2019-09-13 11:56:24 +06:00
Nikolay Kim e35d930ef9 prepare releases 2019-09-12 21:58:08 +06:00
Nikolay Kim 60b7aebd0a fmt & clippy 2019-09-12 21:52:46 +06:00
Nikolay Kim 45d2fd4299 export frozen request related types; refactor code layout 2019-09-12 10:40:56 +06:00
Nikolay Kim 71f8577713 prepare awc release 2019-09-11 20:13:28 +06:00
Nikolay Kim 043f763c51 prepare actix-http release 2019-09-11 20:07:39 +06:00
Dmitry Pypin 8873e9b39e Added FrozenClientRequest for easier retrying HTTP calls (#1064)
* Initial commit

* Added extra_headers

* Added freeze() method to ClientRequest which produces a 'read-only' copy of a request suitable for retrying the send operation

* Additional methods for FrozenClientRequest

* Fix

* Increased crates versions

* Fixed a unit test. Added one more unit test.

* Added RequestHeaderWrapper

* Small fixes

* Renamed RequestHeadWrapper->RequestHeadType

* Updated CHANGES.md files

* Small fix

* Small changes

* Removed *_extra methods from Connection trait

* Added FrozenSendBuilder

* Added FrozenSendBuilder

* Minor fix

* Replaced impl Future with concrete Future implementation

* Small renaming

* Renamed Send->SendBody
2019-09-10 10:29:32 +06:00
Ronald Chan 5e8f1c338c fix h2 not using error response (#1080)
* fix h2 not using error response

* add fix change log

* fix h2 service error tests
2019-09-09 16:24:57 +06:00
Jeffrey Shen 1d96ae9bc3 actix-multipart: Correctly parse multipart body which does not end in CRLF (#1042)
* Correctly parse multipart body which does not end in CRLF

* Add in an eof guard for extra safety
2019-09-09 13:58:00 +06:00
Eugene Bulkin 8d61fe0925 Ensure that awc::ws::WebsocketsRequest sets the Host header (#1070)
* Ensure that awc::ws::WebsocketsRequest sets the Host header before connecting.

* Make sure to check if headers already have a HOST value before setting

* Update CHANGES.md to reflect WebSocket client update.
2019-09-09 12:27:13 +06:00
κeen 8a9fcddb3c Condition middleware (#1075)
* add condition middleware

* write tests

* update changes

* Update src/middleware/condition.rs

Co-Authored-By: Yuki Okushi <huyuumi.dev@gmail.com>

* Update src/middleware/condition.rs

Co-Authored-By: Yuki Okushi <huyuumi.dev@gmail.com>

* Update src/middleware/condition.rs

Co-Authored-By: Yuki Okushi <huyuumi.dev@gmail.com>

* Update src/middleware/condition.rs

Co-Authored-By: Yuki Okushi <huyuumi.dev@gmail.com>
2019-09-09 12:26:38 +06:00
Nikolay Kim c9400456f6 update actix-connect ver 2019-09-02 15:20:28 -07:00
Nikolay Kim 63ddd30ee4 on_connect result isnt added to request extensions for http2 requests #1009 2019-09-01 13:15:02 +06:00
Nikolay Kim bae29897d6 prep actix-web release 2019-08-29 09:36:16 +06:00
Philip Jenvey 616981ecf9 clear extensions before reclaiming HttpRequests in their pool (#1063)
Issue #1062
2019-08-29 09:35:05 +06:00
Nikolay Kim 98bf8ab098 enable rust-tls feature for actix_web::client #1045 2019-08-28 21:40:24 +06:00
Leland Jansen c193137905 actix_web::test::TestRequest::set_form (#1058) 2019-08-28 21:32:17 +06:00
Erlend Langseth a07cdd6533 Data::into_inner 2019-08-27 17:25:25 +01:00
Yuki Okushi 61e492e7e3 Prepare actix-multipart 0.1.3 release 2019-08-18 10:39:22 +09:00
Yuki Okushi 23d768a77b
Add explicit dyns (#1041)
* Add explicit `dyn`s

* Remove unnecessary lines
2019-08-17 02:45:44 +09:00
Roberto Huertas 87b7162473 chore(readme): fix copy paste error (#1040)
Fix actix-cors README
2019-08-16 09:21:30 +09:00
Nikolay Kim 979c4d44f4 update awc dep 2019-08-13 12:41:26 -07:00
Nikolay Kim 5d248cad89 prep release 2019-08-13 12:28:05 -07:00
Nikolay Kim b1cb72d088 update url crate 2019-08-13 11:03:24 -07:00
Nikolay Kim 55179d6ab2 update dependencies 2019-08-13 10:48:11 -07:00
Armin Ronacher 192dfff680 prepare actix-http 0.2.9 release 2019-08-13 15:20:29 +02:00
Armin Ronacher 915010e733
Fixes a bug in OpenWaitingConnection where the h2 flow would panic a future (#1031) 2019-08-13 14:55:04 +02:00
Yuki Okushi dbe4c9ffb5
Replace deprecated methods in actix_files (#1027)
* Bump up mime_guess to 2.0.1

* Replace deprecated methods

* Update CHANGE.md
2019-08-12 05:43:29 +09:00
Yuki Okushi 0ee69671ba
Update nightly to 2019-08-10 (#1028) 2019-08-12 04:00:13 +09:00
leizzer 80e1d16ab8
Merge pull request #1023 from lukaslueg/byteorder_removed
Remove byteorder-dependency
2019-08-07 12:28:23 -03:00
Lukas Lueg b70de5b991 Update CHANGES.md 2019-08-07 16:43:03 +02:00
Lukas Lueg 0b9e692298 Remove byteorder-dependency 2019-08-06 18:32:36 +02:00
Nikolay Kim cf1a60cb3a prepare awc release 2019-08-01 15:41:14 -07:00
Nikolay Kim 0d15861e23 prepare actix-http release 2019-08-01 15:26:30 -07:00
Marat Safin cb19ebfe0c add rustls support for actix-http and awc (#998)
* add rustls support for actix-http and awc

* fix features conflict

* remove unnecessary duplication

* test server with rust-tls

* fix

* test rustls

* awc rustls test

* format

* tests

* fix dependencies

* fixes and add changes

* remove test-server and Cargo.toml dev-dependencies changes

* cargo fmt
2019-07-31 13:02:56 -07:00
Nikolay Kim 0d9ea41047 update min rust version 2019-07-31 06:49:46 -07:00
Nikolay Kim e9b4aa205f Merge branch 'master' of github.com:actix/actix-web 2019-07-30 08:00:57 -07:00
Nikolay Kim 7674f1173c fix awc client panic #1016 2019-07-30 08:00:46 -07:00
Sven-Hendrik Haase 511026cab0 Allow HeaderMap to be cloned (#1014)
* Allow HeaderMap to be cloned

* Add entry to changelog
2019-07-29 08:11:23 +04:00
Sven-Hendrik Haase 81ab37f235 Fix two dyn warnings (#1015) 2019-07-29 08:10:33 +04:00
Cyril Plisko 6f2049ba9b Fix typo 2019-07-25 12:54:59 +01:00
erikdesjardins 52372fcbea actix-files: "Specified path is not a directory" error now includes the path (#1004) 2019-07-23 06:41:58 +06:00
Nikolay Kim f3751d83f8 Modify response body only if encoder is not None #997 2019-07-22 11:35:00 +06:00
jesskfulwood b0b462581b update CHANGES.md for Form impl Responder 2019-07-20 14:46:46 +01:00
jesskfulwood 8f48ed2597 impl Responder for Form 2019-07-20 14:46:46 +01:00
Nikolay Kim c96068e78d bump version 2019-07-20 11:46:21 +06:00
Nikolay Kim 7bca1f7d8d Allow to disable Content-Disposition header #686 2019-07-20 11:43:49 +06:00
Nikolay Kim 3618a84164 update changes 2019-07-20 11:27:21 +06:00
jairinhohw 03ca408e94 add support for specifying protocols on websocket handshake (#835)
* add support for specifying protocols on websocket handshake

* separated the handshake function with and without protocols
changed protocols type from Vec<&str> to [&str]
2019-07-20 11:22:06 +06:00
naerbnic e53e9c8ba3 Add the start_with_addr() function, to obtain an addr to the target websocket actor (#988) 2019-07-20 11:17:58 +06:00
Nikolay Kim 941241c5f0 Remove unneeded actix-utils dependency 2019-07-20 10:50:36 +06:00
jesskfullwood f8320fedd8 add note about Query decoding (#992) 2019-07-19 17:37:49 +06:00
jesskfullwood c808364c07 make Query payload public (#991) 2019-07-19 15:47:44 +06:00
Nikolay Kim cccd829656 update changes 2019-07-19 11:07:52 +06:00
Anton Lazarev 3650f6d7b8 Re-implement Host predicate (#989)
* update HostGuard implementation

* update/add tests for new HostGuard implementation
2019-07-19 10:28:43 +06:00
Nikolay Kim 6b7df6b242 prep actix-web release 2019-07-18 17:51:51 +06:00
Nikolay Kim b6ff786ed3 update dependencies 2019-07-18 17:50:10 +06:00
Nikolay Kim 9c3789cbd0 revert DateServiceInner changes 2019-07-18 17:37:41 +06:00
Armin Ronacher 29098f8397 Add support for downcasting response errors (#986)
* Add support for downcasting response errors

* Added test for error casting
2019-07-18 17:25:50 +06:00
Nikolay Kim fbdda8acb1 Unix domain sockets (HttpServer::bind_uds) #92 2019-07-18 17:24:12 +06:00
Rotem Yaari d03296237e Log error results in Logger middleware (closes #938) (#984)
* Log error results in Logger middleware (closes #938)

* Log internal server errors with an ERROR log level

* Logger middleware: don't log 500 internal server errors, as Actix now logs them always

* Changelog
2019-07-18 14:31:18 +06:00
Aaron Hill b36fdc46db Remove several usages of 'unsafe' (#968)
* Replace UnsafeCell in DateServiceInner with Cell

The previous API was extremely dangerous - calling `get_ref()`
followed by `reset()` would trigger instant UB, without requiring
any `unsafe` blocks in the caller.

By making DateInner `Copy`, we can use a normal `Cell` instead
of an `UnsafeCell`. This makes it impossible to cause UB (or even panic)
with the API.

* Split unsafe block HttpServiceHandlerResponse

Also add explanation of the safety of the usage of `unsafe`

* Replace UnsafeCell with RefCell in PayloadRef

This ensures that a mistake in the usage of 'get_mut' will cause
a panic, not undefined behavior.
2019-07-18 04:45:17 +06:00
Nikolay Kim 2a2d7f5768 nightly clippy warnings 2019-07-17 15:53:51 +06:00
Nikolay Kim 4092c7f326 clippy warnings 2019-07-17 15:08:30 +06:00
Nikolay Kim ef3e1037a8 bump version 2019-07-17 14:18:26 +06:00
Nikolay Kim baaa7b3fbb Replace ClonableService with local copy 2019-07-17 13:55:44 +06:00
Ravi Shankar 32718b7e31 Expose factory traits and some clippy fixes (#983) 2019-07-17 12:58:42 +06:00
Nikolay Kim c01611d8b5 prepare actix-web release 2019-07-17 12:07:12 +06:00
Nikolay Kim 7b1dcaffda cleanup deprecation warning for Box<dyn> 2019-07-17 11:44:39 +06:00
Nikolay Kim c65dbaf88e expose app's ResourceMap via resource_map method 2019-07-17 11:33:05 +06:00
Nikolay Kim c45728ac01 prep test server release 2019-07-16 10:21:52 +06:00
Andrea Corradi 6f71409355 Add DELETE, PATCH, OPTIONS methods to TestServerRunner (#973) 2019-07-16 10:19:28 +06:00
Nikolay Kim 8d17c8651f update bench link 2019-07-11 14:45:58 +06:00
messense b1143168e5 Impl Responder for (T, StatusCode) where T: Responder (#954) 2019-07-11 14:42:58 +06:00
Nikolay Kim 69456991f6 update api doc example for client and add panic info for connection_info 2019-07-11 14:40:37 +06:00
Nikolay Kim f410f3330f prepare actix-session release 2019-07-08 23:25:51 +06:00
Jeff Muizelaar e1fcd203f8 Update the copyless version to 0.1.4 (#956)
< 0.1.4 failed to check for null when doing allocations which could lead to null dereferences.
2019-07-08 15:48:20 +06:00
Michael Snoyman 0d8a4304a9 Drop a duplicated word (#958) 2019-07-05 20:46:55 +06:00
Darin 14cc5a5d6b
Merge pull request #912 from Dowwie/master
updated actix-session to support login and logout functionality
2019-07-03 21:07:07 -04:00
Darin 287c2b1d18
Merge branch 'master' into master 2019-07-03 18:50:19 -04:00
dowwie 7596ab69e0 reverted actix-web/CHANGES.md 2019-07-03 08:55:29 -04:00
dowwie 1fdd77bffa reworded session info in CHANGES 2019-07-03 07:56:50 -04:00
dowwie 2d424957fb updated version in Cargo to 0.2 2019-07-03 07:50:45 -04:00
dowwie dabc4fe00b updated actix-session/CHANGES with info 2019-07-03 07:50:11 -04:00
dowwie 5bf5b0acd2 updated CHANGES with info about actix-session update 2019-07-03 07:46:46 -04:00
dowwie 099a8ff7d8 updated session cookie to support login, logout, changes 2019-07-01 15:26:19 -04:00
Nikolay Kim a28b7139e6 prepare awc release 2019-07-01 11:34:57 +06:00
Nikolay Kim a0a469fe85 disable travis cargo cache 2019-07-01 11:33:11 +06:00
messense dbab55dd6b Bump rand crate version to 0.7 (#951) 2019-07-01 09:37:03 +06:00
Alec Moskvin d2eb1edac3 Actix-web client: Always append a colon after username in basic auth (#949)
* Always append a colon after username in basic auth

* Update CHANGES.md
2019-07-01 09:34:42 +06:00
Sindre Johansen 5901dfee1a Fix link to actix-cors (#950) 2019-06-30 21:30:04 +06:00
dowwie 0e05b37082 updated cookie session to update on change 2019-06-29 14:24:02 -04:00
Cameron Dershem 37f4ce8604 Fixes typo in docs. (#948)
Small typo in docs.
2019-06-29 10:38:16 +06:00
Nikolay Kim 12b5174850 update deps 2019-06-28 14:46:26 +06:00
Nikolay Kim b77ed193f7 prepare actix-web release 2019-06-28 14:41:56 +06:00
Nikolay Kim d286ccb4f5 Add on-connect callback #946 2019-06-28 14:34:26 +06:00
Nikolay Kim cac162aed7 update actix-http changes 2019-06-28 12:34:43 +06:00
Nikolay Kim a3a78ac6fb Do not set Content-Length header, let actix-http set it #930 2019-06-28 11:42:20 +06:00
Nikolay Kim 596483ff55 prepare actix-web-actors release 2019-06-28 10:54:23 +06:00
anthonyjchriste 768859513a Expose the max limit for payload sizes in Websocket Actors. #925 (#933)
* Expose the max limit for payload sizes in Websocket Actors.

* Revert to previous not-formatted code.

* Implement WebsocketContext::with_codec and make Codec Copy and Clone.

* Fix formatting.

* Fix formatting.
2019-06-28 10:49:03 +06:00
messense 44bb79cd07 Call req.path() on Json extractor error only (#945)
* Call req.path() on Json extractor error only

* Cleanup len parse code
2019-06-28 10:44:53 +06:00
Nikolay Kim af9fb5d190 Support asynchronous data factories #850 2019-06-28 10:43:52 +06:00
Darin 50a9d9e2c5
Merge branch 'master' into master 2019-06-27 06:38:13 -04:00
Cameron Dershem c0c71f82c0 Fixes typo. (#940)
Small typo fix.
2019-06-25 23:23:36 +06:00
Darin 93855b889a
Merge branch 'master' into master 2019-06-24 18:41:48 -04:00
dowwie fa7e0fe6df updated cookie.rs req to get_changes 2019-06-24 18:40:14 -04:00
Dustin Bensing b948f74b54 Extractor configuration Migration (#937)
added guide for Extractor configuration in MIGRATION.md
2019-06-24 07:16:04 +06:00
Tim Visée 1a24ff8717 Add builder function for HTTP 429 Too Many Requests status (#931) 2019-06-21 13:06:29 +06:00
messense 47fab0e393 Bump derive_more crate version to 0.15.0 in actix-cors (#927) 2019-06-19 16:41:42 +06:00
messense 313ac48765 Use encoding_rs crate instead of unmaintained encoding crate (#922)
* Use encoding_rs crate instead of unmaintained encoding crate

* Update changelog
2019-06-18 12:43:25 +06:00
Joe Roberts d7780d53c9 Fix typo in actix_web::web::Data::get_ref docstring (#921) 2019-06-18 07:27:23 +06:00
Nikolay Kim ad0e6f73b3 update version 2019-06-17 12:35:00 +06:00
Nikolay Kim 546a8a58db remove cors and identity middlewares 2019-06-17 12:33:00 +06:00
Nikolay Kim acda1c075a prepare actix-web release 2019-06-17 12:23:30 +06:00
Nikolay Kim 686e5f1595 update deps 2019-06-16 22:10:22 +06:00
Nikolay Kim d2b6502c7a prepare actix-http release 2019-06-16 21:59:22 +06:00
Nikolay Kim 7c0f570845 Do not compress NoContent (204) responses #918 2019-06-16 21:54:17 +06:00
Nikolay Kim 382d4ca216
Merge branch 'master' into master 2019-06-15 22:21:39 +06:00
Nikolay Kim eaa371db8b update migration 2019-06-15 22:20:46 +06:00
Nikolay Kim d293ae2a69 fix nested resource map registration #915 2019-06-15 22:12:20 +06:00
Nikolay Kim d7ec241fd0 re-export identity and cors middleware 2019-06-15 21:47:06 +06:00
Nikolay Kim cd323f2ff1 Move cors middleware to actix-cors crate 2019-06-15 09:34:16 +06:00
dowwie 32a66a99bf reverting change to get_session due to side effects 2019-06-13 09:19:03 -04:00
dowwie 73ae801a13 Merge branch 'master' of https://github.com/Dowwie/actix-web 2019-06-13 09:00:45 -04:00
dowwie ca4ed0932e made Session::get_session public 2019-06-13 08:59:59 -04:00
Nikolay Kim bf48798bce Content-Length is 0 for NamedFile HEAD request #914 2019-06-13 15:27:21 +06:00
Nikolay Kim 9fc7c8b1af
Merge branch 'master' into master 2019-06-12 23:53:36 +06:00
Nikolay Kim c8118e8411 fix path doc tests 2019-06-12 20:12:15 +06:00
dowwie 65732197b8 modified so as to consider unanticipated state changes 2019-06-12 10:11:38 -04:00
dowwie 959eef05ae updated actix-session to support login and logout functionality (renew and purge) 2019-06-12 08:03:27 -04:00
Nikolay Kim e7ba67e1a8 rename PathPayloadError and test for path config 2019-06-12 17:02:45 +06:00
Lucas Berezy 13e618b128 Added initial support for PathConfig, allows setting custom error handler. (#903) 2019-06-12 16:49:56 +06:00
Aliaksandr Rahalevich 36e6f0cb4b add "put" and "sput" methods for test server (#909) 2019-06-12 16:47:00 +06:00
Nikolay Kim 7450ae37a7 Re-apply patch from #637 #894 2019-06-12 16:45:05 +06:00
Nikolay Kim 2ffda29f9b Allow to test an app that uses async actors #897 2019-06-12 16:15:06 +06:00
Nikolay Kim ff724e239d move identity service separate crate 2019-06-12 15:52:48 +06:00
Bob ee769832cf get_identity from HttpMessage (#908)
* get_identity from HttpMessage

* more doc for RequestIdentity
2019-06-12 09:26:46 +06:00
simlay c4b7980b4f Upgraded actix-web dependency and set default-features to false (#895) 2019-06-07 09:34:56 +06:00
simlay bfbac4f875 Upgraded actix-web dependency and set default-features to false (#900) 2019-06-07 09:34:30 +06:00
Stefano Probst 53e2f8090f Mark default enabled package features in the docs (#890) 2019-06-06 11:14:56 +06:00
Nikolay Kim e399e01a22 update readme 2019-06-05 09:02:44 +06:00
Nikolay Kim d9a62c4bbf add App::register_data() 2019-06-05 08:43:39 +06:00
Nikolay Kim a548b69679 fmt 2019-06-05 08:43:13 +06:00
Nikolay Kim ae64475d98 test-server release 2019-06-05 08:27:25 +06:00
Nikolay Kim a342b1289d prep awc release 2019-06-05 08:14:00 +06:00
Nikolay Kim 38f04b75a7 update deps 2019-06-04 22:36:10 +06:00
Nikolay Kim a771540b16 prepare actix-web-codegen release 2019-06-04 22:33:43 +06:00
Glade Miller cf217d35a8 Added HEAD, CONNECT, OPTIONS and TRACE to the codegen (#886)
* Added HEAD, CONNECT, OPTIONS and TRACE to the codegen

* Add new macros to use statement

* Add patch to supported codegen http methods

* Update CHANGES.md

Added head, options, trace, connect and patch codegen changes to CHANGES.md
2019-06-04 22:30:43 +06:00
Nikolay Kim 0e138e111f add external resource support on scope level 2019-06-03 23:41:32 +06:00
Denys Vitali 1fce4876f3 Scope configuration (#880)
* WIP: Scope configuarion

* Extensions: Fix into_iter()

* Scope: Fix tests

* Add ScopeConfig to web

Committing from mobile, if this doesn't look good it's because I haven't tested it...

* Scope Config: Use ServiceConfig instead

* Scope: Switch to ServiceConfig in doc

* ScopeConfig: Remove unnecessary changes, handle the case when data is empty

* ScopeConfig: Remove changes from actix-http
2019-06-03 23:12:37 +06:00
Nikolay Kim 4a179d1ae1 prepare actix-session release 2019-06-03 10:52:43 +06:00
Igor Gnatenko a780ea10e9 Guard cookie mod by cookie-session feature (#883)
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
2019-06-03 10:30:30 +06:00
Nikolay Kim 6d2e190c8e prepare actix-files release 2019-06-02 13:09:21 +06:00
Nikolay Kim b1cfbdcf7a prepare actix-http release 2019-06-02 13:05:22 +06:00
Nikolay Kim 24180f9014 Fix boundary parsing #876 2019-06-02 12:58:37 +06:00
Nikolay Kim 15cdc680f6 Static files are incorrectly served as both chunked and with length #812 2019-06-01 17:57:40 +06:00
Nikolay Kim 666756bfbe body helpers 2019-06-01 17:57:25 +06:00
Nikolay Kim a1b40f4314 add license files 2019-06-01 17:25:29 +06:00
Nikolay Kim 29a0fe76d5 prepare actix-web-codegen release 2019-06-01 17:21:22 +06:00
Igor Gnatenko 7753b9da6d web-codegen: Add extra-traits to syn features (#879)
```rust
error[E0277]: `syn::attr::NestedMeta` doesn't implement `std::fmt::Debug`
   --> src/route.rs:149:57
    |
149 |                 attr => panic!("Unknown attribute{:?}", attr),
    |                                                         ^^^^ `syn::attr::NestedMeta` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
    |
    = help: the trait `std::fmt::Debug` is not implemented for `syn::attr::NestedMeta`
    = note: required because of the requirements on the impl of `std::fmt::Debug` for `&syn::attr::NestedMeta`
    = note: required by `std::fmt::Debug::fmt`
```
2019-06-01 14:13:45 +06:00
Mohab Usama f1764bba43 Fix Logger time format (use rfc3339) (#867)
* Fix Logger time format (use rfc3339)

* Update change log
2019-05-31 12:09:21 +04:00
Nikolay Kim c2d7db7e06 prepare actix-web-actors release 2019-05-29 16:22:57 -07:00
Nikolay Kim 21418c7414 prep actix-http release 2019-05-29 16:15:12 -07:00
octave99 fe781345d5 Add Migration steps for Custom Error (#869)
Adds migration steps for custom error in 1.0
2019-05-29 20:47:04 +04:00
Nicolas Gotchac a614be7cb5 Don't DISCONNECT from stream when reader is empty (#870)
* Don't DISCONNECT from stream when reader is empty

* Fix chunked transfer: poll_request before closing stream + Test
2019-05-29 20:37:42 +04:00
Nikolay Kim 1eb89b8375 remove debug prints 2019-05-25 03:16:53 -07:00
Nikolay Kim aa626a1e72 handle disconnects 2019-05-25 03:16:46 -07:00
Nikolay Kim 7f12b754e9 Handle socket read disconnect 2019-05-25 03:07:40 -07:00
Nikolay Kim 3f196f469d update version 2019-05-25 02:13:04 -07:00
Nikolay Kim 35eb378585 prepare actix-files release 2019-05-25 02:02:28 -07:00
Miles Granger 6db625f55b Update actix-web dep to 1.0.0-rc (#864) 2019-05-25 01:52:23 -07:00
Vlad Frolov 801cc2ed5d Cleaned unnecessary Option<_> around ServerBuilder in server.rs/HttpServer (#863) 2019-05-23 05:21:02 -07:00
Nikolay Kim ded1e86e7e Add ServiceRequest::set_payload() method 2019-05-22 21:25:51 -07:00
Nikolay Kim babf48c550 fix NamedFile last-modified check #820 2019-05-22 21:21:12 -07:00
Nikolay Kim d3e807f6e9 move Payload to inner http request 2019-05-22 11:49:27 -07:00
Nikolay Kim 7746e785c1 re-export Service and Transform traits 2019-05-22 11:20:37 -07:00
Nikolay Kim 4e141d7f5d Merge branch 'master' of github.com:actix/actix-web 2019-05-22 11:18:42 -07:00
Nikolay Kim 12842871fe Clear http requests pool on app service drop #860 2019-05-22 11:18:33 -07:00
Aliaksandr Rahalevich fc85ae4014 small documentation fix (#856) 2019-05-21 10:43:18 -07:00
Harry Stern 5826f39dbe Add set_json method to TestRequest (#851)
- Takes a type which implements serde::Serialize, serializes it to JSON,
and sets it as the payload. The content-type is also set to JSON.
2019-05-18 19:36:28 -07:00
Nikolay Kim 8ff56d7cd5 prepare actix-session release 2019-05-18 11:20:09 -07:00
Nikolay Kim 0843bce7ba prepare actix-multipart 2019-05-18 11:15:58 -07:00
Nikolay Kim dea0e0a721 update actix-server dep 2019-05-18 11:00:33 -07:00
Herbert Jones e857ab1f81 HttpServer::shutdown_timeout u16 to u64 (#849)
Increase maximum graceful shutdown time from 18 hours.

For issue #848.
2019-05-18 10:50:35 -07:00
Nikolay Kim 0dda4b06ea prepare release 2019-05-18 10:49:59 -07:00
Nikolay Kim cbe0226177 update changes 2019-05-18 10:47:08 -07:00
Nikolay Kim e8c8626878 update deps 2019-05-18 09:54:23 -07:00
Miles Granger 4b215e0839 Support Query<T>::from_query() (#846) 2019-05-17 13:10:46 -07:00
Nikolay Kim e1ff3bf8fa fix resource match with params #841 2019-05-15 10:31:40 -07:00
Glade Miller 80f4ef9aac When using codegen with paths that have parameters then only the first endpoint resolves (#842) 2019-05-15 09:21:07 -07:00
Davide Di Carlo bba90d7f22 Query config (#839)
* add QueryConfig

* expose QueryConfig in web module

* fmt

* use associated type for QueryConfig

* update CHANGES.md
2019-05-14 13:54:30 -07:00
Nikolay Kim f8af3b86e5 export set_date 2019-05-14 08:48:11 -07:00
Davide Di Carlo 6c3d8b8738 Make JsonConfig send (#830)
* replace Rc with Arc

* add Send trait requirement for Fn in JsonConfig error handler

* add Sync trait requirement for Fn in JsonConfig error handler

* use associated type inside JsonConfig

* fix lint: members in the impl has the same order in the trait

* Update CHANGES.md
2019-05-12 20:04:08 -07:00
Nikolay Kim 5a90e33bcc update deps 2019-05-12 12:01:24 -07:00
Nikolay Kim 86b569e320 version 2019-05-12 11:56:01 -07:00
Nikolay Kim 2350a2dc68 Handle cancellation of uploads #834 #736 2019-05-12 11:43:05 -07:00
Nikolay Kim 36d017dcc6 update deps 2019-05-12 11:41:43 -07:00
Nikolay Kim 3bb081852c prep actix-session release 2019-05-12 10:53:21 -07:00
Nikolay Kim 1ca58e876b prepare beta4 release 2019-05-12 10:49:21 -07:00
Nikolay Kim e9cbcbaf03 update dependencies 2019-05-12 10:18:02 -07:00
Nikolay Kim 07c9eec803 prepare awc release 2019-05-12 10:04:38 -07:00
Nikolay Kim beae9ca0f7 update changes 2019-05-12 09:57:16 -07:00
Nikolay Kim 07b9707ca1 prepare actix-http release 2019-05-12 09:56:55 -07:00
Nikolay Kim 45c05978b0 Allow to set/override app data on scope level 2019-05-12 09:42:05 -07:00
Nikolay Kim df08baf67f update actix-net dependencies 2019-05-12 08:34:51 -07:00
Nikolay Kim 4066375737
Update CHANGES.md 2019-05-10 14:45:30 -07:00
Nikolai Vazquez a77b0b054a Make App::configure take an FnOnce (#825) 2019-05-10 14:44:49 -07:00
Nikolay Kim a17ff492a1 fix formatting 2019-05-04 22:18:59 -07:00
Nikolay Kim 33b4c05557 add payload stream migration entry 2019-05-04 22:18:02 -07:00
Nikolay Kim 005c055a7f prepare actix-web release 2019-05-04 20:05:20 -07:00
Nikolay Kim 3d1af19080 prepare actix-http release 2019-05-04 19:51:13 -07:00
Nikolay Kim fa78da8156 unify route and app data, it allows to provide global extractor config #775 2019-05-04 19:43:49 -07:00
Nikolay Kim 01cfcf3b75 update changes 2019-05-04 08:42:27 -07:00
James 7ef4f5ac0b Make request headers optional in CORS preflight (#816) 2019-05-04 08:41:37 -07:00
Nikolay Kim fc19ce41c4 Clean up response extensions in response pool #817 2019-05-03 15:26:34 -07:00
Otavio Salvador 6e00eef63a awc: Fix typo on ResponseError documentation (#815)
* awc: Fix typo on ResponseError documentation

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>

* http: Fix typo on ResponseError documentation

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>

* http: Expand type names for openssl related errors documentation

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
2019-05-03 14:30:00 -07:00
Nikolay Kim 337c2febe3 add more tests 2019-05-02 09:49:10 -07:00
Nikolay Kim f27beab016 fix case for transfer-encoding header name 2019-05-02 09:30:00 -07:00
Max Bo 4f1c6d1bb7 Update MIGRATION.md (#811) 2019-05-02 09:26:51 -07:00
Nikolay Kim 6b34909537 Fix NormalizePath middleware impl #806 2019-05-01 12:40:56 -07:00
Douman 87284f0951 Add doctest to verify NormalizePath middleware (#809) 2019-05-01 11:47:51 -07:00
Nikolay Kim 24bd5b1344 update readmes 2019-04-29 20:47:21 -07:00
Nikolay Kim 94a0d1a6bc remove old api doc refs 2019-04-29 18:42:21 -07:00
Nikolay Kim f4e1205cbb fix reactor drop panic 2019-04-29 10:14:08 -07:00
Nikolay Kim d2c1791067 add async handler test with blocking call 2019-04-29 09:45:37 -07:00
Nikolay Kim f4b4875cb1 Add helper function for executing futures test::block_fn() 2019-04-29 09:34:14 -07:00
Nikolay Kim 29a841529f Allow to construct Data instances to avoid double Arc for Send + Sync types. 2019-04-29 09:26:12 -07:00
Darin b51b5b763c added clarification to docs regarding middleware processing sequence, added delete method to TestRequest (#799)
* added clarification to docs regarding middleware processing sequnce

* added delete method to TestRequest, doc, and test
2019-04-29 09:14:36 -07:00
Nikolay Kim 8db6b48a76 update version 2019-04-28 09:09:18 -07:00
Nikolay Kim ffd2c04cd3 Add helper trait UserSession which allows to get session for ServiceRequest and HttpRequest 2019-04-28 09:08:51 -07:00
Nikolay Kim 70a4c36496 use Error explicitly 2019-04-25 11:14:32 -07:00
Nikolay Kim cba78e06ae update changes 2019-04-24 15:42:34 -07:00
Nikolay Kim 3b3dbb4f40 add raw services support 2019-04-24 15:29:15 -07:00
Darin 7300002226 grammar fixes (#796) 2019-04-24 13:21:42 -07:00
Nikolay Kim 5426413cb6 update dependencies 2019-04-24 13:00:30 -07:00
Nikolay Kim 2bc937f6c3 prepare release 2019-04-24 12:50:44 -07:00
Maciej Piechotka 60fa0d5427 Store visit and login timestamp in the identity cookie (#502)
This allows to verify time of login or last visit and therfore limiting
the danger of leaked cookies.
2019-04-24 12:49:56 -07:00
Nikolay Kim f429d3319f Read until eof for http/1.0 responses #771 2019-04-24 11:57:40 -07:00
Nikolay Kim 2e19f572ee add tests for camel case headers rendering 2019-04-24 11:27:57 -07:00
Peter Ding 64f603b076 Support to set header names of ClientRequest as Camel-Case (#713)
* Support to set header names of `ClientRequest` as Camel-Case

This is the case for supporting to request for servers which don't
perfectly implement the `RFC 7230`. It is important for an app
which uses `ClientRequest` as core part.

* Add field `upper_camel_case_headers` to `ClientRequest`.

* Add function `set_upper_camel_case_headers` to `ClientRequest`
  and `ClientRequestBuilder` to set field `upper_camel_case_headers`.

* Add trait `client::writer::UpperCamelCaseHeader` for
  `http::header::HeaderName`, let it can be converted to Camel-Case
  then writed to buffer.

* Add test `test_client::test_upper_camel_case_headers`.

* Support upper Camel-Case headers

* [actix-http] Add field `upper_camel_case_headers` for `RequestHead`
* [actix-http] Add code for `MessageType` to support upper camel case
* [awc] Add functions for `ClientRequest` to set upper camel case

* Use `Flags::CAMEL_CASE` for upper camel case of headers
2019-04-24 10:48:49 -07:00
Nikolay Kim 679d1cd513 allow to override responder's status code and headers 2019-04-24 10:25:46 -07:00
Nikolay Kim 42644dac3f prepare actix-http-test release 2019-04-24 07:31:33 -07:00
Nikolay Kim 898ef57080 Fix async web::Data factory handling 2019-04-23 21:21:49 -07:00
Nikolay Kim 9702b2d88e add client h2 reuse test 2019-04-23 15:06:30 -07:00
Nikolay Kim d2b0afd859 Fix http client pool and wait queue management 2019-04-23 14:57:03 -07:00
Nikolay Kim 5f6a1a8249 update version 2019-04-23 09:45:39 -07:00
Nikolay Kim 5d531989e7 Fix BorrowMutError panic in client connector #793 2019-04-23 09:42:19 -07:00
Nikolay Kim 3532602299 Added support for remainder match (i.e /path/{tail}*) 2019-04-22 21:22:17 -07:00
Nikolay Kim 48bee55087 .to_async() handler can return Responder type #792 2019-04-22 14:22:08 -07:00
Nikolay Kim d00c9bb844 do not consume boundary 2019-04-21 16:14:09 -07:00
Nikolay Kim 895e409d57 Optimize multipart handling #634, #769 2019-04-21 15:41:01 -07:00
Nikolay Kim f0789aad05 update dep versions 2019-04-21 09:03:46 -07:00
Nikolay Kim 7e480ab2f7 beta.1 release 2019-04-20 21:16:51 -07:00
Nikolay Kim 891f857547 update changes 2019-04-20 11:18:04 -07:00
Nikolay Kim 01b1350dcc update versions 2019-04-19 18:16:01 -07:00
Nikolay Kim 5e4e95fb0a update create version 2019-04-19 18:13:05 -07:00
Nikolay Kim 9f421b81b8 fix non-ssl connector 2019-04-19 18:10:53 -07:00
Nikolay Kim 6decfdda1f update deps 2019-04-19 18:06:34 -07:00
Nikolay Kim fc9b14a933 allow to specify server address for http and ws requests 2019-04-19 18:03:44 -07:00
Nikolay Kim 7292d0b696 drop chrono and use i64 for max age 2019-04-19 17:23:17 -07:00
Nikolay Kim a3844c1bfd update version 2019-04-19 13:55:36 -07:00
Kilerd Chan 791f22bbc8 replate time::Duration with chrono::Duration and add max_age_time method (#789)
* feat: replate time::Duration with chrono::Duration

* feat: rename max_age method which accepts `Duration` to max_age_time and add new max_age method accepting isize of seconds

* feat: replace `time:Duration` with `chrono:Duration` in repo `actix-http`
2019-04-19 13:54:44 -07:00
Douman 1e7f97a111 Add Normalization middleware for in place (#783) 2019-04-19 13:53:49 -07:00
Darin bc40f5ae40
Merge pull request #788 from Dowwie/master
added put and patch to TestRequest, docs, and test
2019-04-19 06:55:44 -04:00
Darin 3504a8fc0a
Merge branch 'master' into master 2019-04-19 04:38:41 -04:00
Nikolay Kim bfe0df5ab0 update tests 2019-04-18 21:28:23 -07:00
Darin ed94df189f
Merge branch 'master' into master 2019-04-18 19:03:48 -04:00
Nikolay Kim aa255298ef make ServiceRequest::from_parts private, as it is not safe to create from parts 2019-04-18 16:03:13 -07:00
dowwie da86b6e062 added put and patch to TestRequest, docs, and test 2019-04-18 18:06:32 -04:00
Nikolay Kim 75e340137d use local version of http-test 2019-04-18 12:23:56 -07:00
Nikolay Kim e659e09e29 update tests 2019-04-18 11:01:04 -07:00
Nikolay Kim 163ca89cf4 more tests 2019-04-17 17:48:25 -07:00
Nikolay Kim 85b598a614 add cookie session test 2019-04-17 11:02:03 -07:00
Nikolay Kim b64851c5ec enable runtime for test:: methods 2019-04-17 10:28:27 -07:00
Nikolay Kim cc8420377e pass request ownership to closure instead of ref 2019-04-16 15:43:55 -07:00
Nikolay Kim 5740f1e63a prepare actix-framed release 2019-04-16 11:18:47 -07:00
Nikolay Kim c943e95812 update dependencies 2019-04-16 11:17:29 -07:00
Nikolay Kim 4c0ebd55d3 prepare actix-http-test release 2019-04-16 11:02:26 -07:00
Nikolay Kim e7ec77aa81 update readme 2019-04-16 10:50:37 -07:00
Nikolay Kim ddfd7523f7 prepare awc release 2019-04-16 10:49:38 -07:00
Nikolay Kim 2986077a28 no need for feature 2019-04-16 10:32:48 -07:00
Nikolay Kim 3744957804 actix_http::encoding always available 2019-04-16 10:27:58 -07:00
Nikolay Kim 420d3064c5 Add .peer_addr() #744 2019-04-16 10:11:38 -07:00
Nikolay Kim eb4f6b74fb Merge branch 'master' of github.com:actix/actix-web 2019-04-16 09:58:07 -07:00
Nikolay Kim a116c4c2c7 Expose peer addr via Request::peer_addr() and RequestHead::peer_addr 2019-04-16 09:54:02 -07:00
Travis Harmon 7f674febb1 add 422 to httpcodes.rs (#782) 2019-04-15 16:55:06 -07:00
Nikolay Kim 14252f5ef2 use test::call_service 2019-04-15 09:09:21 -07:00
Nikolay Kim 7a28b32f6d Rename test::call_success to test::call_service 2019-04-15 07:44:07 -07:00
Nikolay Kim 09cdf1e302 Rename RouterConfig to ServiceConfig 2019-04-15 07:32:49 -07:00
Nikolay Kim 1eebd47072 fix warnings 2019-04-14 21:00:16 -07:00
Nikolay Kim 002c41a7ca update trust-dns 2019-04-14 20:45:44 -07:00
Nikolay Kim ab4fda6084 update tests 2019-04-14 20:20:33 -07:00
Nikolay Kim f9078d41cd add test::read_response; fix TestRequest::app_data() 2019-04-14 19:52:12 -07:00
Darin 4cc2b38059 added read_response_json for testing (#776)
* added read_response_json for testing

* cleaned up

* modied docs for read_response_json

* typo in doc

* test code in doc should compile now

* use type coercion in doc

* removed generic R, replaced with Request
2019-04-14 16:25:45 -07:00
Nikolay Kim d7040dc303 alpha.6 release 2019-04-14 08:09:32 -07:00
Nikolay Kim 6bc1a0c76b Do not set default headers for websocket request 2019-04-14 07:43:53 -07:00
Nikolay Kim 5bd5651faa Allow to use any service as default service 2019-04-13 22:25:00 -07:00
Nikolay Kim 32ac159ba2 update migration 2019-04-13 16:51:41 -07:00
Nikolay Kim ee33f52736 make extractor config type explicit 2019-04-13 16:35:25 -07:00
Nikolay Kim 4f30fa9d46 Remove generic type for request payload, always use default 2019-04-13 14:50:54 -07:00
Nikolay Kim 043f6e77ae remove nested multipart support 2019-04-13 10:11:07 -07:00
Nikolay Kim 48518df883 do not generate all docs; use docs.rs for 1.0 docs 2019-04-13 09:35:23 -07:00
Nikolay Kim 1f2b15397d prepare alpha5 release 2019-04-12 14:00:45 -07:00
Nikolay Kim 87167f6581 update actix-connect 2019-04-12 12:33:11 -07:00
Nikolay Kim b4768a8f81 add TestRequest::run(), allows to run async functions 2019-04-12 11:28:57 -07:00
Nikolay Kim 3fb7343e73 provide during test request construction 2019-04-12 11:22:18 -07:00
Nikolay Kim 5cfba5ff16 add FramedRequest builder for testing 2019-04-12 11:15:58 -07:00
Nikolay Kim 67c34a5937 Add Debug impl for BoxedSocket 2019-04-11 16:01:54 -07:00
Nikolay Kim 94d7a7f873 custom future for SendError service 2019-04-11 15:12:23 -07:00
Nikolay Kim d86567fbdc revert SendResponse::Error type 2019-04-11 14:18:58 -07:00
Nikolay Kim d115b3b3ed ws verifyciation takes RequestHead; add SendError utility service 2019-04-11 14:00:32 -07:00
Nikolay Kim 6420a2fe1f update client example 2019-04-10 20:57:18 -07:00
Nikolay Kim 0eed9e5257 add more migration 2019-04-10 20:51:57 -07:00
Nikolay Kim 7801fcb993 update migration 2019-04-10 20:47:28 -07:00
Nikolay Kim e55be4dba6 add FramedRequest helper methods 2019-04-10 19:57:34 -07:00
Nikolay Kim 12e1dad42e export TestBuffer 2019-04-10 19:43:09 -07:00
Nikolay Kim 7cd59c38d3 rename framed App 2019-04-10 18:08:28 -07:00
Nikolay Kim 8dc4a88aa6 add actix-framed 2019-04-10 15:06:27 -07:00
Nikolay Kim 52aebb3bca fmt 2019-04-10 15:05:03 -07:00
Nikolay Kim 6b42b2aaee remove framed for now 2019-04-10 12:55:56 -07:00
Darin 6ab9838977 added some error logging for extractors: Data, Json, Query, and Path (#765)
* added some error logging for extractors

* changed log::error to log::debug and fixed position of log for path

* added request path to debug logs
2019-04-10 12:45:13 -07:00
Nikolay Kim 9d82d4dfb9 Fix body propagation in Response::from_error. #760 2019-04-10 12:43:31 -07:00
Nikolay Kim 9bb40c249f add h1::SendResponse future; renamed to MessageBody::size 2019-04-10 12:24:17 -07:00
Douman 046b7a1425 Expand codegen to allow specify guards and async 2019-04-10 15:43:18 +03:00
Nikolay Kim c22a3a71f2 fix test 2019-04-08 19:07:11 -07:00
Nikolay Kim 9c9940d88d update readme 2019-04-08 17:53:19 -07:00
Nikolay Kim 561f83d044 add upgrade service support to h1 dispatcher 2019-04-08 17:51:14 -07:00
Nikolay Kim 43d325a139 allow to specify upgrade service 2019-04-08 14:51:16 -07:00
Nikolay Kim 0a6dd0efdf fix compression tests 2019-04-08 12:48:39 -07:00
Nikolay Kim b921abf18f set host header for http1 connections 2019-04-08 12:48:26 -07:00
Darin 9bcd5d6664 updated legacy code in call_success example (#762) 2019-04-08 11:20:46 -07:00
Nikolay Kim bc58dbb2f5 add async expect service test 2019-04-08 11:19:56 -07:00
Nikolay Kim b1547bbbb6 do not set default headers 2019-04-08 11:09:57 -07:00
Nikolay Kim a7fdac1043 fix expect service registration and tests 2019-04-08 10:31:29 -07:00
Nikolay Kim 53da55aa3c alpha4 release 2019-04-07 23:42:05 -07:00
Nikolay Kim aa78565453 use objects pool for HttpRequest; optimize nested services call 2019-04-07 23:06:21 -07:00
Nikolay Kim 75b213a6f0 refactor FromRequest trait 2019-04-07 14:43:07 -07:00
Nikolay Kim 3c650ca194 remove buffer capacity for payload 2019-04-07 10:40:45 -07:00
Nikolay Kim 219baf3323 remove PayloadWriter trait 2019-04-07 10:29:26 -07:00
Nikolay Kim ec09d6fbe6 optimize encode headers and body split 2019-04-07 10:03:38 -07:00
Nikolay Kim 68d2203dd6 run travis with stable rust only 2019-04-07 08:17:29 -07:00
Nikolay Kim 748289f0ff use custom headers map; more optimizations 2019-04-06 15:02:02 -07:00
Nikolay Kim 4ef46e26f9 Merge branch 'master' of github.com:actix/actix-web 2019-04-06 08:13:14 -07:00
Nikolay Kim 3872d3ba5a refactor h1 dispatcher 2019-04-06 08:12:58 -07:00
Darin b1523ab78c started 1.0 migration guide (#758) 2019-04-06 07:39:20 -07:00
Nikolay Kim fbedaec661 add expect: 100-continue support #141 2019-04-05 16:46:44 -07:00
Nikolay Kim 02fcaca3da add backward compatibility 2019-04-05 11:36:26 -07:00
Darin 18593d8476 updated Connector docs and renamed service() to finish() (#757)
* added Connector to actix-web::client namespace

* updated Connector, renaming service() to finish() and adding docs

* added doc for finish method on Connector
2019-04-05 11:34:27 -07:00
Nikolay Kim b6dacaa23a remove SendError and SendResponse services 2019-04-05 11:29:42 -07:00
Nikolay Kim f89321fd01 fix import 2019-04-05 10:50:11 -07:00
Nikolay Kim 0d4a8e1b1c update actix-connect 2019-04-05 10:35:14 -07:00
Darin 162cd3eecd added Connector to actix-web::client namespace (#756) 2019-04-05 07:37:00 -07:00
nasa a655bdac52 Fix clippy warning (#755) 2019-04-05 12:34:24 +03:00
Nikolay Kim 309c480782 encoder sent uncompressed data before compressed 2019-04-04 15:03:40 -07:00
Nikolay Kim 9c205f9f1d update tests for content-encoding 2019-04-04 14:00:56 -07:00
Nikolay Kim 1f5c0f50f9 Add minimal std::error::Error impl for Error 2019-04-04 13:23:38 -07:00
Nikolay Kim d8bc66a18e Use thread pool for response body comression 2019-04-04 13:17:55 -07:00
Nikolay Kim bc834f6a03 remove some static contraints 2019-04-04 10:59:34 -07:00
Nikolay Kim dc7c3d37a1 upgrade router 2019-04-03 21:45:30 -07:00
Nikolay Kim 1e2bd68e83 Render error and return as response body 2019-04-03 19:55:19 -07:00
Nikolay Kim 954fe21751 set response error body 2019-04-03 19:07:25 -07:00
Haze 7d6085ddbd Add %U (URLPath) for logger (#752)
* Add %R (Route) for logger

* Requested Updates (Route => URLPath, %R => %U)
2019-04-03 17:41:42 -07:00
Nikolay Kim cef3dc3586 added app_data() method 2019-04-03 15:25:52 -07:00
Nikolay Kim 237bfba1ed add App::configure() - allow to offload app configuration to different methods 2019-04-03 15:09:31 -07:00
Nikolay Kim dfa0abf5a5 Export IntoHeaderValue 2019-04-03 12:44:47 -07:00
Nikolay Kim e738361e09 move multipart support to separate crate 2019-04-03 12:28:58 -07:00
Nikolay Kim f56072954b remove PayloadBuffer 2019-04-03 03:20:20 -07:00
Nikolay Kim 2a89b995aa do not cleanup travis build 2019-04-02 21:56:38 -07:00
Nikolay Kim 442f5057dd alpha.3 release 2019-04-02 21:49:31 -07:00
Nikolay Kim 19eef36f8f Merge branch 'tarpaulin' 2019-04-02 21:11:03 -07:00
Nikolay Kim 51d5006ccf Detect socket disconnection during protocol selection 2019-04-02 20:50:25 -07:00
Nikolay Kim 3aebe09e5c travis 2019-04-02 19:21:22 -07:00
Nikolay Kim 4227cddd30 fix dev dependencies 2019-04-02 15:00:10 -07:00
Nikolay Kim db1f7651a3 more patch cratesio 2019-04-02 14:47:59 -07:00
Nikolay Kim 00000fb316 mut obj 2019-04-02 14:27:54 -07:00
Nikolay Kim f100976ef0 rename close_connection to force_close 2019-04-02 14:08:30 -07:00
Nikolay Kim deac983bc7 fix test-server workspace setup 2019-04-02 14:04:28 -07:00
Nikolay Kim bca31eb7ad remove Deref 2019-04-02 13:35:01 -07:00
Nikolay Kim e282ef7925 return back consuming builder 2019-04-02 12:51:16 -07:00
Nikolay Kim 49a499ce74 properly allocate read buffer 2019-04-02 11:11:32 -07:00
Nikolay Kim d067b1d5f1 do not use static 2019-04-02 10:53:44 -07:00
Nikolay Kim c27fbdc35f Preallocate read buffer for h1 codec, #749 2019-04-02 10:19:56 -07:00
Nikolay Kim 1bd0995d7a remove unneded & 2019-04-01 18:00:38 -07:00
Nikolay Kim 2d43489278 ClientRequest::json() accepts reference instead of object 2019-04-01 17:53:30 -07:00
Nikolay Kim 89a0a50e14 Merge branch 'master' of github.com:actix/actix-web 2019-04-01 15:20:04 -07:00
Nikolay Kim 38afc93304 Use non-consuming builder pattern for ClientRequest 2019-04-01 15:19:34 -07:00
Darin 03c84be1f2
Merge pull request #750 from Dowwie/master
added docs for wrap and wrap_fn
2019-04-01 17:37:04 -04:00
dowwie 6d169f4c9c Merge branch 'master' of https://github.com/Dowwie/actix-web 2019-04-01 15:10:49 -04:00
dowwie 3dd3f7bc92 updated scope wrap doc 2019-04-01 15:10:28 -04:00
Darin e6936d9f73
Merge branch 'master' into master 2019-04-01 14:53:23 -04:00
dowwie 03dfbdfcdd updated wrap and wrap fn descriptions, still requiring viable examples 2019-04-01 14:52:05 -04:00
Nikolay Kim 5c4e4edda4 add ClientResponse::json() 2019-04-01 11:51:18 -07:00
Nikolay Kim c5fa6c1abe do not consume response 2019-04-01 11:29:50 -07:00
Nikolay Kim 6c195d8521 add Derev<Target=RequestHead> for ClientRequest 2019-04-01 10:26:25 -07:00
Nikolay Kim 96fd61f3d5 rust 1.31.0 compatibility 2019-04-01 10:26:09 -07:00
dowwie 8800b8ef13 mentioned re-use in wrap doc 2019-04-01 09:59:21 -04:00
dowwie 220c04b7b3 added docs for wrap and wrap_fn 2019-04-01 09:30:11 -04:00
Nikolay Kim 34695f4bce rename test methods; update tests 2019-03-31 20:43:00 -07:00
Nikolay Kim 15c5a3bcfb fix test 2019-03-31 18:57:54 -07:00
Nikolay Kim ab45974e35 add default handler 2019-03-31 18:19:18 -07:00
Nikolay Kim e4b3f79458 allocate enough space 2019-03-31 17:05:02 -07:00
Nikolay Kim ce8294740e fix tests with disabled features 2019-03-31 17:04:34 -07:00
Llaurence ddf5089bff Warn when an unsealed private cookie isn't valid UTF-8 (#746) 2019-03-31 16:26:56 +03:00
Nikolay Kim 7596d0b7cb fix fn_guard doc string 2019-03-30 20:48:00 -07:00
Nikolay Kim 1a871d708e update guard doc test 2019-03-30 12:13:21 -07:00
Nikolay Kim 351df84cca update stable release api doc link 2019-03-30 11:37:56 -07:00
Nikolay Kim 6fcbe4bcda add fn_guard 2019-03-30 11:33:31 -07:00
Nikolay Kim 457b75c995 update api docs; move web to submodule 2019-03-30 10:04:38 -07:00
Nikolay Kim 724e9c2efb replace deprecated fn 2019-03-30 07:56:09 -07:00
Douman 2e159d1eb9 test-server: Request functions should accept path (#743) 2019-03-30 07:53:45 -07:00
Nikolay Kim a20b9fd354 prepare aplha2 release 2019-03-29 22:06:14 -07:00
Nikolay Kim d846328f36 fork cookie crate 2019-03-29 21:13:39 -07:00
Nikolay Kim 193f8fb2d9 update tests 2019-03-29 18:51:07 -07:00
Nikolay Kim 3a954298d7 Merge branch 'master' of github.com:actix/actix-web 2019-03-29 18:23:07 -07:00
Nikolay Kim 3220777ff9 Added ws::Message::Nop, no-op websockets message 2019-03-29 18:22:49 -07:00
Douman 00526f60dc Impl BodyEncoding for Response (#740) 2019-03-29 16:29:11 -07:00
Nikolay Kim c126713f40 add rustls support to HttpServer 2019-03-29 16:28:32 -07:00
Nikolay Kim e9bbde6832 allow to override request's uri 2019-03-29 16:28:28 -07:00
Nikolay Kim 5eb3f1154e revert 2019-03-29 14:27:22 -07:00
Nikolay Kim aebeb511cd explicit impl traits for ws connect 2019-03-29 14:26:11 -07:00
Nikolay Kim 744d82431d add per request timeout 2019-03-29 14:07:37 -07:00
Nikolay Kim 058b1d56e6 Export ws sub-module with websockets related types 2019-03-29 13:49:21 -07:00
Nikolay Kim 709475b2bb multipart::Field renamed to MultipartField 2019-03-29 11:59:38 -07:00
Nikolay Kim 19a0b8046b remove actix reference 2019-03-29 11:13:36 -07:00
Nikolay Kim 1e7096a63a add request timeout 2019-03-28 22:33:41 -07:00
Nikolay Kim ea4d98d669 Session wide headers, basic and bearer auth 2019-03-28 21:48:35 -07:00
Nikolay Kim 3b897da8e2 Do not use thread pool for decomression if chunk size is smaller than 2048 2019-03-28 21:15:26 -07:00
Nikolay Kim 10b166404e Merge branch 'master' of github.com:actix/actix-web 2019-03-28 20:27:59 -07:00
Nikolay Kim 80ff7d40a1 enable awc/ssl if ssl features is enabled 2019-03-28 20:27:47 -07:00
joekyo c4a8bbe47b fix the example in README.md (#739) 2019-03-28 20:03:17 -07:00
Nikolay Kim 9710e9b01f Re-export actix_http::client::Connector 2019-03-28 14:46:33 -07:00
Nikolay Kim 1d79f16529 update release api docs link 2019-03-28 14:30:38 -07:00
Nikolay Kim 670a457013 fix docs.rs feature list 2019-03-28 14:28:59 -07:00
Nikolay Kim 878f32c495 fix tests for no-default-features 2019-03-28 14:27:07 -07:00
Nikolay Kim a2c9ff3a33 back to development 2019-03-28 14:10:03 -07:00
Nikolay Kim 9c198a0d29 alpha.1 release 2019-03-28 13:46:26 -07:00
Nikolay Kim 9cca86e60d prepear actix-http release 2019-03-28 12:45:41 -07:00
Nikolay Kim 605ce05127 App::enable_encoding() allows to enable compression and decompression 2019-03-28 12:32:59 -07:00
Nikolay Kim 5795850bbb decompress payload in cpu threadpool 2019-03-28 11:08:24 -07:00
Nikolay Kim e84c95968f reuse PayloadBuffer from actix-http 2019-03-28 05:34:33 -07:00
Nikolay Kim 6e0fe7db2d use actix-threadpool for blocking calls 2019-03-28 05:16:43 -07:00
Nikolay Kim 4309d9b88c port multipart support 2019-03-28 05:04:39 -07:00
Nikolay Kim c59937784e add client websockets support 2019-03-27 18:53:19 -07:00
Nikolay Kim e254fe4f9c allow to override response body encoding 2019-03-27 11:29:31 -07:00
Nikolay Kim 3edc515bac refactor RequestHead/ResponseHead 2019-03-27 10:38:01 -07:00
Nikolay Kim fb9c94c3e0 remove Backtrace from error 2019-03-27 09:31:07 -07:00
Nikolay Kim faa3ea8e5b rename BodyLength to BodySize 2019-03-27 09:24:55 -07:00
Nikolay Kim b6b37d3ea3 Add Client::request_from 2019-03-26 23:25:24 -07:00
Nikolay Kim b7570b2476 remove unused code 2019-03-26 22:33:01 -07:00
Nikolay Kim 959aebb24f simplify TestResponse builder 2019-03-26 22:03:00 -07:00
Nikolay Kim d49a8ba53b add client TestResponse 2019-03-26 21:57:04 -07:00
Nikolay Kim 5703bd8160 fix client cookies parsing 2019-03-26 21:31:18 -07:00
Nikolay Kim ab597dd98a Added HTTP Authentication for Client #540 2019-03-26 20:57:06 -07:00
Nikolay Kim 1cca25c276 add client decompression support 2019-03-26 20:45:00 -07:00
Nikolay Kim 2629699b62 rename flate2-c feature to flate2-zlib 2019-03-26 18:46:06 -07:00
Nikolay Kim 1904b01fc0 add content-encoding decompression 2019-03-26 15:14:32 -07:00
Nikolay Kim 9451ba71f4 update cargo files 2019-03-26 12:50:51 -07:00
Nikolay Kim 50c0ddb3cd update tests 2019-03-26 12:31:51 -07:00
Nikolay Kim c7ad677804 Merge actix-http project 2019-03-26 11:54:35 -07:00
Nikolay Kim 2c7da28ef9 move high level client code to awc crate 2019-03-26 11:43:22 -07:00
Nikolay Kim b254113d9f move high level client code from actix-http 2019-03-26 11:41:38 -07:00
Nikolay Kim 999fa65efa Merge branch 'master' of github.com:actix/actix-web 2019-03-26 09:22:51 -07:00
Nikolay Kim cc24c77acc add Client::new() 2019-03-26 09:11:27 -07:00
Max Frai 254b61e800 Fix copy/paste mistake in error message (#733) 2019-03-26 09:07:19 -07:00
Nikolay Kim 83d4447349 add http client 2019-03-25 21:58:01 -07:00
Nikolay Kim 9037473e0f update client error 2019-03-25 21:52:45 -07:00
Nikolay Kim 8d1195d8ac add async handler tests 2019-03-25 14:33:34 -07:00
Nikolay Kim e18227cc3d add wrap_fn to App and Scope 2019-03-25 13:43:02 -07:00
Douman d30027ac5b Remove StaticFilesConfig (#731)
* Remove StaticFilesConfig

* Applying comments

* Impl Clone for Files<S>
2019-03-25 13:02:37 -07:00
Nikolay Kim 86a21c956c rename .middleware to .wrap 2019-03-25 13:02:10 -07:00
Nikolay Kim 939d2e745c rename Resource::middleware to Resource::wrap and add wrap_fn for fn middlewares 2019-03-25 12:47:58 -07:00
Nikolay Kim 1970c99522 add session test 2019-03-24 20:21:20 -07:00
Nikolay Kim 51e4dcf3b3 update test doc string 2019-03-24 17:13:17 -07:00
Nikolay Kim e37e81af0b simplify Payload extractor 2019-03-24 17:00:59 -07:00
Nikolay Kim ed322c175e update tests 2019-03-24 16:28:16 -07:00
Nikolay Kim b95e99a09e update changes 2019-03-24 16:17:59 -07:00
Nikolay Kim ffb3324129 do not use default resource from app, return 405 if no matching route found 2019-03-24 16:15:34 -07:00
Nikolay Kim 9932a342ef export Scope 2019-03-24 11:59:35 -07:00
Nikolay Kim c1e8d8363c fix errhandlers doc string 2019-03-24 11:49:26 -07:00
Nikolay Kim 913155d34c update doc strings 2019-03-24 11:47:23 -07:00
Nikolay Kim ede32c8b3f export errhandlers module 2019-03-24 11:32:30 -07:00
Nikolay Kim 307b2e5b0e fix compress features 2019-03-24 11:29:35 -07:00
Nikolay Kim bc01d39d4d add error response test for cors 2019-03-23 22:03:40 -07:00
Nikolay Kim 548f6f89bf allow to get app data via HttpRequest 2019-03-23 21:39:02 -07:00
Nikolay Kim 5b06f2bee5 port cors middleware 2019-03-23 21:29:16 -07:00
Nikolay Kim 60050307bd session feature is renamed to cookies 2019-03-23 11:18:31 -07:00
Nikolay Kim 1e069bb843 Merge branch '1.0' 2019-03-23 10:16:32 -07:00
Nikolay Kim 535b407ac0 make cookies optional 2019-03-23 10:06:54 -07:00
Nikolay Kim c5c7b244be cookie is optional 2019-03-23 09:40:20 -07:00
Nikolay Kim 00b7dc7887 handle socket shutdown for h1 connections 2019-03-18 09:44:48 -07:00
Nikolay Kim 8872f3b590 fix ws upgrade 2019-03-18 05:30:18 -07:00
Nikolay Kim fd86d73a03 fix response upgrade type 2019-03-18 05:26:12 -07:00
Nikolay Kim efe3025395 add handshake test 2019-03-17 22:57:27 -07:00
Nikolay Kim 3301a46264 proper connection upgrade check 2019-03-17 22:56:13 -07:00
Nikolay Kim b0343eb22d simplify ws stream interface 2019-03-17 22:31:10 -07:00
Nikolay Kim 6ab7665868 export ws module 2019-03-17 22:11:50 -07:00
Nikolay Kim fd3e351c31 add websockets context 2019-03-17 22:02:03 -07:00
Nikolay Kim f26d4b6a23 do not chunk websocket stream 2019-03-17 21:57:53 -07:00
Nikolay Kim 85c2887b30 export ws::hash_key 2019-03-17 21:09:50 -07:00
Nikolay Kim 88152740c6 move macros tests to codegen crate 2019-03-17 20:20:10 -07:00
Nikolay Kim a07ea00cc4 add basic test for proc macro 2019-03-17 13:55:03 -07:00
Nikolay Kim 6b66681827 add basic actors integration 2019-03-17 13:47:20 -07:00
Nikolay Kim 9bd0f29ca3 add tests for error and some responders 2019-03-17 10:11:10 -07:00
Nikolay Kim c14c66d2b0 add json extractor tests 2019-03-17 09:52:41 -07:00
Nikolay Kim 2b5f9f0511 temp fix for tarpaulin 2019-03-17 08:52:03 -07:00
Nikolay Kim 7435c5e9bf temp fix for tarpaulin 2019-03-17 01:49:00 -07:00
Nikolay Kim b550f9ecf4 update imports 2019-03-17 01:08:56 -07:00
Nikolay Kim fa66a07ec5 move httpmessage futures to actix-web 2019-03-17 01:02:51 -07:00
Nikolay Kim 9012c46fe1 move payload futures from actix-http 2019-03-17 00:48:40 -07:00
Nikolay Kim fd141ef9b1 move json to actix-web 2019-03-16 22:10:15 -07:00
Nikolay Kim c80884904c move JsonBody from actix-http 2019-03-16 22:04:09 -07:00
Nikolay Kim 725ee3d396 rename extract to types 2019-03-16 21:43:48 -07:00
Nikolay Kim 4a4826b23a cleanup doc strings and clippy warnings 2019-03-16 21:35:02 -07:00
Nikolay Kim e396c90c9e update api doc 2019-03-16 21:13:16 -07:00
Nikolay Kim 60386f1791 introduce RouteData extractor 2019-03-16 21:09:11 -07:00
Nikolay Kim 6afcecdb5f Merge branch '1.0' of github.com:actix/actix-web into 1.0 2019-03-16 20:17:48 -07:00
Nikolay Kim b1e267bce4 rename State to a Data 2019-03-16 20:17:27 -07:00
Nikolay Kim d93fe157b9 use better name Route::data instead of Route::config 2019-03-16 11:58:01 -07:00
lagudomeze 414614e1b5 change marco import (#727) 2019-03-15 21:08:39 -07:00
Nikolay Kim ce4a2629f3 update actix-connect 2019-03-14 22:56:06 -07:00
Nikolay Kim 15ba40d3ab fix non ssl connector 2019-03-14 13:08:05 -07:00
Nikolay Kim 76bb30dc3a fix names 2019-03-14 13:06:29 -07:00
Nikolay Kim 1f9467e880 update tests 2019-03-14 12:01:35 -07:00
Nikolay Kim b8bfd29d2c use Uri as client connect message 2019-03-14 11:52:52 -07:00
Jannik Keye bf8262196f feat: enable use of patch as request method (#718) 2019-03-14 11:36:10 +03:00
Nikolay Kim d2c755bb47 update client connector 2019-03-13 22:57:28 -07:00
Nikolay Kim 3a24a75d13 update dep 2019-03-13 16:56:11 -07:00
Nikolay Kim 033a8d890c update actix connect 2019-03-13 15:57:33 -07:00
Nikolay Kim 1941aa0217 use actix-connect crate 2019-03-13 14:41:40 -07:00
Luca Bruno 17ecdd63d2 httpresponse: add constructor for HttpResponseBuilder (#697) 2019-03-13 17:20:18 +03:00
Nikolay Kim 86405cfe7a more tests 2019-03-12 22:57:09 -07:00
Nikolay Kim 28f01beaec update deps 2019-03-12 17:06:08 -07:00
Nikolay Kim f627d01055 update actix-server 2019-03-12 17:04:08 -07:00
Nikolay Kim e271d4e47a Merge branch 'master' of github.com:actix/actix-http 2019-03-12 16:55:38 -07:00
Nikolay Kim 402a40ab27 update actix-server dep 2019-03-12 16:55:16 -07:00
Nikolay Kim 7242d96701 map BlockingError 2019-03-11 23:19:05 -07:00
Nikolay Kim a2c4639074 move blocking code to actix-rt 2019-03-11 23:11:51 -07:00
Nikolay Kim 00d47acedc
Update README.md 2019-03-11 17:56:48 -07:00
Nikolay Kim 409888fcd5 remove debug print, remove unused flags 2019-03-11 16:47:12 -07:00
Nikolay Kim e15e4f18fd update tests 2019-03-11 16:42:33 -07:00
Nikolay Kim eae48f9612 use server backlog 2019-03-11 15:26:05 -07:00
Nikolay Kim ad43ca735b update server service requirenments 2019-03-11 15:09:42 -07:00
David McGuire cc7f6b5eef Fix preflight CORS header compliance; refactor previous patch. (#717) 2019-03-11 07:26:54 +03:00
Nikolay Kim 9680423025 Add more tests for route 2019-03-10 18:35:15 -07:00
Nikolay Kim b8829bbf22 add identity middleware tests 2019-03-10 17:16:32 -07:00
Nikolay Kim 0f0d6b65ca update service request/response location 2019-03-10 17:16:28 -07:00
Nikolay Kim 6436004194 set test cookie if it is not empty 2019-03-10 17:06:43 -07:00
Nikolay Kim 50a0cb5653 do no move self 2019-03-10 17:02:14 -07:00
Nikolay Kim 615fbb49bd support cookies in TestRequest 2019-03-10 17:00:03 -07:00
Nikolay Kim 4d96abb639 use actix_web::Error for middleware errors 2019-03-10 16:35:38 -07:00
Nikolay Kim d755772039 add From impls for ResponseBuilder 2019-03-10 15:30:31 -07:00
Nikolay Kim 79875ea039 update deps 2019-03-10 14:22:53 -07:00
Nikolay Kim 039efc5703 move tests to different mods 2019-03-10 11:04:50 -07:00
Nikolay Kim b6c1135798 hide blocking mod 2019-03-10 10:56:53 -07:00
Nikolay Kim 16c42be4a2 simplify extractor configuration, config is optional now 2019-03-10 10:53:56 -07:00
Nikolay Kim ee8725b581 move extractors to separate submod 2019-03-10 10:01:24 -07:00
Nikolay Kim 49d65fb07a move extract to submodule 2019-03-10 09:34:25 -07:00
Nikolay Kim 9b8812423c reexport Server controller form actix-server 2019-03-10 09:20:58 -07:00
Nikolay Kim 3a2035a121 fix doc tests 2019-03-09 21:15:26 -08:00
Nikolay Kim be9031c55e update doc api 2019-03-09 20:48:05 -08:00
Nikolay Kim 12f0c78091 port identity middleware 2019-03-09 20:40:09 -08:00
Nikolay Kim 134863d5c8 move middlewares 2019-03-09 18:05:50 -08:00
Nikolay Kim 513ce0b08d add json and form client request's method 2019-03-09 17:42:35 -08:00
Nikolay Kim 85664cc6f7 update deps 2019-03-09 14:56:18 -08:00
Nikolay Kim 6c4be45787 update deps 2019-03-09 14:33:33 -08:00
Nikolay Kim d2dba028f6 fix dependency link 2019-03-09 14:07:43 -08:00
Nikolay Kim 54678308d0 propogate app config with http request; add tests for url_for 2019-03-09 14:06:24 -08:00
Nikolay Kim 9c7056e9b8 fix connector 2019-03-09 13:38:56 -08:00
Nikolay Kim c0ce7f0bae update http service usage; add app host 2019-03-09 10:53:00 -08:00
Nikolay Kim d026821924 unify service builders 2019-03-09 10:39:06 -08:00
Nikolay Kim fde55ffa14 revert generic request parameter for service; support ServerConfig as new factory config 2019-03-09 09:49:11 -08:00
Nikolay Kim aadcdaa3d6 add resource map, it allow to check if router has resource and it allows to generate urls for named resources 2019-03-09 07:39:34 -08:00
Nikolay Kim ca73f178c9 revert generic service request; add ServerConfig to service factories 2019-03-09 07:37:23 -08:00
Nikolay Kim e324522389 listen method has different signature 2019-03-08 22:47:49 -08:00
Nikolay Kim 2f6df11183 do not execute blocking fn if result is not required 2019-03-07 19:31:17 -08:00
Nikolay Kim eef687ec80 remove unneeded methods 2019-03-07 15:51:24 -08:00
Nikolay Kim 88e5059910 add doc string to guards 2019-03-07 15:37:39 -08:00
Nikolay Kim b6b2eadb3a rename blocking fn 2019-03-07 14:41:43 -08:00
Nikolay Kim c2a350b33f export blocking via web module 2019-03-07 14:40:20 -08:00
Nikolay Kim 0e57b4ad61 export extractor configs via web module 2019-03-07 14:01:52 -08:00
Nikolay Kim b211966c28 Payload extractor 2019-03-07 13:33:40 -08:00
Nikolay Kim d77954d19e fix files test 2019-03-07 12:32:40 -08:00
Nikolay Kim ceb6d45bf2 reexpost extractors in web module 2019-03-07 11:43:46 -08:00
Nikolay Kim 22708e78a9 added proc-macros for route registration 2019-03-07 11:09:42 -08:00
Nikolay Kim 1151b5bf7c fix crate name 2019-03-06 23:43:47 -08:00
Nikolay Kim e56691bcf2 rename to Files 2019-03-06 23:39:08 -08:00
Nikolay Kim 6e638129c5 use generic HttpService 2019-03-06 23:06:14 -08:00
Nikolay Kim 6d639ae3df allow to create http services with config 2019-03-06 22:59:56 -08:00
Nikolay Kim 3b069e0568 added combined http1/2 service 2019-03-06 22:56:34 -08:00
Nikolay Kim e25483a0d5 fix warnings 2019-03-06 21:12:35 -08:00
Nikolay Kim 60c048c8cd fix nested resources 2019-03-06 19:27:18 -08:00
Nikolay Kim 244fff9e0a added Logger middleware 2019-03-06 19:19:27 -08:00
Nikolay Kim 561a89b8b3 copy logger 2019-03-06 17:33:12 -08:00
Nikolay Kim fe22e83144 refactor service registration process; unify services and resources 2019-03-06 15:47:15 -08:00
Nikolay Kim b689bb9260 add failure support 2019-03-06 11:45:33 -08:00
Nikolay Kim 5cde4dc479 update actix-rt 2019-03-06 10:41:07 -08:00
Nikolay Kim ad08e856d7 update actix-rt 2019-03-06 10:30:17 -08:00
Nikolay Kim db39a604ae implement ResponseError trait for BlockingError 2019-03-06 10:03:37 -08:00
Nikolay Kim db566a634c make State type Send compatible 2019-03-06 10:03:18 -08:00
Nikolay Kim 3fc28c5d07 simplify StaticFile constructor, move HttpRange to separate module 2019-03-06 09:27:02 -08:00
Stephen Ellis ceca96da28 Added HTTP Authentication for Client (#540) 2019-03-06 12:56:12 +03:00
Nikolay Kim 6efc3438b8 refactor and enable some tests for staticfiles 2019-03-05 22:10:08 -08:00
Nikolay Kim 889d67a356 add Stream impl for ResponseBody 2019-03-05 21:19:12 -08:00
Nikolay Kim 34c8b95a35 allow to extract body from response 2019-03-05 21:15:18 -08:00
Nikolay Kim 1a80b70868 add Responder impl for InternalError 2019-03-05 19:41:50 -08:00
Nikolay Kim 0de47211b2 tune App::default_resource signature 2019-03-05 19:30:44 -08:00
Nikolay Kim f71354783e update HttpMessage impls 2019-03-05 19:10:45 -08:00
Nikolay Kim d85468f7e1 do not expose headers_mut via HttpMessage 2019-03-05 19:07:07 -08:00
Nikolay Kim 81273f71ef update tests 2019-03-05 19:03:59 -08:00
Nikolay Kim 0cf73f1a04 move session to different folder 2019-03-05 18:52:29 -08:00
Nikolay Kim 143ef87b66 add session and cookie session backend 2019-03-05 18:47:18 -08:00
Nikolay Kim 496ee8d039 remove more MessageBody constraints from Response 2019-03-05 18:14:30 -08:00
Nikolay Kim 0d2116156a Messagebody constraint is not required from Response::into_body 2019-03-05 17:24:24 -08:00
Nikolay Kim 200cae19a9 add HttpMessage impl &mut T 2019-03-05 14:39:06 -08:00
Nikolay Kim 96477d42cb extend HttpMessage trait, add api to work with requests cookies 2019-03-05 13:16:26 -08:00
Nikolay Kim 01329af1c2 fix non ssl code 2019-03-05 10:18:46 -08:00
Nikolay Kim 6457996cf1 move session to separate crate 2019-03-05 10:13:33 -08:00
Nikolay Kim 03248028a9 update actix-service 2019-03-05 10:08:08 -08:00
Nikolay Kim ce0b172598 update actix-service 2019-03-05 09:30:11 -08:00
Nikolay Kim b6fe1dacf2 update middleware impl 2019-03-04 21:42:51 -08:00
Douman 42f030d3f4 Ensure that Content-Length zero is specified in empty request 2019-03-05 08:37:15 +03:00
Nikolay Kim 3a456ec148 update actix-service dependency 2019-03-04 20:46:33 -08:00
Nikolay Kim 65a313c78b update utils dep 2019-03-04 19:51:09 -08:00
Nikolay Kim 2e79562c9d add HttpServer type 2019-03-04 16:29:03 -08:00
Nikolay Kim a88b3b090d allow to specify service config for h1 service 2019-03-04 15:58:39 -08:00
Nikolay Kim bd4124587a provide block_on function for testing purpose 2019-03-04 13:25:35 -08:00
Nikolay Kim e442ddb167 allow scope level guards 2019-03-04 11:47:53 -08:00
Nikolay Kim 5c61321565 fix state factory support, tests for state and state factory 2019-03-03 21:40:03 -08:00
Nikolay Kim 34171fa7f5 add scopes 2019-03-03 21:02:01 -08:00
Nikolay Kim 8502c32a3c re-enable extractor tests 2019-03-03 15:32:47 -08:00
Nikolay Kim 360082f99f update api docs 2019-03-03 14:45:56 -08:00
Nikolay Kim e50d4c5e0e rename extractor module to extract, re-enable doc tests 2019-03-03 13:53:31 -08:00
Nikolay Kim 237677be15 rename filter to guard 2019-03-03 12:09:38 -08:00
Nikolay Kim b81ae899f6 better naming 2019-03-03 08:24:09 -08:00
Nikolay Kim 015364edf8 fix travis config 2019-03-03 08:00:12 -08:00
Nikolay Kim f90ca868ca update tests 2019-03-03 01:12:06 -08:00
Nikolay Kim a8f3dec527 use tarpaulin from cache 2019-03-03 01:03:28 -08:00
Nikolay Kim 6df85e32df added extractor configuration system 2019-03-03 00:57:48 -08:00
Nikolay Kim 08fcb6891e use specific nightly version for travis 2019-03-02 22:33:46 -08:00
Nikolay Kim b320dc127a remove unused code 2019-03-02 22:22:45 -08:00
Nikolay Kim 115b30d9cc add state example 2019-03-02 22:11:24 -08:00
Nikolay Kim d5c54a1867 update extractor tests 2019-03-02 22:03:45 -08:00
Nikolay Kim 352e7b7a75 update tests for defaultheaders middleware 2019-03-02 21:35:31 -08:00
Nikolay Kim b535adf637 add IntoFuture impl for Response and ResponseBuilder 2019-03-02 21:22:01 -08:00
Nikolay Kim 8103d33270 use custom request for FromRequest trait 2019-03-02 19:19:56 -08:00
Nikolay Kim 2d0495093c add Payload::take method 2019-03-02 18:37:09 -08:00
Nikolay Kim e4198a037a add TestServiceRequest builder 2019-03-02 16:24:14 -08:00
Nikolay Kim 00ea195601 TestRequest::take public 2019-03-02 16:04:43 -08:00
Nikolay Kim 0081b9d446 improve ergomonics of TestRequest 2019-03-02 15:59:05 -08:00
Nikolay Kim de9b38295f update deps 2019-03-02 15:08:10 -08:00
Nikolay Kim 9394a4e2a5 cleanup dependencies 2019-03-02 14:07:21 -08:00
Nikolay Kim 3454812b68 rename actix-web-fs crate 2019-03-02 13:59:12 -08:00
Nikolay Kim 75fbb97480 update new transform trait 2019-03-02 13:57:00 -08:00
Nikolay Kim cc20fee628 add request chain services 2019-03-02 11:53:05 -08:00
Nikolay Kim fdf3011837 add responder for unit type 2019-03-02 09:05:07 -08:00
Nikolay Kim bc3c29c398 update version 2019-03-02 00:04:39 -08:00
Nikolay Kim e6d04d24cc move fs to separate crate 2019-03-01 23:59:44 -08:00
Nikolay Kim 2d7293aaf8 copy actix-web2 2019-03-01 22:51:32 -08:00
Nikolay Kim 5fff07402e downgrade tarpaulin 2019-03-01 21:36:37 -08:00
Nikolay Kim 650474ca39 choose openssl version for travis 2019-03-01 21:02:56 -08:00
Nikolay Kim 38c86d4683 update tarpaulin travis config 2019-03-01 20:33:31 -08:00
Hugo Benício 6d11ee683f fixing little typo in docs (#711) 2019-03-01 11:34:58 +03:00
Douman 80d4cbe301 Add change notes for new HttpResponseBuilder 2019-02-27 21:37:20 +03:00
Kornel 69d710dbce Add insert and remove() to response builder (#707) 2019-02-27 15:52:42 +03:00
Nikolay Kim b80ee71785 use new new service api 2019-02-22 14:21:35 -08:00
Nikolay Kim 2f89b12f4f remove more response containts 2019-02-20 21:05:37 -08:00
Nikolay Kim 60a8da5c05 remove Response constraint 2019-02-20 21:02:23 -08:00
Nikolay Kim 7f749ac9cc add missing end of line 2019-02-18 22:34:22 -08:00
Nikolay Kim 781f1a3fef do not skip content length is no chunking is selected 2019-02-18 22:20:00 -08:00
Nikolay Kim c8713d045c poll payload again if framed object get flushed during same iteration 2019-02-18 21:41:38 -08:00
Nikolay Kim 842da939dc fix chunked transfer encoding handling 2019-02-18 20:24:50 -08:00
Nikolay Kim d180b2a1e3 update tests 2019-02-18 18:46:30 -08:00
Nikolay Kim 037c3da172 enable ssl for connector 2019-02-18 18:40:40 -08:00
Nikolay Kim e6e83ea57e add Response::map_body 2019-02-18 17:01:35 -08:00
Nikolay Kim 118606262b refactor payload handling 2019-02-13 13:52:11 -08:00
Michael Edwards 0059a55dfb Fix typo 2019-02-13 14:31:28 +03:00
Nikolay Kim 8d4ce0c956 export PayloadStream 2019-02-12 11:09:58 -08:00
Nikolay Kim a41459bf69 make payload generic 2019-02-12 11:07:42 -08:00
Nikolay Kim 32021532c3 export Payload type 2019-02-12 09:55:29 -08:00
Nikolay Kim f9724fa0ec add ErrorResponse impl for TimeoutError 2019-02-11 09:54:41 -08:00
Nikolay Kim e178db7f74 fix test 2019-02-09 21:32:44 -08:00
Nikolay Kim 1af149b9e6 remove Clone constraint from handler service 2019-02-09 20:27:39 -08:00
Nikolay Kim a66d8589c2 add Extensions::contains method 2019-02-09 10:45:35 -08:00
Nikolay Kim 6a343fae06 simplify Message type 2019-02-09 10:33:49 -08:00
Nikolay Kim f3ed1b601e Change service response to Into<Response> 2019-02-09 08:44:22 -08:00
cuebyte c695358bcb Ignored the If-Modified-Since if If-None-Match is specified (#680) (#692) 2019-02-09 00:33:00 +03:00
Nikolay Kim ed7ca7fe07 make Message clonable and expose as public 2019-02-07 21:50:20 -08:00
Nikolay Kim b0e36fdcf9 simplify Message api 2019-02-07 21:19:10 -08:00
Nikolay Kim a7a2d4cf5c fix warns 2019-02-07 19:53:48 -08:00
Nikolay Kim 2a6e4dc7ab use non mutable self for HttpMessage::payload() for ergonomic reasons 2019-02-07 19:26:12 -08:00
Nikolay Kim 5575ee7d2d use same payload type for h1 and h2 2019-02-07 13:41:50 -08:00
Nikolay Kim 7d49a07f91 add h1/h2 payload 2019-02-07 13:39:15 -08:00
Nikolay Kim c4596b0bd6 add headers from actix-web 2019-02-07 13:24:24 -08:00
Nikolay Kim cd83553db7 simplify payload api; add missing http error helper functions 2019-02-07 11:37:33 -08:00
Jason Hills b018e4abaf Fixes TestRequest::with_cookie panic 2019-02-07 07:55:27 +03:00
Nikolay Kim fcace161c7 fix manifest features 2019-02-06 12:22:40 -08:00
Nikolay Kim 55a29d3778 add h2 server support 2019-02-06 11:44:15 -08:00
Vladislav Stepanov 346d85a884 Serve static file directly instead of redirecting (#676) 2019-02-04 13:20:46 +03:00
Nikolay Kim ef5b54a481 use released service crate 2019-02-03 14:05:44 -08:00
Nikolay Kim c9bb2116fe update actix-utils 2019-02-03 10:50:29 -08:00
Nikolay Kim e70c7f2a5d upgrade derive-more 2019-02-01 20:22:43 -08:00
Nikolay Kim 3269e35722 migrate to actix-service 0.2 2019-02-01 20:18:44 -08:00
Nikolay Kim 76866f054f move service to submodule; update travis config 2019-01-30 10:29:15 -08:00
Nikolay Kim 3e6bdbd9ee rename trait 2019-01-29 10:34:27 -08:00
Nikolay Kim 9a4eb5a848 update readme 2019-01-29 10:17:38 -08:00
Nikolay Kim 4217894d48 cleaup warnings 2019-01-29 10:14:00 -08:00
Nikolay Kim 4a388d7ad9 add client http/2 support 2019-01-28 20:41:09 -08:00
wildarch 9968afe4a6 Use NamedFile with an existing File (#670) 2019-01-28 08:07:28 +03:00
Nikolay Kim 12fb94204f use hashbrown instead of std HashMap 2019-01-27 11:42:41 -08:00
Nikolay Kim c3d3e8b465 move TestServer to separate crate 2019-01-27 11:07:48 -08:00
Nikolay Kim 42277c5c8f update deps 2019-01-26 22:09:26 -08:00
Tomas Izquierdo Garcia-Faria f5bec968c7 Bump v_htmlescape version to 0.4 2019-01-25 11:31:42 +03:00
Neil Jensen a534fdd125 Add io handling for ECONNRESET when data has already been received 2019-01-20 08:45:33 +03:00
rishflab 3431fff4d7 Fixed example in client documentation. This closes #665. 2019-01-14 07:44:30 +03:00
Sameer Puri d6df2e3399 Fix HttpResponse doc spelling "os" to "of" 2019-01-11 08:45:15 +03:00
Douman 1fbb52ad3b 0.7.18 Bump 2019-01-10 17:05:18 +03:00
Julian Tescher e5cdd22720 Fix test server listener thread leak (#655) 2019-01-08 10:42:22 -08:00
Douman 4f2e970732 Tidy up CHANGES.md 2019-01-08 10:49:03 +03:00
Douman 4d45313f9d Decode special characters when handling static files 2019-01-08 10:46:58 +03:00
Juan Aguilar 55a2a59906 Improve change askama_escape in favor of v_htmlescape (#651) 2019-01-03 22:34:18 +03:00
Ji Qu 61883042c2 Add with-cookie init-method for TestRequest (#647) 2019-01-02 13:24:08 +03:00
Douman 799c6eb719 0.7.17 Bump 2018-12-25 16:28:36 +03:00
Douman 037a1c6a24 Bump min version of rustc
Due to actix & trust-dns requirement
2018-12-24 21:17:09 +03:00
BlueC0re bfdf762062 Only return a single Origin value (#644)
Only return a single origin if matched.
2018-12-24 21:16:07 +03:00
Nikolay Kim 477bf0d8ae Send HTTP/1.1 100 Continue if request contains expect: continue header #634 2018-12-23 10:19:12 -08:00
Phil Booth e9fe3879df Support custom content types in JsonConfig 2018-12-23 08:27:47 +03:00
Nikolay Kim f2251b8059 Merge branch 'master' of github.com:fafhrd91/actix-http 2018-12-19 18:35:09 -08:00
Nikolay Kim cc74435b01 drop failure crate 2018-12-19 18:34:56 -08:00
Nikolay Kim 3bd5167ac2
Merge pull request #10 from DoumanAsh/http1_case
H1 decoder should ignore headers case
2018-12-16 07:44:40 -08:00
Douman 67df9399df H1 decoder should ignore headers case 2018-12-16 18:43:11 +03:00
Douman 1a940d4c18 H1 decoded should ignore header cases 2018-12-16 18:34:32 +03:00
Douman e8bdcb1c08 Update min version of http
Closes #630
2018-12-15 09:26:56 +03:00
Nikolay Kim b1001b80b7 upgrade actix-service dependency 2018-12-12 18:39:01 -08:00
Douman 46db09428c Prepare release 0.7.16 2018-12-11 21:04:05 +03:00
Nikolay Kim 1c60992723 use released crates 2018-12-11 09:29:12 -08:00
ethanpailes 90eef31cc0 impl ResponseError for SendError when possible (#619) 2018-12-11 19:37:52 +03:00
Nikolay Kim aaae368ed9 use new actix crates 2018-12-10 18:08:33 -08:00
Akos Vandra 86af02156b add impl FromRequest for Either<A,B> (#618) 2018-12-10 19:02:05 +03:00
Nikolay Kim 9f4d48f7a1 update tests 2018-12-06 15:03:01 -08:00
Nikolay Kim e9121025b7 convert to 2018 edition 2018-12-06 14:32:52 -08:00
Douman ac9fc662c6 Bump version to 0.7.15 2018-12-05 18:27:06 +03:00
Douman 0745a1a9f8 Remove usage of upcoming keyword async
AsyncResult::async is replaced with AsyncResult::future
2018-12-05 18:23:04 +03:00
silwol b1635bc0e6 Update some dependencies (#612)
* Update rand to 0.6

* Update parking_lot to 0.7

* Update env_logger to 0.6
2018-12-04 09:58:22 +03:00
Kelly Thomas Kline 08c7743bb8 Add set_mailbox_capacity() function 2018-12-02 08:40:09 +03:00
vemoo 68c5d6e6d6 impl From<Cow<'static, [u8]>> for Binary (#611)
impl `From` for `Cow<'static, [u8]>`  and `From<Cow<'static, str>>` for `Binary`
2018-12-02 08:32:55 +03:00
Nikolay Kim c0f8bc9e90 fix ssl support 2018-11-30 16:04:33 -08:00
Nikolay Kim 5003c00efb use new Service and NewService traits 2018-11-30 11:57:57 -08:00
Nikolay Kim d269904fbf add cause for nested errors 2018-11-28 09:10:13 -10:00
Nikolay Kim 06387fc778 display parse error for ws client errors 2018-11-28 09:02:31 -10:00
Nikolay Kim 617b8557e1
Merge pull request #9 from alishir/new-example
echo example with `impl Future`
2018-11-27 20:17:32 -10:00
Ali Shirvani 4028f6f6fd http crate removed, cargo fmt 2018-11-28 09:42:04 +03:30
Ali Shirvani 397804a786 echo example with impl Future 2018-11-28 09:15:08 +03:30
Nikolay Kim 756bf0af58
Merge pull request #5 from alishir/echo-example
Two other simple examples.
2018-11-25 20:50:17 -10:00
Nikolay Kim f1bfdc7395 Merge branch 'master' of https://github.com/fafhrd91/actix-http 2018-11-25 20:14:58 -10:00
Nikolay Kim 9c038ee189 allow to use Uri for client request 2018-11-25 20:14:42 -10:00
Ali Shirvani ca1b460924
comments aligned. 2018-11-25 05:48:33 +03:30
François c386353337 decode reserved characters when extracting path with configuration (#577)
* decode reserved characters when extracting path with configuration

* remove useless clone

* add a method to get decoded parameter by name
2018-11-24 16:54:11 +03:00
Ali Shirvani 7a97de3a1e update readme. 2018-11-24 17:17:34 +03:30
Ali Shirvani d5b2640342 add framed_hello.rs 2018-11-24 17:08:17 +03:30
Ali Shirvani c3c2286e3a An other hello word example and update sample in README.md 2018-11-24 17:07:30 +03:30
Ali Shirvani d5ca6e21e2 simple echo server. 2018-11-24 11:29:14 +03:30
Douman 9aab382ea8 Allow user to provide addr to custom resolver
We basically swaps Addr with Recipient to enable user to use custom resolver
2018-11-23 15:36:12 +03:00
Nikolay Kim 7ef6eab9af
Merge pull request #3 from alishir/examples
hello-world example added.
2018-11-22 19:24:50 -10:00
Ali Shirvani 41d68c87d9 hello-world example added. 2018-11-23 07:42:40 +03:30
Nikolay Kim 1a322966ff handle response errors 2018-11-21 07:49:24 -08:00
Douman 389cb13cd6 Export PathConfig and QueryConfig
Closes #597
2018-11-20 23:06:38 +03:00
Nikolay Kim ab3e12f2b4 set server response version 2018-11-20 11:23:05 -08:00
Nikolay Kim 186d3d727a add kee-alive tests 2018-11-20 10:55:50 -08:00
Huston Bokinsky 6a93178479 Complete error helper functions. 2018-11-20 08:07:46 +03:00
Nikolay Kim e1fc6dea84 restore execute method 2018-11-19 16:39:40 -08:00
Nikolay Kim 6b60c9e230 add debug impl for H1ServiceResult 2018-11-19 16:11:58 -08:00
Nikolay Kim 3901239128 unify requedt/response encoder 2018-11-19 14:57:12 -08:00
Nikolay Kim 1ca6b44bae add TestServer 2018-11-18 21:48:20 -08:00
Nikolay Kim 18fcddfd63 remove backtrace dep 2018-11-18 20:25:59 -08:00
Nikolay Kim 7d66430324 move url module to different crate 2018-11-18 20:08:43 -08:00
Nikolay Kim 22d4523c93 update actix-net 2018-11-18 18:31:44 -08:00
Nikolay Kim 7d3adaa6a8 replace message flags with ConnectionType 2018-11-18 18:17:38 -08:00
Nikolay Kim adad203314 refactor encoder/decoder impl 2018-11-18 17:52:56 -08:00
Nikolay Kim 8fea1367c7 re-introduce Body type, use Body as default body type for Response 2018-11-18 13:48:42 -08:00
Nikolay Kim 7fed50bcae refactor response body management 2018-11-17 20:21:28 -08:00
Nikolay Kim e73a97884a do not allow to set server response version 2018-11-17 09:03:35 -08:00
Nikolay Kim f0bd4d868e simplify server response type 2018-11-17 08:56:40 -08:00
Nikolay Kim 3a4b16a6d5 use BodyLength for request and response body 2018-11-16 21:30:37 -08:00
Nikolay Kim aa20e2670d refactor h1 dispatcher 2018-11-16 21:09:33 -08:00
Nikolay Kim 625469f0f4 refactor decoder 2018-11-16 19:28:07 -08:00
Nikolay Kim 3b7bc41418 use RequestHead for Request 2018-11-15 22:34:29 -08:00
Nikolay Kim 6d9733cdf7 define generic client Connection trait 2018-11-15 11:10:23 -08:00
Nikolay Kim acd42f92d8 remove debug print 2018-11-14 19:08:52 -08:00
Nikolay Kim 6e7560e287 SendResponse service sends body as well 2018-11-14 18:57:58 -08:00
Nikolay Kim cd9901c928 prepare release 2018-11-14 16:24:01 -08:00
Nikolay Kim 03ad9a3105 simplify client decoder 2018-11-14 10:52:40 -08:00
Nikolay Kim 6297fe0d41 refactor client response payload handling 2018-11-14 09:38:16 -08:00
Nikolay Kim 550c5f55b6 add simple http client 2018-11-13 22:59:00 -08:00
Nikolay Kim 537144f0b9 add http client connector service 2018-11-11 23:12:54 -08:00
Nikolay Kim 1ef0eed0bd do not stop on keep-alive timer if sink is not completly flushed 2018-11-08 20:46:13 -08:00
Nikolay Kim b25b083866 do not stop on keep-alive timer if sink is not completly flushed 2018-11-08 20:45:48 -08:00
Nikolay Kim dea39030bc properly handle upgrade header if content-length header is set 2018-11-08 20:38:40 -08:00
Nikolay Kim 61b1030882 Fix websockets connection drop if request contains content-length header #567 2018-11-08 20:35:47 -08:00
Nikolay Kim 7065c540e1 set nodelay on socket #560 2018-11-08 16:29:43 -08:00
Nikolay Kim aed3933ae8 Merge branch 'master' of github.com:actix/actix-web 2018-11-08 16:15:45 -08:00
Nikolay Kim 5b7740dee3 hide ChunkedReadFile 2018-11-08 16:12:16 -08:00
imaperson 1a0bf32ec7 Fix unnecessary owned string and change htmlescape in favor of askama_escape (#584) 2018-11-08 16:08:06 -08:00
Nikolay Kim 9ab586e24e update actix-net dep 2018-11-08 16:06:23 -08:00
Nikolay Kim 6a1d560f22 fix keep-alive timer reset 2018-11-08 09:30:53 -08:00
Nikolay Kim 62f1c90c8d update base64 dep 2018-11-07 21:18:40 -08:00
Nikolay Kim 2677d325a7 fix keep-alive timer reset 2018-11-07 21:09:33 -08:00
Julian Tescher 8e354021d4 Add SameSite option to identity middleware cookie (#581) 2018-11-07 23:24:06 +03:00
Nikolay Kim f1587243c2 fix body decoding 2018-11-05 19:32:03 -08:00
Stanislav Tkach 3b536ee96c Use old clippy attributes syntax (#562) 2018-11-01 11:14:48 +03:00
Nikolay Kim da82e24954 render error message as body 2018-10-30 11:55:17 -07:00
Nikolay Kim 79bcbb8a10 use error message 2018-10-30 11:50:30 -07:00
Nikolay Kim 148cf73003 allow to create response with error message 2018-10-30 11:46:44 -07:00
Nikolay Kim c2540cc59b clippy warnings 2018-10-29 16:39:46 -07:00
Nikolay Kim cfd9a56ff7 Add async/await ref 2018-10-28 09:24:19 -07:00
Douman 5f91f5eda6
Correct IoStream::set_keepalive for UDS (#564)
Enable uds feature in tests
2018-10-26 10:59:06 +03:00
Nikolay Kim 540ad18432 add Debug impl 2018-10-24 16:48:45 -07:00
Nikolay Kim cd0223e8b7 update Connector usage 2018-10-23 22:41:30 -07:00
Nikolay Kim bc6e62349c update deps; export api 2018-10-23 21:44:20 -07:00
Nikolay Kim 4260692034 add DefaultClient type alias 2018-10-22 18:52:40 -07:00
Nikolay Kim 09c94cb06b add client http codec; websockets client 2018-10-22 18:18:05 -07:00
Nikolay Kim 9b94eaa6a8 ws services 2018-10-22 09:59:20 -07:00
François 42d5d48e71 add a way to configure error treatment for Query and Path extractors (#550)
* add a way to configure error treatment for Query extractor

* allow error handler to be customized for Path extractor
2018-10-20 06:43:43 +03:00
Douman 960274ada8
Refactoring of server output to not exclude HTTP_10 (#552) 2018-10-19 07:52:10 +03:00
ivan-ochc f383f618b5 Fix typo in error message (#554) 2018-10-18 21:27:31 +03:00
Nikolay Kim 20c693b39c rename service 2018-10-15 16:46:13 -07:00
Nikolay Kim 3c402a55da added H1SimpleService 2018-10-15 15:56:47 -07:00
Nikolay Kim c04b4678f1 bump version 2018-10-14 08:10:41 -07:00
Nikolay Kim dd948f836e HttpServer not sending streamed request body on HTTP/2 requests #544 2018-10-14 08:08:12 -07:00
Nikolay Kim d39c018c93 do not handle upgrade and connect requests 2018-10-13 23:57:31 -07:00
Douman 63a443fce0 Correct build script 2018-10-13 10:05:21 +03:00
Douman d145136e56 Add individual check for TLS features 2018-10-13 09:54:03 +03:00
Nikolay Kim b960b5827c export Uri 2018-10-11 20:15:10 -07:00
jeizsm 32145cf6c3 fix after update tokio-rustls (#542) 2018-10-11 11:05:07 +03:00
Nikolay Kim 06addd5523 update deps 2018-10-10 13:23:25 -07:00
Nikolay Kim 47b47af01a refactor ws codec 2018-10-10 13:20:00 -07:00
Nikolay Kim ec8aef6b43 update dep versions 2018-10-10 08:36:16 -07:00
Nikolay Kim f45038bbfe remove unused code 2018-10-09 13:23:37 -07:00
Nikolay Kim c63838bb71 fix 204 support for http/2 2018-10-09 13:12:49 -07:00
Nikolay Kim 4d17a9afcc update version 2018-10-09 11:42:52 -07:00
Nikolay Kim 65e9201b4d Fixed panic during graceful shutdown 2018-10-09 11:35:57 -07:00
Nikolay Kim 4a167dc89e update readme example 2018-10-09 10:47:41 -07:00
Nikolay Kim 1407bf4f7f simplify h1 codec messages 2018-10-09 10:39:55 -07:00
Nikolay Kim c3ad516f56 disable shutdown atm 2018-10-09 09:45:24 -07:00
Nikolay Kim cb78d9d41a use actix-net release 2018-10-08 22:04:53 -07:00
Nikolay Kim 93b1c5fd46 update deps 2018-10-08 21:58:37 -07:00
Nikolay Kim fd5da5945e update appveyor config 2018-10-08 21:23:52 -07:00
Nikolay Kim 2b4870e65b fix tests on stable 2018-10-08 16:10:07 -07:00
Nikolay Kim f99a723643 add Default impl for ServiceConfig 2018-10-08 15:52:12 -07:00
Nikolay Kim 3984ad45df separate ResponseLength::Zero is not needed 2018-10-08 15:33:38 -07:00
Nikolay Kim 4e7fac08b9 do not override content-length header 2018-10-08 15:30:59 -07:00
Nikolay Kim 805e7a4cd0 impl response body support 2018-10-08 15:24:51 -07:00
Nikolay Kim 07f6ca4b71 Merge branch 'master' of github.com:actix/actix-web 2018-10-08 13:06:49 -07:00
Nikolay Kim 03d988b898 refactor date rendering 2018-10-08 10:16:19 -07:00
Nikolay Kim 431e33acb2 add Date header to response 2018-10-08 10:14:29 -07:00
Nikolay Kim 30db78c19c use TakeItem instead of TakeRequest 2018-10-08 07:55:01 -07:00
Nikolay Kim cfad5bf1f3 enable slow request timeout for h2 dispatcher 2018-10-08 07:47:42 -07:00
Nikolay Kim 8acf9eb98a better keep-alive handling 2018-10-07 10:09:48 -07:00
Nikolay Kim 13193a0721 refactor http/1 dispatcher 2018-10-07 09:59:40 -07:00
Nikolay Kim 9c4a55c95c simplify H1Service configuration 2018-10-07 08:28:38 -07:00
Nikolay Kim 8d85c45c1d simplify error handling 2018-10-07 00:04:38 -07:00
Nikolay Kim b0ca6220f0 refactor te encoding 2018-10-06 22:36:57 -07:00
Nikolay Kim dda5b399ca add content-length test 2018-10-06 21:32:01 -07:00
Nikolay Kim 25af82c45a cleanup dependencies 2018-10-06 21:17:27 -07:00
Nikolay Kim 87b83a3403 update tests, remove unused deps 2018-10-06 21:07:32 -07:00
Nikolay Kim c368abdf5f remove Json type 2018-10-06 20:34:19 -07:00
Nikolay Kim ee62814216 split request decoder and payload decoder 2018-10-06 20:31:22 -07:00
Danil Berestov 10678a22af test content length (#532) 2018-10-06 08:17:20 +03:00
lzx 7ae5a43877 httpresponse.rs doc fix (#534) 2018-10-06 08:16:12 +03:00
Nikolay Kim c0699a070e add TakeRequest service; update ws test case 2018-10-05 15:40:56 -07:00
Nikolay Kim 7e135b798b add websocket transport and test 2018-10-05 14:30:40 -07:00
Nikolay Kim 5c0a2066cc refactor ws to a websocket codec 2018-10-05 12:47:22 -07:00
Nikolay Kim 8c2244dd88 rename HttpResponse 2018-10-05 11:04:59 -07:00
Nikolay Kim d53f3d7187 re-enable websockets 2018-10-05 10:20:49 -07:00
Nikolay Kim 2e27d77740 fix connection keepalive support 2018-10-05 10:03:10 -07:00
Nikolay Kim fbf67544e5 remove unused code 2018-10-05 08:03:25 -07:00
Nikolay Kim c24a8f4c2d remove high level apis 2018-10-05 07:02:09 -07:00
Nikolay Kim c99f9eaa63
Update test_h1v2.rs 2018-10-05 05:59:02 -07:00
Nikolay Kim caa5a54b8f fix test and remove unused code 2018-10-04 23:46:43 -07:00
Nikolay Kim 7fdc18f9b9 calculate response parameters 2018-10-04 23:39:11 -07:00
Nikolay Kim e78014c65a fix travis link in readme 2018-10-04 21:19:43 -07:00
Nikolay Kim df50e636f1 update readme 2018-10-04 21:18:36 -07:00
Nikolay Kim 99a915e668 disable gh-pages update 2018-10-04 21:15:24 -07:00
Nikolay Kim 829dbae609 cleanups and tests 2018-10-04 21:14:18 -07:00
Nikolay Kim 4ca711909b refactor types 2018-10-04 20:02:10 -07:00
Nikolay Kim b15b2dda22 remove ServerSettings 2018-10-04 17:34:57 -07:00
Nikolay Kim 6aa2de7b8d remove actix-web artifacts 2018-10-04 17:00:27 -07:00
Nikolay Kim 13b0ee7355 stopping point 2018-10-04 16:22:00 -07:00
Nikolay Kim 1e1a4f846e use actix-net cell features 2018-10-02 22:23:51 -07:00
Nikolay Kim 49eea3bf76 travis config 2018-10-02 20:22:51 -07:00
Nikolay Kim b0677aa029 fix stable compatibility 2018-10-02 19:42:24 -07:00
Nikolay Kim 401ea574c0 make AcceptorTimeout::new public 2018-10-02 19:31:30 -07:00
Nikolay Kim bbcd618304 export AcceptorTimeout 2018-10-02 19:12:08 -07:00
Nikolay Kim 1f68ce8541 fix tests 2018-10-02 19:05:58 -07:00
Nikolay Kim 2710f70e39 add H1 transport 2018-10-02 17:30:29 -07:00
Nikolay Kim ae5c4dfb78 refactor http channels list; rename WorkerSettings 2018-10-02 15:25:32 -07:00
Nikolay Kim d7379bd10b update server ssl tests; upgrade rustls 2018-10-02 13:41:33 -07:00
Nikolay Kim b59712c439 add ssl handshake timeout tests 2018-10-02 11:32:43 -07:00
Nikolay Kim 724668910b fix ssh handshake timeout 2018-10-02 11:18:59 -07:00
Nikolay Kim 61c7534e03 fix stream flushing 2018-10-02 10:43:23 -07:00
Douman f8b176de9e
Fix no_http2 flag in HttpServer (#526) 2018-10-02 20:09:31 +03:00
Danil Berestov c8505bb53f content-length bug fix (#525)
* content-length bug fix

* changes.md is updated

* typo
2018-10-02 09:15:48 -07:00
Nikolay Kim eed377e773 uneeded dep 2018-10-02 00:20:27 -07:00
Nikolay Kim f3ce6574e4 fix client timer and add slow request tests 2018-10-02 00:19:28 -07:00
Nikolay Kim f007860a16 cleanup warnings 2018-10-01 22:48:11 -07:00
Nikolay Kim fdfadb52e1 fix doc test for State 2018-10-01 22:29:30 -07:00
Nikolay Kim 368f73513a set tcp-keepalive for test as well 2018-10-01 22:25:53 -07:00
Nikolay Kim c674ea9126 add StreamConfiguration service 2018-10-01 22:23:02 -07:00
Nikolay Kim 7c78797d9b proper stop for test_ws_stopped test 2018-10-01 21:30:00 -07:00
Nikolay Kim 84edc57fd9 increase sleep time 2018-10-01 21:19:27 -07:00
Nikolay Kim 127af92541 clippy warnings 2018-10-01 21:16:56 -07:00
Nikolay Kim e4686f6c8d set socket linger to 0 on timeout 2018-10-01 20:53:22 -07:00
Nikolay Kim 1bac65de4c add websocket stopped test 2018-10-01 20:15:26 -07:00
Nikolay Kim 16945a554a add client shutdown timeout 2018-10-01 20:04:16 -07:00
Nikolay Kim 91af3ca148 simplify h1 dispatcher 2018-10-01 19:18:24 -07:00
Nikolay Kim 2217a152cb expose app error by http service 2018-10-01 15:19:49 -07:00
Nikolay Kim c1e0b4f322 expose internal http server types and allow to create custom http pipelines 2018-10-01 14:43:06 -07:00
Nikolay Kim 5966ee6192 add HttpServer::register() function, allows to register services in actix net server 2018-09-28 16:03:53 -07:00
Nikolay Kim 4aac3d6a92 refactor keep-alive timer 2018-09-28 15:04:59 -07:00
Nikolay Kim e95babf8d3 log acctor init errors 2018-09-28 12:37:20 -07:00
Nikolay Kim f2d42e5e77 refactor acceptor error handling 2018-09-28 11:50:47 -07:00
Nikolay Kim 0f1c80ccc6 deprecate start_incoming 2018-09-28 08:45:49 -07:00
Nikolay Kim fc5088b55e fix tarpaulin args 2018-09-28 00:08:23 -07:00
Nikolay Kim bec37fdbd5 update travis config 2018-09-27 22:23:29 -07:00
Nikolay Kim 4b59ae2476 fix ssl config for client connector 2018-09-27 22:15:38 -07:00
Nikolay Kim d0fc9d7b99 simplify listen_ and bind_ methods 2018-09-27 21:55:44 -07:00
Nikolay Kim 1ff86e5ac4 restore rust-tls support 2018-09-27 21:24:21 -07:00
Nikolay Kim ecfda64f6d add native-tls support 2018-09-27 20:40:34 -07:00
Nikolay Kim 0bca21ec6d fix ssl tests 2018-09-27 19:57:40 -07:00
Nikolay Kim 3173c9fa83 diesable client timeout for tcp stream acceptor 2018-09-27 19:34:07 -07:00
Nikolay Kim 85445ea809 rename and simplify ServiceFactory trait 2018-09-27 18:33:29 -07:00
Nikolay Kim d57579d700 refactor acceptor pipeline add client timeout 2018-09-27 18:33:29 -07:00
Nikolay Kim b6a1cfa6ad update openssl support 2018-09-27 18:33:29 -07:00
Nikolay Kim 9f1417af30 refactor http service builder 2018-09-27 18:33:29 -07:00
Nikolay Kim 0aa0f326f7 fix changes from master 2018-09-27 18:33:29 -07:00
Nikolay Kim dbb4fab4f7 separate mod for HttpHandler; add HttpHandler impl for Vec<H> 2018-09-27 18:33:29 -07:00
Nikolay Kim 6f3e70a92a simplify application factory 2018-09-27 18:33:29 -07:00
Nikolay Kim a63d3f9a7a cleanup ServerFactory trait 2018-09-27 18:33:29 -07:00
Nikolay Kim a3cfc24232 refactor acceptor service 2018-09-27 18:33:29 -07:00
Nikolay Kim 6a61138bf8 enable ssl feature 2018-09-27 18:33:29 -07:00
Nikolay Kim 7cf9af9b55 disable ssl for travis 2018-09-27 18:33:29 -07:00
Nikolay Kim c9a52e3197 refactor date generatioin 2018-09-27 18:33:29 -07:00
Nikolay Kim 1907102685 switch to actix-net server 2018-09-27 18:33:29 -07:00
Nikolay Kim 52195bbf16 update version 2018-09-27 18:17:58 -07:00
sapir 59deb4b40d Try to separate HTTP/1 read & write disconnect handling, to fix #511. (#514) 2018-09-27 18:15:02 -07:00
Ashley 782eeb5ded Reduced unsafe converage (#520) 2018-09-26 11:56:34 +03:00
Douman 1b298142e3
Correct composing of multiple origins in cors (#518) 2018-09-21 08:45:22 +03:00
Douman 0dc96658f2
Send response to inform client of error (#515) 2018-09-21 07:24:10 +03:00
Nikolay Kim f40153fca4 fix node::insert() method, missing next element 2018-09-17 11:39:03 -07:00
Nikolay Kim 764103566d update changes 2018-09-17 10:48:37 -07:00
Nikolay Kim bfb2f2e9e1 fix node.remove(), update next node pointer 2018-09-17 10:25:45 -07:00
Nikolay Kim 599e6b3385 refactor channel node remove operation 2018-09-17 05:29:07 -07:00
Nikolay Kim 03e318f446 update changes 2018-09-15 17:10:53 -07:00
Nikolay Kim 7449884ce3 fix wrong error message for path deserialize for i32 #510 2018-09-15 17:09:07 -07:00
Nikolay Kim bbe69e5b8d update version 2018-09-15 10:00:54 -07:00
Nikolay Kim 9d1eefc38f use 5 seconds keep-alive timer by default 2018-09-15 09:57:54 -07:00
Nikolay Kim d65c72b44d use server keep-alive timer as slow request timer 2018-09-15 09:55:38 -07:00
Nikolay Kim c3f8b5cf22 clippy warnings 2018-09-11 11:25:32 -07:00
Nikolay Kim 70a3f317d3 fix failing requests to test server #508 2018-09-11 11:24:05 -07:00
Nikolay Kim 513c8ec1ce
Merge pull request #505 from Neopallium/master
Fix issue with HttpChannel linked list.
2018-09-11 11:18:33 -07:00
Robert G. Jakabosky 04608b2ea6 Update changes. 2018-09-12 00:27:15 +08:00
Robert G. Jakabosky 70b45659e2 Make Node's traverse method take a closure instead of calling shutdown on each HttpChannel. 2018-09-12 00:27:15 +08:00
Robert G. Jakabosky e0ae6b10cd Fix bug with HttpChannel linked list. 2018-09-12 00:27:15 +08:00
Maciej Piechotka 003b05b095 Don't ignore errors in std::fmt::Debug implementations (#506) 2018-09-11 14:57:55 +03:00
Nikolay Kim cdb57b840e prepare release 2018-09-07 20:47:54 -07:00
Nikolay Kim 002bb24b26 unhide SessionBackend and SessionImpl traits and cleanup warnings 2018-09-07 20:46:43 -07:00
Nikolay Kim 51982b3fec
Merge pull request #503 from uzytkownik/route-regex
Refactor resource route parsing to allow repetition in the regexes
2018-09-07 20:19:31 -07:00
Maciej Piechotka 4251b0bc10 Refactor resource route parsing to allow repetition in the regexes 2018-09-06 08:51:55 +02:00
Nikolay Kim 42f3773bec update changes 2018-09-05 09:03:58 -07:00
Jan Michael Auer 86fdbb47a5 Fix system_exit in HttpServer (#501) 2018-09-05 10:41:23 +02:00
Nikolay Kim 4ca9fd2ad1 remove debug print 2018-09-03 22:09:12 -07:00
Nikolay Kim f0f67072ae Read client response until eof if connection header set to close #464 2018-09-03 21:35:59 -07:00
Nikolay Kim 24d1228943 simplify handler path processing 2018-09-03 11:28:47 -07:00
Nikolay Kim b7a73e0a4f fix Scope::handler doc test 2018-09-02 08:51:26 -07:00
Nikolay Kim 968c81e267 Handling scoped paths without leading slashes #460 2018-09-02 08:14:54 -07:00
Nikolay Kim d5957a8466 Merge branch 'master' of https://github.com/actix/actix-web 2018-09-02 07:47:45 -07:00
Nikolay Kim f2f05e7715 allow to register handlers on scope level #465 2018-09-02 07:47:19 -07:00
Markus Unterwaditzer 3439f55288 doc: Add example for using custom nativetls connector (#497) 2018-09-01 18:13:52 +03:00
Robert Gabriel Jakabosky 0425e2776f Fix Issue #490 (#498)
* Add failing testcase for HTTP 404 response with no reason text.

* Include canonical reason test for HTTP error responses.

* Don't send a reason for unknown status codes.
2018-09-01 12:00:32 +03:00
Nikolay Kim 6464f96f8b Merge branch 'master' of https://github.com/actix/actix-web 2018-08-31 18:56:53 -07:00
Nikolay Kim a2b170fec9 fmt 2018-08-31 18:56:21 -07:00
Nikolay Kim 0b42cae082 update tests 2018-08-31 18:54:19 -07:00
Nikolay Kim c313c003a4
Fix typo 2018-08-31 17:45:29 -07:00
Nikolay Kim 3fa23f5e10 update version 2018-08-31 17:25:15 -07:00
Nikolay Kim 2d51831899 handle socket read disconnect 2018-08-31 17:24:13 -07:00
Nikolay Kim e59abfd716
Merge pull request #496 from Neopallium/master
Fix issue with 'Connection: close' in ClientRequest
2018-08-31 17:17:39 -07:00
Robert G. Jakabosky 66881d7dd1 If buffer is empty, read more data before calling parser. 2018-09-01 02:25:05 +08:00
Robert G. Jakabosky a42a8a2321 Add some comments to clarify logic. 2018-09-01 02:15:36 +08:00
Robert G. Jakabosky 2341656173 Simplify buffer reading logic. Remove duplicate code. 2018-09-01 01:41:38 +08:00
Robert G. Jakabosky 487519acec Add client test for 'Connection: close' as reported in issue #495 2018-09-01 00:34:19 +08:00
Robert Gabriel Jakabosky af6caa92c8
Merge branch 'master' into master 2018-09-01 00:17:34 +08:00
Robert G. Jakabosky 3ccbce6bc8 Fix issue with 'Connection: close' in ClientRequest 2018-09-01 00:08:53 +08:00
Armin Ronacher 797b52ecbf
Update CHANGES.md 2018-08-29 20:58:23 +02:00
Markus Unterwaditzer 4bab50c861 Add ability to pass a custom TlsConnector (#491) 2018-08-29 20:53:31 +02:00
Nikolay Kim 5906971b6d
Merge pull request #483 from Neopallium/master
Fix bug with client disconnect immediately after receiving http request.
2018-08-26 10:15:25 -07:00
Robert G. Jakabosky 8393d09a0f Fix tests. 2018-08-27 00:31:31 +08:00
Robert G. Jakabosky c3ae9997fc Fix bug with http1 client disconnects. 2018-08-26 22:21:05 +08:00
Nikolay Kim d39dcc58cd
Merge pull request #482 from 0x1793d1/master
Fix server startup log message
2018-08-24 20:53:45 -07:00
0x1793d1 471a3e9806 Fix server startup log message 2018-08-24 23:21:32 +02:00
Nikolay Kim 48ef18ffa9 update changes 2018-08-23 12:54:59 -07:00
Nikolay Kim 9ef7a9c182 hide AcceptorService 2018-08-23 11:30:49 -07:00
Nikolay Kim 3dafe6c251 hide token and server flags 2018-08-23 11:30:07 -07:00
Nikolay Kim 8dfc34e785 fix tokio-tls IoStream impl 2018-08-23 10:27:32 -07:00
Nikolay Kim 810995ade0 fix tokio-tls dependency #480 2018-08-23 10:10:13 -07:00
Nikolay Kim 1716380f08 clippy fmt 2018-08-23 09:48:01 -07:00
Nikolay Kim e9c139bdea clippy warnings 2018-08-23 09:47:32 -07:00
Nikolay Kim cf54be2f17 hide new server api 2018-08-23 09:39:11 -07:00
Nikolay Kim f39b520a2d
Merge pull request #478 from fzgregor/master
Made extensions constructor public
2018-08-23 09:34:47 -07:00
Nikolay Kim 89f414477c
Merge branch 'master' into master 2018-08-23 09:34:34 -07:00
Douman 986f19af86
Revert back to serde_urlencoded dependecy (#479) 2018-08-21 22:23:17 +03:00
Franz Gregor e680541e10 Made extensions constructor public 2018-08-18 19:32:28 +02:00
Douman 56bc900a82
Set minimum rustls version that fixes corruption (#474) 2018-08-17 19:53:16 +03:00
Kornel bdc9a8bb07 Optionally support tokio-uds's UnixStream as IoStream (#472) 2018-08-17 19:04:15 +03:00
Nikolay Kim 8fe30a5b66
Merge pull request #473 from kornelski/usetest
Fix tests on Unix
2018-08-17 07:20:47 -07:00
Kornel Lesiński a8405d0686 Fix tests on Unix 2018-08-17 13:13:48 +01:00
Nikolay Kim eb1e9a785f allow to use fn with multiple arguments with .with()/.with_async() 2018-08-16 20:29:06 -07:00
Douman 248bd388ca
Improve HTTP server docs (#470) 2018-08-16 16:11:15 +03:00
Douman 9f5641c85b
Add mention of reworked Content-Disposition 2018-08-13 17:37:00 +03:00
Gowee d9c7cd96a6 Rework Content-Disposition parsing totally (#461) 2018-08-13 17:34:05 +03:00
Nikolay Kim bf7779a9a3 add TestRequest::run_async_result helper method 2018-08-09 18:58:14 -07:00
Nikolay Kim cc3fbd27e0 better ergonomics 2018-08-09 17:25:23 -07:00
Nikolay Kim 26629aafa5 explicit use 2018-08-09 13:41:13 -07:00
Nikolay Kim 2ab7dbadce better ergonomics for Server::service() method 2018-08-09 13:38:10 -07:00
Nikolay Kim 2e8d67e2ae upgrade native-tls package 2018-08-09 13:08:59 -07:00
Nikolay Kim 43b6828ab5 Merge branch 'master' of https://github.com/actix/actix-web 2018-08-09 11:52:45 -07:00
Nikolay Kim e4ce6dfbdf refactor workers management 2018-08-09 11:52:32 -07:00
Nikolay Kim 6b9fa2c3d9
Merge pull request #458 from davidMcneil/master
Add json2 HttpResponseBuilder method
2018-08-09 02:10:14 -07:00
Douman 5713d93158
Merge branch 'master' into master 2018-08-09 08:13:22 +03:00
Nikolay Kim cfe4829a56 add TestRequest::execute() helper method 2018-08-08 16:13:45 -07:00
Nikolay Kim b69774db61 fix attr name 2018-08-08 14:23:16 -07:00
Nikolay Kim 542782f28a add HttpRequest::drop_state() 2018-08-08 13:57:13 -07:00
David McNeil 7c8dc4c201 Add json2 tests 2018-08-08 12:17:19 -06:00
David McNeil 7a11c2eac1 Add json2 HttpResponseBuilder method 2018-08-08 11:11:15 -06:00
Nikolay Kim 8eb9eb4247 flush io on complete 2018-08-08 09:12:32 -07:00
Nikolay Kim 992f7a11b3 remove debug println 2018-08-07 22:40:09 -07:00
Nikolay Kim 30769e3072 fix http/2 error handling 2018-08-07 20:48:25 -07:00
Nikolay Kim 57f991280c fix protocol order for rustls acceptor 2018-08-07 13:53:24 -07:00
Nikolay Kim 85acc3f8df deprecate HttpServer::no_http2(), update changes 2018-08-07 12:49:40 -07:00
Nikolay Kim 5bd82d4f03 update changes 2018-08-07 12:00:51 -07:00
Nikolay Kim 58a079bd10 include content-length to error response 2018-08-07 11:56:39 -07:00
Nikolay Kim 16546a707f
Merge pull request #453 from DoumanAsh/reserve_status_line_for_server_error
Reserve enough space for ServerError task to write status line
2018-08-07 11:48:55 -07:00
Douman 86a5afb5ca Reserve enough space for ServerError task to write status line 2018-08-07 17:34:24 +03:00
Douman 9c80d3aa77
Write non-80 port in HOST of client's request (#451) 2018-08-07 10:01:29 +03:00
Erik Desjardins 954f1a0b0f impl FromRequest for () (#449) 2018-08-06 10:44:08 +03:00
Nikolay Kim f4fba5f481
Merge pull request #447 from DoumanAsh/multiple_set_cookies
Correct setting cookies in HTTP2 writer
2018-08-04 08:58:12 -07:00
Nikolay Kim 995f819eae
Merge branch 'master' into multiple_set_cookies 2018-08-04 08:58:00 -07:00
Nikolay Kim 85e7548088 fix adding multiple response headers for http/2 #446 2018-08-04 08:56:33 -07:00
Douman 900fd5a98e Correct settings headers for HTTP2
Add test to verify number of Set-Cookies
2018-08-04 18:05:41 +03:00
Nikolay Kim 84b27db218 fix no_http2 flag 2018-08-03 19:40:43 -07:00
Nikolay Kim ac9180ac46 simplify channel impl 2018-08-03 19:32:46 -07:00
Nikolay Kim e34b5c08ba allow to pass extra information from acceptor to application level 2018-08-03 19:24:53 -07:00
Nikolay Kim f3f1e04853 refactor ssl support 2018-08-03 16:09:46 -07:00
Nikolay Kim 036cf5e867 update changes 2018-08-03 08:20:59 -07:00
Jan Michael Auer e61ef7dee4 Use zlib instead of deflate for content encoding (#442) 2018-08-03 14:56:26 +02:00
Mathieu Amiot 9a10d8aa7a Fixed headers' formating for CORS Middleware Access-Control-Expose-Headers header value to HTTP/1.1 & HTTP/2 spec-compliant format (#436) 2018-08-03 15:03:11 +03:00
Mathieu Amiot f8e5d7c6c1 Fixed broken build on wrong variable usage (#440) 2018-08-03 14:11:51 +03:00
Nikolay Kim 8c89c90c50 add accept backpressure #250 2018-08-02 23:17:10 -07:00
Nikolay Kim e9c1889df4 test timing 2018-08-01 16:41:24 -07:00
Nikolay Kim 0da3fdcb09 do not use Arc for rustls config 2018-08-01 10:59:00 -07:00
Nikolay Kim a5f80a25ff update changes 2018-08-01 10:51:47 -07:00
Nikolay Kim 6d9a1cadad
Merge pull request #433 from jrconlin/feat/432
feature: allow TestServer to open a websocket on any URL
2018-08-01 10:45:55 -07:00
jrconlin 97ada3d3d0
Merge branch 'feat/432' of github.com:jrconlin/actix-web into feat/432 2018-08-01 10:27:48 -07:00
jrconlin 115f59dd14
Merge branch 'master' of https://github.com/actix/actix-web into feat/432 2018-08-01 09:59:36 -07:00
Nikolay Kim 972b008a6e remove unsafe error transmute, upgrade failure to 0.1.2 #434 2018-08-01 09:42:12 -07:00
jrconlin 246eafb8d2
Merge branch 'master' of https://github.com/actix/actix-web into feat/432 2018-08-01 09:36:08 -07:00
jrconlin dca4c110dd
feature: allow TestServer to open a websocket on any URL
* added `TestServer::ws_at(uri_str)`
* modified `TestServer::ws()` to call `self.ws_at("/")` to preserve
behavior

Closes #432
2018-08-01 09:30:27 -07:00
Nikolay Kim 58230b15b9 use one thread for accept loop; refactor rust-tls support 2018-07-31 19:51:26 -07:00
jrconlin aa1e75f071
feature: allow TestServer to open a websocket on any URL
* added `TestServer::ws_at(uri_str)`
* modified `TestServer::ws()` to call `self.ws_at("/")` to preserve
behavior

Closes #432
2018-07-31 16:21:18 -07:00
Nikolay Kim 2071ea0532 HttpRequest::url_for is not working with scopes #429 2018-07-31 15:40:52 -07:00
Nikolay Kim 3bd43090fb use new gzdecoder, fixes gz streaming #228 2018-07-31 09:06:05 -07:00
Nikolay Kim 4dba531bf9 do not override HOST header for client request #428 2018-07-31 08:51:24 -07:00
Nikolay Kim 2072c933ba handle error during request creation 2018-07-30 15:04:52 -07:00
Nikolay Kim 7bc0ace52d move server accept impl to seprate module 2018-07-30 13:42:42 -07:00
Nikolay Kim 4c4d0d2745 update changes 2018-07-30 10:23:28 -07:00
Nikolay Kim 28a855214b
Merge pull request #427 from jeizsm/feature/rustls
add rustls
2018-07-30 10:21:37 -07:00
Marat Safin 196da6d570 add rustls 2018-07-30 08:21:12 +03:00
Nikolay Kim b4ed564e5d update changes 2018-07-26 09:11:50 -07:00
Nikolay Kim 80fbc2e9ec Fix stream draining for http/2 connections #290 2018-07-25 15:38:02 -07:00
Nikolay Kim f58065082e fix missing content-encoding header for h2 connections #421 2018-07-25 10:30:55 -07:00
Douman 6048817ba7 Correct flate feature names in documentation 2018-07-25 20:22:18 +03:00
Mateusz Mikuła e408b68744 Update cookie dependency (#422) 2018-07-25 18:01:22 +03:00
Nikolay Kim b878613e10 fix warning 2018-07-24 15:49:46 -07:00
Nikolay Kim 85b275bb2b fix warnings 2018-07-24 15:09:30 -07:00
Nikolay Kim d6abd2fe22 allow to handle empty path for application with prefix 2018-07-24 14:51:48 -07:00
Nikolay Kim b79a9aaec7 fix changelog 2018-07-24 14:18:04 -07:00
Nikolay Kim b9586b3f71
Merge pull request #412 from gdamjan/master
remove the timestamp from the default logger middleware
2018-07-24 14:07:10 -07:00
Nikolay Kim d3b12d885e
Merge branch 'master' into master 2018-07-24 14:07:03 -07:00
Nikolay Kim f21386708a
Merge pull request #416 from axos88/master
Add FromRequest<S> implementation for Option<T> and Result<T> where T: FromRequest<S>
2018-07-24 14:06:08 -07:00
Akos Vandra b48a2d4d7b add changes to CHANGES.md 2018-07-24 22:25:48 +02:00
Akos Vandra 35b754a3ab pr fixes 2018-07-24 09:42:46 +02:00
Akos Vandra 1079c5c562 Add FromRequest<S> implementation for Result<T> and Option<T> where T:FromRequest<S> 2018-07-24 09:42:46 +02:00
Akos Vandra f4bb7efa89 add partialeq, eq, partialord and ord dervie to Path, Form and Query 2018-07-24 09:42:46 +02:00
Akos Vandra 0099091e96 remove unnecessary use 2018-07-24 09:42:46 +02:00
Nikolay Kim c352a69d54 fix dead links 2018-07-23 13:22:16 -07:00
Nikolay Kim f5347ec897
Merge pull request #415 from DenisKolodin/cookie-http-only
Add http_only flag to CookieSessionBackend
2018-07-23 02:54:23 -07:00
Denis Kolodin b367f07d56 Add http_only flag to CookieSessionBackend 2018-07-23 12:49:59 +03:00
Damjan Georgievski 6a75a3d683 document the change in the default logger 2018-07-21 16:01:42 +02:00
Damjan Georgievski 56b924e155 remove the timestamp from the default logger middleware
env_logger and other logging systems will (or should) already add their
own timestamp.
2018-07-21 15:15:28 +02:00
Nikolay Kim 4862227df9 fix not implemented panic #410 2018-07-21 05:58:08 -07:00
Nikolay Kim f6499d9ba5 publish stable docs on actix.rs site 2018-07-21 04:19:02 -07:00
Nikolay Kim 7138bb2f29 update migration 2018-07-21 01:00:50 -07:00
Nikolay Kim 8cb510293d update changes 2018-07-20 14:10:41 -07:00
Nikolay Kim 040d9d2755 Merge branch 'master' of github.com:actix/actix-web 2018-07-20 12:43:44 -07:00
Nikolay Kim 2043bb5ece do not reallocate waiters 2018-07-20 10:20:41 -07:00
Douman a751df2589
Initial config for static files (#405) 2018-07-20 07:49:25 +03:00
Douman f6e35a04f0
Just a bit of sanity check for short paths (#409) 2018-07-20 07:48:57 +03:00
Tobias Bieniek 0925a7691a ws/context: Increase write() visibility to public (#402)
This type is introduced to avoid confusion between the `.binary()` and `.write_raw()` methods on WebSocket contexts
2018-07-19 20:04:13 +03:00
Douman 2988a84e5f
Expose leaked private ContentDisposition (#406) 2018-07-19 20:03:45 +03:00
Nikolay Kim 6b10e1eff6 rename PayloadHelper 2018-07-18 10:01:28 +06:00
Nikolay Kim 85672d1379 fix client connector wait queue 2018-07-18 01:23:56 +06:00
Nikolay Kim 373f2e5028 add release stat 2018-07-17 17:38:16 +06:00
Nikolay Kim f9f259e718 Merge branch 'master' of github.com:actix/actix-web 2018-07-17 17:23:23 +06:00
Nikolay Kim d43902ee7c proper handling for client connection release 2018-07-17 17:23:03 +06:00
Douman a7ca5fa5d8
Add few missing entries to changelog 2018-07-17 11:10:04 +03:00
Douman 29a275b0f5
Session should write percent encoded cookies and add cookie middleware test (#393)
* Should write percent encoded cookies to HTTP response

* Add cookie middleware test
2018-07-17 08:38:18 +03:00
Nikolay Kim 1af5aa3a3e calculate client request timeout 2018-07-17 02:30:21 +06:00
Nikolay Kim bccd7c7671 add wait queue size stat to client connector 2018-07-17 01:57:57 +06:00
Nikolay Kim 2a8c2fb55e export Payload 2018-07-16 12:14:24 +06:00
Nikolay Kim 2dd57a48d6 checks nested scopes in has_resource() 2018-07-16 11:33:29 +06:00
Nikolay Kim 22385505a3 clippy warnings and fmt 2018-07-16 11:17:45 +06:00
Nikolay Kim 5888f01317 use has_prefixed_route for NormalizePath helper 2018-07-16 11:13:41 +06:00
Nikolay Kim b7a3fce17b simplify has_prefixed_route() 2018-07-16 11:10:51 +06:00
Nikolay Kim bce05e4fcb
Merge pull request #381 from OtaK/fix/has_route_prefixes
Add prefix aware RouteInfo::has_prefixed_route()
2018-07-16 10:58:50 +06:00
Nikolay Kim 3373847a14 allocate buffer for request payload extractors 2018-07-16 00:40:22 +06:00
Mathieu Amiot 8f64508887 Added RouteInfo::has_prefixed_route() method for route matching with prefix awareness 2018-07-15 19:37:20 +02:00
Nikolay Kim 30c84786b7
Merge pull request #399 from actix/router-refactor
Router refactoring
2018-07-15 19:16:07 +06:00
Nikolay Kim 2e5f627050 do not force install tarpaulin 2018-07-15 19:15:36 +06:00
Nikolay Kim 2214492792 use assert and restore test case 2018-07-15 18:53:02 +06:00
Nikolay Kim c43b6e3577 cargo tarpaulin 2018-07-15 16:39:15 +06:00
Nikolay Kim 42d3e86941 calculate prefix dynamicly 2018-07-15 16:25:56 +06:00
Nikolay Kim b759dddf5a simplify application prefix impl 2018-07-15 16:25:56 +06:00
Nikolay Kim 9570c1cccd rename RouteInfo 2018-07-15 16:25:56 +06:00
Nikolay Kim da915972c0 refactor router 2018-07-15 16:25:56 +06:00
Nikolay Kim cf976d296f
Merge pull request #397 from actix/Turbo87-patch-1
error: Fix documentation typo
2018-07-14 09:38:43 +06:00
Tobias Bieniek 9012cf43fe
error: Fix documentation typo 2018-07-14 00:05:07 +02:00
Douman 7d753eeb8c
Private serde fork (#390)
* Fork serde_urlencoded

* Apply enum PR https://github.com/nox/serde_urlencoded/pull/30

* Add test to verify enum in query

* Docs are updated to show example of how to use enum.
2018-07-13 09:59:09 +03:00
Nikolay Kim 4395add1c7 update travis config 2018-07-13 00:05:01 +06:00
Nikolay Kim 35911b832a Merge branch 'master' of github.com:actix/actix-web 2018-07-12 23:59:10 +06:00
Nikolay Kim b8b90d9ec9 rename ResourceHandler to Resource 2018-07-12 15:30:01 +06:00
kingoflolz 422a870cd7
Merge pull request #387 from actix/fix-missing-content-length
fix missing content length
2018-07-12 16:18:55 +10:00
Nikolay Kim db005af1af clippy warnings 2018-07-12 10:41:49 +06:00
Nikolay Kim 8e462c5944 use write instead format 2018-07-12 10:35:09 +06:00
Nikolay Kim 86e44de787 pin failure crate 2018-07-12 10:29:37 +06:00
kingoflolz d9988f3ab6
fix missing content length
fix missing content length when no compression is used
2018-07-11 21:21:32 +10:00
Nikolay Kim 696152f763
Merge pull request #377 from Diggsey/apply-mask
Refactor `apply_mask` implementation, removing dead code paths and re…
2018-07-11 13:36:08 +06:00
Nikolay Kim f38a370b94 update changes 2018-07-11 13:34:40 +06:00
Nikolay Kim 28b36c650a fix h2 compatibility 2018-07-11 13:25:07 +06:00
Nikolay Kim b22132d3d6
Merge branch 'master' into apply-mask 2018-07-11 13:15:35 +06:00
Nikolay Kim 19ae5e9489 Merge branch 'master' of github.com:actix/actix-web 2018-07-11 12:56:53 +06:00
Nikolay Kim 9aef34e768 remove & to &mut transmute #385 2018-07-11 12:56:35 +06:00
Douman bed961fe35 Lessen numbers of jobs for AppVeyor 2018-07-11 09:23:17 +03:00
Diggory Blake 87824a9cf6 Refactor apply_mask implementation, removing dead code paths and reducing scope of unsafety 2018-07-08 13:56:43 +01:00
Douman 82920e1ac1
Do not override user settings on signals and stop handling (#375) 2018-07-08 09:01:44 +03:00
Nikolay Kim 110605f50b stop actor context on error #311 2018-07-08 09:41:55 +06:00
Nikolay Kim 00c97504b6
Merge pull request #368 from Diggsey/master
Remove reimplementation of `LazyCell`
2018-07-07 09:46:44 +06:00
Diggory Blake 85012f947a Remove reimplementation of LazyCell 2018-07-06 22:28:08 +01:00
Nikolay Kim 62ba01fc15 update changes 2018-07-06 15:00:14 +06:00
Nikolay Kim 5b7aed101a remove unsafe 2018-07-06 13:54:43 +06:00
Nikolay Kim 1c3b32169e remove stream from WebsocketsContext::with_factory 2018-07-06 12:11:40 +06:00
Nikolay Kim cfa470db50 close conneciton for head requests 2018-07-06 09:21:24 +06:00
Nikolay Kim a5f7a67b4d clippy warnings 2018-07-06 08:24:44 +06:00
Nikolay Kim 185e710dc8 do not drop content-encoding header in case of identity #363 2018-07-06 08:24:36 +06:00
Nikolay Kim 9070d59ea8 do not read head payload 2018-07-06 08:11:36 +06:00
Nikolay Kim 2a25caf2c5 Merge branch 'master' of github.com:actix/actix-web 2018-07-06 07:49:50 +06:00
Nikolay Kim 7d96b92aa3 add check for usize cast 2018-07-06 07:46:47 +06:00
Douman 67e4cad281
Introduce method to set header if it is missing only (#364)
Also let default headers use it.

Closes #320
2018-07-05 19:27:18 +03:00
Tessa Bradbury 080f232a0f Use StaticFile default handler when file is inaccessible (#357)
* Use Staticfile default handler on all error paths

* Return an error from StaticFiles::new() if directory doesn't exist
2018-07-05 12:34:13 +03:00
Nikolay Kim ac3a76cd32 update httparse version 2018-07-05 13:21:33 +06:00
Nikolay Kim 8058d15624 clippy warnings 2018-07-05 13:16:16 +06:00
Nikolay Kim 05a43a855e remove unsafe 2018-07-05 13:00:46 +06:00
Nikolay Kim 80339147b9 call disconnect on write error 2018-07-05 12:50:54 +06:00
Nikolay Kim 6af2f5d642 re-enable start_incoming support 2018-07-05 12:14:10 +06:00
Nikolay Kim d7762297da update actix dependency 2018-07-05 12:02:32 +06:00
Nikolay Kim d5606625a2 remove public Clone for Request 2018-07-04 22:57:40 +06:00
Nikolay Kim 5d79114239 optimize Request handling 2018-07-04 22:52:49 +06:00
Nikolay Kim f559f23e1c Merge branch 'master' of github.com:actix/actix-web 2018-07-04 21:02:40 +06:00
Nikolay Kim 6fd686ef98 cleanup warnings 2018-07-04 21:01:27 +06:00
Nikolay Kim 4c5a63965e use new actix context api 2018-07-04 17:04:23 +06:00
Gorm Casper 09aabc7b3b plain/text -> text/plain in comment (#362) 2018-07-04 11:17:44 +03:00
Nikolay Kim b6d26c9faf
Merge pull request #348 from actix/request-mutability
Request mutability
2018-07-02 23:52:42 +06:00
Nikolay Kim fec6047ddc refactor HttpRequest mutability 2018-07-02 23:35:32 +06:00
Nikolay Kim 445ea043dd remove unsafes 2018-07-02 23:32:29 +06:00
Gowee 0be5448597 Properly escape special characters in fs/directory_listing. (#355) 2018-06-30 15:01:48 +03:00
ousado 0f27389e72 set length of vector to max_bytes (closes #345) (#346) 2018-06-26 08:09:12 +03:00
Douman a9425a866b Fix duplicate tail of StaticFiles with index_file
Map from 0.6 to master
2018-06-25 19:59:55 +03:00
Nikolay Kim 800c404c72 explicit response release 2018-06-25 10:10:02 +06:00
Nikolay Kim 32212bad1f simplify http response pool 2018-06-25 09:08:28 +06:00
Nikolay Kim d1b73e30e0 update comments 2018-06-24 22:27:30 +06:00
Nikolay Kim c0cdc39ba9 do not store cookies on client response 2018-06-24 22:21:04 +06:00
Nikolay Kim 8e8a68f90b add empty output stream 2018-06-24 22:05:44 +06:00
Nikolay Kim 989cd61236 handle empty te 2018-06-24 10:59:01 +06:00
Nikolay Kim 33260c7b35 split encoding module 2018-06-24 10:42:20 +06:00
Nikolay Kim 40ca9ba9c5 simplify write buffer 2018-06-24 10:30:58 +06:00
Nikolay Kim 45682c04a8 refactor content encoder 2018-06-24 08:54:01 +06:00
Nikolay Kim 348491b18c fix alpn connector 2018-06-23 17:59:45 +06:00
Nikolay Kim 3d2226aa9e Merge branch 'master' of github.com:actix/actix-web 2018-06-23 12:40:45 +06:00
Nikolay Kim cf38183dcb refactor client connector waiters maintenance 2018-06-23 12:40:21 +06:00
Nikolay Kim e3dc6f0ca8 refactor h1decoder 2018-06-23 12:28:55 +06:00
Armin Ronacher a5369aed8b
Changes a leaked box into an Rc<String> and makes resource() return an Option (#343) 2018-06-23 08:16:52 +02:00
Nikolay Kim ff0ab733e4 remove unsafe from mask 2018-06-23 11:51:02 +06:00
Nikolay Kim d1318a35a0 remove unnecessary unsafes 2018-06-23 10:29:23 +06:00
Nikolay Kim 756227896b update set_date impl 2018-06-23 10:13:09 +06:00
Nikolay Kim 4fadff63f4 Use Box::leak for dynamic param names 2018-06-23 09:57:03 +06:00
Armin Ronacher 7bc7b4839b
Switch from fnv to a identity hasher in extensions (#342) 2018-06-22 11:32:32 +02:00
Armin Ronacher dda6ee95df
Changes the router to use atoms internally (#341) 2018-06-22 09:33:32 +02:00
Nikolay Kim 765c38e7b9 remove libc dependency 2018-06-22 11:47:33 +06:00
Nikolay Kim 6c44575923 transmute names once 2018-06-22 11:44:38 +06:00
Nikolay Kim fc7238baee refactor read_from_io 2018-06-22 11:30:40 +06:00
Nikolay Kim edd22bb279 refactor read_from_io 2018-06-22 09:01:20 +06:00
Nikolay Kim 17c033030b Revert "remove unnecessary use of unsafe in read_from_io"
This reverts commit da237611cb.
2018-06-22 08:55:19 +06:00
Nikolay Kim 3afdf3fa7e
Merge pull request #335 from gnzlbg/fix_unsafe
remove unnecessary use of unsafe in read_from_io
2018-06-22 07:23:14 +06:00
Nikolay Kim 50fbef88fc cleanup srver pipeline 2018-06-21 23:51:25 +06:00
Nikolay Kim c9069e9a3c remove unneeded UnsafeCell 2018-06-21 23:21:28 +06:00
Nikolay Kim 65ca563579 use read only self for Middleware 2018-06-21 23:06:23 +06:00
Nikolay Kim 3de9284592 Handler::handle uses &self instead of mutabble reference 2018-06-21 17:07:54 +06:00
Nikolay Kim 5a9992736f
Merge pull request #339 from joshleeb/propogate-scope-default-resource
Propagate scope default resource
2018-06-21 15:40:02 +06:00
Josh Leeb-du Toit 0338767264 Update CHANGES for default scope propagation 2018-06-21 19:37:34 +10:00
Josh Leeb-du Toit c5e8c1b710 Propagate default resources to underlying scopes 2018-06-21 18:17:27 +10:00
Nikolay Kim b5594ae2a5
Fix doc api example 2018-06-21 14:11:00 +06:00
Nikolay Kim 58d1f4a4aa switch to actix master 2018-06-21 13:34:36 +06:00
Nikolay Kim b7d813eeba update tests 2018-06-21 12:04:00 +06:00
Nikolay Kim 8e160ebda7 clippy warning 2018-06-21 11:49:36 +06:00
Nikolay Kim 0093b7ea5a refactor extractor configuration #331 2018-06-21 11:47:01 +06:00
Nikolay Kim 75eec8bd4f fix condition 2018-06-21 11:23:21 +06:00
Nikolay Kim ebc59cf7b9 add unsafe checks #331 2018-06-21 11:20:21 +06:00
Nikolay Kim c2c4a5ba3f fix failure Send+Sync compatibility 2018-06-21 10:45:24 +06:00
Nikolay Kim dbd093075d
Merge pull request #338 from tbroadley/fix-typos
Fix typos
2018-06-21 10:13:30 +06:00
Nikolay Kim 1be27e17f8 convert timer error to io error 2018-06-21 10:05:20 +06:00
Nikolay Kim 8b0fbb85d1 SendRequest execution fails with the entered unreachable code #329 2018-06-21 09:52:18 +06:00
Nikolay Kim cfe6725eb4 Allow to disable masking for websockets client 2018-06-21 09:49:33 +06:00
Josh Leeb-du Toit f815c1c096 Add test for default_resource scope propagation 2018-06-21 13:10:40 +10:00
Nikolay Kim 280eae4335
Merge pull request #334 from Vurich/master
Fix some unsoundness
2018-06-21 07:15:33 +06:00
Thomas Broadley bd8cbfff35 docs: fix typos 2018-06-20 21:05:26 -04:00
gnzlbg da237611cb remove unnecessary use of unsafe in read_from_io 2018-06-20 13:14:53 +02:00
Jef 234c60d473 Fix some unsoundness
This improves the sound implementation of `fn route`.
Previously this function would iterate twice but we
can reduce the overhead without using `unsafe`.
2018-06-20 10:53:18 +02:00
Nikolay Kim 2f917f3700 various cleanups and comments 2018-06-20 01:27:41 +06:00
Nikolay Kim 311f0b23a9 cleanup more code 2018-06-20 00:36:32 +06:00
Nikolay Kim a69c1e3de5 remove unsafe from scope impl 2018-06-19 23:46:58 +06:00
Nikolay Kim c427fd1241
Merge pull request #328 from xfix/remove-some-uses-of-unsafe-from-frame-message
Remove some uses of unsafe from Frame::message
2018-06-19 21:52:41 +06:00
Nikolay Kim adcb4e1492
Merge pull request #327 from xfix/remove-use-of-unsafe-from-pipeline-poll
Remove use of unsafe from Pipeline#poll
2018-06-19 19:58:15 +06:00
Nikolay Kim 3b1124c56c
Merge branch 'master' into remove-some-uses-of-unsafe-from-frame-message 2018-06-19 19:20:40 +06:00
Nikolay Kim cafde76361
Merge branch 'master' into remove-use-of-unsafe-from-pipeline-poll 2018-06-19 19:20:25 +06:00
Nikolay Kim bfb93cae66
Update connector.rs 2018-06-19 19:19:31 +06:00
Nikolay Kim b5c1e42feb
Merge branch 'master' into remove-use-of-unsafe-from-pipeline-poll 2018-06-19 18:30:37 +06:00
Konrad Borowski e884e7e84e Remove some uses of unsafe from Frame::message 2018-06-19 14:11:53 +02:00
Konrad Borowski 877e177b60 Remove use of unsafe from Pipeline#poll 2018-06-19 13:42:44 +02:00
Nikolay Kim 27b6af2800 refactor route matching 2018-06-19 16:45:26 +06:00
Nikolay Kim 5c42b0902f better doc api examples 2018-06-19 12:07:07 +06:00
Nikolay Kim 247e8727cb ClientBody is not needed 2018-06-19 10:15:16 +06:00
Nikolay Kim 362b14c2f7 remove unsafe cell from ws client 2018-06-19 09:36:17 +06:00
Nikolay Kim 261ad31b9a remove some unsafe code 2018-06-19 07:44:01 +06:00
Nikolay Kim 68cd5bdf68 use actix 0.6 2018-06-18 09:18:03 +06:00
Nikolay Kim 26f37ec2e3 refactor HttpHandlerTask trait 2018-06-18 05:45:54 +06:00
Nikolay Kim ef15646bd7 refactor edfault cpu pool 2018-06-18 04:56:18 +06:00
Nikolay Kim a5bbc455c0 cleanup mut transform 2018-06-18 04:41:41 +06:00
Nikolay Kim 6ec8352612 method only for tests 2018-06-18 01:05:02 +06:00
Nikolay Kim f0f19c14d2 remove wsclient 2018-06-18 01:03:47 +06:00
Nikolay Kim daed502ee5 make mut api private 2018-06-18 01:03:07 +06:00
Nikolay Kim 9d114d785e remove Clone from ExtractorConfig 2018-06-18 00:19:07 +06:00
Nikolay Kim ea118edf56 do not use references in ConnectionInfo 2018-06-18 00:01:41 +06:00
Nikolay Kim e1db47d550 refactor server settings 2018-06-17 23:51:20 +06:00
Nikolay Kim 38fe8bebec fix doc string 2018-06-17 08:57:51 +06:00
Nikolay Kim c3f295182f use HashMap for HttpRequest::query() 2018-06-17 08:54:30 +06:00
Nikolay Kim b6ed778775 remove HttpMessage::range() 2018-06-17 08:48:50 +06:00
Nikolay Kim 0f2aac1a27 remove unneed Send and Sync 2018-06-17 08:32:22 +06:00
Nikolay Kim 70244c29e0 update doc api examples 2018-06-17 04:09:07 +06:00
Nikolay Kim a7a062fb68 clippy warnings 2018-06-17 03:26:34 +06:00
Nikolay Kim f3a73d7dde update changelog 2018-06-17 03:24:08 +06:00
Nikolay Kim 879b2b5bde port Extensions from http crate #315 2018-06-17 03:22:08 +06:00
Nikolay Kim 33050f55a3 remove Context::actor() method 2018-06-17 03:10:44 +06:00
Nikolay Kim e4443226f6 update actix usage 2018-06-17 02:58:56 +06:00
Nikolay Kim 342a194605 fix handling ServerCommand #316 2018-06-16 22:56:27 +06:00
Nikolay Kim 566b16c1f7 Merge branch 'master' of github.com:actix/actix-web 2018-06-14 11:42:27 +02:00
Nikolay Kim 8261cf437d update actix api 2018-06-13 23:37:19 -07:00
Özgür Akkurt 8a8e6add08
Merge pull request #314 from DJMcNab/app-cleanup
remove duplication of `App::with_state` in `App::new`
2018-06-14 01:19:56 +03:00
Özgür Akkurt b79307cab1
Merge branch 'master' into app-cleanup 2018-06-14 01:01:11 +03:00
Özgür Akkurt 4c646962a9
Merge pull request #312 from eddomuke/master
Add HttpMessage::readlines()
2018-06-14 00:40:29 +03:00
Dursun Akkurt cb77f7e688 Add HttpMessage::readlines() 2018-06-14 00:19:48 +03:00
Dursun Akkurt 1bee528018 move ReadlinesError to error module 2018-06-13 22:59:36 +03:00
Dursun Akkurt ad9aacf521 change poll method of Readlines 2018-06-13 22:41:35 +03:00
Daniel McNab f8854f951c remove duplication of App::with_state in App::new 2018-06-13 20:31:20 +01:00
Dursun Akkurt 6d95e34552 add HttpMessage::readlines() 2018-06-13 20:45:31 +03:00
Dursun Akkurt 6c765739d0 add HttpMessage::readlines() 2018-06-13 20:43:03 +03:00
Özgür Akkurt c8528e8920
Merge pull request #308 from eddomuke/master
Allow to override Form extractor error
2018-06-13 01:53:32 +03:00
Dursun Akkurt 0a080d9fb4 add test for form extractor 2018-06-13 01:33:28 +03:00
eddomuke 45b408526c
Merge branch 'master' into master 2018-06-13 00:53:46 +03:00
Nikolay Kim 1a91854270 Merge branch 'master' of github.com:actix/actix-web 2018-06-12 14:50:41 -07:00
Nikolay Kim 99092fdf06 http/2 end-of-frame is not set if body is empty bytes #307 2018-06-12 14:50:21 -07:00
Dursun Akkurt 748ff389e4 Allow to override Form extractor error 2018-06-13 00:47:47 +03:00
Nikolay Kim b679b4cabc
Merge pull request #306 from eddomuke/master
add ClientRequestBuilder::form()
2018-06-12 13:33:16 -07:00
Dursun Akkurt ed7cbaa772 fix form_extractor test 2018-06-12 23:04:54 +03:00
Dursun Akkurt e6bbda0efc add serialize 2018-06-12 22:42:15 +03:00
Dursun Akkurt 94283a73c2 make into_string, to_string 2018-06-12 22:31:33 +03:00
Dursun Akkurt ffca416463 add test for ClientRequestBuilder::form() 2018-06-12 22:16:20 +03:00
Dursun Akkurt 9cc7651c22 add change to CHANGES.md 2018-06-12 20:32:16 +03:00
Dursun Akkurt 8af082d873 remove FormPayloadError 2018-06-12 20:26:09 +03:00
Ozgur Akkurt d4d3add17d add ClientRequestBuilder::form() 2018-06-12 19:30:00 +03:00
axon-q ce6f9e848b
Merge pull request #305 from axon-q/response-cookies
Add HttpResponse methods to retrieve, add, and delete cookies
2018-06-12 14:39:06 +00:00
axon-q d8e1fd102d add cookie methods to HttpResponse 2018-06-12 13:56:53 +00:00
axon-q e414a52b51 content_disposition: remove unnecessary allocations 2018-06-12 13:48:23 +00:00
axon-q 4d69e6d0b4 fs: minor cleanups to content_disposition 2018-06-12 13:47:49 +00:00
Nikolay Kim 6f38d769a8
Merge pull request #304 from kazcw/master
fix url in example
2018-06-12 03:58:48 -07:00
Kaz Wesley 48f77578ea fix url in example 2018-06-11 21:55:05 -07:00
Nikolay Kim 9b012b3304 do not allow stream or actor responses for internal error #301 2018-06-11 19:45:17 -07:00
Nikolay Kim a0344eebeb InternalError can trigger memory unsafety #301 2018-06-11 18:54:36 -07:00
Nikolay Kim b9f6c313d4 Merge branch 'master' of github.com:actix/actix-web 2018-06-11 12:56:33 -07:00
Nikolay Kim ef420a8bdf fix docs.rs 2018-06-11 12:21:09 -07:00
David McNeil 0d54b6f38e Implement Responder for Option #294 (#297) 2018-06-11 14:05:41 +03:00
Nikolay Kim 9afc3b6737 api docs link 2018-06-10 10:31:19 -07:00
Nikolay Kim ef88fc78d0 Merge branch 'master' of github.com:actix/actix-web 2018-06-10 10:25:05 -07:00
Nikolay Kim 9dd66dfc22 better name for error 2018-06-10 10:24:34 -07:00
Nikolay Kim 87a822e093 fix deprecated warnings 2018-06-10 10:14:13 -07:00
Nikolay Kim 3788887c92
Merge pull request #293 from axon-q/static-file-updates
Better Content-Type and Content-Disposition handling for static files
2018-06-09 08:51:42 -07:00
Nikolay Kim 785d0e24f0
Merge branch 'master' into static-file-updates 2018-06-09 08:21:34 -07:00
Nikolay Kim 818d0bc187 new StreamHandler impl 2018-06-09 07:53:46 -07:00
axon-q aee24d4af0 minor syntax changes 2018-06-09 14:47:06 +00:00
axon-q fee203b402 update changelog 2018-06-09 14:02:05 +00:00
axon-q 8681a346c6 fs: refactor Content-Type and Content-Disposition handling 2018-06-09 13:56:01 +00:00
axon-q 1fdf6d13be content_disposition: add doc example 2018-06-09 13:38:21 +00:00
axon-q 3751656722 expose fs::file_extension_to_mime() function 2018-06-09 11:20:06 +00:00
Nikolay Kim 9151d61eda allow to use custom resolver for ClientConnector 2018-06-08 16:33:57 -07:00
Nikolay Kim 4fe2f6b763
Merge pull request #284 from axon-q/multipart-content-disposition
multipart: parse and validate Content-Disposition
2018-06-07 21:20:18 -07:00
Nikolay Kim 5a7902ff9a
Merge branch 'master' into multipart-content-disposition 2018-06-07 21:20:11 -07:00
Nikolay Kim 172b514fef
Merge pull request #288 from memoryruins/patch-1
Update TechEmpower benchmarks to round 16
2018-06-07 21:09:49 -07:00
michael efb5d13280
readme: link to TechEmpower r16 benchmarks 2018-06-07 23:55:08 -04:00
Nikolay Kim f9f2ed04ab fix doc test 2018-06-07 20:22:23 -07:00
Nikolay Kim ce40ab307b update changes 2018-06-07 20:09:08 -07:00
Nikolay Kim f7ef8ae5a5 add Host predicate 2018-06-07 20:00:54 -07:00
Nikolay Kim 60d40df545 fix clippy warning 2018-06-07 19:46:46 -07:00
Nikolay Kim f7bd6eeedc add application filters 2018-06-07 19:46:38 -07:00
axon-q a11f3c112f fix doc test 2018-06-07 21:18:51 +00:00
Nikolay Kim e9f59bc7d6
Merge branch 'master' into multipart-content-disposition 2018-06-07 11:02:53 -07:00
axon-q e970846167 update changelog 2018-06-07 17:59:35 +00:00
axon-q 56e0dc06c1 defer parsing until user method call 2018-06-07 17:29:46 +00:00
Armin Ronacher 789af0bbf2
Added improved failure interoperability with downcasting (#285)
Deprecates Error::cause and introduces failure interoperability functions and downcasting.
2018-06-07 18:53:27 +02:00
axon-q 97b5410aad remove Option from ContentDisposition::from_raw() argument 2018-06-07 12:55:35 +00:00
axon-q a6e07c06b6 move CD parsing to Content-Type parsing location 2018-06-07 12:35:10 +00:00
axon-q 31a301c9a6 fix multipart test 2018-06-07 11:38:35 +00:00
axon-q 5a37a8b813 restore hyper tests 2018-06-07 10:55:36 +00:00
axon-q c0c1817b5c remove unicase dependency 2018-06-07 10:33:00 +00:00
axon-q 82c888df22 fix test 2018-06-07 09:10:46 +00:00
axon-q 936ba2a368 multipart: parse and validate Content-Disposition 2018-06-06 14:06:01 +00:00
Nikolay Kim 2d0b609c68 travis config 2018-06-05 10:08:42 -07:00
Nikolay Kim 6467d34a32 update release date 2018-06-05 09:45:07 -07:00
Nikolay Kim 2b616808c7 metadata for docs.rs 2018-06-05 09:00:21 -07:00
Nikolay Kim e5f7e4e481 update changelog 2018-06-05 08:55:28 -07:00
Nikolay Kim d1da227ac5 fix multipart boundary parsing #282 2018-06-05 08:53:51 -07:00
Nikolay Kim 960a8c425d update changelog 2018-06-05 07:40:11 -07:00
Nikolay Kim f94fd9ebee CORS: Do not validate Origin header on non-OPTION requests #271 2018-06-05 07:39:47 -07:00
Nikolay Kim 67ee24f9a0
Merge pull request #274 from mockersf/user-agent
add default value for header User-Agent in requests
2018-06-04 14:04:52 -07:00
Nikolay Kim 5004821cda
Merge branch 'master' into user-agent 2018-06-04 14:04:45 -07:00
Nikolay Kim ae7a0e993d update changelog 2018-06-04 13:43:52 -07:00
Nikolay Kim 984791187a Middleware::response is not invoked if error result was returned by another Middleware::start #255 2018-06-04 13:42:47 -07:00
François Mockers b07c50860a update changelog 2018-06-04 22:34:07 +02:00
Nikolay Kim eb0909b3a8
Merge branch 'master' into user-agent 2018-06-04 10:20:53 -07:00
François Mockers ca3fb11f8b add actix-web version in header 2018-06-04 08:15:04 +02:00
Nikolay Kim 47eb4e3d3d
Merge pull request #278 from mbrobbel/patch-2
Fix typo
2018-06-03 16:28:51 -07:00
Matthijs Brobbel 268c5d9238
Fix typo 2018-06-03 20:28:08 +02:00
François Mockers 86be54df71 add default value for header User-Agent in requests 2018-06-03 15:48:00 +02:00
Nikolay Kim ea018e0ad6 better examle in doc string 2018-06-02 16:03:23 -07:00
Nikolay Kim b799677532 better error messages for overflow errors 2018-06-02 15:10:48 -07:00
Nikolay Kim 8c7182f6e6
Merge pull request #270 from DoumanAsh/payload_err
Specialize ResponseError for PayloadError
2018-06-02 15:06:55 -07:00
Nikolay Kim 7298c7aabf
Merge branch 'master' into payload_err 2018-06-02 15:04:22 -07:00
Nikolay Kim 7e0706a942 implement Debug for Form, Query, Path extractors 2018-06-02 15:00:11 -07:00
Nikolay Kim 698f0a1849 update changelog 2018-06-02 15:00:11 -07:00
Nikolay Kim 8b8a3ac01d Support chunked encoding for UrlEncoded body #262 2018-06-02 15:00:06 -07:00
Nikolay Kim 7ab23d082d fix doc test 2018-06-02 13:45:29 -07:00
Douman 913dce0a72
Merge branch 'master' into payload_err 2018-06-02 23:10:06 +03:00
Douman 2a9b57f489 Correct docstring 2018-06-02 22:27:43 +03:00
Douman fce8dd275a Specialize ResponseError for PayloadError
Closes #257
2018-06-02 22:20:22 +03:00
Nikolay Kim 3c472a2f66 remove debug prints 2018-06-02 11:57:49 -07:00
Nikolay Kim dcb561584d remove debug print 2018-06-02 11:55:50 -07:00
Nikolay Kim 593a66324f update changelog 2018-06-02 11:45:37 -07:00
Nikolay Kim 4a39216aa7 fixed HttpRequest::url_for for a named route with no variables #265 2018-06-02 11:44:09 -07:00
Nikolay Kim 8d905c8504 add links to migration 2018-06-02 09:28:32 -07:00
Nikolay Kim 33326ea41b fix layout 2018-06-02 09:25:11 -07:00
Nikolay Kim 0457fe4d61 add System changes to migration guide 2018-06-02 09:19:13 -07:00
Nikolay Kim cede817915 update changelog 2018-06-02 09:15:44 -07:00
Nikolay Kim 3bfed36fcc do not re-export actix_inner 2018-06-02 09:14:47 -07:00
Nikolay Kim 0ff5f5f448 update migration 2018-06-02 09:01:51 -07:00
Nikolay Kim 2f476021d8
Merge pull request #267 from joshleeb/trait-middleware-mut-self
Update Middleware Trait to Use `&mut self`
2018-06-02 08:54:30 -07:00
Nikolay Kim a61a1b0efe
Merge branch 'master' into trait-middleware-mut-self 2018-06-02 08:54:00 -07:00
Nikolay Kim e041e9d3b7
Merge pull request #268 from killercup/docs/no-more-missing-docs
No more missing docs
2018-06-02 08:52:14 -07:00
Pascal Hertleif 890a7e70d6 Add missing API docs
These were written without much knowledge of the actix-web internals!
Please review carefully!
2018-06-02 15:52:50 +02:00
Pascal Hertleif 47b7be4fd3 Add warning for missing API docs 2018-06-02 15:50:45 +02:00
Josh Leeb-du Toit 9c9eb62031 Update Middleware trait to use &mut self 2018-06-02 16:47:18 +10:00
Nikolay Kim 8d73c30dae
Merge pull request #266 from killercup/docs/fix-typos-and-run-more-code
Fix some ResourceHandler docs
2018-06-01 16:37:34 -07:00
Pascal Hertleif d912bf8771 Add more docs to ResourceHandler API 2018-06-02 00:57:24 +02:00
Pascal Hertleif f414a491dd Fix some ResourceHandler docs
Re-enables code blocks as doc tests to prevent them failing in the
future.
2018-06-02 00:57:07 +02:00
Nikolay Kim 8f42fec9b2 stable compat 2018-06-01 12:17:13 -07:00
Nikolay Kim 8452c7a044 fix doc api example 2018-06-01 11:22:40 -07:00
Nikolay Kim 009ee4b3db update changelog 2018-06-01 10:55:54 -07:00
Nikolay Kim 3e0a71101c drop with2 and with3 2018-06-01 10:54:23 -07:00
Nikolay Kim c8930b7b6b fix rustfmt formatting 2018-06-01 10:27:23 -07:00
Nikolay Kim 3f5a39a5b7 cargo fmt 2018-06-01 09:37:14 -07:00
Nikolay Kim 154cd3c5de better actix mod re-exports 2018-06-01 09:36:16 -07:00
Douman 80965d7a9a
Re-export actix dependency. Closes #260 (#264)
- Re-export actix's prelude into actix namespace
- Removing implicit dependency on root's actix module
2018-05-31 20:43:14 +03:00
Nikolay Kim 77becb9bc0 fix doc string 2018-05-29 18:48:39 -07:00
Nikolay Kim dde266b9ef fix doc string 2018-05-29 18:31:39 -07:00
Nikolay Kim 34fd9f8148 travis config 2018-05-29 18:18:05 -07:00
Nikolay Kim a64205e502 refactor TransferEncoding; allow to use client api with threaded tokio runtime 2018-05-29 16:32:39 -07:00
Nikolay Kim 844be8d9dd fix ssl test server 2018-05-29 10:59:24 -07:00
Nikolay Kim dffb7936fb Merge branch 'master' of github.com:actix/actix-web 2018-05-29 10:31:43 -07:00
Nikolay Kim ecd05662c0 use new actix system api 2018-05-29 10:31:37 -07:00
Nikolay Kim 6eee3d1083
Merge pull request #258 from mbrobbel/patch-1
Fix typo in httpresponse.rs
2018-05-29 09:15:39 -07:00
Matthijs Brobbel 6b43fc7068
Fix typo in httpresponse.rs 2018-05-29 18:11:10 +02:00
Nikolay Kim fb582a6bca fix connector 2018-05-27 05:18:37 -07:00
Nikolay Kim be2ceb7c66 update actix Addr; make ClientConnector thread safe 2018-05-27 05:02:49 -07:00
Nikolay Kim 7c71171602
Merge pull request #248 from bbigras/same-site
Add same-site to CookieSessionBackend
2018-05-26 08:02:12 -07:00
Bruno Bigras 4dcecd907b Add same-site to CookieSessionBackend
closes #247
2018-05-25 19:18:16 -04:00
Nikolay Kim 255cd4917d fix doc test 2018-05-24 22:04:14 -07:00
Nikolay Kim f48702042b min rustc version 2018-05-24 21:09:20 -07:00
Nikolay Kim 690169db89 migrate to tokio 2018-05-24 21:03:16 -07:00
Nikolay Kim 565bcfb561
Merge pull request #245 from svartalf/response-builder-cookies-doc
Updating docs for HttpResponseBuilder::del_cookie
2018-05-24 12:42:08 -07:00
svartalf 36f933ce1d Updating docs for HttpResponseBuilder::del_cookie 2018-05-24 21:53:35 +03:00
Nikolay Kim 111b6835fa fix comment 2018-05-24 11:06:15 -07:00
Nikolay Kim bf63be3bcd bump version 2018-05-24 09:24:04 -07:00
Nikolay Kim 9f9e0b98ad change homepage link 2018-05-24 08:55:10 -07:00
Nikolay Kim 556646aaec update changelog 2018-05-24 07:56:51 -07:00
Nikolay Kim 174fb0b5f4
Merge pull request #239 from max-frai/master
Add ability to set encoding for exact NamedFile.
2018-05-24 07:46:53 -07:00
Nikolay Kim 836706653b
Merge branch 'master' into master 2018-05-24 07:46:46 -07:00
Nikolay Kim 17f1a2b92a more scope tests 2018-05-23 14:11:01 -07:00
Nikolay Kim 3b08b16c11 bump version 2018-05-23 13:21:54 -07:00
Nikolay Kim 68eb2f26c9 Allow to use path without traling slashes for scope registration #241 2018-05-23 13:21:29 -07:00
Nikolay Kim 72757887c9 update doc links 2018-05-23 11:20:12 -07:00
Nikolay Kim eb5dbd43ae update changelog 2018-05-23 10:37:17 -07:00
Nikolay Kim 1f1dfac3f9
Merge pull request #240 from ivanovaleksey/patch-2
Fix TestServer::post
2018-05-23 09:50:40 -07:00
Aleksey Ivanov 2479b14aba Fix TestServer::post 2018-05-23 19:07:42 +03:00
Max Frai ac24703512 Add ability to set encoding for exact NamedFile. 2018-05-23 09:12:23 +03:00
Nikolay Kim db0091ba6f disable server test for windows 2018-05-21 21:01:52 -07:00
Nikolay Kim 2159158c30 Fix streaming response with body compression 2018-05-21 20:50:10 -07:00
Nikolay Kim 76d790425f bump version 2018-05-21 19:07:56 -07:00
Nikolay Kim 90968d4333 Drop connection if request's payload is not fulle consumed #236 2018-05-21 18:54:17 -07:00
Nikolay Kim 577a509875 increase delay 2018-05-21 16:12:33 -07:00
Nikolay Kim a9728abfc8 run coverage report on 1.24 2018-05-20 21:10:50 -07:00
Nikolay Kim 14d1b8e2b6 prepare release 2018-05-20 21:09:54 -07:00
Nikolay Kim 285c73e95e Re-use tcp listener on pause/resume 2018-05-20 20:47:20 -07:00
Nikolay Kim 483db7028c expose low level data 2018-05-20 20:37:19 -07:00
Nikolay Kim 082ff46041 Fix scope resource path extractor #234 2018-05-20 17:04:23 -07:00
Nikolay Kim f32e8f22c8
Merge pull request #231 from qrvaelet/ranges
NamedFile: range upgrade
2018-05-20 09:18:46 -07:00
Nikolay Kim 766dde7c42
Merge branch 'master' into ranges 2018-05-20 08:51:07 -07:00
qrvaelet b68687044e range header syntax fix, change range to content-range in responses, enabled accept ranges, tests for content-range, content-length, and range status code 2018-05-20 17:40:36 +02:00
Nikolay Kim c9e84e9dd3
Merge pull request #233 from sindreij/patch-1
Fix some typos in server/srv.rs
2018-05-20 06:19:53 -07:00
Sindre Johansen 0126ac46fc
Fix some typos in server/srv.rs
Hello! This looks like a great library, thanks for creating it! While reading through the documentation I found a few typos.
2018-05-20 14:43:26 +02:00
Nikolay Kim 9b7ea836d0 bump version 2018-05-17 18:34:09 -07:00
Nikolay Kim 537b420d35 Fix compilation with --no-default-features 2018-05-17 18:33:48 -07:00
Nikolay Kim 16906c5951 clippy warnings 2018-05-17 12:23:37 -07:00
Nikolay Kim 45e9aaa462 rustfmt 0.7 2018-05-17 12:20:20 -07:00
Nikolay Kim 564cc15c04 update changes 2018-05-17 12:20:04 -07:00
Nikolay Kim 8fd18d56a5
Merge pull request #227 from qrvaelet/ranges
NamedFile: added basic ranges header support, added content-length support
2018-05-17 12:18:10 -07:00
Nikolay Kim a5692d4ecf
Merge branch 'master' into ranges 2018-05-17 11:16:08 -07:00
qrvaelet 2d83f79433 NamedFile: added ranges support, content-length support 2018-05-17 20:09:41 +02:00
Nikolay Kim f3ece74406 better error handling 2018-05-17 10:58:08 -07:00
Nikolay Kim 8de1f60347 add session extractor doc api 2018-05-16 21:05:59 -07:00
Nikolay Kim b4252f8fd1 implement extractor for Session 2018-05-16 21:02:51 -07:00
Nikolay Kim fe2b50a9ef update changelog 2018-05-16 11:02:50 -07:00
Nikolay Kim d8ae8c3821
Merge pull request #225 from mitsuhiko/feature/addrs-with-scheme
Support returning addresses plus scheme from the server
2018-05-16 11:02:15 -07:00
Nikolay Kim c9a026fabb
Merge branch 'master' into feature/addrs-with-scheme 2018-05-16 11:01:45 -07:00
Nikolay Kim 64eca1546e
Merge pull request #224 from mitsuhiko/feature/listen-tls
Add support for listen_tls/listen_ssl
2018-05-16 11:01:28 -07:00
Nikolay Kim b19fe98ff4
Merge branch 'master' into feature/listen-tls 2018-05-16 11:01:21 -07:00
Nikolay Kim b393ddf879 fix panic during middleware execution #226 2018-05-16 11:00:29 -07:00
Armin Ronacher 7bb7d85c1d Added support for returning addresses plus scheme from the server 2018-05-16 16:17:27 +02:00
Armin Ronacher 6e976153e7 Add support for listen_tls/listen_ssl 2018-05-16 15:20:47 +02:00
Nikolay Kim 03e758cee4 bump version 2018-05-15 19:08:34 -07:00
Nikolay Kim 0d36b8f826 fix 1.24 compatibility 2018-05-15 19:07:43 -07:00
Nikolay Kim f82fa08d72 various optimizations 2018-05-15 16:49:03 -07:00
Nikolay Kim d6787e6c56 prepare release 2018-05-15 10:20:32 -07:00
Nikolay Kim b9d870645f store cookies in extensions 2018-05-15 10:09:48 -07:00
Nikolay Kim ef89430f9b undeprecate query() and store query in extensions 2018-05-15 09:53:58 -07:00
Nikolay Kim 953a0d4e4a add test case for #222 2018-05-15 09:29:59 -07:00
Nikolay Kim 5ea2d68438 h1 decoder blocks on error #222 2018-05-15 07:55:36 -07:00
Nikolay Kim d65a03f6ac use latest nightly for appveyor 2018-05-13 08:43:09 -07:00
Nikolay Kim b588b2bf5c
Merge pull request #221 from skorgu/patch-1
Include mention of http client in README.md
2018-05-11 21:56:46 -07:00
Nikolay Kim d455e2cd13
Merge branch 'master' into patch-1 2018-05-11 21:56:35 -07:00
Nikolay Kim 9306631d6e Fix segfault in ServerSettings::get_response_builder() 2018-05-11 21:19:48 -07:00
skorgu f735da504b
Include mention of http client in README.md 2018-05-11 20:36:54 -04:00
Nikolay Kim 487a713ca0 update doc string 2018-05-11 15:01:15 -07:00
Nikolay Kim 095ad328ee prepare release 2018-05-10 15:45:06 -07:00
Nikolay Kim a38afa0cec --no-count for tarpaulin 2018-05-10 13:05:56 -07:00
Nikolay Kim 9619698543 doc string 2018-05-10 13:04:56 -07:00
Nikolay Kim 4b1a471b35 add more examples for extractor config 2018-05-10 13:03:43 -07:00
Nikolay Kim b6039b0bff add doc string 2018-05-10 11:04:03 -07:00
Nikolay Kim d8fa43034f export ExtractorConfig type 2018-05-10 11:00:22 -07:00
Nikolay Kim 92f993e054 Fix client request timeout handling 2018-05-10 09:37:38 -07:00
Nikolay Kim c172deb0f3
Merge pull request #219 from benjamingroeber/improve-readme
correct order of format arguments in readme example
2018-05-10 09:15:50 -07:00
Nikolay Kim dee6aed010
Merge branch 'master' into improve-readme 2018-05-10 09:15:44 -07:00
Nikolay Kim 76f021a6e3 add tests for ErrorXXX helpers 2018-05-10 09:13:26 -07:00
Benjamin Gröber 2f244ea028
fix order of name and id in readme example 2018-05-10 18:12:59 +02:00
Nikolay Kim 5f5ddc8f01
Merge pull request #218 from Dowwie/master
added error response functions for 501,502,503,504
2018-05-10 08:59:23 -07:00
dowwie 8b473745cb added error response functions for 501,502,503,504 2018-05-10 11:26:38 -04:00
Nikolay Kim 18575ee1ee Add Router::with_async() method for async handler registration 2018-05-09 16:27:31 -07:00
Nikolay Kim e58b38fd13 deprecate WsWrite from top level mod 2018-05-09 06:12:16 -07:00
Nikolay Kim b043c34632 bump version 2018-05-09 06:05:44 -07:00
Nikolay Kim b748bf3b0d make api public 2018-05-09 06:05:16 -07:00
Nikolay Kim be12d5e6fc make WsWriter trait optional 2018-05-09 05:48:06 -07:00
Nikolay Kim 7c4941f868 update migration doc 2018-05-08 18:48:09 -07:00
Nikolay Kim d1f5c457c4 Merge branch 'master' of github.com:actix/actix-web 2018-05-08 18:35:52 -07:00
Nikolay Kim c26c5fd9a4 prep release 2018-05-08 18:34:36 -07:00
Nikolay Kim 4a73d1c8c1
Merge pull request #216 from lcowell/lcowell-scoupe
replace typo `scoupe` with `scope`
2018-05-08 17:47:20 -07:00
Luke Cowell 7c395fcc83
replace typo scoupe with scope 2018-05-08 17:40:18 -07:00
Nikolay Kim 54c33a7aff Allow to exclude certain endpoints from logging #211 2018-05-08 16:30:34 -07:00
Nikolay Kim 47d80382b2 Fix http/2 payload streaming #215 2018-05-08 15:44:50 -07:00
Nikolay Kim ba816a8562
Merge pull request #214 from niklasf/de-path-404
let Path::from_request() fail with ErrorNotFound
2018-05-08 14:41:05 -07:00
Niklas Fiekas 6f75b0e95e let Path::from_request() fail with ErrorNotFound 2018-05-08 22:59:46 +02:00
Nikolay Kim b3cc43bb9b Fix connector's default keep-alive and lifetime settings #212 2018-05-08 13:41:04 -07:00
Nikolay Kim ecda97aadd update doc string 2018-05-08 05:54:06 -07:00
Nikolay Kim 8cda362866 simplify pipeline 2018-05-07 16:09:41 -07:00
Nikolay Kim 3c6c1268c9 travis cover report 2018-05-07 15:54:29 -07:00
Nikolay Kim 72908d974c test for Scope::route(); prep release 2018-05-07 15:19:03 -07:00
Nikolay Kim c755d71a8b add filters support to scopes 2018-05-07 14:40:04 -07:00
Nikolay Kim a817ddb57b add variable segments support for scope prefix 2018-05-07 13:50:43 -07:00
Nikolay Kim 44c36e93d1
Merge pull request #210 from andreevlex/feature/spelling-check-06-05
spelling check
2018-05-07 11:30:46 -07:00
Nikolay Kim c92ebc22d7
Merge branch 'master' into feature/spelling-check-06-05 2018-05-07 11:30:39 -07:00
Alexander Andreev 599fd6af93 fix formatting 2018-05-07 20:53:45 +03:00
Nikolay Kim fa81d97004 more handler tests 2018-05-06 20:05:31 -07:00
Nikolay Kim c54f045b39 more handler tests 2018-05-06 15:11:36 -07:00
Alexander Andreev cd11293c1f spelling check 2018-05-06 19:07:30 +03:00
Nikolay Kim 45325a5f75 more middleware tests 2018-05-06 08:33:41 -07:00
Nikolay Kim a7c40024ce async handle middleware test 2018-05-05 18:40:16 -07:00
Nikolay Kim 0af4d01fe4 move middleware tests to seprate module 2018-05-05 12:18:43 -07:00
Nikolay Kim bd6e18b7fe update migration doc 2018-05-04 13:38:17 -07:00
Nikolay Kim f66cf16823 upgrade regex 2018-05-04 12:25:06 -07:00
Nikolay Kim 03d6b04eef update tests 2018-05-04 12:11:38 -07:00
Nikolay Kim f37880d89c refactor Responder trait 2018-05-04 11:44:22 -07:00
Nikolay Kim 8b43574bd5 Merge branch 'master' of github.com:actix/actix-web 2018-05-03 16:27:12 -07:00
Nikolay Kim b07d0e712f always provide backtrace for error 2018-05-03 16:26:42 -07:00
Nikolay Kim acd7380865 rename Reply to a AsyncResult 2018-05-03 16:22:08 -07:00
Nikolay Kim 0208dfb6b2
Merge pull request #208 from DenisKolodin/ws-trait
Add WsWriter trait
2018-05-03 10:43:44 -07:00
Nikolay Kim bb61dd41af
Merge branch 'master' into ws-trait 2018-05-03 08:57:45 -07:00
Nikolay Kim 58079b5bbe add session test 2018-05-02 19:11:44 -07:00
Nikolay Kim 3623383e83 fix tests 2018-05-02 16:48:42 -07:00
Nikolay Kim 7036656ae4 make Reply generic over error too 2018-05-02 16:33:29 -07:00
Nikolay Kim 32a2866449 Allow to override files listing renderer for #203 2018-05-02 15:53:07 -07:00
Nikolay Kim 35a4078434 update changelog 2018-05-02 13:43:51 -07:00
Nikolay Kim 4ca5d8bcfc add FromRequest impl for tuples of various length 2018-05-02 13:38:25 -07:00
Nikolay Kim a38acb41e5 better query example 2018-05-02 06:30:06 -07:00
Nikolay Kim 31e23d4ab1 add query deprecation info 2018-05-02 06:28:38 -07:00
Nikolay Kim 1aadfee6f7 rename from_default to extract 2018-05-02 06:09:50 -07:00
Nikolay Kim 76b644365f use read only ref for FromRequest; remove unnecessary static 2018-05-02 06:07:30 -07:00
Denis Kolodin 80f385e703 Add WsWriter trait
`WsWriter` trait is a common interface for writing to a websocket and
it's implemented for both: `WebScoketContext` and `ClientWriter`.
2018-05-02 08:35:50 +03:00
Nikolay Kim a1958deaae add impl Future for Reply 2018-05-01 17:30:06 -07:00
Nikolay Kim 8d65468c58 refactor FromRequest trait 2018-05-01 17:19:15 -07:00
Nikolay Kim 195246573e rename threads to workers 2018-05-01 13:15:35 -07:00
Nikolay Kim e01102bda2 no need for mut 2018-05-01 11:45:46 -07:00
Nikolay Kim 9b6343d54b refactor session impl 2018-05-01 09:40:23 -07:00
Nikolay Kim d9a4fadaae make HttpRequest::extensions() readonly 2018-05-01 09:05:50 -07:00
Nikolay Kim 48e05a2d87 add nested scope support 2018-04-30 22:04:24 -07:00
Nikolay Kim 70d0c5c700 update changes 2018-04-30 19:56:17 -07:00
Nikolay Kim d43ca96c5c Allow to use ssl and non-ssl connections with the same HttpServer #206 2018-04-30 19:51:55 -07:00
Nikolay Kim bfd46e6a71 update doc string 2018-04-29 22:28:16 -07:00
Nikolay Kim 25b245ac72 allow to use custom state for scope 2018-04-29 22:19:52 -07:00
Nikolay Kim eefbe19651 remove deprecated types and methods 2018-04-29 21:05:10 -07:00
Nikolay Kim ab4e889f96 add middleware finished handler for route middleware 2018-04-29 20:50:38 -07:00
Nikolay Kim 91235ac816 fix reading from socket 2018-04-29 20:34:59 -07:00
Nikolay Kim 9c1bda3eca fix stable compiler compatibility 2018-04-29 19:49:26 -07:00
Nikolay Kim 4a29f12876 update doc string; missing file 2018-04-29 19:39:28 -07:00
Nikolay Kim 368730f5f1 Add route scopes #202 2018-04-29 19:35:50 -07:00
Nikolay Kim aa757a5be8 Allow to access Error's backtrace object 2018-04-29 14:21:50 -07:00
Nikolay Kim 03ded62337 bump minimum supported rustc version because of minor version change of parking_lot crate 2018-04-29 14:13:46 -07:00
Nikolay Kim c72d1381a6 clippy warnings 2018-04-29 09:09:08 -07:00
Nikolay Kim d98d723f97 bump rustc version requirements 2018-04-29 08:24:19 -07:00
Nikolay Kim eb6e618812
Merge pull request #204 from svenstaro/master
Add Content-Disposition to NamedFile (fixes #172)
2018-04-29 08:18:48 -07:00
Sven-Hendrik Haase de222fe33b Merge and fix PR comments 2018-04-29 14:02:50 +02:00
Nikolay Kim de49796fd1 clippy warnings; fmt 2018-04-28 22:55:47 -07:00
Nikolay Kim a38c3985f6 refactor http1 parser 2018-04-28 22:20:32 -07:00
Sven-Hendrik Haase 492c072564 Add Content-Disposition to NamedFile (fixes #172) 2018-04-27 09:49:55 +02:00
Nikolay Kim fd876efa68 allow to access application state during configuration stage 2018-04-26 09:05:07 -07:00
Nikolay Kim c5b9bed478 update changes 2018-04-26 08:01:08 -07:00
Nikolay Kim 3eba383cdc
Merge pull request #196 from fuchsnj/websocket_close_reason
Websocket close reason
2018-04-26 07:55:32 -07:00
Nikolay Kim 927f2e594e
Merge branch 'master' into websocket_close_reason 2018-04-25 20:17:19 -07:00
Nikolay Kim fa9edf2180 prep release 2018-04-24 12:34:10 -07:00
Nikolay Kim 5ca904d1db make flate crate optional 2018-04-24 12:24:04 -07:00
Nikolay Kim 2e7d323e1a add r2d2 example link 2018-04-24 09:34:38 -07:00
Nikolay Kim b66566f610 comments 2018-04-24 09:32:19 -07:00
Nikolay Kim 2477afcf30 Allow to use rust backend for flate2 crate #199 2018-04-24 09:29:15 -07:00
Nikolay Kim bcd03a9c62 link to askama example 2018-04-24 09:16:46 -07:00
Nikolay Kim f8af3ef7f4 refactor keep-alive 2018-04-22 15:28:04 -07:00
Nathan Fox f8b75c157f fix style 2018-04-22 11:43:47 -04:00
Nathan Fox b7b61afacc add ws close description parse test 2018-04-21 17:20:23 -04:00
Nathan Fox 507361c1df Merge branch 'master' into websocket_close_reason 2018-04-21 17:05:43 -04:00
Nathan Fox f6fd9e70f9 code cleanup 2018-04-21 16:53:55 -04:00
Nathan Fox de8a09254d use Optional with websocket close reason 2018-04-21 16:50:27 -04:00
Brandur f89b7a9bb8
Merge pull request #194 from actix/brandur-allowed-origin-into
Let CSRF's `allowed_origin()` be specified as a type supporting `Into<String>`
2018-04-21 10:37:18 -07:00
Brandur 59244b203c Let CSRF's allowed_origin() be specified as a type supporting Into<String>
A very minor addition: I'm using this middleware on specific resources,
and given a non-static string, I often have to `clone()` already to get
a string into a closure. Take this code for example:

``` rust
let server = actix_web::server::new(move || {
    let csrf_origin_graphql = csrf_origin.clone();

    ...

    .resource("/graphql", move |r| {
	r.middleware(
	    csrf::CsrfFilter::new().allowed_origin(csrf_origin_graphql.as_str()),
	);

	r.method(Method::POST).a(graphql::handlers::graphql_post);
    })
```

Letting `allowed_origin()` take an `Into<String>` instead of `&str` would
prevent a second `clone()` in the code above, and also make the code a little
nicer to read (you eliminate the `.as_str()` above). This is a pattern that
seems to be common throughout actix-web already anyway, so it should also be
fine to have here.
2018-04-21 08:41:06 -07:00
Nikolay Kim 2adf8a3a48 add changelog entry 2018-04-21 07:56:11 -07:00
Nikolay Kim 805dbea8e7
Merge pull request #192 from fuchsnj/check_if_close_code_exists
check if close code exists before reading it
2018-04-21 07:54:25 -07:00
Nathan Fox dc9a24a189 add websocket empty close status test 2018-04-20 21:55:07 -04:00
Nathan Fox 5528cf62f0 check if close code exists before reading it 2018-04-20 21:30:18 -04:00
Nikolay Kim 9880a95603
Merge pull request #189 from drklee3/patch-1
Update README links to use new guide
2018-04-19 19:24:40 -07:00
Derrick Lee 2579c49865
Update README links to use new guide 2018-04-19 18:51:01 -07:00
Nikolay Kim 01a0f3f5a0 remove unused dependency 2018-04-19 09:54:22 -07:00
Nikolay Kim 2c8d987241 Use Display formatting for InternalError Display implementation #188 2018-04-19 07:55:09 -07:00
Nikolay Kim 813d1d6e66 doc strings layout 2018-04-18 20:41:03 -07:00
Nikolay Kim 48b02abee7 fmt 2018-04-18 20:16:29 -07:00
Nikolay Kim ce1081432b export session module 2018-04-18 20:11:49 -07:00
Nikolay Kim e9bdba57a0 Add identity service middleware 2018-04-18 19:05:24 -07:00
Nikolay Kim f907be585e Middleware response() is not invoked if there was an error in async handler #187 2018-04-18 14:15:53 -07:00
Nikolay Kim 022f9800ed formatting 2018-04-18 10:49:03 -07:00
Nikolay Kim a9a54ac4c6 prep release 2018-04-18 10:45:59 -07:00
Nikolay Kim 50b9fee3a7 Merge branch 'master' of github.com:actix/actix-web 2018-04-17 16:24:02 -07:00
Nikolay Kim bf9a90293f fix doc strings 2018-04-17 16:22:25 -07:00
Nikolay Kim 17ec3a3a26
Merge pull request #185 from kornelski/master
Replace use of try!() with ?
2018-04-17 15:57:09 -07:00
Kornel 5b4b885fd6 Replace use of try!() with ? 2018-04-17 23:20:47 +01:00
Nikolay Kim 65b8197876 better doc string for Application::with_state() 2018-04-17 13:59:55 -07:00
Nikolay Kim a826d113ee add custom request path quoter #182 2018-04-17 12:55:13 -07:00
Nikolay Kim 3a79505a44 update doc string 2018-04-17 07:51:06 -07:00
Nikolay Kim 5f3a7a6a52
Merge pull request #184 from ivanovaleksey/patch-1
Fix route in App::resource example
2018-04-17 07:49:09 -07:00
Aleksey Ivanov 6a7b097bcf Fix route in App::resource example 2018-04-17 16:01:34 +03:00
Nikolay Kim 30a36bed9d fix doc example 2018-04-16 09:50:37 -07:00
Nikolay Kim 79818560b2 cleanup doc strings; prepare release 2018-04-16 09:30:59 -07:00
Nikolay Kim 58cc0dfbc5 Fix Client Request with custom Body Stream halting on certain size requests #176 2018-04-15 10:22:09 -07:00
Nikolay Kim a9ea649348 Allow to configure StaticFiles CpuPool, via static method or env variable 2018-04-13 19:46:14 -07:00
Nikolay Kim 634c5723a0 update changelog 2018-04-13 19:19:30 -07:00
Nikolay Kim a5b5ff0894 update doc strings 2018-04-13 19:14:14 -07:00
Nikolay Kim 5140fea8d1 allow to use castom error handler for json extractor 2018-04-13 19:10:42 -07:00
Nikolay Kim 333b4f57d3 use different directory for tests 2018-04-13 17:00:18 -07:00
Nikolay Kim 827ca5eada remove skeptic tests 2018-04-13 16:36:39 -07:00
Nikolay Kim ebc1f6eff9 drop skeptic 2018-04-13 16:21:57 -07:00
Nikolay Kim a8567da3e2 move guide to separate repo; update links 2018-04-13 16:20:23 -07:00
Nikolay Kim 113f5ad1a8 add rustfmt config 2018-04-13 16:02:01 -07:00
Nikolay Kim 95f6277007 fix typo 2018-04-13 14:36:07 -07:00
Nikolay Kim 22c776f46e Fix StaticFiles does not support percent encoded paths #177 2018-04-13 10:13:12 -07:00
Nikolay Kim c0976bfa17 fix test 2018-04-12 21:28:17 -07:00
Nikolay Kim 5e9ec4299c fix workspace links 2018-04-12 20:52:30 -07:00
Nikolay Kim e05aba65de examples moved to separate repo 2018-04-12 20:31:58 -07:00
Nikolay Kim c5b18c6d30 prepare release 2018-04-12 16:03:22 -07:00
Nikolay Kim 94c5bb5cdd add helper method for returning inner value 2018-04-12 15:55:15 -07:00
Nikolay Kim 2ca0ea70c4 use one default cpu pool for StaticFiles #174 2018-04-12 15:50:20 -07:00
Nikolay Kim 0b01884fca add timeouts stats to client connector 2018-04-12 13:08:13 -07:00
Nikolay Kim 83168731fc update user guide content compression section 2018-04-12 09:54:35 -07:00
Nikolay Kim 7295846426
Merge pull request #173 from jannic/pr
fix end-of-stream handling in parse_payload
2018-04-12 09:30:26 -07:00
Jan Niehusmann 72bc1546c4 fix end-of-stream handling in parse_payload
parse_payload can be called with a pre-filled buf.

In this case, it's totaly fine for read_from_io to return
sync::Ready(0) while buf is not empty. This is not an
PayloadError::Incomplete.

So, move the check for PayloadError::Incomplete down to the
decoding code: If the decoder is not ready, but the input stream
is finished, PayloadError::Incomplete will be returned.
2018-04-12 09:47:32 +02:00
Nikolay Kim d39b531537 Merge branch 'master' of github.com:actix/actix-web 2018-04-11 19:05:34 -07:00
Nikolay Kim 35e68723df use older mdbook 2018-04-11 19:05:14 -07:00
Nikolay Kim 0624f9b9d9
Update MIGRATION-0.4-0.5.md 2018-04-11 16:53:27 -07:00
Nikolay Kim 0e3820afdf
Update MIGRATION-0.4-0.5.md 2018-04-11 16:49:45 -07:00
Nikolay Kim 839d67ac6a migration to 0.5 2018-04-11 16:46:21 -07:00
Nikolay Kim b517957761 fix stats for tls and alpn features 2018-04-11 16:34:01 -07:00
Nikolay Kim d18f9c5905 add clinet connector stats 2018-04-11 16:11:11 -07:00
Douman 76fcdc13a3
Merge pull request #171 from DoumanAsh/without_state_public
Make HttpRequest::without_state public
2018-04-11 23:48:19 +03:00
Douman 62a9b4c53c Rename HttpRequest::without_state into drop_state and make it public 2018-04-11 22:41:06 +03:00
Nikolay Kim c570229351
Update README.md 2018-04-11 10:49:34 -07:00
Nikolay Kim d041df6c4b update links 2018-04-10 19:27:09 -07:00
Nikolay Kim bc28e54976 add homepage link 2018-04-10 19:20:21 -07:00
Nikolay Kim 26ab5cbd01 forgot to include 2018-04-10 15:14:46 -07:00
Nikolay Kim 50c2a5ceb0 update basic example 2018-04-10 14:45:03 -07:00
Nikolay Kim 8dbbb0ee07 update guide 2018-04-10 13:31:10 -07:00
Nikolay Kim ca76dff5a7 update redis example 2018-04-10 13:21:54 -07:00
Nikolay Kim 88f66d49d0 openssl features 2018-04-10 11:07:54 -07:00
Nikolay Kim be288fa00a for NamedFile process etag and last modified only if status code is 200 2018-04-10 10:57:53 -07:00
Nikolay Kim 5e6a0aa3df simplier example in readme 2018-04-10 10:39:16 -07:00
Nikolay Kim fd87eb59f8 remove reference to master 2018-04-10 10:29:10 -07:00
Nikolay Kim 81ac905c7b fix prefix and static file serving #168 2018-04-10 10:16:00 -07:00
Nikolay Kim bb11fb3d24 update client mod doc string 2018-04-09 21:57:40 -07:00
Nikolay Kim 23eea54776 update cors doc string 2018-04-09 21:39:32 -07:00
Nikolay Kim 2881859400 proper test for CorsBuilder::resource 2018-04-09 21:29:57 -07:00
Nikolay Kim 1686682c19 extend CorsBuilder api to make it more user friendly 2018-04-09 21:11:15 -07:00
Nikolay Kim d04ff13955 update version 2018-04-09 14:27:13 -07:00
Nikolay Kim e757dc5a71 clippy warnings 2018-04-09 14:25:30 -07:00
Nikolay Kim be358db422 CorsBuilder::finish() panics on any configuration error 2018-04-09 14:20:12 -07:00
Nikolay Kim 7df2d6b12a clippy warnings; extend url_for example in user guide 2018-04-09 13:30:38 -07:00
Nikolay Kim 458e6bdcc2
Merge pull request #170 from adwhit/private-cookies
Public, signed and private cookies
2018-04-09 12:54:15 -07:00
Nikolay Kim 0b0bbd6bd9
Merge branch 'master' into private-cookies 2018-04-09 12:54:08 -07:00
Nikolay Kim 5617896780 cleanup doc tests 2018-04-09 10:40:12 -07:00
Alex Whitney 2b803f30c9 remove CookieSessionBackend::new 2018-04-09 18:33:29 +01:00
Alex Whitney 9b152acc32 add signed and private cookies 2018-04-09 17:59:28 +01:00
Nikolay Kim eb66685d1a simplify csrf middleware 2018-04-09 09:49:07 -07:00
Nikolay Kim b505e682d4 fix session doc test 2018-04-09 09:31:11 -07:00
Nikolay Kim 48e7013997 update guide examples 2018-04-09 07:57:50 -07:00
Nikolay Kim ff14633b3d simplify CookieSessionBackend; expose max_age cookie setting 2018-04-08 11:05:37 -07:00
Nikolay Kim 37db7d8168 allow to override status code for NamedFile 2018-04-08 10:53:58 -07:00
Nikolay Kim 89bf12605d
Merge pull request #165 from tazjin/docs/various-doc-fixes
Various minor documentation fixes
2018-04-07 09:53:19 -07:00
Vincent Ambo 9fb0498437 docs(lib): Add a note about getting started with the API docs
Adds some initial pointers for newcomers to the documentation that
direct them at some of the most commonly used API types.

I based these links on what *I* usually end up looking at when I open
the actix_web docs.
2018-04-07 17:27:53 +02:00
Vincent Ambo b2a43a3c8d docs(application): Formatting & spelling fixes in module docs 2018-04-07 17:19:11 +02:00
Vincent Ambo 38063b9873 docs(client): Minor formatting and spelling fixes in module docs 2018-04-07 17:00:57 +02:00
Vincent Ambo 1045a6c6f0 docs(README): Minor formatting and spelling fixes 2018-04-07 17:00:39 +02:00
Nikolay Kim 7243c58fce stable rust compatibility 2018-04-06 21:57:45 -07:00
Nikolay Kim fffaf2bb2d App::route method 2018-04-06 21:18:42 -07:00
Nikolay Kim 7becb95a97 fix guide example 2018-04-06 20:24:49 -07:00
Nikolay Kim a4b837a1c1 flaky test 2018-04-06 19:45:14 -07:00
Nikolay Kim 542315ce7f simplify StaticFiles 2018-04-06 19:34:55 -07:00
Nikolay Kim 602d78b76c
Merge pull request #163 from memoryruins/guide
Guide: edits to the second half
2018-04-06 19:11:12 -07:00
memoryruins 18b706d4fb Guide: tweak to websocket and testing. 2018-04-06 19:44:52 -04:00
memoryruins 94b41fd484 Guide: tweak to database integration. 2018-04-06 19:42:18 -04:00
memoryruins 3a80cb7bf3 Guide: tweak to http/2. 2018-04-06 19:37:14 -04:00
memoryruins e4a85a53f4 Guide: additional tweaks to Middleware. 2018-04-06 19:35:11 -04:00
memoryruins 1a45dbd768 Guide: additional tweak to testing chapter. 2018-04-06 19:26:07 -04:00
memoryruins 7cff5d9ade Guide: additional tweaks to request and response chapter. 2018-04-06 19:17:03 -04:00
memoryruins c04e0fdec4 Merge branch 'master' into guide 2018-04-06 19:04:50 -04:00
memoryruins 0f0fe5f148 Guide: updates to the Database integration chapter. 2018-04-06 19:02:11 -04:00
memoryruins e7f9f5b46d Guide: updates to HTTP/2 chapter. 2018-04-06 18:46:56 -04:00
memoryruins c3fbba2678 Guide: updates to static file handling chapter. 2018-04-06 18:40:57 -04:00
memoryruins a88e97edba Guide: updates to Middleware chapter. 2018-04-06 18:29:18 -04:00
memoryruins 1f08100f6f Guide: updates to the WebSockets chapter. 2018-04-06 18:04:42 -04:00
memoryruins ab60ec6e1d Guide: updates to the Testing chapter. 2018-04-06 18:03:30 -04:00
memoryruins 0fbd05009d Guide: tweaks to the request and response chapter. 2018-04-06 17:31:18 -04:00
Nikolay Kim fdb7419e24 use actix-web from master 2018-04-06 14:11:04 -07:00
Nikolay Kim 191b53bd7c pin futures 0.1 2018-04-06 13:22:27 -07:00
Nikolay Kim 2d4ee0ee01 make Pause::new public 2018-04-06 12:34:24 -07:00
Nikolay Kim 5bd5f67d79 add Pause message constructors 2018-04-06 12:31:31 -07:00
memoryruins 5d8cbccfe9 Remove article. 2018-04-06 15:12:06 -04:00
Nikolay Kim 8d5fa6ee71 added Pause/Resume for client connector 2018-04-06 11:08:41 -07:00
Nikolay Kim 084104d058 update doc strings for extractors 2018-04-06 10:24:57 -07:00
Nikolay Kim 2c411a04a9 no need for export in doc example 2018-04-06 10:15:06 -07:00
Nikolay Kim af0c8d893d add shortcut method for client requests 2018-04-06 10:09:31 -07:00
Nikolay Kim 691457fbfe update tests 2018-04-06 09:45:10 -07:00
Nikolay Kim 2dafd9c681 do not re-export HttpServer from server module 2018-04-06 08:40:11 -07:00
Nikolay Kim 12586db15c
Merge pull request #160 from memoryruins/guide
Guide: edits to first half
2018-04-05 19:44:42 -07:00
Nikolay Kim b847bda8ca
Merge branch 'master' into guide 2018-04-05 19:44:34 -07:00
memoryruins 2a543001e0 Tweaks to the URL Dispatch chapter. 2018-04-05 22:12:20 -04:00
memoryruins 0f86c596fa Tweaks to Errors chapter. 2018-04-05 21:54:39 -04:00
Nikolay Kim 6c55501252 client connector wait timeout 2018-04-05 18:33:58 -07:00
memoryruins 961edfd21a Tweaks to the Handler chapter. 2018-04-05 21:30:52 -04:00
memoryruins 7f0de705a3 Tweaks to Server chapter. 2018-04-05 20:55:19 -04:00
memoryruins c2ad65a61d Various tweaks to Application chapter. 2018-04-05 19:43:17 -04:00
memoryruins 3c93e0c654 Add newline for reading source. 2018-04-05 19:25:41 -04:00
memoryruins a0f1ff7eb3 Add src directory to main.rs and list on first codeblock. 2018-04-05 19:21:29 -04:00
memoryruins 9f45cfe492 Expand note about actix. 2018-04-05 19:12:23 -04:00
memoryruins 46e6641528 Add repository hyperlink and trim repeat. 2018-04-05 18:46:36 -04:00
memoryruins a3f124685a Remove redundant quickstart paragraph. 2018-04-05 18:32:04 -04:00
Nikolay Kim 800f711cc1 add PayloadConfig 2018-04-04 21:13:48 -07:00
Nikolay Kim 7be4b1f399 clippy warns 2018-04-04 20:24:09 -07:00
Nikolay Kim eeae0ddab4 start client timeout for response only 2018-04-04 20:15:47 -07:00
Nikolay Kim c1af59c618 update juniper example 2018-04-04 17:57:02 -07:00
Nikolay Kim d8a9606162 add connection limits to pool 2018-04-04 16:39:01 -07:00
Nikolay Kim 8038a52287 run test coverage on beta 2018-04-04 08:12:33 -07:00
Nikolay Kim c273b7ac3f update json example 2018-04-04 08:08:31 -07:00
Nikolay Kim df21892b5b added extractor configuration 2018-04-03 22:06:18 -07:00
Nikolay Kim a255a6fb69 use build_response method 2018-04-03 17:37:17 -07:00
Nikolay Kim b693d5491b
Merge pull request #157 from krircc/master
only use diesel::r2d2 feature. no need r2d2_diesel create
2018-04-03 08:18:16 -07:00
krircc 56a31ea0ee only use diesel::r2d2 feature. no need r2d2_diesel create 2018-04-03 22:37:53 +08:00
Nikolay Kim 2a269f1111 update changes 2018-04-02 22:08:04 -07:00
Nikolay Kim fee30d6f47 fix doc test compatibility 2018-04-02 22:01:20 -07:00
Nikolay Kim 476b1fb36a simplify DefaultHeaders middleware 2018-04-02 21:43:50 -07:00
Nikolay Kim 3b93bff602 add ErrorHandlers middleware 2018-04-02 21:37:00 -07:00
Nikolay Kim d292c5023f add String and Bytes extractor 2018-04-02 16:19:18 -07:00
Nikolay Kim ef6f310060 update urlencoded example in guide 2018-04-02 15:08:49 -07:00
Nikolay Kim a6cbdde43f add extractor for Binary type; move all extractors to separate module 2018-04-02 14:55:42 -07:00
Nikolay Kim cbf4c61eb5 add urlencoded body extractor 2018-04-02 14:00:18 -07:00
Nikolay Kim 280c8d87f8 expose ResourceType 2018-04-02 11:18:31 -07:00
Nikolay Kim 83bf852192 Fix logger request duration calculation 2018-04-02 11:09:24 -07:00
Nikolay Kim 9d39f441e9
Merge pull request #153 from rofrol/add-header-for-juniper-example
Add header for juniper example
2018-04-02 10:51:42 -07:00
Nikolay Kim 03d851680b
Merge branch 'master' into add-header-for-juniper-example 2018-04-02 10:51:35 -07:00
Nikolay Kim 0ddd018214
Merge pull request #154 from dholbert/patch-1
Use https (not http) url for meritbadge
2018-04-02 10:50:17 -07:00
Daniel Holbert 8219a7aebe
Use https (not http) url for meritbadge
Right now this readme file uses an HTTP url to reference a meritbadge image, which ends up producing "broken https" UI on the crates.io page https://crates.io/crates/actix-web. This patch just upgrades this to an HTTPS url (which still works), to avoid that problem. (Literally a 1-character change, changing "http" to "https" in "http://meritbadge.herokuapp.com/actix-web")
2018-04-02 10:44:46 -07:00
Nikolay Kim 6c906b08e1 match resource path before executing middlewares 2018-04-02 10:27:37 -07:00
Roman Frołow 220cbe40e5 Add header for juniper example 2018-04-02 19:10:33 +02:00
Nikolay Kim 74d0656d27 update diesel example 2018-04-01 18:24:07 -07:00
Nikolay Kim 17c27ef42d HttpRequest::resource() returns current matched resource 2018-04-01 17:37:22 -07:00
Nikolay Kim b2e771df2c use r2d2 for diesel example 2018-04-01 08:20:15 -07:00
Nikolay Kim a5a36ff194 update readme example 2018-03-31 17:15:44 -07:00
Nikolay Kim 97e2bcd055 allow primitive types for Path extractor 2018-03-31 17:12:08 -07:00
Nikolay Kim 23cfa649f4 update tests 2018-03-31 10:21:54 -07:00
Nikolay Kim 8791c0f880 simplify With handlers 2018-03-31 09:58:33 -07:00
Nikolay Kim 16c212f853 add extractors info to guide 2018-03-31 09:18:25 -07:00
Nikolay Kim 3ee228005d rename Application 2018-03-31 00:16:55 -07:00
Nikolay Kim 7a743fa6b5 update examples 2018-03-30 23:37:15 -07:00
Nikolay Kim 44e3df82f6 simplify http response construction; deprecate httpcodes 2018-03-30 23:07:33 -07:00
Nikolay Kim 8d8f6bedad update examples 2018-03-30 18:54:38 -07:00
Nikolay Kim 9e751de707 re-arrange modules and exports 2018-03-30 17:31:18 -07:00
Nikolay Kim b16419348e add from HttpRequest to a HttpRequestBuilder 2018-03-30 14:30:24 -07:00
Nikolay Kim 3ccaa04575 unhide AsyncResponder; remove unused code 2018-03-30 09:34:03 -07:00
Nikolay Kim d80b84c915 add test builder guide information 2018-03-29 19:23:45 -07:00
Nikolay Kim 145010a2b0 use unreachable instead of panic 2018-03-29 15:55:27 -07:00
Nikolay Kim 3e98177fad added State extractor 2018-03-29 15:41:13 -07:00
Nikolay Kim d24752d9bc update example in readme 2018-03-29 15:07:12 -07:00
Nikolay Kim 92fe2e96de update doc strings 2018-03-29 15:00:18 -07:00
Nikolay Kim 3cf54bc0fd proper serde deserializer implementation for path 2018-03-29 14:30:45 -07:00
Nikolay Kim 86dd732704 use FromRequest instead of HttpRequestExtractor 2018-03-29 13:12:28 -07:00
Nikolay Kim dfd8f1058e move NormalizePath type to separate module 2018-03-29 11:39:21 -07:00
Nikolay Kim f5636f321b drop deprecated code 2018-03-29 11:06:44 -07:00
Nikolay Kim ae6c9cb7fa re-arrange exports, some doc string updates 2018-03-29 10:44:26 -07:00
Nikolay Kim 32052c2750 update guide 2018-03-29 10:01:07 -07:00
Nikolay Kim 7d6deab9fb drop request's extract_xxx methods 2018-03-29 09:26:01 -07:00
Nikolay Kim 9e61c67128 do not re-export Version 2018-03-28 22:00:36 -07:00
Nikolay Kim 13bb5f20d2 fix export name 2018-03-28 21:58:08 -07:00
Nikolay Kim d14991ec96 update doc strings 2018-03-28 21:49:50 -07:00
Nikolay Kim 45dec8d0c0 optimize with and with2 method impls and tests 2018-03-28 21:33:40 -07:00
Nikolay Kim 90e3aaaf8a fix router cannot parse Non-ASCII characters in URL #137 2018-03-28 16:10:58 -07:00
Nikolay Kim 4f7d45ee9c remove unneeded import 2018-03-28 14:38:01 -07:00
Nikolay Kim e1d2536d85 remove unused code 2018-03-28 14:34:17 -07:00
Nikolay Kim 65700281e8 add support for multiple extractors 2018-03-28 14:24:32 -07:00
Nikolay Kim 80f6b93714
Merge pull request #138 from bwasty/guide
Guide: improve wording & style
2018-03-28 13:40:05 -07:00
Nikolay Kim 5585465859
Merge branch 'master' into guide 2018-03-28 13:39:59 -07:00
Benjamin Wasty 368103dd09 guide: improve wording & style 2018-03-28 22:16:01 +02:00
Nikolay Kim df7ffe14f2 add PathAndQuery extractor 2018-03-28 11:20:06 -07:00
Nikolay Kim 36161aba99 update Path and Query doc strings 2018-03-28 07:27:06 -07:00
Nikolay Kim 9f5a91ae3c export types 2018-03-27 21:59:55 -07:00
Nikolay Kim 4e61e0db34 mdbook 2018-03-27 21:33:35 -07:00
Nikolay Kim 2dfccdd924 allow to fail nightly 2018-03-27 20:57:02 -07:00
Nikolay Kim 4358da9926 refactor WithHandler trait 2018-03-27 20:33:24 -07:00
Nikolay Kim 62fb75ff95 add Application::configure method, it simplifies configuration process 2018-03-27 11:16:02 -07:00
Nikolay Kim 29a0feb415 fix guide example 2018-03-27 07:47:29 -07:00
Nikolay Kim dcc5eb7ace pass request as value 2018-03-26 23:34:31 -07:00
Nikolay Kim 81f4e12a27 fix doc string test 2018-03-26 23:29:53 -07:00
Nikolay Kim 2f60a4b89d add handler with exatractor 2018-03-26 23:10:31 -07:00
Nikolay Kim b03c7051ff add extractor info to the guide 2018-03-26 18:35:08 -07:00
Nikolay Kim 8fff2c7595 remove Path and Query from public api 2018-03-26 18:18:38 -07:00
Nikolay Kim 052d5f0bc5 silence AsciiExt deprecation warn 2018-03-26 16:12:25 -07:00
Nikolay Kim 68cf32e848 add path and query extractors 2018-03-26 15:58:30 -07:00
Nikolay Kim a56e5113ee process transfer-encoding before content-length, fix tests on 32bit platform 2018-03-24 09:22:34 -07:00
Alexander Andreev 5127b85672
Merge pull request #132 from andreevlex/spell-check-24-03
spelling check
2018-03-24 11:47:11 +03:00
Alexander Andreev 2d80c5053d spelling check 2018-03-24 09:35:52 +03:00
Nikolay Kim d46854b315 bump version 2018-03-22 21:16:42 -07:00
Nikolay Kim 47f836cd1b add helper method for response creation 2018-03-22 21:14:57 -07:00
Nikolay Kim 449709dd7e add 0.5 sec deley before exit 2018-03-22 18:41:02 -07:00
Nikolay Kim 5a25fd95f5 Fix panic on invalid URL characters #130 2018-03-22 18:08:12 -07:00
Nikolay Kim b942bcc4a6 Fix long client urls #129 2018-03-22 07:44:16 -07:00
Nikolay Kim 1107fdec9d fix guide 2018-03-21 21:02:57 -07:00
Nikolay Kim 04515e4697 update guide 2018-03-21 21:02:04 -07:00
Nikolay Kim 93d99b5a49 Use more ergonomic actix_web::Error instead of http::Error for ClientRequestBuilder::body() 2018-03-21 20:19:31 -07:00
Nikolay Kim e49910cdab Use more ergonomic actix_web::Error instead of http::Error for HttpResponseBuilder::body() 2018-03-21 20:15:52 -07:00
Nikolay Kim e8a1850c79 add helper conversion from ClientResponse for HttpResponseBuilder 2018-03-21 20:04:35 -07:00
Nikolay Kim afb81b6b8f add convinience ClientRequest::build_from() from HttpRequest 2018-03-21 19:54:21 -07:00
Nikolay Kim 4866a26578 make streaming method more ergonomic 2018-03-21 19:14:18 -07:00
Nikolay Kim 2d75ced4ed fix client connection pooling 2018-03-21 11:51:08 -07:00
Nikolay Kim 7bcc258b09
Use fast compression setting 2018-03-21 08:56:21 -07:00
Nikolay Kim d5fa0a9418 disable brotli if feature is not enabled, faster compression 2018-03-21 08:03:21 -07:00
Nikolay Kim ce6d237cc1 prepare 0.4.10 release 2018-03-20 15:53:39 -07:00
Nikolay Kim 70caa2552b simplify httpresponse release 2018-03-20 15:51:19 -07:00
Nikolay Kim ee7d58dd7f disable h2 2018-03-20 12:35:44 -07:00
Nikolay Kim c4f4cadb43 Fix http/2 date header generation 2018-03-20 11:40:05 -07:00
Nikolay Kim 978091cedb wake up io task when next chunk of data is needed 2018-03-20 11:37:13 -07:00
Nikolay Kim 8198f5e10a Refactor TestServer configuration 2018-03-20 11:23:35 -07:00
Nikolay Kim 6cd40df387 Fix server websockets big payloads support 2018-03-19 17:27:03 -07:00
Nikolay Kim 35ee5d36d8 actix 0.5.5, ws test 2018-03-19 13:12:36 -07:00
Nikolay Kim e7ec0f9fd7 ws tests and proper write payload ref 2018-03-19 09:30:58 -07:00
Nikolay Kim f4a47ef71e allow set client request/ws timeout 2018-03-18 19:27:51 -07:00
Nikolay Kim 6b1a79fab8 update example 2018-03-18 16:27:34 -07:00
Nikolay Kim ab73da4a1a use Error instead of InternalError for helper methods error::ErrorXXX 2018-03-18 14:18:47 -07:00
Nikolay Kim e0c8da567c various optimizations 2018-03-18 11:05:44 -07:00
Douman c10dedf7e4
Merge pull request #124 from DoumanAsh/show_hidden
Show Request's hidden methods
2018-03-17 18:39:21 +03:00
Douman ec192e0ab1 Show Request's hidden methods 2018-03-17 18:10:22 +03:00
Nikolay Kim 6d792d9948 simplify h1 parse 2018-03-16 20:56:23 -07:00
Nikolay Kim 1fe4315c94 use actix 0.5.4 2018-03-16 13:37:47 -07:00
Nikolay Kim 381b90e9a1 bump version 2018-03-16 12:31:29 -07:00
Nikolay Kim 2d18dba40a fix compilation 2018-03-16 12:28:08 -07:00
Nikolay Kim d2693d58a8 clippy warnings 2018-03-16 12:12:55 -07:00
Nikolay Kim 84bf282c17 add basic client connection pooling 2018-03-16 12:04:01 -07:00
Nikolay Kim b15b5e5246 check number of available workers 2018-03-16 11:17:27 -07:00
Douman 52b3b0c362
Merge pull request #119 from DoumanAsh/default_static_files
Add default resource for StaticFiles
2018-03-16 20:12:07 +03:00
Nikolay Kim 64c4cefa8f
Merge branch 'master' into default_static_files 2018-03-16 09:31:36 -07:00
Nikolay Kim 7e8b231f57 disable test 2018-03-16 09:13:36 -07:00
Douman 8a344d0c94 Add default resource for StaticFiles 2018-03-16 19:04:36 +03:00
Nikolay Kim 4096089a3f allow to disable http/2 support 2018-03-16 08:48:44 -07:00
Nikolay Kim b16f2d5f05 proper check for actor context poll 2018-03-16 08:04:26 -07:00
Nikolay Kim 5baf15822a always start actors 2018-03-16 07:46:27 -07:00
Nikolay Kim 5368ce823e
Merge pull request #123 from h416/patch-1
fix typo
2018-03-16 05:31:10 -07:00
h416 4effdf065b
fix typo 2018-03-16 19:03:16 +09:00
Nikolay Kim 61970ab190 always poll stream or actor for the first time 2018-03-15 17:11:49 -07:00
Nikolay Kim 484b00a0f9 Merge branch 'master' of github.com:actix/actix-web 2018-03-15 16:55:33 -07:00
Nikolay Kim 73bf2068aa allow to use NamedFile with any request method 2018-03-15 16:55:22 -07:00
Nikolay Kim 1cda949204
Merge pull request #122 from mockersf/test_qp
test for query parameters in client
2018-03-14 16:10:31 -07:00
François Mockers ad6b823255 test for query parameters in client 2018-03-14 21:45:49 +01:00
Nikolay Kim 0f064db31d Move brotli encoding to a feature 2018-03-13 17:21:22 -07:00
Nikolay Kim fd0bb54469 add debug formatter for ClientRequestBuilder 2018-03-13 15:09:05 -07:00
Nikolay Kim e27bbaa55c
Update CHANGES.md 2018-03-13 13:15:21 -07:00
Nikolay Kim 8a50eae1e2
Merge pull request #121 from glademiller/master
Send Query Parameters in client requests
2018-03-13 13:14:51 -07:00
Glade Miller 38080f67b3 If no path is available from the URI request / 2018-03-13 13:35:11 -06:00
Glade Miller 08504e0892 Move path call inline into write 2018-03-13 13:26:13 -06:00
Glade Miller 401c0ad809 https://github.com/actix/actix-web/issues/120 - Send Query Parameters in client requests 2018-03-13 13:17:55 -06:00
Nikolay Kim b4b0deb7fa Wake payload reading task when data is available 2018-03-12 16:29:13 -07:00
Nikolay Kim 05ff35d383 Fix server keep-alive handling 2018-03-12 16:16:17 -07:00
Nikolay Kim 29c3e8f7ea update test 2018-03-12 10:19:09 -07:00
Nikolay Kim 6657446433 Allow to set read buffer capacity for server request 2018-03-12 10:01:56 -07:00
Nikolay Kim 46b9a9c887 update readme 2018-03-12 09:13:04 -07:00
Nikolay Kim b3cdb472d0 remove reserved state for h2 write if buffer is empty 2018-03-12 09:04:54 -07:00
Nikolay Kim 31e1aab9a4 do not log WouldBlock error from socket accept 2018-03-12 09:02:15 -07:00
Nikolay Kim 67f383f346 typo 2018-03-11 16:53:46 -07:00
Nikolay Kim 49f5c335f6 better sleep on error 2018-03-11 16:52:20 -07:00
Nikolay Kim 692e11a584 bump version 2018-03-11 16:40:25 -07:00
Nikolay Kim 208117ca6f
Merge pull request #118 from messense/feature/sockets-vec
Use Vec instead of HashMap to store sockets in HttpServer
2018-03-11 16:38:23 -07:00
Nikolay Kim 3e276ac921
Merge branch 'master' into feature/sockets-vec 2018-03-11 16:38:17 -07:00
Nikolay Kim 4af115a19c Fix steraming response handling for http/2 2018-03-11 16:37:44 -07:00
Nikolay Kim 051703eb2c Fix connection get closed too early 2018-03-11 15:37:33 -07:00
Nikolay Kim 31fbbd3168 Fix panic on unknown content encoding 2018-03-11 14:50:13 -07:00
Nikolay Kim fee1e255ac
add comments 2018-03-11 10:10:30 -07:00
Nikolay Kim a4c933e56e update doc string 2018-03-11 09:36:54 -07:00
Nikolay Kim 9ddf5a3550 better doc string for Either 2018-03-11 09:28:22 -07:00
messense 9ab0fa604d
Use Vec instead of HashMap to store sockets in HttpServer 2018-03-11 17:29:44 +08:00
Nikolay Kim 6c709b33cc return error on write zero bytes 2018-03-10 10:42:46 -08:00
Nikolay Kim 71b4c07ea4 Fix json content type detection 2018-03-10 10:27:29 -08:00
Nikolay Kim ac9eba8261 add api doc for Either 2018-03-10 10:12:44 -08:00
Nikolay Kim cad55f9c80 add Either responder 2018-03-10 09:39:43 -08:00
Nikolay Kim 4263574a58 fix panic in cors if request does not contain origin header and send_wildcard is not set 2018-03-10 08:31:20 -08:00
messense 84ef5ee410
Merge pull request #116 from messense/feature/from-usize-to-keepalive
Impl From<usize> and From<Option<usize>> for KeepAlive
2018-03-10 22:55:55 +08:00
messense 598fb9190d
rerun build if USE_SKEPTIC env var changed 2018-03-10 17:53:11 +08:00
messense 9a404a0c03
Impl From<usize> and From<Option<usize>> for KeepAlive 2018-03-10 17:52:50 +08:00
Nikolay Kim 3dd8fdf450 fix guide 2018-03-09 21:40:51 -08:00
Nikolay Kim 05f5ba0084 refactor keep-alive; fixed write to socket for upgraded connection 2018-03-09 16:21:14 -08:00
Nikolay Kim 8169149554 update wstool 2018-03-09 13:12:25 -08:00
Nikolay Kim 8d1de6c497 ws client timeouts 2018-03-09 13:12:14 -08:00
Nikolay Kim caaace82e3 export symbols 2018-03-09 13:03:15 -08:00
Nikolay Kim 02dd5375a9 aling mask to 8 bytes 2018-03-09 10:25:47 -08:00
Nikolay Kim 717602472a clippy warnings 2018-03-09 10:11:38 -08:00
Nikolay Kim b56be8e571 write buffer capacity for client 2018-03-09 10:09:13 -08:00
Nikolay Kim 2853086463 add write buffer capacity config 2018-03-09 10:00:15 -08:00
Nikolay Kim e2107ec6f4 use small vec on hot path 2018-03-09 08:00:44 -08:00
Nikolay Kim c33caddf57 update tests 2018-03-09 05:50:47 -08:00
Nikolay Kim db1e04e418 prepare release 2018-03-09 05:42:42 -08:00
Nikolay Kim f8b8fe3865 add space to cookie header 2018-03-09 05:38:07 -08:00
Nikolay Kim 1c6ddfd34c naming 2018-03-09 05:36:40 -08:00
Nikolay Kim 49e007ff2a move protobuf support to the example 2018-03-09 05:29:06 -08:00
Nikolay Kim 2068eee669 update readme 2018-03-08 20:58:05 -08:00
Nikolay Kim f3c63e631a add protobuf feature 2018-03-08 20:56:18 -08:00
Nikolay Kim 3f0803a7d3 Merge branch 'master' of github.com:actix/actix-web 2018-03-08 20:39:10 -08:00
Nikolay Kim f12b613211 more ws optimizations 2018-03-08 20:39:05 -08:00
Nikolay Kim 695c052c58
Merge pull request #115 from kingxsp/master
Add protobuf support
2018-03-08 18:59:18 -08:00
kingxsp 63634be542
Merge branch 'master' into master 2018-03-09 10:22:15 +08:00
Nikolay Kim f88f1c65b6 update tests 2018-03-08 18:19:46 -08:00
kingxsp a0b589eb96 Add protobuf support 2018-03-09 10:05:13 +08:00
Nikolay Kim ebdc983dfe optimize websocket stream 2018-03-08 17:19:50 -08:00
Nikolay Kim 395243a539 another attempt to fix cookie handling 2018-03-08 11:16:54 -08:00
Nikolay Kim 1ab676d7eb bump version and add some tests 2018-03-07 22:40:46 -08:00
Nikolay Kim 47f01e5b7e update doc string 2018-03-07 21:39:20 -08:00
Nikolay Kim ffb89935b6 update all features 2018-03-07 21:37:42 -08:00
Nikolay Kim 77a111b95c prepare release 2018-03-07 21:28:54 -08:00
Nikolay Kim 6c0fb3a7d2 handle panics in worker threads 2018-03-07 21:10:53 -08:00
Nikolay Kim 824244622f update test 2018-03-07 17:42:57 -08:00
Nikolay Kim 42d2a29b1d non-blocking processing for NamedFile 2018-03-07 17:40:13 -08:00
Nikolay Kim af8875f6ab sleep on accept socket error 2018-03-07 15:52:05 -08:00
Nikolay Kim 1db1ce1ca3 one more cookie handling fix 2018-03-07 15:41:46 -08:00
Nikolay Kim f55ef3a059 create default CpuPool 2018-03-07 14:56:53 -08:00
Nikolay Kim 67bf0ae79f fix HttpServer::listen method 2018-03-07 14:46:12 -08:00
Nikolay Kim b06cf32329
Merge pull request #114 from DancingBard/master
BoyScoutRule: Fixed typo
2018-03-07 13:07:10 -08:00
Thedancingbard 7cce29b633 BoyScoutRule: Fixed typo 2018-03-07 21:54:25 +01:00
Nikolay Kim c26d9545a5 map connector timeout error 2018-03-07 12:09:53 -08:00
Nikolay Kim b950d6997d add csrf link to readme 2018-03-07 11:31:02 -08:00
Nikolay Kim 0bf29a522b Allow to use std::net::TcpListener for HttpServer 2018-03-07 11:28:44 -08:00
Nikolay Kim 24342fb745
Merge pull request #113 from niklasf/csrf-upgrade
Let CSRF filter catch cross-site upgrades
2018-03-07 09:58:30 -08:00
Niklas Fiekas 0278e364ec add tests for csrf upgrade filter 2018-03-07 18:42:21 +01:00
Niklas Fiekas b9d6bbd357 filter cross-site upgrades in csrf middleware 2018-03-07 17:49:30 +01:00
Niklas Fiekas 5816ecd1bc fix variable name: cors -> csrf 2018-03-07 17:44:19 +01:00
Nikolay Kim 2ff55ee1c5
Update CHANGES.md 2018-03-07 06:14:44 -08:00
Nikolay Kim b42de6c41f
Merge pull request #111 from adwhit/cookie-handling
Fix client cookie handling
2018-03-07 06:13:02 -08:00
Nikolay Kim 9e0e081c90
Merge branch 'master' into cookie-handling 2018-03-07 06:12:37 -08:00
Nikolay Kim 178f5a104e
Merge pull request #110 from messense/feature/tools-actix
Use actix from crates.io in tools/wsload
2018-03-07 06:10:18 -08:00
Nikolay Kim 1e42f9575a
Merge branch 'master' into feature/tools-actix 2018-03-07 06:09:09 -08:00
Nikolay Kim 24dfcf1303
Merge pull request #109 from kingoflolz/master
make session an optional feature
2018-03-07 06:04:55 -08:00
Alex Whitney 6cc3aaef1b add client cookie handling test 2018-03-07 11:43:55 +00:00
messense 436a16a2c8
Use actix from crates.io in tools/wsload 2018-03-07 19:26:23 +08:00
Alex Whitney 9afad5885b fix client cookie handling 2018-03-07 09:48:34 +00:00
kindiana 04d0abb3c7 make session an optional feature 2018-03-07 15:38:58 +08:00
Nikolay Kim 1e5daa1de8 update changes 2018-03-06 23:04:18 -08:00
Nikolay Kim d3c859f9f3 bump version 2018-03-06 22:44:06 -08:00
Nikolay Kim c1419413aa Fix client cookie support 2018-03-06 22:36:34 -08:00
Nikolay Kim acd33cccbb add tls 2018-03-06 17:34:46 -08:00
Nikolay Kim 57a1d68f89 add client response timeout 2018-03-06 17:04:48 -08:00
Nikolay Kim 5c88441cd7
Merge pull request #108 from glademiller/feature/allow_connection_timeout_to_be_set
Allow connection timeout to be set
2018-03-06 15:18:31 -08:00
Nikolay Kim 6a3c5c4ce0
Merge branch 'master' into feature/allow_connection_timeout_to_be_set 2018-03-06 15:18:25 -08:00
Nikolay Kim 14a511bdad use IntoHeaderValue and Header for client request 2018-03-06 15:18:04 -08:00
Glade Miller e4ed53d691 Merge branch 'feature/allow_connection_timeout_to_be_set' of https://github.com/glademiller/actix-web into feature/allow_connection_timeout_to_be_set 2018-03-06 15:44:18 -07:00
Glade Miller 5bf4f3be8b Actix dependency needs to be updated to master 2018-03-06 15:43:56 -07:00
Glade Miller 6b9e51740b
Merge branch 'master' into feature/allow_connection_timeout_to_be_set 2018-03-06 15:28:31 -07:00
Glade Miller be7e8d159b Allow connection timeout to be set 2018-03-06 15:26:09 -07:00
Nikolay Kim ceb97cd6b9
Merge pull request #106 from niklasf/starting-url
give a url in the log when starting
2018-03-06 11:41:42 -08:00
Niklas Fiekas 85b650048d give a url in the log when starting 2018-03-06 20:37:18 +01:00
Nikolay Kim a0e6313d56 Fix compression #103 and #104 2018-03-06 11:02:03 -08:00
Nikolay Kim 9cc6f6b1e4
Merge pull request #102 from mockersf/gzip
add tests with large random bodies for gzip
2018-03-06 08:48:06 -08:00
Nikolay Kim 526753ee88 update tests for stable compiler 2018-03-06 07:56:43 -08:00
François Mockers 779e773185 add tests with large random bodies for gzip 2018-03-06 14:26:48 +01:00
Nikolay Kim 7eb310f8ce fix guide 2018-03-06 00:44:45 -08:00
Nikolay Kim d573cf2d97 Merge branch 'master' of github.com:actix/actix-web 2018-03-06 00:43:34 -08:00
Nikolay Kim 32b5544ad9 port hyper header 2018-03-06 00:43:25 -08:00
Nikolay Kim e182ed33b1 add Header trait 2018-03-05 19:28:42 -08:00
Nikolay Kim 6f1836f80e
Merge pull request #98 from flip111/patch-2
Update qs_14.md
2018-03-05 16:48:47 -08:00
flip111 5b530f11b5
Update qs_14.md
fix missing semicolon
2018-03-06 01:46:16 +01:00
Nikolay Kim 0c30057c8c move headers to separate module; allow custom HeaderValue conversion 2018-03-05 16:45:54 -08:00
Nikolay Kim 6078344ecc
Merge pull request #97 from flip111/patch-1
Update qs_14.md
2018-03-05 16:36:32 -08:00
flip111 67f5a949a4
Update qs_14.md
fix syntax error on use statement
2018-03-06 01:35:41 +01:00
Nikolay Kim 05e49e893e allow only GET and HEAD for NamedFile 2018-03-05 14:04:30 -08:00
Nikolay Kim c8844425ad Enable compression support for NamedFile 2018-03-05 13:31:30 -08:00
Nikolay Kim b282ec106e Add ResponseError impl for SendRequestError 2018-03-05 13:02:31 -08:00
Nikolay Kim ea2a8f6908 add http proxy example 2018-03-05 11:12:19 -08:00
Nikolay Kim 2b942ec5f2 add uds example readme 2018-03-05 09:47:17 -08:00
Nikolay Kim bf77be0337
Merge pull request #95 from messense/feature/unix-socket-example
Add unix domain socket example
2018-03-05 09:37:00 -08:00
messense c2741054bb
Add unix domain socket example 2018-03-05 22:14:25 +08:00
Nikolay Kim e708f51156 prep release 2018-03-04 20:28:06 -08:00
Nikolay Kim cbb821148b explicitly set tcp nodelay 2018-03-04 20:14:58 -08:00
Nikolay Kim d6b021e185
Merge pull request #94 from messense/feature/str-repeat
Use str::repeat
2018-03-04 19:57:49 -08:00
messense 0adb7e8553
Use str::repeat 2018-03-05 09:54:58 +08:00
Nikolay Kim dbfa1f0ac8 fix example 2018-03-04 10:44:41 -08:00
Nikolay Kim 11347e3c7d Allow to use Arc<Vec<u8>> as response/request body 2018-03-04 10:33:18 -08:00
Nikolay Kim 631fe72a46 websockets text() is more generic 2018-03-04 10:18:42 -08:00
Nikolay Kim f673dba759 Fix handling of requests with an encoded body with a length > 8192 #93 2018-03-04 09:48:34 -08:00
Nikolay Kim ab978a18ff unix only test 2018-03-03 18:50:00 -08:00
Nikolay Kim 327df159c6 prepare release 2018-03-03 18:46:22 -08:00
Nikolay Kim 2ccbd5fa18 fix socket polling 2018-03-03 12:17:26 -08:00
Nikolay Kim 058630d041 simplify channels list management 2018-03-03 11:16:55 -08:00
Nikolay Kim f456be0309 simplify linked nodes 2018-03-03 10:06:13 -08:00
Nikolay Kim 9bd6cb03ac Merge branch 'master' of github.com:actix/actix-web 2018-03-03 09:29:46 -08:00
Nikolay Kim 16afeda79c update changes 2018-03-03 09:29:36 -08:00
Nikolay Kim 83fcdfd91f fix potential bug in payload processing 2018-03-03 09:27:54 -08:00
Nikolay Kim 8f94ae41cc
Merge pull request #90 from rvlzzr/master
move reuse_address before bind
2018-03-02 23:08:33 -08:00
Anti Revoluzzer 4e41347de8 move reuse_address before bind 2018-03-02 22:57:11 -08:00
Nikolay Kim 6acb6dd4e7 set release date 2018-03-02 22:31:58 -08:00
Nikolay Kim 791a980e2d update tests 2018-03-02 22:08:56 -08:00
Nikolay Kim c2d8abcee7 Fix disconnect on idle connections 2018-03-02 20:47:23 -08:00
Nikolay Kim 16c05f07ba make HttpRequest::match_info_mut() public 2018-03-02 20:40:08 -08:00
Nikolay Kim 2158ad29ee add Pattern::with_prefix, make it usable outside of actix 2018-03-02 20:39:22 -08:00
Nikolay Kim feba5aeffd bump version 2018-03-02 14:31:23 -08:00
Nikolay Kim 343888017e
Update CHANGES.md 2018-03-02 12:26:31 -08:00
Nikolay Kim 3a5d445b2f
Merge pull request #89 from niklasf/csrf-middleware
add csrf filter middleware
2018-03-02 12:25:23 -08:00
Nikolay Kim e60acb7607
Merge branch 'master' into csrf-middleware 2018-03-02 12:25:05 -08:00
Nikolay Kim bebfc6c9b5 sleep for test 2018-03-02 11:32:37 -08:00
Nikolay Kim 3b2928a391 Better naming for websockets implementation 2018-03-02 11:29:55 -08:00
Niklas Fiekas 10f57dac31 add csrf filter middleware 2018-03-02 20:13:43 +01:00
Nikolay Kim b640b49b05 adjust low buf size 2018-03-01 20:13:50 -08:00
Nikolay Kim 1fea4bd9a6 prepare release 2018-03-01 20:01:25 -08:00
Nikolay Kim 206c4e581a rename httpcodes 2018-03-01 19:12:59 -08:00
Nikolay Kim 4e13505b92 rename .p to a .filter 2018-03-01 18:42:50 -08:00
Nikolay Kim 5b6d7cddbf Fix payload parse in situation when socket data is not ready 2018-03-01 18:27:04 -08:00
Nikolay Kim 4aaf9f08f8 update readme 2018-02-28 22:31:54 -08:00
Nikolay Kim b0ba23ff55
Merge pull request #88 from rofrol/patch-2
be consistent with host - had CORS preflight once
2018-02-28 17:07:57 -08:00
Nikolay Kim 42b19b1819
Merge branch 'master' into patch-2 2018-02-28 17:07:44 -08:00
Nikolay Kim 0335fde3f9
Update README.md 2018-02-28 16:58:05 -08:00
Roman Frołow f27edbff89
be consistent with host - had CORS preflight once 2018-03-01 01:01:27 +01:00
Nikolay Kim d62d6e68e0 use new version of http crate 2018-02-28 14:16:55 -08:00
Nikolay Kim 1284264511
Update CHANGES.md 2018-02-28 12:35:16 -08:00
Nikolay Kim d977fe563b
Merge pull request #87 from adwhit/fix-session-set
fix session mut borrow lifetime
2018-02-28 12:34:46 -08:00
Alex Whitney bb68f9dd90 add session borrow fix to changes 2018-02-28 19:52:53 +00:00
Alex Whitney 313396d9b5 fix session mut borrow lifetime 2018-02-28 19:35:26 +00:00
Nikolay Kim 171a23561e export Drain 2018-02-28 11:10:54 -08:00
Nikolay Kim 67f33a4760 add redis session example 2018-02-28 10:26:40 -08:00
Nikolay Kim 764421fe44 update categories 2018-02-27 23:51:57 -08:00
Nikolay Kim b339ea0a3a update versions in guide 2018-02-27 23:31:43 -08:00
Nikolay Kim 8994732227 doc strings 2018-02-27 23:30:26 -08:00
Nikolay Kim 7591592279 fix handle big data chunkd for parsing 2018-02-27 23:04:57 -08:00
Nikolay Kim 4a48b43927 big value 2018-02-27 21:49:08 -08:00
Nikolay Kim b1ad4763a2 check juniper example 2018-02-27 21:23:41 -08:00
Nikolay Kim 2f3a2115c0
Merge pull request #86 from pyros2097/master
add juniper example
2018-02-27 21:21:52 -08:00
pyros2097 1283c00583 add juniper example 2018-02-28 10:41:24 +05:30
Nikolay Kim 9f81eae215 build docs on nightly 2018-02-27 21:04:22 -08:00
Nikolay Kim ccb6ebb259 headers test 2018-02-27 20:49:53 -08:00
Nikolay Kim da76de76f0 upgrade sha crate 2018-02-27 20:32:51 -08:00
Nikolay Kim c316a99746 stop server test 2018-02-27 20:04:01 -08:00
Nikolay Kim 1e2aa4fc90 mark context as modified after writing data 2018-02-27 18:05:06 -08:00
Nikolay Kim e2c8f17c2c drop connection if handler get dropped without consuming payload 2018-02-27 16:08:57 -08:00
Nikolay Kim 9b06eac720 Merge branch 'master' of github.com:actix/actix-web 2018-02-27 15:41:53 -08:00
Nikolay Kim 4f99cd1580 add ws error tracing 2018-02-27 15:38:57 -08:00
Nikolay Kim f56fa49a9b
Merge pull request #84 from mpaltun/patch-1
Fix typos in README
2018-02-27 15:18:16 -08:00
Nikolay Kim 1f063e4136 move with_connector method to ClientRequestBuilder 2018-02-27 15:14:33 -08:00
Mustafa Paltun 33c935dccc
Fix typos in README 2018-02-28 01:13:59 +02:00
Nikolay Kim a7bf635158 unify headers and body processing for client response and server request 2018-02-27 15:03:28 -08:00
Nikolay Kim aac9b5a97c update readme 2018-02-27 12:49:11 -08:00
Nikolay Kim 6c480fae90 added HttpRequest::encoding() method; fix urlencoded parsing with charset 2018-02-27 11:31:54 -08:00
Nikolay Kim 5dcb558f50 refactor websockets handling 2018-02-27 10:09:24 -08:00
Nikolay Kim a344c3a02e remove read buffer management api 2018-02-26 20:07:22 -08:00
Nikolay Kim 0ab8bc11f3 fix guide example 2018-02-26 16:41:57 -08:00
Nikolay Kim abae65a49e remove unused code 2018-02-26 16:11:00 -08:00
Nikolay Kim d6fd4a3524 use buffer capacity; remove unused imports 2018-02-26 15:34:25 -08:00
Nikolay Kim 72aa2d9eae clippy warnings 2018-02-26 14:33:56 -08:00
Nikolay Kim 644f1a9518 refactor ws frame parser 2018-02-26 13:58:23 -08:00
Nikolay Kim 56ae565688 fix guide examples 2018-02-26 08:02:58 -08:00
Nikolay Kim 0a3b776aa7 refactor multipart stream 2018-02-26 06:00:54 +03:00
Nikolay Kim 6ef9c60361 add Read and AsyncRead impl to HttpRequest 2018-02-25 21:26:58 +03:00
Nikolay Kim a2b98b31e8 refactor payload related futures for HttpRequest 2018-02-25 20:34:26 +03:00
Nikolay Kim ab5ed27bf1 refactor and simplify content encoding 2018-02-25 11:43:00 +03:00
Nikolay Kim 141b992450 Make payload and httprequest a stream 2018-02-25 11:21:45 +03:00
Nikolay Kim 4e41e13baf refactor client payload processing 2018-02-25 11:18:17 +03:00
Nikolay Kim ea8e8e75a2 fix websocket example 2018-02-24 08:41:58 +03:00
Nikolay Kim a855c8b2c9 better ergonomics for WsClient::client() 2018-02-24 08:14:21 +03:00
Nikolay Kim fd31eb74c5 better ergonomics for ws client 2018-02-24 07:36:50 +03:00
Nikolay Kim 3b22b1b168
Merge pull request #78 from pyros2097/master
Fix websocket example path
2018-02-23 01:47:40 -08:00
Nikolay Kim 7a7df7f8fb
Merge branch 'master' into master 2018-02-23 01:47:30 -08:00
Nikolay Kim 25aabfb3e2 fix big ws frames 2018-02-23 10:45:33 +01:00
pyros2097 3a3657cfaf
Update qs_9.md 2018-02-23 12:39:19 +05:30
Nikolay Kim aff43cc8b8 fix routes registration order 2018-02-22 05:48:18 -08:00
Nikolay Kim 4a9c1ae894 allow to use Connection for sending client request 2018-02-21 22:53:23 -08:00
Nikolay Kim 4a07430e8e remove RegexSet mention 2018-02-21 22:04:59 -08:00
Nikolay Kim 9a076c69d1 update route matching guide section 2018-02-21 22:00:22 -08:00
Nikolay Kim 8f2d3a0a76 fix NormalizePath helper 2018-02-21 14:53:42 -08:00
Nikolay Kim d4611f8bb9 Merge branch 'master' of github.com:actix/actix-web 2018-02-21 14:31:31 -08:00
Nikolay Kim fd56e5dc82 do not use regset for route recognition 2018-02-21 14:31:22 -08:00
Nikolay Kim 7c74259453
Merge pull request #77 from rofrol/patch-1
could used -> could be used, latest actix sync
2018-02-21 10:00:08 -08:00
Roman Frołow 6a01af32bc
could used -> could be used, latest actix sync 2018-02-21 18:59:00 +01:00
Nikolay Kim 5634e5794f more tests for NormalizePath helper 2018-02-20 13:03:21 -08:00
Nikolay Kim 187644e178 update logger doc string 2018-02-20 12:53:51 -08:00
Nikolay Kim 7198dde465 add logger info 2018-02-20 12:49:42 -08:00
Nikolay Kim 2374aa42ed set date header for client requests 2018-02-19 23:18:18 -08:00
Nikolay Kim 03912d2089 support client request's async body 2018-02-19 22:48:27 -08:00
Nikolay Kim 3f95cce9e8 allow to pass different binary data 2018-02-19 20:03:57 -08:00
Nikolay Kim 979cea03ac added TestRequest::set_payload() 2018-02-19 20:01:38 -08:00
Nikolay Kim 6424defee6 code coverage on 1.21 2018-02-19 17:32:22 -08:00
Nikolay Kim 6ee14efbe2 optimize http message serialization 2018-02-19 17:21:04 -08:00
Nikolay Kim 4d81186059 escape router pattern re 2018-02-19 14:57:57 -08:00
Nikolay Kim ddc82395e8 try to remove trailing slash for normalize path handler 2018-02-19 14:27:36 -08:00
Nikolay Kim 360ffbba68 clone router with httprequest 2018-02-19 14:26:51 -08:00
Nikolay Kim f2f1798215 allow to send request using custom connector 2018-02-19 13:41:21 -08:00
Nikolay Kim 548f4e4d62 replace reqwest with actix::client 2018-02-19 13:18:18 -08:00
Nikolay Kim cb70d5ec3d refactor http client 2018-02-19 03:11:11 -08:00
Nikolay Kim edd114f6e4 allow to set default content encoding on application level 2018-02-18 22:23:17 -08:00
Nikolay Kim 816c6fb0e0 log 5xx responses as error 2018-02-18 09:57:57 -08:00
Nikolay Kim 0da382a7a4 use actix 0.5 release 2018-02-17 13:33:38 -08:00
Nikolay Kim 3e3d3279b8 deregister server socket on shutdown 2018-02-16 09:42:15 -08:00
Nikolay Kim 3c95823e53 add r2d2 example 2018-02-15 23:05:10 -08:00
Nikolay Kim 8607c51bcf do not stop accept thread on error 2018-02-15 22:02:03 -08:00
Nikolay Kim 080bb3e5ae disable dead code link 2018-02-15 16:25:43 -08:00
Nikolay Kim d31e71a169 update examples 2018-02-15 13:59:25 -08:00
Nikolay Kim 7b0e1642b6
add techempower benchmark link 2018-02-15 09:53:09 -08:00
Nikolay Kim 096dee519c
Merge pull request #71 from rbtcollins/patch-1
Wait for spawned thread
2018-02-13 14:58:11 -08:00
Nikolay Kim 8bce3b9d10
Merge branch 'master' into patch-1 2018-02-13 14:57:59 -08:00
Robert Collins b28ecbcf0c
Update qs_2.md 2018-02-14 10:37:12 +13:00
Nikolay Kim 8f9ec5c23c fix doc test 2018-02-13 07:50:49 -08:00
Nikolay Kim 96b87761d1 update examples 2018-02-12 23:13:06 -08:00
Nikolay Kim b1eec3131f use newer api 2018-02-12 22:56:47 -08:00
Nikolay Kim a544034c06 use Recipient 2018-02-12 22:09:31 -08:00
Christopher Armstrong 4b8181476c
consistently use #[cause] and display causing errors (#73) 2018-02-12 23:55:44 -06:00
Nikolay Kim eb041de36d update examples 2018-02-12 19:15:39 -08:00
Nikolay Kim 80285f2a32 fix doc test 2018-02-12 18:38:13 -08:00
Nikolay Kim de869ed879
Merge pull request #72 from rbtcollins/patch-2
Use AtomicUsize properly
2018-02-12 17:46:03 -08:00
Nikolay Kim 7ccacb92ce update websocket-chat example 2018-02-12 17:42:10 -08:00
Robert Collins 57655d8153
Use AtomicUsize properly
doing a read+write on an atomic int will lose updates from other threads.
2018-02-13 13:47:59 +13:00
Nikolay Kim 335ca8ff33 use new actix api 2018-02-12 16:08:04 -08:00
Nikolay Kim 720d8c36c1 update names 2018-02-12 12:45:08 -08:00
Nikolay Kim 8c1b5fa945 sync with latest actix 2018-02-12 12:17:30 -08:00
Robert Collins 232aba2080
Wait for spawned thread
A spawned thread doesn't block the main thread exiting unless explicitly joined.
The demo as written in the guide simply exits immediately at the moment.
2018-02-12 23:52:03 +13:00
Nikolay Kim 30bdf9cb5e update actix api 2018-02-12 01:13:06 -08:00
Nikolay Kim 285c66e7d8 build docs for apln and tls features 2018-02-10 11:39:12 -08:00
Nikolay Kim 856055c6ca simplify HttpServer::start_tls() method 2018-02-10 11:34:54 -08:00
Nikolay Kim e3081306da update doc string 2018-02-10 11:29:40 -08:00
Nikolay Kim 94c4053cb5 more HttpServer type simplification 2018-02-10 11:01:54 -08:00
Nikolay Kim 762961b0f4 simplify HttpServer type definition 2018-02-10 10:22:03 -08:00
Nikolay Kim 3109f9be62 special handling for upgraded pipeline 2018-02-10 00:05:20 -08:00
Nikolay Kim 2d049e4a9f update example 2018-02-09 22:46:34 -08:00
Nikolay Kim 0c98775b51 refactor h1 stream polling 2018-02-09 22:26:48 -08:00
Nikolay Kim b4b5c78b51 optimize ws frame generation 2018-02-09 20:43:14 -08:00
Nikolay Kim 78da98a16d add wsload tool; optimize ws frame parser 2018-02-09 17:20:28 -08:00
Nikolay Kim 74377ef73d fix back pressure for h1 import stream 2018-02-09 16:20:10 -08:00
Nikolay Kim 728377a447 fix example 2018-02-08 20:55:34 -08:00
Nikolay Kim 73ed1342eb more actix compatibility 2018-02-08 17:13:56 -08:00
Nikolay Kim bc6300be34 actix compatibility 2018-02-08 17:08:57 -08:00
Nikolay Kim 2faf3a5eb6 fix deprecation warnings, update actix 2018-02-08 17:00:22 -08:00
Nikolay Kim 6181a84d7b update websocket-chat example 2018-02-08 14:03:41 -08:00
Christopher Armstrong f8f99ec0c7
Disable signals in HttpServers started by the tests. (#69)
Something is wrong with signals on windows.
This change causes the unit tests to pass on Windows.
2018-02-08 14:55:47 -06:00
Christopher Armstrong bd03ba1192
Update most examples to use actix from git (#68) 2018-02-08 00:08:36 -06:00
Nikolay Kim d0cbf7cd25 upgrade trust-dns-resolver 2018-02-07 14:58:08 -08:00
Nikolay Kim 93aa220e8d remove default impl for std error, it prevents use of Fail 2018-02-07 13:57:58 -08:00
Christopher Armstrong 81e4fb9353
Avoid using Path to calculate URIs, because it doesn't do the right thing on Windows (#67)
Redirecting to index files now always uses `/` instead of backslash on windows.
2018-02-07 15:31:09 -06:00
Christopher Armstrong 884ea02f5c
Allow returning failure::Error from handlers (#65)
This implements From<failure::Error> for Error (by way of `failure::Compat`)
and ResponseError for failure::Compat<T>.
2018-02-06 10:26:50 -06:00
Nikolay Kim b6d5516e3a remove rust_backtrace for appveyor 2018-02-04 10:48:16 -08:00
Nikolay Kim 46841cc87e update config for appveyor 2018-02-04 10:31:39 -08:00
Nikolay Kim 7ad66956b2 add HttpRequest::uri_mut(), allows to modify request uri 2018-02-03 08:31:32 -08:00
Nikolay Kim d568161852 update websocket-chat example 2018-02-03 08:25:31 -08:00
Nikolay Kim 671ab35cf6 re enable 1.21 2018-02-02 21:32:43 -08:00
Nikolay Kim c63ad4b6f1 appveyor cfg 2018-02-02 21:31:16 -08:00
Nikolay Kim eb713bd60e update actix version 2018-02-01 01:08:08 -08:00
Nikolay Kim 2b74fbf586 fix websocket example 2018-01-31 13:18:30 -08:00
Nikolay Kim 58f85658bd update actix 2018-01-31 12:57:02 -08:00
Nikolay Kim 7e9fbfca72 missing http codes 2018-01-31 12:34:58 -08:00
Nikolay Kim 5115384501
Merge pull request #64 from andreevlex/fix-2
spelling check
2018-01-31 10:54:05 -08:00
Alexander Andreev a1b96b1cf4 return "chnked" value 2018-01-31 21:37:12 +03:00
Alexander Andreev a565e71018 spelling check 2018-01-31 20:28:53 +03:00
Nikolay Kim e41b175e3d
Update README.md 2018-01-31 06:40:00 -08:00
Nikolay Kim db39f122be
Update README.md 2018-01-31 06:37:37 -08:00
Nikolay Kim afd2dc4666
Update README.md 2018-01-31 06:36:15 -08:00
Nikolay Kim cba7e426a5
Update README.md 2018-01-31 06:35:47 -08:00
Nikolay Kim 01e7cc9620
Update README.md 2018-01-31 06:34:50 -08:00
Nikolay Kim 5a5497b745 add close ws test 2018-01-30 16:04:04 -08:00
Nikolay Kim b698e3546b link to websocket example 2018-01-30 15:26:58 -08:00
Nikolay Kim e99a5e8144 drop local actix ref 2018-01-30 15:19:30 -08:00
Nikolay Kim 577f91206c added support for websocket testing 2018-01-30 15:13:33 -08:00
Nikolay Kim 76f9542df7 rename module 2018-01-30 13:04:52 -08:00
Nikolay Kim 9739168d48 fix limit usage for Request/Response Body future 2018-01-30 12:44:14 -08:00
Nikolay Kim 5cbaf3a1b8 add client ssl support 2018-01-30 11:17:17 -08:00
Nikolay Kim a02e0dfab6 initial work on client connector 2018-01-29 23:01:20 -08:00
Nikolay Kim 5cc3bba5cc change ws client names 2018-01-29 15:45:37 -08:00
Nikolay Kim 6e51573975 app veyor config 2018-01-29 14:51:34 -08:00
Nikolay Kim b686f39d0b complete impl for client request and response 2018-01-29 14:44:25 -08:00
Nikolay Kim 6416a796c3 add ClientRequest and ClientRequestBuilder 2018-01-29 11:45:33 -08:00
Nikolay Kim b6a394a113 added StaticFiles::inex_file config 2018-01-29 03:23:45 -08:00
Nikolay Kim 456fd1364a add handle method to contexts 2018-01-28 09:47:46 -08:00
Nikolay Kim f3cce6a04c update websocket example 2018-01-28 09:07:12 -08:00
Nikolay Kim 9835a4537a update websocket example 2018-01-28 08:58:18 -08:00
Nikolay Kim 715ec4ae2f update actix 2018-01-28 08:26:36 -08:00
Nikolay Kim 55b2fb7f77 update example 2018-01-28 01:04:58 -08:00
Nikolay Kim 7c7743c145 use right path 2018-01-27 22:52:17 -08:00
Nikolay Kim 826fc62299 disable websocket-chat example 2018-01-27 22:44:50 -08:00
Nikolay Kim 5dd2e7523d basic websocket client 2018-01-27 22:03:03 -08:00
Nikolay Kim 4821d51167 fix actix compatibility 2018-01-27 11:15:03 -08:00
Nikolay Kim c446be48e3 min rust version 1.21 2018-01-27 10:58:09 -08:00
Nikolay Kim 042f8391bb Merge branch 'master' of github.com:actix/actix-web 2018-01-27 10:05:07 -08:00
Nikolay Kim d4bc3294a3 actix compatibility 2018-01-27 10:04:56 -08:00
Nikolay Kim 04d53d6f57
Merge pull request #59 from andreevlex/fix-cors
spelling check cors example
2018-01-26 21:42:36 -08:00
Alexander Andreev 881e0e0346 spelling check 2018-01-27 08:38:17 +03:00
Nikolay Kim b9f8a00ba3 update cors example readme 2018-01-26 19:56:34 -08:00
Nikolay Kim 99bed67bec rename cors example 2018-01-26 19:52:20 -08:00
Nikolay Kim 52a454800f cleanup cors example 2018-01-26 19:51:13 -08:00
Nikolay Kim c09c8e4980
Merge pull request #58 from krircc/master
add actix-web-cors example
2018-01-26 19:43:40 -08:00
Nikolay Kim b931dda1fe
Merge branch 'master' into master 2018-01-26 19:42:06 -08:00
krircc 74166b4834 add actix-web-cors example 2018-01-27 11:00:26 +08:00
Nikolay Kim 4abb769ee5 fix request json loader; mime_type() method 2018-01-25 21:50:28 -08:00
Nikolay Kim e8e2ca1526 refactor alpn support; upgrade openssl to 0.10 2018-01-25 10:24:04 -08:00
Nikolay Kim 78967dea13 stop http context immediately 2018-01-24 20:17:14 -08:00
Nikolay Kim 58a5d493b7 re-eanble write backpressure for h1 connections 2018-01-24 20:12:49 -08:00
Nikolay Kim c5341017cd fix typo 2018-01-23 15:39:53 -08:00
Nikolay Kim f4873fcdee stop websocket context 2018-01-23 15:35:39 -08:00
Nikolay Kim 35efd017bb impl waiting for HttpContext 2018-01-23 09:42:04 -08:00
Nikolay Kim fb76c490c6 mention tokio handle in guide 2018-01-22 20:10:05 -08:00
Nikolay Kim 3653c78e92 check example on stable 2018-01-22 19:49:19 -08:00
Nikolay Kim 1053c44326 pin new actix version 2018-01-22 17:01:54 -08:00
Nikolay Kim e6ea177181 impl WebsocketContext::waiting() method 2018-01-22 16:55:50 -08:00
Nikolay Kim 1957469061 code of conduct 2018-01-21 15:29:02 -08:00
Nikolay Kim 2227120ae0 exclude examples 2018-01-21 09:09:19 -08:00
Nikolay Kim 21c8c0371d travis config 2018-01-21 08:50:29 -08:00
Nikolay Kim 1914a6a0d8 Always enable content encoding if encoding explicitly selected 2018-01-21 08:31:46 -08:00
Nikolay Kim 1cff4619e7 reduce threshold for content encoding 2018-01-21 08:12:32 -08:00
Nikolay Kim 7bb7adf89c relax InternalError constraints 2018-01-20 22:02:42 -08:00
Nikolay Kim f55ff24925 fix guide example 2018-01-20 21:40:18 -08:00
Nikolay Kim f5f78d79e6 update doc strings 2018-01-20 21:16:31 -08:00
Nikolay Kim 9180625dfd refactor helper error types 2018-01-20 21:11:46 -08:00
Nikolay Kim 552320bae2 add error logging guide section 2018-01-20 20:21:01 -08:00
Nikolay Kim 7cf221f767 Log request processing errors 2018-01-20 20:12:24 -08:00
Nikolay Kim 98931a8623 test case for broken transfer encoding 2018-01-20 16:51:18 -08:00
Nikolay Kim ae10a89014 use ws masking from tungstenite project 2018-01-20 16:47:34 -08:00
Nikolay Kim 71d534dadb CORS middleware: allowed_headers is defaulting to None #50 2018-01-20 16:36:57 -08:00
Nikolay Kim 867bb1d409 Merge branch 'master' of github.com:actix/actix-web 2018-01-20 16:12:51 -08:00
Nikolay Kim 91c44a1cf1 Fix HEAD requests handling 2018-01-20 16:12:38 -08:00
Nikolay Kim 3bc60a8d5d
Merge pull request #53 from andreevlex/spelling-check-2
spelling check
2018-01-16 12:07:58 -08:00
Alexander Andreev 58df8fa4b9 spelling check 2018-01-16 21:59:33 +03:00
Nikolay Kim 81f92b43e5
Merge pull request #52 from andreevlex/spelling-check
spelling check
2018-01-15 14:16:54 -08:00
Alexander Andreev e1d9c3803b spelling check 2018-01-16 00:47:25 +03:00
Nikolay Kim a7c24aace1 flush is useless 2018-01-14 19:28:34 -08:00
Nikolay Kim 89a89e7b18 refactor shared bytes api 2018-01-14 17:00:28 -08:00
Nikolay Kim 3425f7be40 fix tests 2018-01-14 14:58:58 -08:00
Nikolay Kim 09a6f8a34f disable alpn feature 2018-01-14 14:44:32 -08:00
Nikolay Kim 7060f298b4 use more binary 2018-01-14 14:40:39 -08:00
Nikolay Kim 33dbe15760 use Binary for writer trait 2018-01-14 13:50:38 -08:00
Nikolay Kim e95c7dfc29 use local actix-web for examples 2018-01-13 19:04:07 -08:00
Nikolay Kim 927a92fcac impl HttpHandler for Box<HttpHandler> and add helper method Application::boxed() #49 2018-01-13 18:58:17 -08:00
Nikolay Kim 2b0f3d2a9a prepare release 2018-01-13 16:57:01 -08:00
Nikolay Kim 93fdb596d4 Allow to explicitly disable chunked encoding 2018-01-13 16:17:33 -08:00
Nikolay Kim 305666067e Do not enable chunked encoding for HTTP/1.0 2018-01-13 12:46:43 -08:00
Nikolay Kim b805d87ee7 no need for custom cookie module 2018-01-13 11:33:42 -08:00
Nikolay Kim bc6bb9984f user guide spelling 2018-01-13 11:17:48 -08:00
Nikolay Kim c043fd7912
Merge pull request #47 from belltoy/master
fix directory entry path
2018-01-13 11:16:53 -08:00
belltoy 781282897a fix directory entry path 2018-01-13 08:37:27 +00:00
Nikolay Kim a9c71b2894 add link to cors middleware 2018-01-12 13:10:12 -08:00
Nikolay Kim edd26837dd update dependency specs in user guide 2018-01-12 12:54:57 -08:00
Nikolay Kim 3105bca13b use cookie-rs released create 2018-01-12 12:32:54 -08:00
Nikolay Kim c470e7a02b use flate2 released crate 2018-01-12 12:31:33 -08:00
Nikolay Kim 8a96e8fdd0 disable compression for static files 2018-01-11 23:49:53 -08:00
Nikolay Kim e919ec485e cleanup http channel 2018-01-11 22:06:06 -08:00
Nikolay Kim e482b88741 refactor http protocol selection procedure 2018-01-11 21:48:36 -08:00
Nikolay Kim eb8052b936 fix cors tests 2018-01-11 20:20:50 -08:00
Nikolay Kim dab918261c fix cors allowed header validation 2018-01-11 20:11:34 -08:00
Nikolay Kim 11342e4566 add link to gitter 2018-01-11 18:49:30 -08:00
Nikolay Kim f7b895b53a add link to github 2018-01-11 18:47:34 -08:00
Nikolay Kim ac89880c0a move encoding to server 2018-01-11 18:41:33 -08:00
Nikolay Kim 8a058efb4e move server protocol impl to submodule 2018-01-11 18:35:05 -08:00
Nikolay Kim fa93701bee upgrade packages 2018-01-11 16:47:55 -08:00
Nikolay Kim 0707dfe5bb flush stream on drain 2018-01-11 16:22:27 -08:00
Nikolay Kim 0a41ecd01d disable test 2018-01-11 15:38:57 -08:00
Nikolay Kim 0648ad6f33 fix implicit chunked encoding 2018-01-11 15:26:46 -08:00
Nikolay Kim 728d4f1f57 clean cargo before running skeptic tests 2018-01-11 11:39:17 -08:00
Nikolay Kim d152860fa7 add Cors::register method 2018-01-11 11:14:18 -08:00
Nikolay Kim 43f14224b1 properly enable encoding tests 2018-01-10 22:42:26 -08:00
Nikolay Kim f7d9b45e64 travis config 2018-01-10 21:49:23 -08:00
Nikolay Kim 448b73a4b5 encoding tests 2018-01-10 21:47:30 -08:00
Nikolay Kim 1a31554ee6 travis config 2018-01-10 21:02:28 -08:00
Nikolay Kim 49cdddf479 upgrade flate package 2018-01-10 20:28:06 -08:00
Nikolay Kim aed90ed458 rename payload 2018-01-10 20:08:13 -08:00
Nikolay Kim e0faf3f69c refactor pipeline impl 2018-01-10 16:45:57 -08:00
Nikolay Kim f7807e43d8 cleanup Binary type; more cors tests 2018-01-10 15:28:33 -08:00
Nikolay Kim fee54d1de0 tests for cors response 2018-01-10 14:56:45 -08:00
Nikolay Kim 1445cc7a2c test for cors 2018-01-10 14:21:48 -08:00
Nikolay Kim 16e9512457 better names for cors errors 2018-01-10 14:20:00 -08:00
Nikolay Kim 615db0d9d8 complete cors implementation 2018-01-10 13:41:33 -08:00
Nikolay Kim 3f3dcf413b move websocket code to submodule 2018-01-10 11:13:29 -08:00
Nikolay Kim d85081b64e update websocket examples 2018-01-10 10:40:14 -08:00
Nikolay Kim 4b72a1b325 create custom WebsocketContext for websocket connection 2018-01-10 10:12:34 -08:00
Nikolay Kim 8aae2daafa update example 2018-01-10 07:55:25 -08:00
Nikolay Kim d7f59ce481 add cors preflight request support 2018-01-09 23:55:42 -08:00
Nikolay Kim ce78f17a79 refactor Middleware trait, use Result 2018-01-09 22:48:35 -08:00
Nikolay Kim 16310a5ebd initial work on cors middleware 2018-01-09 22:33:51 -08:00
Nikolay Kim e8412672a2 add resource level middlewares support 2018-01-09 20:00:18 -08:00
Nikolay Kim 6c7dda495b add very simple http/2 test 2018-01-09 12:49:46 -08:00
Nikolay Kim 584d0c9e99 Merge branch 'master' of github.com:actix/actix-web 2018-01-09 10:08:14 -08:00
Nikolay Kim a159a9cd6e cleanup doc tests 2018-01-09 10:08:06 -08:00
Nikolay Kim 9d4e926302
Merge pull request #45 from ami44/master
fix url
2018-01-08 11:33:36 -08:00
ami44 41c94a1220 fix url 2018-01-08 19:10:47 +01:00
Nikolay Kim c7798ef45d update examples 2018-01-07 19:40:42 -08:00
Nikolay Kim d696c1692e Merge branch 'master' of github.com:actix/actix-web 2018-01-07 19:10:55 -08:00
Nikolay Kim f90bc0caae do no stop on write_eof 2018-01-07 19:10:42 -08:00
Nikolay Kim f802fe09e6 fix context poll 2018-01-07 17:13:49 -08:00
Nikolay Kim 513fcd4a47
Update README.md 2018-01-07 08:33:06 -08:00
Nikolay Kim c28d052d22
Merge pull request #44 from krircc/master
IT's not true, actix-web are more features than other rust web frameworks
2018-01-07 08:32:08 -08:00
Nikolay Kim 550f68ca05
Merge branch 'master' into master 2018-01-07 08:31:57 -08:00
Nikolay Kim 3074071d03
Merge branch 'master' into master 2018-01-07 08:31:31 -08:00
Nikolay Kim 3ffefb8b29
Merge pull request #42 from ami44/master
upd examples basics
2018-01-07 08:30:42 -08:00
Ami44 3cf2fbbb23
Merge branch 'master' into master 2018-01-07 12:00:24 +01:00
Nikolay Kim 896981cdf8 update examples 2018-01-06 23:22:10 -08:00
Nikolay Kim 71da72efdb use general context impl 2018-01-06 22:59:39 -08:00
krircc 5e9b94a6dd
Update README.md 2018-01-07 11:07:51 +08:00
ami44 665f4edf6b upd examples basics 2018-01-06 16:43:59 +01:00
Nikolay Kim 247c23c1ea no need for StreamHandler 2018-01-06 01:06:35 -08:00
Nikolay Kim 3ed9e872ad subscriber to os signals automatically 2018-01-05 16:32:36 -08:00
Nikolay Kim 473ec38439 use dev cookies package as temp solution for ring problem 2018-01-05 14:50:33 -08:00
Nikolay Kim 524493e0b0 pin nightly 2018-01-05 14:29:40 -08:00
Nikolay Kim 5ae646332e update example to use actix 0.4 2018-01-05 14:01:19 -08:00
Nikolay Kim 5ff35f5b99 upgrade to actix 0.4 2018-01-05 13:30:21 -08:00
Nikolay Kim dea354d6d8 fix basic example in guide 2018-01-04 16:21:18 -08:00
Nikolay Kim 20d5c61c11 set nodelay for streams 2018-01-04 09:32:47 -08:00
Nikolay Kim 91230afc44 fix time calculations 2018-01-04 09:32:33 -08:00
Nikolay Kim afeffe4b19 encode returns result 2018-01-04 09:32:15 -08:00
Nikolay Kim fdf7726831 update changelog 2018-01-03 23:59:12 -08:00
Nikolay Kim 9559f6a175 introduce IoStream trait for low level stream operations 2018-01-03 23:41:55 -08:00
Nikolay Kim 1f7aee23df shutdown io streams before exit 2018-01-03 22:43:44 -08:00
Nikolay Kim bf11bfed8e use explicit actix:: mod 2018-01-03 19:11:40 -08:00
Nikolay Kim e439d0546b * fix force_close
* shutdown io before exit

* fix response creation with body from pool
2018-01-03 18:21:34 -08:00
Nikolay Kim 8348c830e2 no need for mut ref 2018-01-03 10:57:57 -08:00
Nikolay Kim ae084d1146 added helper future for reading request body 2018-01-03 09:23:58 -08:00
Nikolay Kim 88031b7fde remove debug prints 2018-01-03 09:00:22 -08:00
Nikolay Kim 70ea43b3c0 fix drain support for actor; make pattern more reusable 2018-01-02 23:43:17 -08:00
Nikolay Kim 9e6d090fd0 update readme example 2018-01-02 19:57:25 -08:00
Nikolay Kim 7af3b3f956 update example 2018-01-02 19:43:59 -08:00
Nikolay Kim 3a59344ffb update h2 lib 2018-01-02 19:37:33 -08:00
Nikolay Kim 3768a2885d fix examples 2018-01-02 15:52:11 -08:00
Nikolay Kim f0fdcc9936 handle application prefix for handlers; use handler for StaticFiles 2018-01-02 15:23:31 -08:00
Nikolay Kim 77ba1de305 flush encoder 2018-01-02 14:53:51 -08:00
Nikolay Kim fb2c78d9fc add hello-world example 2018-01-02 13:42:30 -08:00
Nikolay Kim b49eadf7e5 fix content length serialization #33 2018-01-02 13:39:32 -08:00
Nikolay Kim 9040f588af allow to handle entire sub path 2018-01-02 13:09:02 -08:00
Nikolay Kim 284b59722a update websocket example 2018-01-01 09:31:42 -08:00
Ami44 e798af26a2
Merge pull request #27 from ami44/master
move examples/websocket.rs to examples/websocket
2018-01-01 12:26:07 +01:00
ami44 fc88bb294a Merge remote-tracking branch 'upstream/master' 2018-01-01 12:22:03 +01:00
Nikolay Kim f3a90a2829 add example to workspace 2017-12-31 22:22:56 -08:00
Nikolay Kim d2f54b7d19 use workspace 2017-12-31 21:55:25 -08:00
Nikolay Kim 8e89ff1d1e fix examples 2017-12-31 20:08:35 -08:00
Nikolay Kim cc38b30f7b refactor http actor usage 2017-12-31 17:26:32 -08:00
Nikolay Kim 967d3244d7 fix http/2 support 2017-12-31 13:22:11 -08:00
ami44 d8548ad83b update examples/diesel readme 2017-12-31 08:12:26 +01:00
ami44 5741b8b372 add examples/websocket 2017-12-30 22:43:10 +01:00
ami44 7962d28a6d move examples/websocket.rs to examples/websocket 2017-12-30 21:47:39 +01:00
Ami44 e18f9f3f3a
Merge pull request #1 from actix/master
Update from original
2017-12-30 21:27:48 +01:00
ami44 73e2773a10 minor fix guide/ 2017-12-30 21:13:23 +01:00
ami44 c998c75515 move examples/state.rs to examples/state 2017-12-30 21:08:54 +01:00
ami44 f1f5b23e77 fix readme examples/signal 2017-12-30 21:08:12 +01:00
ami44 76b03851e6 fix examples - disable signal if windows 2017-12-30 21:05:03 +01:00
ami44 87188e1505 minor fix examples/websocket-chat 2017-12-30 16:50:49 +01:00
ami44 df393df547 move example/basic.rs to examples/basic 2017-12-30 16:50:17 +01:00
ami44 a1dc5a6bd1 update examples/tls/README 2017-12-30 16:24:50 +01:00
ami44 8e580ef7b9 add README examples/template_tera 2017-12-30 16:10:29 +01:00
ami44 12345004dd add README examples/signals 2017-12-30 16:10:00 +01:00
ami44 a1a77600c6 add README example/multipart 2017-12-30 16:09:39 +01:00
ami44 d7d9e8c0e9 update json example 2017-12-30 16:08:18 +01:00
ami44 e93af57fa7 add json example link 2017-12-30 16:07:39 +01:00
ami44 a166fc82f4 add json-rust example 2017-12-30 15:24:12 +01:00
Alban Minassian 2d769f805a add diesel+postgresql link 2017-12-30 12:21:34 +01:00
Nikolay Kim 6ea894547d better application handling, fix url_for method for routes with prefix 2017-12-29 14:04:13 -08:00
Nikolay Kim 491d43aa8c update tests 2017-12-29 11:49:36 -08:00
Nikolay Kim 1baead993a call poll_io recursevely aftre drain completion 2017-12-29 11:45:56 -08:00
Nikolay Kim 3d3e4dae9a refactor IntoHttpHandler trait 2017-12-29 11:33:04 -08:00
Nikolay Kim 1d195a2cf2 make Pipeline private 2017-12-29 09:16:50 -08:00
Nikolay Kim d87fafb563 fix and refactor middleware runner 2017-12-29 01:01:31 -08:00
Nikolay Kim 308df19865 update readme 2017-12-28 16:27:08 -08:00
Nikolay Kim 538fea8027 add graceful shutdown system 2017-12-28 16:25:47 -08:00
Nikolay Kim 3f4898a6d1 add StopWorker message 2017-12-28 13:07:29 -08:00
Nikolay Kim 6a2bb9a473 split worker code to separate module 2017-12-28 12:38:37 -08:00
Nikolay Kim d8b0ce88a5 fix guide example 2017-12-28 12:27:46 -08:00
Nikolay Kim 783e19c1bf fix RequestSession impl for HttpRequest 2017-12-28 11:43:45 -08:00
Nikolay Kim d80a0c9f94 add support for unix signals 2017-12-28 11:36:20 -08:00
Nikolay Kim 02b37570f4 flaky test 2017-12-28 09:11:25 -08:00
Nikolay Kim 820404cdd2
Merge pull request #20 from ami44/master
set session name
2017-12-28 04:23:41 -08:00
Alban Minassian 27b0dfd761 set sessio name 2017-12-28 13:02:46 +01:00
Nikolay Kim b714e1f4ce fix example 2017-12-27 19:29:04 -08:00
Nikolay Kim 093d0bae40 Param ctor is private 2017-12-27 19:19:28 -08:00
Nikolay Kim 8941557da6 add parameter container iterator 2017-12-27 19:09:36 -08:00
Nikolay Kim 6bb893deab use Params object for query 2017-12-27 19:02:29 -08:00
Nikolay Kim 19e1c1b75b use Cow for Params type 2017-12-27 18:41:09 -08:00
Nikolay Kim 556de72932 add server spawn method 2017-12-27 17:49:10 -08:00
Nikolay Kim 4d741b4de5
Fix typos 2017-12-27 13:26:31 -08:00
Nikolay Kim 0589f2ee49 add server management commands 2017-12-27 12:58:32 -08:00
Nikolay Kim da8aa8b988 use mio for accept loop 2017-12-27 11:22:27 -08:00
Nikolay Kim be1cd2936d check example in 1.20 2017-12-27 09:49:59 -08:00
Nikolay Kim e1fb32c6e5
Update .travis.yml 2017-12-27 07:36:24 -08:00
Nikolay Kim 5df5cc7374 fix guide example 2017-12-26 21:33:23 -08:00
Nikolay Kim 0d21c2da22 various typos 2017-12-26 21:07:51 -08:00
Nikolay Kim 183bcd38f8 modify unused_addr method; update websockt guide section 2017-12-26 20:52:21 -08:00
Nikolay Kim 3abd0db6b1 restore server start test 2017-12-26 20:07:31 -08:00
Nikolay Kim 29adc20581 rename module 2017-12-26 19:59:41 -08:00
Nikolay Kim 743235b8fd add unit test helper 2017-12-26 19:48:02 -08:00
Nikolay Kim 7f77ba557d add testing section to guide 2017-12-26 17:14:37 -08:00
Nikolay Kim d3b7d2d6b3 allow to use application factory for test server 2017-12-26 16:47:55 -08:00
Nikolay Kim f6510161b5 add simple TestServer for integrational tests cases 2017-12-26 16:35:00 -08:00
Nikolay Kim e3b0f02794 fix type for disable feartures 2017-12-26 15:17:20 -08:00
Nikolay Kim 9521de5746 HttpServer::addrs() return all bound socket addresses 2017-12-26 14:45:38 -08:00
Nikolay Kim dd3a2aa68a add HttpServer::server_hostname method 2017-12-26 14:36:03 -08:00
Nikolay Kim cce9c68a10 add doc string 2017-12-26 12:46:27 -08:00
Nikolay Kim 5e17a846af add notes on sync primitives 2017-12-26 11:19:08 -08:00
Nikolay Kim 030a70841a add link to gitter 2017-12-26 11:04:25 -08:00
Nikolay Kim e4bfef9d26 fix tests 2017-12-26 09:28:24 -08:00
Nikolay Kim cf8c2ca95e refactor Handler trait, use mut self 2017-12-26 09:00:45 -08:00
Nikolay Kim b61a07a320 more info for middleware guide 2017-12-26 07:58:21 -08:00
Nikolay Kim ffb5742b71 fix tests 2017-12-25 19:42:55 -08:00
Nikolay Kim 465a87a7cf right version 2017-12-25 13:44:50 -08:00
Nikolay Kim 5b65987f6a write response optimizations 2017-12-25 13:40:06 -08:00
Nikolay Kim 89c9dfb5bc update getting started guide section 2017-12-25 08:19:33 -08:00
Nikolay Kim a578262f73 update json example and guide info 2017-12-25 08:12:13 -08:00
Nikolay Kim b0c8fa03f0 use specific nightly version for appveyor 2017-12-25 07:33:05 -08:00
Nikolay Kim 98b0e023f3 optimize payload detection 2017-12-25 07:31:12 -08:00
Nikolay Kim 012d55e424
Set nightly version 2017-12-25 05:49:56 -08:00
Nikolay Kim f1e82ebc1e better connect handling 2017-12-24 16:15:40 -08:00
Nikolay Kim ddd9c24bb2 optimize payload type detection 2017-12-24 14:29:19 -08:00
Nikolay Kim 9f9c75d832 simplify drain feature 2017-12-24 11:58:09 -08:00
Nikolay Kim eaab28cd3b proper fix for compression 2017-12-21 12:57:59 -08:00
Nikolay Kim c35d294611 fix compression 2017-12-21 12:54:18 -08:00
Nikolay Kim 18f3841783 update test 2017-12-20 23:36:52 -08:00
Nikolay Kim 0567e6fb0a fix typos in guide 2017-12-20 23:27:30 -08:00
Nikolay Kim 55534bff8c simplify guide examples 2017-12-20 23:21:26 -08:00
Nikolay Kim bca1dd4f9e update doc strings 2017-12-20 23:19:21 -08:00
Nikolay Kim 0a68811dce cleanup more examples 2017-12-20 21:06:04 -08:00
Nikolay Kim 406d2c41e9 add doc string 2017-12-20 20:56:17 -08:00
Nikolay Kim 63ddc07ccb added JsonBody future 2017-12-20 20:30:54 -08:00
Nikolay Kim 33b2be3281 move json responder to separate module 2017-12-20 17:51:28 -08:00
Nikolay Kim bf23aa5d4b move db code to separate module 2017-12-20 17:44:19 -08:00
Nikolay Kim 3c5fd18e02 cleanup examples 2017-12-20 16:32:31 -08:00
Nikolay Kim 4dd3382ac7 update example 2017-12-20 16:13:21 -08:00
Nikolay Kim 50891986bc simplify json example 2017-12-20 16:05:07 -08:00
Nikolay Kim df2aa42dad cleanup example 2017-12-20 15:45:26 -08:00
Nikolay Kim c36ad06332 more general Responder implementaiton for response future 2017-12-20 15:26:28 -08:00
Nikolay Kim 821c96c37c check json example during travis build 2017-12-20 15:20:28 -08:00
Nikolay Kim cbb81bc747 json request example 2017-12-20 15:12:43 -08:00
Nikolay Kim 79f047f5be remove box from predicates 2017-12-20 13:23:50 -08:00
Nikolay Kim 813b56ebe5 make async handler future more generic 2017-12-20 12:51:39 -08:00
Nikolay Kim c3a39e026d Merge branch 'master' of github.com:actix/actix-web 2017-12-20 11:37:36 -08:00
Nikolay Kim e05596b65d upgrade actix min version 2017-12-20 11:37:27 -08:00
Nikolay Kim 65767558fb
Update README.md 2017-12-20 08:00:28 -08:00
Nikolay Kim 7fc7d6e17a update guide 2017-12-19 22:36:06 -08:00
Nikolay Kim c47e2ccfee update guide examples 2017-12-19 18:44:17 -08:00
Nikolay Kim d0c01c2cdd update guide example 2017-12-19 18:38:02 -08:00
Nikolay Kim 50b2f62c80 update guide section about ssl 2017-12-19 18:36:29 -08:00
Nikolay Kim 0a96b8c579 update readme 2017-12-19 16:17:27 -08:00
Nikolay Kim d41aade0b7 update readme 2017-12-19 16:14:47 -08:00
Nikolay Kim 626999bcc9 update doc strings 2017-12-19 16:09:19 -08:00
Nikolay Kim 64d867d9a1 update session guide section 2017-12-19 15:44:25 -08:00
Nikolay Kim 1596f4db73 refactor url encoded body parsing 2017-12-19 14:03:01 -08:00
Nikolay Kim fa2a3bc55e make method private 2017-12-19 13:11:19 -08:00
Nikolay Kim 52c9865716 split examples check 2017-12-19 12:22:11 -08:00
Nikolay Kim db7bd962cb fix some doc strings 2017-12-19 11:46:11 -08:00
Nikolay Kim f858fa7a32 Merge branch 'travis-test' 2017-12-19 11:35:16 -08:00
Nikolay Kim 2bad99b645 better query() method impl; update doc strings 2017-12-19 11:34:51 -08:00
Nikolay Kim 566066e855 check examples 2017-12-19 10:56:48 -08:00
Nikolay Kim 009874125e add client.py comments 2017-12-19 10:25:23 -08:00
Nikolay Kim 2e790dfcc6 add multipart guide section 2017-12-19 10:10:03 -08:00
Nikolay Kim e3f9345420 multipart field is stream of bytes 2017-12-19 09:55:49 -08:00
Nikolay Kim 790793f8a1 refactor multipart stream creation 2017-12-19 09:51:28 -08:00
Nikolay Kim 13cbfc877d simplify server start method 2017-12-19 09:08:36 -08:00
Nikolay Kim 4f6145e5c7 fix typos 2017-12-19 00:29:25 -08:00
Nikolay Kim f3b853f224 refactor payload 2017-12-19 00:18:57 -08:00
Nikolay Kim 0cab873066 make payload sender public 2017-12-18 21:58:38 -08:00
Nikolay Kim 64dc6c5771 fix typos 2017-12-18 20:03:42 -08:00
Nikolay Kim 669975df75 fix typos 2017-12-18 20:00:57 -08:00
Nikolay Kim 56fd088163 added database integration guide section 2017-12-18 19:38:16 -08:00
Nikolay Kim 2124730e0a guide update 2017-12-18 18:56:58 -08:00
Nikolay Kim e9a3845e26 update license in readme 2017-12-18 16:48:30 -08:00
Nikolay Kim 3f0e7456c0 update examples links 2017-12-18 16:42:58 -08:00
Nikolay Kim 1e1da5832f better name 2017-12-18 16:40:33 -08:00
Nikolay Kim 625c4ad0db add more comments 2017-12-18 16:30:35 -08:00
Nikolay Kim fde94bfe95 added diesel example 2017-12-18 16:25:26 -08:00
Nikolay Kim 3e8a6c3988 add tera example 2017-12-18 13:41:52 -08:00
Nikolay Kim 26af6040ff update tests 2017-12-18 13:26:43 -08:00
Nikolay Kim 9ed4159c0c update examples 2017-12-18 13:06:41 -08:00
Nikolay Kim 27d92f3a23 refactor server bind and start process 2017-12-17 12:35:04 -08:00
Nikolay Kim 4b421b44a2 add mit license 2017-12-17 10:08:44 -08:00
Nikolay Kim 1a51f75ecc update readme 2017-12-17 10:03:37 -08:00
Nikolay Kim 9821c6ea90 update readme 2017-12-16 11:39:56 -08:00
Nikolay Kim 167717d20e update readme 2017-12-16 11:22:39 -08:00
Nikolay Kim 91ffab8f6e update readme 2017-12-16 07:30:53 -08:00
Nikolay Kim b1f33e29ec simplify content-length calculation 2017-12-16 07:29:15 -08:00
Nikolay Kim ed8bd3d6a3 h1 cleanups 2017-12-15 22:49:48 -08:00
Nikolay Kim 1daf50095a cleanup response 2017-12-15 20:00:12 -08:00
Nikolay Kim a8b2f1b821 update tests 2017-12-15 18:49:11 -08:00
Nikolay Kim 1ddcce7b76 hide httpresponse box 2017-12-15 16:24:15 -08:00
Nikolay Kim c3d5e4301a cleanup h1 parse 2017-12-15 13:10:12 -08:00
Nikolay Kim 71c37bde5a
Update README.md 2017-12-15 05:44:10 -08:00
Nikolay Kim 4913e7d3c2 cleanup 2017-12-14 22:22:27 -08:00
Nikolay Kim d77156c16c fix readme 2017-12-14 20:49:09 -08:00
Nikolay Kim 106f43e874 better SharedBytes usage for h2 2017-12-14 20:48:31 -08:00
Nikolay Kim 2b0994e448 update tests 2017-12-14 20:29:49 -08:00
Nikolay Kim a2dff8a0b9 update readme 2017-12-14 20:12:28 -08:00
Nikolay Kim c37565cc4a various server optimizations 2017-12-14 19:34:31 -08:00
Nikolay Kim b61c2a0cf0 handle keep-alive setting more efficient 2017-12-14 11:20:45 -08:00
Nikolay Kim c98d320f8c rename FromRequest trait to Responder 2017-12-14 09:43:42 -08:00
Nikolay Kim 355f54efe2 update api docs 2017-12-13 23:35:21 -08:00
Nikolay Kim 8c1487f7f2 update tests 2017-12-13 23:09:35 -08:00
Nikolay Kim 4529efa948 rename module 2017-12-13 22:54:52 -08:00
Nikolay Kim 9d0a64ac98 remove unused file 2017-12-13 22:43:16 -08:00
Nikolay Kim b7cde3f4a9 update guide 2017-12-13 22:36:28 -08:00
Nikolay Kim 408ddf0be1 add ssl guide ref 2017-12-13 21:56:30 -08:00
Nikolay Kim 406ef20262 add readme 2017-12-13 21:44:16 -08:00
Nikolay Kim c2751efa87 refactor keep-alive; update guide 2017-12-13 21:38:47 -08:00
Nikolay Kim 653b431895 fix example 2017-12-13 17:28:16 -08:00
Nikolay Kim 96f598f2c4 various optimizations 2017-12-13 16:44:35 -08:00
Nikolay Kim 81f8da03ae refactor http workers 2017-12-13 12:47:07 -08:00
Nikolay Kim 6b61041aec move tests 2017-12-13 11:16:26 -08:00
Nikolay Kim d4187f682b various cleanups 2017-12-13 11:10:03 -08:00
Nikolay Kim 55204c829c update tests 2017-12-13 08:00:25 -08:00
Nikolay Kim 2e83c5924d cleanup and optimize some code 2017-12-12 21:32:58 -08:00
Nikolay Kim ab6efd2421 handle http connections in different threads 2017-12-12 17:21:00 -08:00
Nikolay Kim 55818028cb state does not need to be Send 2017-12-12 08:51:16 -08:00
Nikolay Kim e9aa67b75d http server accepts factory of HttpHandlers 2017-12-12 07:40:36 -08:00
Nikolay Kim b9da09ddf0 update readme 2017-12-11 19:17:37 -08:00
Nikolay Kim d7efbb516d fix guide tests 2017-12-11 19:16:45 -08:00
Nikolay Kim 6e3f598c50 fix guide page 2017-12-11 16:50:51 -08:00
Nikolay Kim 007b7ce62f unify route not found handling 2017-12-11 16:26:51 -08:00
Nikolay Kim b1ae7f95cc update readme example 2017-12-11 15:57:37 -08:00
Nikolay Kim 96381f5d6a fix doc 2017-12-11 14:27:09 -08:00
Nikolay Kim 0f75d066f2 simplify Application creation; update url dispatch guide section 2017-12-11 14:16:29 -08:00
Nikolay Kim caca907c23 update guide 2017-12-09 14:06:22 -08:00
Nikolay Kim c5490a851c add guid for path normalization 2017-12-09 13:58:24 -08:00
Nikolay Kim 0388a464ba tests for NormalizePath 2017-12-09 13:25:06 -08:00
Nikolay Kim 71bbe2a5dd update doc string for NormalizePath 2017-12-09 11:55:55 -08:00
Nikolay Kim 7addd2800d add NormalizePath handler 2017-12-09 11:39:13 -08:00
Nikolay Kim 273de2260d refactor pipeline 2017-12-09 05:54:04 -08:00
Nikolay Kim b98ab2eebe use trait instead of pipeline 2017-12-09 04:33:40 -08:00
Nikolay Kim 4a40b026a4 more error wrappers 2017-12-08 15:52:46 -08:00
Nikolay Kim a44f71d8c2 make ErrorBadRequest type useful 2017-12-08 15:25:37 -08:00
Nikolay Kim 9043e7286d tests for default predicates 2017-12-08 12:51:44 -08:00
Nikolay Kim 3e91b06241 fix static files 2017-12-08 12:29:28 -08:00
Nikolay Kim 774bfc0a86 use server settings for scheme and host values 2017-12-08 09:48:53 -08:00
Nikolay Kim 1293619096 set server settings to HttpHandler 2017-12-08 09:24:05 -08:00
Nikolay Kim 2192d14eff added ServerSettings 2017-12-07 22:54:44 -08:00
Nikolay Kim b71ddf7b4c pass local addr to channel; use bitflags 2017-12-07 21:52:46 -08:00
Nikolay Kim 3f06439d3e update examples 2017-12-07 18:08:16 -08:00
Nikolay Kim d595dd850e load cookies automatically 2017-12-07 18:00:20 -08:00
Nikolay Kim 0abb3863dc simplify api 2017-12-07 17:38:18 -08:00
Nikolay Kim dff7618f35 rearrange exports 2017-12-07 16:40:29 -08:00
Nikolay Kim 968f5d39d6 added external resources; refactor route recognizer 2017-12-07 16:22:26 -08:00
Nikolay Kim 9e3aa59155 ignore tests 2017-12-07 10:23:14 -08:00
Nikolay Kim 2a0d5db41a more tests 2017-12-06 18:39:13 -08:00
Nikolay Kim 4b03d03404 rearrange exports 2017-12-06 17:06:40 -08:00
Nikolay Kim 9ea0781aba fix test 2017-12-06 16:58:49 -08:00
Nikolay Kim 63502fa833 test for Router::has_route 2017-12-06 16:40:23 -08:00
Nikolay Kim a18bd5dac0 add doc ref 2017-12-06 16:34:54 -08:00
Nikolay Kim 0dd27bd224 added HttpRequest::url_for 2017-12-06 16:26:27 -08:00
Nikolay Kim 8d52e2bbd9 tests for default resource 2017-12-06 13:02:53 -08:00
Nikolay Kim c63f058647 simplify application creation 2017-12-06 11:00:39 -08:00
Nikolay Kim 87c7441f7d remove Applicaiton::route, resource is enough 2017-12-06 08:03:08 -08:00
Nikolay Kim 04ded5ba68 hide pkcs 2017-12-06 07:49:01 -08:00
Nikolay Kim 903b391e0a move ConnectionInfo to dev 2017-12-06 07:47:42 -08:00
Nikolay Kim c2bfc091bd fix travis 2017-12-05 22:14:38 -08:00
Nikolay Kim 20af8822fd cleanup 2017-12-05 21:53:00 -08:00
Nikolay Kim d7e65b6212 add ConnectionInfo tests 2017-12-05 21:41:30 -08:00
Nikolay Kim c3de32c3b3 added ConnectionInfo 2017-12-05 17:09:15 -08:00
Nikolay Kim d8b880e167 work on resource_path api 2017-12-05 13:31:06 -08:00
Nikolay Kim 3de43c2a46 update readme 2017-12-05 12:25:57 -08:00
Nikolay Kim bd1e9abdd8 simple readme example 2017-12-05 11:50:09 -08:00
Nikolay Kim 86d7290f9e update tests 2017-12-05 11:43:41 -08:00
Nikolay Kim a83d9b24ae extrat elements of path pattern 2017-12-05 11:31:35 -08:00
Nikolay Kim 3c9b6ea619 update guide 2017-12-04 20:38:38 -08:00
Nikolay Kim fd6b243cd6 update examples 2017-12-04 16:32:31 -08:00
Nikolay Kim 2950c90c77 doc fixes 2017-12-04 16:26:40 -08:00
Nikolay Kim f4e9fc7b6a rename async to a 2017-12-04 16:09:22 -08:00
Nikolay Kim e98972e93b exclude example from code coverage 2017-12-04 15:35:07 -08:00
Nikolay Kim e332c1242f use Route for Applicaiton handlers 2017-12-04 14:53:40 -08:00
Nikolay Kim f5d6179a34 renamed Route::handler to Route::f, added Route::h to register Handler 2017-12-04 14:07:53 -08:00
Nikolay Kim 03f7d95d88 fix fmratting 2017-12-04 13:36:28 -08:00
Nikolay Kim a163e75318 drop tail path pattern 2017-12-04 13:34:55 -08:00
Nikolay Kim 3bf3738e65 introduce route predicates 2017-12-04 13:32:05 -08:00
Nikolay Kim 57fd35ffc1 added default headers middleware 2017-12-03 20:47:15 -08:00
Nikolay Kim d35be02587 cleanup 2017-12-03 20:09:46 -08:00
Nikolay Kim 57c53bd2a0 add encoding section 2017-12-03 18:58:15 -08:00
Nikolay Kim 319e9bbd05 added Json response support 2017-12-03 18:51:52 -08:00
Nikolay Kim 5decff9154 added fs tests 2017-12-03 18:15:09 -08:00
Nikolay Kim 69f0c098e3 check show_index 2017-12-03 16:58:31 -08:00
Nikolay Kim 5abc46034a refactor static files 2017-12-03 16:57:25 -08:00
Nikolay Kim 7c6faaa8e0 add Item and Error to FromRequest trait 2017-12-03 14:22:04 -08:00
Nikolay Kim 6bc7d60f52 more default impls for FromRequest 2017-12-02 17:14:55 -08:00
Nikolay Kim fb3185de94 rename module 2017-12-02 16:47:02 -08:00
Nikolay Kim 61744b68a1 introduce custom FromRequest traint for conversion into Reply 2017-12-02 16:37:21 -08:00
Nikolay Kim 187948ddd1 error response for io::Error 2017-12-02 14:58:22 -08:00
Nikolay Kim 29a26b3236 code cleanup 2017-12-02 12:14:16 -08:00
Nikolay Kim d0b9d9c1d6 content-encoding; try cargo tarpaulin 2017-12-02 11:41:20 -08:00
Nikolay Kim 0fc01c48d1 return bad request for param parse error 2017-12-02 11:03:41 -08:00
Nikolay Kim ebfd3ac275 tests for PathBuf::from_param 2017-12-02 10:43:14 -08:00
Nikolay Kim d8f27e95a6 added FromParam trait for path segment conversions, FramParam impl for PathBuf 2017-12-02 10:18:54 -08:00
Nikolay Kim d03d1207a8 add http2 section 2017-12-02 00:36:50 -08:00
Nikolay Kim 8f33dec026 add logging doc section 2017-12-02 00:24:26 -08:00
Nikolay Kim 0dae109172 missing files 2017-12-01 23:42:21 -08:00
Nikolay Kim 1a5df7192e add multiple apps example 2017-12-01 23:32:15 -08:00
Nikolay Kim 3ffd36eee2 some more guide 2017-12-01 23:06:15 -08:00
Nikolay Kim c3a0a4457a add appl builder async method; add async handler section 2017-12-01 21:58:19 -08:00
Nikolay Kim e6feec62a8 simplier examples 2017-12-01 21:31:38 -08:00
Nikolay Kim f0c346f18c handler info 2017-12-01 21:29:22 -08:00
Nikolay Kim 186726fbad tests for Completed state 2017-12-01 19:57:34 -08:00
Nikolay Kim 97bed17fd2 test for completed pipeline state 2017-12-01 16:10:01 -08:00
Nikolay Kim 47645626c4 refactor pipeline 2017-12-01 15:45:15 -08:00
Nikolay Kim 9a1ba527c0 recognizer tests 2017-11-30 19:34:33 -08:00
Nikolay Kim 3fcd5f6935 use http::Uri for uri parsing 2017-11-30 19:01:25 -08:00
Nikolay Kim 7135c0163b simlify code 2017-11-30 18:27:27 -08:00
Nikolay Kim f53f35f364 added tail pattern 2017-11-30 15:48:09 -08:00
Nikolay Kim 07cc017320 make Task private 2017-11-30 15:13:56 -08:00
Nikolay Kim 271a292ea5 no need to store disconnected state on task 2017-11-30 14:44:58 -08:00
Nikolay Kim 6e138bf373 refactor streaming responses 2017-11-30 14:42:20 -08:00
Nikolay Kim a0bca2d4cf fix typo 2017-11-30 07:42:02 -08:00
Nikolay Kim 6c4fdf604b do not set content encoding header for upgraded connection 2017-11-29 19:40:27 -08:00
Nikolay Kim e4f8551cba do not com press upgrade connection 2017-11-29 19:36:55 -08:00
Nikolay Kim 559b1c50a3 do not encode payload less that 1024 bytes 2017-11-29 19:18:37 -08:00
Nikolay Kim d2eae3d5b3 simplify Handler trait 2017-11-29 15:10:45 -08:00
Nikolay Kim 27035c9454 fixes 2017-11-29 14:22:47 -08:00
Nikolay Kim 991dd107b1 update ws doc 2017-11-29 14:12:27 -08:00
Nikolay Kim ffb2e3c0ab update examples 2017-11-29 14:03:18 -08:00
Nikolay Kim acc2fff655 export and simplify HttpHandler trait 2017-11-29 13:53:52 -08:00
Nikolay Kim 427566b90d export Handler 2017-11-29 13:41:51 -08:00
Nikolay Kim 16ceb741b8 refactor RouteHandler trait 2017-11-29 13:26:55 -08:00
Nikolay Kim 6f833798c7 refactor http actor handling 2017-11-29 10:31:24 -08:00
Nikolay Kim 6177d86d97 refactor handler rtype handling 2017-11-29 09:17:00 -08:00
Nikolay Kim e9bfab8012 add deref for payload item 2017-11-28 19:51:39 -08:00
Nikolay Kim afeecea05f refactor reply handling 2017-11-28 19:49:17 -08:00
Nikolay Kim 6f5b58b691 more guide 2017-11-28 18:00:10 -08:00
Nikolay Kim 987b275c3f add response test 2017-11-28 14:29:22 -08:00
Nikolay Kim 932e751240 add status code helper method for http response 2017-11-28 14:23:42 -08:00
Nikolay Kim 706e2a07de add helper converters into response 2017-11-28 13:52:53 -08:00
Nikolay Kim a3022e6d88 some overview text for guide 2017-11-28 12:44:59 -08:00
Nikolay Kim b55d69b4c2 better handler result handling 2017-11-28 12:42:53 -08:00
Nikolay Kim 0bd8725426 make resource handler result more generic 2017-11-28 12:28:51 -08:00
Nikolay Kim ac3fe30d19 use git master for examples 2017-11-28 10:27:58 -08:00
Nikolay Kim 88eb6bc6a2 build mdbook 2017-11-28 09:57:27 -08:00
Nikolay Kim 91cefa8e2f use precompiled mdbook 2017-11-28 09:40:22 -08:00
Nikolay Kim 26413d1d61 add link to guide 2017-11-27 19:56:14 -08:00
Nikolay Kim 06f9b7b52f fix travis config 2017-11-27 16:49:25 -08:00
Nikolay Kim 599f3c26e0 start working on guide 2017-11-27 16:41:37 -08:00
Nikolay Kim b5a4f6f855 hellper method for json body 2017-11-27 10:39:47 -08:00
Nikolay Kim 42716d3252 update tests 2017-11-26 22:59:04 -08:00
Nikolay Kim 170d3163f3 better export naming 2017-11-26 22:53:28 -08:00
Nikolay Kim 0519056199 consistent naming 2017-11-26 22:31:29 -08:00
Nikolay Kim 45433f71e5 impl Default trait for HttpRequest 2017-11-26 22:20:28 -08:00
Nikolay Kim b62b303fdb remove unneeded directives 2017-11-26 22:11:51 -08:00
Nikolay Kim 8e80fed2af added urlencoded errors 2017-11-26 22:00:25 -08:00
Nikolay Kim fdafb0c848 simplify middleware api; fix examples 2017-11-26 21:47:33 -08:00
Nikolay Kim 5a3b6638a7 move state to request object 2017-11-26 21:18:38 -08:00
Nikolay Kim 8e0a7f44d4 pass request by value 2017-11-26 20:34:20 -08:00
Nikolay Kim eb7f48a1c6 include payload into request 2017-11-26 19:00:57 -08:00
Nikolay Kim 32483735ba cookie session implementation 2017-11-26 17:34:11 -08:00
Nikolay Kim 53ce186294 cleanup pipeline 2017-11-25 12:05:27 -08:00
Nikolay Kim 37c1e78c7a added helper Task::error method 2017-11-25 10:52:43 -08:00
Nikolay Kim 45ecb87eab allow middlware error result 2017-11-25 10:24:45 -08:00
Nikolay Kim 54bbc98343 cookie session prototype 2017-11-25 09:52:32 -08:00
Nikolay Kim f4972150cc better middleware error handling 2017-11-25 09:40:57 -08:00
Nikolay Kim 1fc64bc83d better pipeline error handling 2017-11-25 09:28:25 -08:00
Nikolay Kim 64ade803f9 store error for error response 2017-11-25 09:03:44 -08:00
Nikolay Kim 940bc08aba remove unused imports 2017-11-24 22:19:06 -08:00
Nikolay Kim 7569036dd4 refactor request pipeline 2017-11-24 22:15:52 -08:00
Nikolay Kim 59b8214685 better nightly detection 2017-11-24 10:28:43 -08:00
Nikolay Kim f33c489154 added default ErrorResponse for std::error::Error 2017-11-24 10:03:13 -08:00
Nikolay Kim 5529ea0428 better logger format test 2017-11-23 16:53:02 -08:00
Nikolay Kim 39a20fb95d use env_logger for logger tests 2017-11-23 15:48:59 -08:00
Nikolay Kim 155a636487 more logger tests 2017-11-23 15:37:11 -08:00
Nikolay Kim e571587a8c refactor logger middleware 2017-11-23 15:17:16 -08:00
Nikolay Kim 5945035fc3 better method name 2017-11-19 18:55:37 -10:00
Nikolay Kim 766e243c63 more Body tests 2017-11-19 18:32:37 -10:00
Nikolay Kim 83862dfbb4 update payload tests 2017-11-19 18:26:30 -10:00
Nikolay Kim c44e4ad100 expect error tests 2017-11-19 18:02:31 -10:00
Nikolay Kim 1a0e87ac3c add tests for errors 2017-11-19 17:58:47 -10:00
Nikolay Kim 72edd75eab add custom ExceptError 2017-11-19 17:51:14 -10:00
Nikolay Kim 78d8d21196 cleanup error 2017-11-19 17:26:31 -10:00
Nikolay Kim fd3dcdf0f6 use failure from crates 2017-11-18 06:50:56 -10:00
Nikolay Kim a87784ba15 use Result intead of HandlerResult 2017-11-18 06:50:07 -10:00
Nikolay Kim c800bf55f5 update tests 2017-11-15 20:28:02 -10:00
Nikolay Kim 0143e18fe9 fix extern crate 2017-11-15 20:09:37 -10:00
Nikolay Kim de71ad7de4 refactor error handling 2017-11-15 20:06:28 -10:00
Nikolay Kim c565965865 rename BinaryBody 2017-11-10 13:42:32 -08:00
Nikolay Kim f2520d2d79 update logger doc 2017-11-10 13:34:16 -08:00
Nikolay Kim be3a1ab770 use remote addr in logger if available 2017-11-10 13:26:12 -08:00
Nikolay Kim f369d9af0e make remote addr available to http request 2017-11-10 13:08:15 -08:00
Nikolay Kim 265628750c refactor logger middleware 2017-11-10 12:29:54 -08:00
Nikolay Kim 657efb8cce fix readme 2017-11-09 22:18:59 -08:00
Nikolay Kim 40c1d3b711 refactor middlewares 2017-11-09 22:08:54 -08:00
Nikolay Kim 51cd08ef57 store cookies load state 2017-11-08 21:01:56 -08:00
Nikolay Kim 2a319d733f enable secure cookies 2017-11-08 20:57:59 -08:00
Nikolay Kim 519a9e64f8 cleanup tls example 2017-11-08 20:29:48 -08:00
Nikolay Kim 4d575c6269 update readme 2017-11-08 20:25:14 -08:00
Nikolay Kim e9fe2ba740 use bytes::Writer 2017-11-08 20:08:16 -08:00
Nikolay Kim 7565ed8e06 use higher pripority for br 2017-11-08 19:42:13 -08:00
Nikolay Kim 02fb424659 add custom Debug impl for HttpResponse 2017-11-08 19:31:25 -08:00
Nikolay Kim 1392b2b171
Update README.md 2017-11-08 16:48:20 -08:00
Nikolay Kim e558414867 add response content encoding 2017-11-08 16:44:46 -08:00
Nikolay Kim 76b8104f52 use version in readme 2017-11-07 16:09:37 -08:00
Nikolay Kim 2eb3ad0de3 better name 2017-11-07 16:08:10 -08:00
Nikolay Kim 6974213036 use new brotli2 version 2017-11-07 15:59:37 -08:00
Nikolay Kim 72c8ad9fe1 fix appveyor config for gnu target 2017-11-07 09:43:39 -08:00
Nikolay Kim a65fd695e1 refactor content encoding 2017-11-06 16:23:58 -08:00
Nikolay Kim 994d0afd80 allow to set/change responses content encoding 2017-11-06 14:56:38 -08:00
Nikolay Kim 2379bcbf39 added content-encoding support to h2 2017-11-06 09:35:52 -08:00
Nikolay Kim bddd8e9c2e better deflate decoding 2017-11-06 09:24:19 -08:00
Nikolay Kim c2978a6eea add content encoding decompression 2017-11-06 01:27:46 -08:00
Nikolay Kim b467ddf970 test with alpn feature 2017-11-04 15:16:49 -07:00
Nikolay Kim 3f649b8e07 fix name 2017-11-04 14:07:15 -07:00
Nikolay Kim e9e247217a update readme 2017-11-04 13:49:51 -07:00
Nikolay Kim f23974cfb5 update readme 2017-11-04 13:49:05 -07:00
Nikolay Kim 53868a88fa add keep-alive for h2 connection 2017-11-04 13:24:57 -07:00
Nikolay Kim 28652a3ba8 update readme 2017-11-04 12:36:37 -07:00
Nikolay Kim 41be1db8bc fix link 2017-11-04 12:35:55 -07:00
Nikolay Kim 67f3ad31ab update readme 2017-11-04 12:35:19 -07:00
Nikolay Kim d7d3d663e9 refactor server impl and add support for alpn http2 negotiation 2017-11-04 12:33:14 -07:00
Nikolay Kim 32cefb8455 implement h2 writer 2017-11-04 09:07:44 -07:00
Nikolay Kim 4add742aba refactor task impl, extract stream writer to separate struct 2017-11-03 13:48:00 -07:00
Nikolay Kim f010672885 rename modules 2017-11-03 13:48:00 -07:00
458 changed files with 83585 additions and 10517 deletions

View file

@ -1,49 +0,0 @@
environment:
global:
PROJECT_NAME: actix
matrix:
# Stable channel
- TARGET: i686-pc-windows-gnu
CHANNEL: stable
- TARGET: i686-pc-windows-msvc
CHANNEL: stable
- TARGET: x86_64-pc-windows-gnu
CHANNEL: stable
- TARGET: x86_64-pc-windows-msvc
CHANNEL: stable
# Beta channel
- TARGET: i686-pc-windows-gnu
CHANNEL: beta
- TARGET: i686-pc-windows-msvc
CHANNEL: beta
- TARGET: x86_64-pc-windows-gnu
CHANNEL: beta
- TARGET: x86_64-pc-windows-msvc
CHANNEL: beta
# Nightly channel
- TARGET: i686-pc-windows-gnu
CHANNEL: nightly
- TARGET: i686-pc-windows-msvc
CHANNEL: nightly
- TARGET: x86_64-pc-windows-gnu
CHANNEL: nightly
- TARGET: x86_64-pc-windows-msvc
CHANNEL: nightly
# Install Rust and Cargo
# (Based on from https://github.com/rust-lang/libc/blob/master/appveyor.yml)
install:
- curl -sSf -o rustup-init.exe https://win.rustup.rs
- rustup-init.exe --default-host %TARGET% --default-toolchain %CHANNEL% -y
- set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
- rustc -Vv
- cargo -V
# 'cargo test' takes care of building for us, so disable Appveyor's build stage.
build: false
# Equivalent to Travis' `script` phase
test_script:
- cargo build --no-default-features
- cargo clean
- cargo test --no-default-features

10
.cargo/config.toml Normal file
View file

@ -0,0 +1,10 @@
[alias]
lint = "clippy --workspace --all-targets -- -Dclippy::todo"
lint-all = "clippy --workspace --all-features --all-targets -- -Dclippy::todo"
# lib checking
ci-check-min = "hack --workspace check --no-default-features"
ci-check-default = "hack --workspace check"
ci-check-default-tests = "check --workspace --tests"
ci-check-all-feature-powerset="hack --workspace --feature-powerset --depth=4 --skip=__compress,experimental-io-uring check"
ci-check-all-feature-powerset-linux="hack --workspace --feature-powerset --depth=4 --skip=__compress check"

15
.codecov.yml Normal file
View file

@ -0,0 +1,15 @@
comment: false
coverage:
status:
project:
default:
threshold: 100% # make CI green
patch:
default:
threshold: 100% # make CI green
ignore: # ignore code coverage on following paths
- "**/tests"
- "**/benches"
- "**/examples"

3
.github/FUNDING.yml vendored Normal file
View file

@ -0,0 +1,3 @@
# These are supported funding model platforms
github: [robjtede]

43
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,43 @@
---
name: Bug Report
about: Create a bug report.
---
Your issue may already be reported! Please search on the [Actix Web issue tracker](https://github.com/actix/actix-web/issues) before creating one.
## Expected Behavior
<!--- If you're describing a bug, tell us what should happen -->
<!--- If you're suggesting a change/improvement, tell us how it should work -->
## Current Behavior
<!--- If describing a bug, tell us what happens instead of the expected behavior -->
<!--- If suggesting a change/improvement, explain the difference from current behavior -->
## Possible Solution
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
<!--- or ideas how to implement the addition or change -->
## Steps to Reproduce (for bugs)
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
<!--- reproduce this bug. Include code to reproduce, if relevant -->
1.
2.
3.
4.
## Context
<!--- How has this issue affected you? What are you trying to accomplish? -->
<!--- Providing context helps us come up with a solution that is most useful in the real world -->
## Your Environment
<!--- Include as many relevant details about the environment you experienced the bug in -->
- Rust Version (I.e, output of `rustc -V`):
- Actix Web Version:

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View file

@ -0,0 +1,8 @@
blank_issues_enabled: true
contact_links:
- name: Actix Discord
url: https://discord.gg/NWpN5mmg3x
about: Actix developer discussion and community chat
- name: GitHub Discussions
url: https://github.com/actix/actix-web/discussions
about: Actix Web Q&A

28
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View file

@ -0,0 +1,28 @@
<!-- Thanks for considering contributing actix! -->
<!-- Please fill out the following to get your PR reviewed quicker. -->
## PR Type
<!-- What kind of change does this PR make? -->
<!-- Bug Fix / Feature / Refactor / Code Style / Other -->
PR_TYPE
## PR Checklist
<!-- Check your PR fulfills the following items. -->
<!-- For draft PRs check the boxes as you complete them. -->
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] A changelog entry has been made for the appropriate packages.
- [ ] Format code with the latest stable rustfmt.
- [ ] (Team) Label with affected crates and semver status.
## Overview
<!-- Describe the current and new behavior. -->
<!-- Emphasize any breaking changes. -->
<!-- If this PR fixes or closes an issue, reference it here. -->
<!-- Closes #000 -->

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

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

28
.github/workflows/bench.yml vendored Normal file
View file

@ -0,0 +1,28 @@
name: Benchmark
on:
push:
branches: [master]
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
check_benchmark:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
run: |
rustup set profile minimal
rustup install nightly
rustup override set nightly
- name: Check benchmark
run: cargo bench --bench=server -- --sample-size=15

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

@ -0,0 +1,91 @@
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 }
version:
- { name: nightly, version: nightly }
name: ${{ matrix.target.name }} / ${{ matrix.version.name }}
runs-on: ${{ matrix.target.os }}
steps:
- uses: actions/checkout@v4
- name: Install nasm
if: matrix.target.os == 'windows-latest'
uses: ilammy/setup-nasm@v1.5.1
- 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.name }})
uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
with:
toolchain: ${{ matrix.version.version }}
- name: Install just, cargo-hack, cargo-nextest, cargo-ci-cache-clean
uses: taiki-e/install-action@v2.33.34
with:
tool: just,cargo-hack,cargo-nextest,cargo-ci-cache-clean
- name: check minimal
run: cargo ci-check-min
- name: check default
run: cargo ci-check-default
- name: tests
timeout-minutes: 60
run: just test
- name: CI cache clean
run: cargo-ci-cache-clean
ci_feature_powerset_check:
name: Verify Feature Combinations
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Free Disk Space
run: ./scripts/free-disk-space.sh
- name: Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
- name: Install cargo-hack
uses: taiki-e/install-action@v2.33.34
with:
tool: cargo-hack
- name: check feature combinations
run: cargo ci-check-all-feature-powerset
- name: check feature combinations
run: cargo ci-check-all-feature-powerset-linux

121
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,121 @@
name: CI
on:
pull_request:
types: [opened, synchronize, reopened]
merge_group:
types: [checks_requested]
push:
branches: [master]
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
read_msrv:
name: Read MSRV
uses: actions-rust-lang/msrv/.github/workflows/msrv.yml@main
build_and_test:
needs: read_msrv
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 }
version:
- { name: msrv, version: "${{ needs.read_msrv.outputs.msrv }}" }
- { name: stable, version: stable }
name: ${{ matrix.target.name }} / ${{ matrix.version.name }}
runs-on: ${{ matrix.target.os }}
steps:
- uses: actions/checkout@v4
- name: Install nasm
if: matrix.target.os == 'windows-latest'
uses: ilammy/setup-nasm@v1.5.1
- 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: Setup mold linker
if: matrix.target.os == 'ubuntu-latest'
uses: rui314/setup-mold@v1
- name: Install Rust (${{ matrix.version.name }})
uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
with:
toolchain: ${{ matrix.version.version }}
- name: Install just, cargo-hack, cargo-nextest, cargo-ci-cache-clean
uses: taiki-e/install-action@v2.33.34
with:
tool: just,cargo-hack,cargo-nextest,cargo-ci-cache-clean
- name: workaround MSRV issues
if: matrix.version.name == 'msrv'
run: just downgrade-for-msrv
- name: check minimal
run: cargo ci-check-min
- name: check default
run: cargo ci-check-default
- name: tests
timeout-minutes: 60
run: just test
- name: CI cache clean
run: cargo-ci-cache-clean
io-uring:
name: io-uring tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
with:
toolchain: nightly
- name: tests (io-uring)
timeout-minutes: 60
run: >
sudo bash -c "ulimit -Sl 512 && ulimit -Hl 512 && PATH=$PATH:/usr/share/rust/.cargo/bin && RUSTUP_TOOLCHAIN=stable cargo test --lib --tests -p=actix-files --all-features"
rustdoc:
name: doc tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust (nightly)
uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
with:
toolchain: nightly
- name: Install just
uses: taiki-e/install-action@v2.33.34
with:
tool: just
- name: doc tests
run: just test-docs

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.8.0
with:
components: llvm-tools-preview
- name: Install just,cargo-llvm-cov
uses: taiki-e/install-action@v2.33.34
with:
tool: just,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@v4.4.1
with:
files: codecov.json
fail_ci_if_error: true
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

93
.github/workflows/lint.yml vendored Normal file
View file

@ -0,0 +1,93 @@
name: Lint
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
fmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust (nightly)
uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
with:
toolchain: nightly
components: rustfmt
- name: Check with Rustfmt
run: cargo fmt --all -- --check
clippy:
permissions:
contents: read
checks: write # to add clippy checks to PR diffs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
with:
components: clippy
- name: Check with 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 --
-A unknown_lints -D clippy::todo -D clippy::dbg_macro
lint-docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust (nightly)
uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
with:
toolchain: nightly
components: rust-docs
- name: Check for broken intra-doc links
env:
RUSTDOCFLAGS: -D warnings
run: cargo +nightly doc --no-deps --workspace --all-features
public-api-diff:
runs-on: ubuntu-latest
steps:
- name: Checkout main branch
uses: actions/checkout@v4
with:
ref: ${{ github.base_ref }}
- name: Checkout PR branch
uses: actions/checkout@v4
- name: Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
with:
toolchain: nightly-2024-04-26
- name: Install cargo-public-api
uses: taiki-e/install-action@v2.33.34
with:
tool: cargo-public-api
- name: Generate API diff
run: |
for f in $(find -mindepth 2 -maxdepth 2 -name Cargo.toml); do
cargo public-api --manifest-path "$f" diff ${{ github.event.pull_request.base.sha }}..${{ github.sha }}
done

16
.gitignore vendored
View file

@ -1,7 +1,7 @@
target/
Cargo.lock
target/
guide/build/
/gh-pages
__pycache__
*.so
*.out
@ -9,7 +9,17 @@ __pycache__
*.pid
*.sock
*~
*.egg-info/
.DS_Store
# These are backup files generated by rustfmt
**/*.rs.bk
# Configuration directory generated by CLion
.idea
# Configuration directory generated by VSCode
.vscode
# code coverage
/lcov.info
/codecov.json

5
.prettierrc.yml Normal file
View file

@ -0,0 +1,5 @@
overrides:
- files: "*.md"
options:
printWidth: 9999
proseWrap: never

3
.rustfmt.toml Normal file
View file

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

View file

@ -1,69 +0,0 @@
language: rust
rust:
- 1.20.0
- stable
- beta
- nightly
sudo: required
dist: trusty
env:
global:
- RUSTFLAGS="-C link-dead-code"
addons:
apt:
packages:
- libcurl4-openssl-dev
- libelf-dev
- libdw-dev
- cmake
- gcc
- binutils-dev
- libiberty-dev
# Add clippy
before_script:
- |
if [[ "$TRAVIS_RUST_VERSION" == "nightly" ]]; then
( ( cargo install clippy && export CLIPPY=true ) || export CLIPPY=false );
fi
- export PATH=$PATH:~/.cargo/bin
script:
- USE_SKEPTIC=1 cargo test --no-default-features
- |
if [[ "$TRAVIS_RUST_VERSION" == "nightly" && $CLIPPY ]]; then
cargo clippy
fi
# Upload docs
after_success:
- |
if [[ "$TRAVIS_OS_NAME" == "linux" && "$TRAVIS_PULL_REQUEST" = "false" && "$TRAVIS_BRANCH" == "master" && "$TRAVIS_RUST_VERSION" == "nightly" ]]; then
cargo doc --no-deps &&
echo "<meta http-equiv=refresh content=0;url=os_balloon/index.html>" > target/doc/index.html &&
git clone https://github.com/davisp/ghp-import.git &&
./ghp-import/ghp_import.py -n -p -f -m "Documentation upload" -r https://"$GH_TOKEN"@github.com/"$TRAVIS_REPO_SLUG.git" target/doc &&
echo "Uploaded documentation"
fi
- |
if [[ "$TRAVIS_OS_NAME" == "linux" && "$TRAVIS_RUST_VERSION" == "stable" ]]; then
wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz &&
tar xzf master.tar.gz &&
cd kcov-master &&
mkdir build &&
cd build &&
cmake .. &&
make &&
make install DESTDIR=../../kcov-build &&
cd ../.. &&
rm -rf kcov-master &&
for file in target/debug/actix_web-*[^\.d]; do mkdir -p "target/cov/$(basename $file)"; ./kcov-build/usr/local/bin/kcov --exclude-pattern=/.cargo,/usr/lib --verify "target/cov/$(basename $file)" "$file"; done &&
for file in target/debug/test_*[^\.d]; do mkdir -p "target/cov/$(basename $file)"; ./kcov-build/usr/local/bin/kcov --exclude-pattern=/.cargo,/usr/lib --verify "target/cov/$(basename $file)" "$file"; done &&
bash <(curl -s https://codecov.io/bash) &&
echo "Uploaded code coverage"
fi

View file

@ -1,33 +1,5 @@
# Changes
# Changelog
Changelogs are kept separately for each crate in this repo.
## 0.2.1 (2017-11-03)
* Allow to start tls server with `HttpServer::serve_tls`
* Export `Frame` enum
* Add conversion impl from `HttpResponse` and `BinaryBody` to a `Frame`
## 0.2.0 (2017-10-30)
* Do not use `http::Uri` as it can not parse some valid paths
* Refactor response `Body`
* Refactor `RouteRecognizer` usability
* Refactor `HttpContext::write`
* Refactor `Payload` stream
* Re-use `BinaryBody` for `Frame::Payload`
* Stop http actor on `write_eof`
* Fix disconnection handling.
## 0.1.0 (2017-10-23)
* First release
Actix Web changelog [is now here &rarr;](./actix-web/CHANGES.md).

49
CODE_OF_CONDUCT.md Normal file
View file

@ -0,0 +1,49 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at robjtede@icloud.com ([@robjtede]) or huyuumi@neet.club ([@JohnTitor]). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
[@robjtede]: https://github.com/robjtede
[@JohnTitor]: https://github.com/JohnTitor
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View file

@ -1,76 +1,53 @@
[package]
name = "actix-web"
version = "0.2.1"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix web framework"
readme = "README.md"
keywords = ["actor", "http", "web"]
homepage = "https://github.com/actix/actix-web"
repository = "https://github.com/actix/actix-web.git"
documentation = "https://docs.rs/actix-web/"
categories = ["network-programming", "asynchronous"]
license = "Apache-2.0"
exclude = [".gitignore", ".travis.yml", ".cargo/config", "appveyor.yml"]
build = "build.rs"
[workspace]
resolver = "2"
members = [
"actix-files",
"actix-http-test",
"actix-http",
"actix-multipart",
"actix-multipart-derive",
"actix-router",
"actix-test",
"actix-web-actors",
"actix-web-codegen",
"actix-web",
"awc",
]
[badges]
travis-ci = { repository = "actix/actix-web", branch = "master" }
appveyor = { repository = "fafhrd91/actix-web-hdy9d" }
codecov = { repository = "actix/actix-web", branch = "master", service = "github" }
[workspace.package]
homepage = "https://actix.rs"
repository = "https://github.com/actix/actix-web"
license = "MIT OR Apache-2.0"
edition = "2021"
rust-version = "1.72"
[lib]
name = "actix_web"
path = "src/lib.rs"
[features]
default = []
# tls
tls = ["native-tls", "tokio-tls"]
# http2 = ["h2"]
[dependencies]
log = "0.3"
time = "0.1"
http = "0.1"
httparse = "0.1"
http-range = "0.1"
mime = "0.3"
mime_guess = "1.8"
cookie = { version="0.10", features=["percent-encode"] }
regex = "0.2"
sha1 = "0.2"
url = "1.5"
percent-encoding = "1.0"
# tokio
bytes = "0.4"
futures = "0.1"
tokio-io = "0.1"
tokio-core = "0.1"
# h2 = { git = 'https://github.com/carllerche/h2', optional = true }
# tls
native-tls = { version="0.1", optional = true }
tokio-tls = { version="0.1", optional = true }
[dependencies.actix]
version = ">=0.3.1"
#path = "../actix"
#git = "https://github.com/actix/actix.git"
default-features = false
features = []
[dev-dependencies]
env_logger = "0.4"
reqwest = "0.8"
skeptic = "0.13"
[build-dependencies]
skeptic = "0.13"
[profile.dev]
# Disabling debug info speeds up builds a bunch and we don't rely on it for debugging that much.
debug = 0
[profile.release]
lto = true
opt-level = 3
debug = true
codegen-units = 1
[patch.crates-io]
actix-files = { path = "actix-files" }
actix-http = { path = "actix-http" }
actix-http-test = { path = "actix-http-test" }
actix-multipart = { path = "actix-multipart" }
actix-multipart-derive = { path = "actix-multipart-derive" }
actix-router = { path = "actix-router" }
actix-test = { path = "actix-test" }
actix-web = { path = "actix-web" }
actix-web-actors = { path = "actix-web-actors" }
actix-web-codegen = { path = "actix-web-codegen" }
awc = { path = "awc" }
# uncomment for quick testing against local actix-net repo
# actix-service = { path = "../actix-net/actix-service" }
# actix-macros = { path = "../actix-net/actix-macros" }
# actix-rt = { path = "../actix-net/actix-rt" }
# actix-codec = { path = "../actix-net/actix-codec" }
# actix-utils = { path = "../actix-net/actix-utils" }
# actix-tls = { path = "../actix-net/actix-tls" }
# actix-server = { path = "../actix-net/actix-server" }

View file

@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2017-NOW Nikolay Kim
Copyright 2017-NOW Actix Team
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

25
LICENSE-MIT Normal file
View file

@ -0,0 +1,25 @@
Copyright (c) 2017-NOW Actix Team
Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the
Software without restriction, including without
limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software
is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice
shall be included in all copies or substantial portions
of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

View file

@ -1,22 +0,0 @@
.PHONY: default build test doc clean
CARGO_FLAGS := --features "$(FEATURES)"
default: test
build:
cargo build $(CARGO_FLAGS)
test: build clippy
cargo test $(CARGO_FLAGS)
skeptic:
USE_SKEPTIC=1 cargo test $(CARGO_FLAGS)
# cd examples/word-count && python setup.py install && pytest -v tests
clippy:
if $$CLIPPY; then cargo clippy $(CARGO_FLAGS); fi
doc: build
cargo doc --no-deps $(CARGO_FLAGS)

123
README.md
View file

@ -1,123 +0,0 @@
# Actix web [![Build Status](https://travis-ci.org/actix/actix-web.svg?branch=master)](https://travis-ci.org/actix/actix-web) [![Build status](https://ci.appveyor.com/api/projects/status/kkdb4yce7qhm5w85/branch/master?svg=true)](https://ci.appveyor.com/project/fafhrd91/actix-web-hdy9d/branch/master) [![codecov](https://codecov.io/gh/actix/actix-web/branch/master/graph/badge.svg)](https://codecov.io/gh/actix/actix-web) [![crates.io](http://meritbadge.herokuapp.com/actix-web)](https://crates.io/crates/actix-web)
Asynchronous web framework for [Actix](https://github.com/actix/actix).
* [API Documentation (Development)](http://actix.github.io/actix-web/actix_web/)
* [API Documentation (Releases)](https://docs.rs/actix-web/)
* Cargo package: [actix-web](https://crates.io/crates/actix-web)
* Minimum supported Rust version: 1.20 or later
---
Actix web is licensed under the [Apache-2.0 license](http://opensource.org/licenses/APACHE-2.0).
## Features
* HTTP 1.1 and 1.0 support
* Streaming and pipelining support
* Keep-alive and slow requests support
* [WebSockets support](https://actix.github.io/actix-web/actix_web/ws/index.html)
* Configurable request routing
* Multipart streams
* Middlewares
## Usage
To use `actix-web`, add this to your `Cargo.toml`:
```toml
[dependencies]
actix-web = "0.2"
```
## Example
* [Basic](https://github.com/actix/actix-web/tree/master/examples/basic.rs)
* [Stateful](https://github.com/actix/actix-web/tree/master/examples/state.rs)
* [Mulitpart streams](https://github.com/actix/actix-web/tree/master/examples/multipart)
* [Simple websocket session](https://github.com/actix/actix-web/tree/master/examples/websocket.rs)
* [Tcp/Websocket chat](https://github.com/actix/actix-web/tree/master/examples/websocket-chat)
* [SockJS Server](https://github.com/fafhrd91/actix-sockjs)
```rust
extern crate actix;
extern crate actix_web;
extern crate env_logger;
use actix::*;
use actix_web::*;
struct MyWebSocket;
/// Actor with http context
impl Actor for MyWebSocket {
type Context = HttpContext<Self>;
}
/// Http route handler
impl Route for MyWebSocket {
type State = ();
fn request(req: &mut HttpRequest,
payload: Payload, ctx: &mut HttpContext<Self>) -> RouteResult<Self>
{
// websocket handshake
let resp = ws::handshake(req)?;
// send HttpResponse back to peer
ctx.start(resp);
// convert bytes stream to a stream of `ws::Message` and handle stream
ctx.add_stream(ws::WsStream::new(payload));
Reply::async(MyWebSocket)
}
}
/// Standard actix's stream handler for a stream of `ws::Message`
impl StreamHandler<ws::Message> for MyWebSocket {
fn started(&mut self, ctx: &mut Self::Context) {
println!("WebSocket session openned");
}
fn finished(&mut self, ctx: &mut Self::Context) {
println!("WebSocket session closed");
}
}
impl Handler<ws::Message> for MyWebSocket {
fn handle(&mut self, msg: ws::Message, ctx: &mut HttpContext<Self>)
-> Response<Self, ws::Message>
{
// process websocket messages
println!("WS: {:?}", msg);
match msg {
ws::Message::Ping(msg) => ws::WsWriter::pong(ctx, &msg),
ws::Message::Text(text) => ws::WsWriter::text(ctx, &text),
ws::Message::Binary(bin) => ws::WsWriter::binary(ctx, bin),
ws::Message::Closed | ws::Message::Error => {
ctx.stop();
}
_ => (),
}
Self::empty()
}
}
fn main() {
::std::env::set_var("RUST_LOG", "actix_web=info");
let _ = env_logger::init();
let sys = actix::System::new("ws-example");
HttpServer::new(
Application::default("/")
// enable logger
.middleware(Logger::new(None))
// websocket route
.resource("/ws/", |r| r.get::<MyWebSocket>())
.route_handler("/", StaticFiles::new("examples/static/", true)))
.serve::<_, ()>("127.0.0.1:8080").unwrap();
Arbiter::system().send(msgs::SystemExit(0));
let _ = sys.run();
}
```

1
README.md Symbolic link
View file

@ -0,0 +1 @@
actix-web/README.md

247
actix-files/CHANGES.md Normal file
View file

@ -0,0 +1,247 @@
# Changes
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.72.
## 0.6.5
- Fix handling of special characters in filenames.
## 0.6.4
- Fix handling of newlines in filenames.
- Minimum supported Rust version (MSRV) is now 1.68 due to transitive `time` dependency.
## 0.6.3
- XHTML files now use `Content-Disposition: inline` instead of `attachment`. [#2903]
- Minimum supported Rust version (MSRV) is now 1.59 due to transitive `time` dependency.
- Update `tokio-uring` dependency to `0.4`.
[#2903]: https://github.com/actix/actix-web/pull/2903
## 0.6.2
- Allow partial range responses for video content to start streaming sooner. [#2817]
- Minimum supported Rust version (MSRV) is now 1.57 due to transitive `time` dependency.
[#2817]: https://github.com/actix/actix-web/pull/2817
## 0.6.1
- Add `NamedFile::{modified, metadata, content_type, content_disposition, encoding}()` getters. [#2021]
- Update `tokio-uring` dependency to `0.3`.
- Audio files now use `Content-Disposition: inline` instead of `attachment`. [#2645]
- Minimum supported Rust version (MSRV) is now 1.56 due to transitive `hashbrown` dependency.
[#2021]: https://github.com/actix/actix-web/pull/2021
[#2645]: https://github.com/actix/actix-web/pull/2645
## 0.6.0
- No significant changes since `0.6.0-beta.16`.
## 0.6.0-beta.16
- No significant changes since `0.6.0-beta.15`.
## 0.6.0-beta.15
- No significant changes since `0.6.0-beta.14`.
## 0.6.0-beta.14
- The `prefer_utf8` option introduced in `0.4.0` is now true by default. [#2583]
[#2583]: https://github.com/actix/actix-web/pull/2583
## 0.6.0-beta.13
- The `Files` service now rejects requests with URL paths that include `%2F` (decoded: `/`). [#2398]
- The `Files` service now correctly decodes `%25` in the URL path to `%` for the file path. [#2398]
- Minimum supported Rust version (MSRV) is now 1.54.
[#2398]: https://github.com/actix/actix-web/pull/2398
## 0.6.0-beta.12
- No significant changes since `0.6.0-beta.11`.
## 0.6.0-beta.11
- No significant changes since `0.6.0-beta.10`.
## 0.6.0-beta.10
- No significant changes since `0.6.0-beta.9`.
## 0.6.0-beta.9
- Add crate feature `experimental-io-uring`, enabling async file I/O to be utilized. This feature is only available on Linux OSes with recent kernel versions. This feature is semver-exempt. [#2408]
- Add `NamedFile::open_async`. [#2408]
- Fix 304 Not Modified responses to omit the Content-Length header, as per the spec. [#2453]
- The `Responder` impl for `NamedFile` now has a boxed future associated type. [#2408]
- The `Service` impl for `NamedFileService` now has a boxed future associated type. [#2408]
- Add `impl Clone` for `FilesService`. [#2408]
[#2408]: https://github.com/actix/actix-web/pull/2408
[#2453]: https://github.com/actix/actix-web/pull/2453
## 0.6.0-beta.8
- Minimum supported Rust version (MSRV) is now 1.52.
## 0.6.0-beta.7
- Minimum supported Rust version (MSRV) is now 1.51.
## 0.6.0-beta.6
- Added `Files::path_filter()`. [#2274]
- `Files::show_files_listing()` can now be used with `Files::index_file()` to show files listing as a fallback when the index file is not found. [#2228]
[#2274]: https://github.com/actix/actix-web/pull/2274
[#2228]: https://github.com/actix/actix-web/pull/2228
## 0.6.0-beta.5
- `NamedFile` now implements `ServiceFactory` and `HttpServiceFactory` making it much more useful in routing. For example, it can be used directly as a default service. [#2135]
- For symbolic links, `Content-Disposition` header no longer shows the filename of the original file. [#2156]
- `Files::redirect_to_slash_directory()` now works as expected when used with `Files::show_files_listing()`. [#2225]
- `application/{javascript, json, wasm}` mime type now have `inline` disposition by default. [#2257]
[#2135]: https://github.com/actix/actix-web/pull/2135
[#2156]: https://github.com/actix/actix-web/pull/2156
[#2225]: https://github.com/actix/actix-web/pull/2225
[#2257]: https://github.com/actix/actix-web/pull/2257
## 0.6.0-beta.4
- Add support for `.guard` in `Files` to selectively filter `Files` services. [#2046]
[#2046]: https://github.com/actix/actix-web/pull/2046
## 0.6.0-beta.3
- No notable changes.
## 0.6.0-beta.2
- Fix If-Modified-Since and If-Unmodified-Since to not compare using sub-second timestamps. [#1887]
- Replace `v_htmlescape` with `askama_escape`. [#1953]
[#1887]: https://github.com/actix/actix-web/pull/1887
[#1953]: https://github.com/actix/actix-web/pull/1953
## 0.6.0-beta.1
- `HttpRange::parse` now has its own error type.
- Update `bytes` to `1.0`. [#1813]
[#1813]: https://github.com/actix/actix-web/pull/1813
## 0.5.0
- Optionally support hidden files/directories. [#1811]
[#1811]: https://github.com/actix/actix-web/pull/1811
## 0.4.1
- Clarify order of parameters in `Files::new` and improve docs.
## 0.4.0
- Add `Files::prefer_utf8` option that adds UTF-8 charset on certain response types. [#1714]
[#1714]: https://github.com/actix/actix-web/pull/1714
## 0.3.0
- No significant changes from 0.3.0-beta.1.
## 0.3.0-beta.1
- Update `v_htmlescape` to 0.10
- Update `actix-web` and `actix-http` dependencies to beta.1
## 0.3.0-alpha.1
- Update `actix-web` and `actix-http` dependencies to alpha
- Fix some typos in the docs
- Bump minimum supported Rust version to 1.40
- Support sending Content-Length when Content-Range is specified [#1384]
[#1384]: https://github.com/actix/actix-web/pull/1384
## 0.2.1
- Use the same format for file URLs regardless of platforms
## 0.2.0
- Fix BodyEncoding trait import #1220
## 0.2.0-alpha.1
- Migrate to `std::future`
## 0.1.7
- Add an additional `filename*` param in the `Content-Disposition` header of `actix_files::NamedFile` to be more compatible. (#1151)
## 0.1.6
- Add option to redirect to a slash-ended path `Files` #1132
## 0.1.5
- Bump up `mime_guess` crate version to 2.0.1
- Bump up `percent-encoding` crate version to 2.1
- Allow user defined request guards for `Files` #1113
## 0.1.4
- Allow to disable `Content-Disposition` header #686
## 0.1.3
- Do not set `Content-Length` header, let actix-http set it #930
## 0.1.2
- Content-Length is 0 for NamedFile HEAD request #914
- Fix ring dependency from actix-web default features for #741
## 0.1.1
- Static files are incorrectly served as both chunked and with length #812
## 0.1.0
- NamedFile last-modified check always fails due to nano-seconds in file modified date #820
## 0.1.0-beta.4
- Update actix-web to beta.4
## 0.1.0-beta.1
- Update actix-web to beta.1
## 0.1.0-alpha.6
- Update actix-web to alpha6
## 0.1.0-alpha.4
- Update actix-web to alpha4
## 0.1.0-alpha.2
- Add default handler support
## 0.1.0-alpha.1
- Initial impl

51
actix-files/Cargo.toml Normal file
View file

@ -0,0 +1,51 @@
[package]
name = "actix-files"
version = "0.6.5"
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
description = "Static file serving for Actix Web"
keywords = ["actix", "http", "async", "futures"]
homepage = "https://actix.rs"
repository = "https://github.com/actix/actix-web"
categories = ["asynchronous", "web-programming::http-server"]
license = "MIT OR Apache-2.0"
edition = "2021"
[lib]
name = "actix_files"
path = "src/lib.rs"
[features]
experimental-io-uring = ["actix-web/experimental-io-uring", "tokio-uring"]
[dependencies]
actix-http = "3"
actix-service = "2"
actix-utils = "3"
actix-web = { version = "4", default-features = false }
bitflags = "2"
bytes = "1"
derive_more = "0.99.5"
futures-core = { version = "0.3.17", default-features = false, features = ["alloc"] }
http-range = "0.1.4"
log = "0.4"
mime = "0.3.9"
mime_guess = "2.0.1"
percent-encoding = "2.1"
pin-project-lite = "0.2.7"
v_htmlescape = "0.15.5"
# experimental-io-uring
[target.'cfg(target_os = "linux")'.dependencies]
tokio-uring = { version = "0.4", optional = true, features = ["bytes"] }
actix-server = { version = "2.2", optional = true } # ensure matching tokio-uring versions
[dev-dependencies]
actix-rt = "2.7"
actix-test = "0.1"
actix-web = "4"
env_logger = "0.11"
tempfile = "3.2"

1
actix-files/LICENSE-APACHE Symbolic link
View file

@ -0,0 +1 @@
../LICENSE-APACHE

1
actix-files/LICENSE-MIT Symbolic link
View file

@ -0,0 +1 @@
../LICENSE-MIT

32
actix-files/README.md Normal file
View file

@ -0,0 +1,32 @@
# `actix-files`
<!-- prettier-ignore-start -->
[![crates.io](https://img.shields.io/crates/v/actix-files?label=latest)](https://crates.io/crates/actix-files)
[![Documentation](https://docs.rs/actix-files/badge.svg?version=0.6.5)](https://docs.rs/actix-files/0.6.5)
![Version](https://img.shields.io/badge/rustc-1.72+-ab6000.svg)
![License](https://img.shields.io/crates/l/actix-files.svg)
<br />
[![dependency status](https://deps.rs/crate/actix-files/0.6.5/status.svg)](https://deps.rs/crate/actix-files/0.6.5)
[![Download](https://img.shields.io/crates/d/actix-files.svg)](https://crates.io/crates/actix-files)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)
<!-- prettier-ignore-end -->
<!-- cargo-rdme start -->
Static file serving for Actix Web.
Provides a non-blocking service for serving static files from disk.
## Examples
```rust
use actix_web::App;
use actix_files::Files;
let app = App::new()
.service(Files::new("/static", ".").prefer_utf8(true));
```
<!-- cargo-rdme end -->

View file

@ -0,0 +1,33 @@
use actix_files::Files;
use actix_web::{get, guard, middleware, App, HttpServer, Responder};
const EXAMPLES_DIR: &str = concat![env!("CARGO_MANIFEST_DIR"), "/examples"];
#[get("/")]
async fn index() -> impl Responder {
"Hello world!"
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
log::info!("starting HTTP server at http://localhost:8080");
HttpServer::new(|| {
App::new()
.service(index)
.service(
Files::new("/assets", EXAMPLES_DIR)
.show_files_listing()
.guard(guard::Header("show-listing", "?1")),
)
.service(Files::new("/assets", EXAMPLES_DIR))
.wrap(middleware::Compress::default())
.wrap(middleware::Logger::default())
})
.bind(("127.0.0.1", 8080))?
.workers(2)
.run()
.await
}

217
actix-files/src/chunked.rs Normal file
View file

@ -0,0 +1,217 @@
use std::{
cmp, fmt,
future::Future,
io,
pin::Pin,
task::{Context, Poll},
};
use actix_web::{error::Error, web::Bytes};
#[cfg(feature = "experimental-io-uring")]
use bytes::BytesMut;
use futures_core::{ready, Stream};
use pin_project_lite::pin_project;
use super::named::File;
pin_project! {
/// Adapter to read a `std::file::File` in chunks.
#[doc(hidden)]
pub struct ChunkedReadFile<F, Fut> {
size: u64,
offset: u64,
#[pin]
state: ChunkedReadFileState<Fut>,
counter: u64,
callback: F,
}
}
#[cfg(not(feature = "experimental-io-uring"))]
pin_project! {
#[project = ChunkedReadFileStateProj]
#[project_replace = ChunkedReadFileStateProjReplace]
enum ChunkedReadFileState<Fut> {
File { file: Option<File>, },
Future { #[pin] fut: Fut },
}
}
#[cfg(feature = "experimental-io-uring")]
pin_project! {
#[project = ChunkedReadFileStateProj]
#[project_replace = ChunkedReadFileStateProjReplace]
enum ChunkedReadFileState<Fut> {
File { file: Option<(File, BytesMut)> },
Future { #[pin] fut: Fut },
}
}
impl<F, Fut> fmt::Debug for ChunkedReadFile<F, Fut> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("ChunkedReadFile")
}
}
pub(crate) fn new_chunked_read(
size: u64,
offset: u64,
file: File,
) -> impl Stream<Item = Result<Bytes, Error>> {
ChunkedReadFile {
size,
offset,
#[cfg(not(feature = "experimental-io-uring"))]
state: ChunkedReadFileState::File { file: Some(file) },
#[cfg(feature = "experimental-io-uring")]
state: ChunkedReadFileState::File {
file: Some((file, BytesMut::new())),
},
counter: 0,
callback: chunked_read_file_callback,
}
}
#[cfg(not(feature = "experimental-io-uring"))]
async fn chunked_read_file_callback(
mut file: File,
offset: u64,
max_bytes: usize,
) -> Result<(File, Bytes), Error> {
use io::{Read as _, Seek as _};
let res = actix_web::web::block(move || {
let mut buf = Vec::with_capacity(max_bytes);
file.seek(io::SeekFrom::Start(offset))?;
let n_bytes = file.by_ref().take(max_bytes as u64).read_to_end(&mut buf)?;
if n_bytes == 0 {
Err(io::Error::from(io::ErrorKind::UnexpectedEof))
} else {
Ok((file, Bytes::from(buf)))
}
})
.await??;
Ok(res)
}
#[cfg(feature = "experimental-io-uring")]
async fn chunked_read_file_callback(
file: File,
offset: u64,
max_bytes: usize,
mut bytes_mut: BytesMut,
) -> io::Result<(File, Bytes, BytesMut)> {
bytes_mut.reserve(max_bytes);
let (res, mut bytes_mut) = file.read_at(bytes_mut, offset).await;
let n_bytes = res?;
if n_bytes == 0 {
return Err(io::ErrorKind::UnexpectedEof.into());
}
let bytes = bytes_mut.split_to(n_bytes).freeze();
Ok((file, bytes, bytes_mut))
}
#[cfg(feature = "experimental-io-uring")]
impl<F, Fut> Stream for ChunkedReadFile<F, Fut>
where
F: Fn(File, u64, usize, BytesMut) -> Fut,
Fut: Future<Output = io::Result<(File, Bytes, BytesMut)>>,
{
type Item = Result<Bytes, Error>;
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
let mut this = self.as_mut().project();
match this.state.as_mut().project() {
ChunkedReadFileStateProj::File { file } => {
let size = *this.size;
let offset = *this.offset;
let counter = *this.counter;
if size == counter {
Poll::Ready(None)
} else {
let max_bytes = cmp::min(size.saturating_sub(counter), 65_536) as usize;
let (file, bytes_mut) = file
.take()
.expect("ChunkedReadFile polled after completion");
let fut = (this.callback)(file, offset, max_bytes, bytes_mut);
this.state
.project_replace(ChunkedReadFileState::Future { fut });
self.poll_next(cx)
}
}
ChunkedReadFileStateProj::Future { fut } => {
let (file, bytes, bytes_mut) = ready!(fut.poll(cx))?;
this.state.project_replace(ChunkedReadFileState::File {
file: Some((file, bytes_mut)),
});
*this.offset += bytes.len() as u64;
*this.counter += bytes.len() as u64;
Poll::Ready(Some(Ok(bytes)))
}
}
}
}
#[cfg(not(feature = "experimental-io-uring"))]
impl<F, Fut> Stream for ChunkedReadFile<F, Fut>
where
F: Fn(File, u64, usize) -> Fut,
Fut: Future<Output = Result<(File, Bytes), Error>>,
{
type Item = Result<Bytes, Error>;
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
let mut this = self.as_mut().project();
match this.state.as_mut().project() {
ChunkedReadFileStateProj::File { file } => {
let size = *this.size;
let offset = *this.offset;
let counter = *this.counter;
if size == counter {
Poll::Ready(None)
} else {
let max_bytes = cmp::min(size.saturating_sub(counter), 65_536) as usize;
let file = file
.take()
.expect("ChunkedReadFile polled after completion");
let fut = (this.callback)(file, offset, max_bytes);
this.state
.project_replace(ChunkedReadFileState::Future { fut });
self.poll_next(cx)
}
}
ChunkedReadFileStateProj::Future { fut } => {
let (file, bytes) = ready!(fut.poll(cx))?;
this.state
.project_replace(ChunkedReadFileState::File { file: Some(file) });
*this.offset += bytes.len() as u64;
*this.counter += bytes.len() as u64;
Poll::Ready(Some(Ok(bytes)))
}
}
}
}

View file

@ -0,0 +1,126 @@
use std::{
fmt::Write,
fs::DirEntry,
io,
path::{Path, PathBuf},
};
use actix_web::{dev::ServiceResponse, HttpRequest, HttpResponse};
use percent_encoding::{utf8_percent_encode, CONTROLS};
use v_htmlescape::escape as escape_html_entity;
/// A directory; responds with the generated directory listing.
#[derive(Debug)]
pub struct Directory {
/// Base directory.
pub base: PathBuf,
/// Path of subdirectory to generate listing for.
pub path: PathBuf,
}
impl Directory {
/// Create a new directory
pub fn new(base: PathBuf, path: PathBuf) -> Directory {
Directory { base, path }
}
/// Is this entry visible from this directory?
pub fn is_visible(&self, entry: &io::Result<DirEntry>) -> bool {
if let Ok(ref entry) = *entry {
if let Some(name) = entry.file_name().to_str() {
if name.starts_with('.') {
return false;
}
}
if let Ok(ref md) = entry.metadata() {
let ft = md.file_type();
return ft.is_dir() || ft.is_file() || ft.is_symlink();
}
}
false
}
}
pub(crate) type DirectoryRenderer =
dyn Fn(&Directory, &HttpRequest) -> Result<ServiceResponse, io::Error>;
/// Returns percent encoded file URL path.
macro_rules! encode_file_url {
($path:ident) => {
utf8_percent_encode(&$path, CONTROLS)
};
}
/// Returns HTML entity encoded formatter.
///
/// ```plain
/// " => &quot;
/// & => &amp;
/// ' => &#x27;
/// < => &lt;
/// > => &gt;
/// / => &#x2f;
/// ```
macro_rules! encode_file_name {
($entry:ident) => {
escape_html_entity(&$entry.file_name().to_string_lossy())
};
}
pub(crate) fn directory_listing(
dir: &Directory,
req: &HttpRequest,
) -> Result<ServiceResponse, io::Error> {
let index_of = format!("Index of {}", req.path());
let mut body = String::new();
let base = Path::new(req.path());
for entry in dir.path.read_dir()? {
if dir.is_visible(&entry) {
let entry = entry.unwrap();
let p = match entry.path().strip_prefix(&dir.path) {
Ok(p) if cfg!(windows) => base.join(p).to_string_lossy().replace('\\', "/"),
Ok(p) => base.join(p).to_string_lossy().into_owned(),
Err(_) => continue,
};
// if file is a directory, add '/' to the end of the name
if let Ok(metadata) = entry.metadata() {
if metadata.is_dir() {
let _ = write!(
body,
"<li><a href=\"{}\">{}/</a></li>",
encode_file_url!(p),
encode_file_name!(entry),
);
} else {
let _ = write!(
body,
"<li><a href=\"{}\">{}</a></li>",
encode_file_url!(p),
encode_file_name!(entry),
);
}
} else {
continue;
}
}
}
let html = format!(
"<html>\
<head><title>{}</title></head>\
<body><h1>{}</h1>\
<ul>\
{}\
</ul></body>\n</html>",
index_of, index_of, body
);
Ok(ServiceResponse::new(
req.clone(),
HttpResponse::Ok()
.content_type("text/html; charset=utf-8")
.body(html),
))
}

View file

@ -0,0 +1,52 @@
use mime::Mime;
/// Transforms MIME `text/*` types into their UTF-8 equivalent, if supported.
///
/// MIME types that are converted
/// - application/javascript
/// - text/html
/// - text/css
/// - text/plain
/// - text/csv
/// - text/tab-separated-values
pub(crate) fn equiv_utf8_text(ct: Mime) -> Mime {
// use (roughly) order of file-type popularity for a web server
if ct == mime::APPLICATION_JAVASCRIPT {
return mime::APPLICATION_JAVASCRIPT_UTF_8;
}
if ct == mime::TEXT_HTML {
return mime::TEXT_HTML_UTF_8;
}
if ct == mime::TEXT_CSS {
return mime::TEXT_CSS_UTF_8;
}
if ct == mime::TEXT_PLAIN {
return mime::TEXT_PLAIN_UTF_8;
}
if ct == mime::TEXT_CSV {
return mime::TEXT_CSV_UTF_8;
}
if ct == mime::TEXT_TAB_SEPARATED_VALUES {
return mime::TEXT_TAB_SEPARATED_VALUES_UTF_8;
}
ct
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_equiv_utf8_text() {
assert_eq!(equiv_utf8_text(mime::TEXT_PLAIN), mime::TEXT_PLAIN_UTF_8);
assert_eq!(equiv_utf8_text(mime::TEXT_XML), mime::TEXT_XML);
assert_eq!(equiv_utf8_text(mime::IMAGE_PNG), mime::IMAGE_PNG);
}
}

49
actix-files/src/error.rs Normal file
View file

@ -0,0 +1,49 @@
use actix_web::{http::StatusCode, ResponseError};
use derive_more::Display;
/// Errors which can occur when serving static files.
#[derive(Debug, PartialEq, Eq, Display)]
pub enum FilesError {
/// Path is not a directory.
#[allow(dead_code)]
#[display(fmt = "path is not a directory. Unable to serve static files")]
IsNotDirectory,
/// Cannot render directory.
#[display(fmt = "unable to render directory without index file")]
IsDirectory,
}
impl ResponseError for FilesError {
/// Returns `404 Not Found`.
fn status_code(&self) -> StatusCode {
StatusCode::NOT_FOUND
}
}
#[derive(Debug, PartialEq, Eq, Display)]
#[non_exhaustive]
pub enum UriSegmentError {
/// Segment started with the wrapped invalid character.
#[display(fmt = "segment started with invalid character: ('{_0}')")]
BadStart(char),
/// Segment contained the wrapped invalid character.
#[display(fmt = "segment contained invalid character ('{_0}')")]
BadChar(char),
/// Segment ended with the wrapped invalid character.
#[display(fmt = "segment ended with invalid character: ('{_0}')")]
BadEnd(char),
/// Path is not a valid UTF-8 string after percent-decoding.
#[display(fmt = "path is not a valid UTF-8 string after percent-decoding")]
NotValidUtf8,
}
impl ResponseError for UriSegmentError {
/// Returns `400 Bad Request`.
fn status_code(&self) -> StatusCode {
StatusCode::BAD_REQUEST
}
}

430
actix-files/src/files.rs Normal file
View file

@ -0,0 +1,430 @@
use std::{
cell::RefCell,
fmt, io,
path::{Path, PathBuf},
rc::Rc,
};
use actix_service::{boxed, IntoServiceFactory, ServiceFactory, ServiceFactoryExt};
use actix_web::{
dev::{
AppService, HttpServiceFactory, RequestHead, ResourceDef, ServiceRequest, ServiceResponse,
},
error::Error,
guard::Guard,
http::header::DispositionType,
HttpRequest,
};
use futures_core::future::LocalBoxFuture;
use crate::{
directory_listing, named,
service::{FilesService, FilesServiceInner},
Directory, DirectoryRenderer, HttpNewService, MimeOverride, PathFilter,
};
/// Static files handling service.
///
/// `Files` service must be registered with `App::service()` method.
///
/// # Examples
/// ```
/// use actix_web::App;
/// use actix_files::Files;
///
/// let app = App::new()
/// .service(Files::new("/static", "."));
/// ```
pub struct Files {
mount_path: String,
directory: PathBuf,
index: Option<String>,
show_index: bool,
redirect_to_slash: bool,
default: Rc<RefCell<Option<Rc<HttpNewService>>>>,
renderer: Rc<DirectoryRenderer>,
mime_override: Option<Rc<MimeOverride>>,
path_filter: Option<Rc<PathFilter>>,
file_flags: named::Flags,
use_guards: Option<Rc<dyn Guard>>,
guards: Vec<Rc<dyn Guard>>,
hidden_files: bool,
}
impl fmt::Debug for Files {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("Files")
}
}
impl Clone for Files {
fn clone(&self) -> Self {
Self {
directory: self.directory.clone(),
index: self.index.clone(),
show_index: self.show_index,
redirect_to_slash: self.redirect_to_slash,
default: self.default.clone(),
renderer: self.renderer.clone(),
file_flags: self.file_flags,
mount_path: self.mount_path.clone(),
mime_override: self.mime_override.clone(),
path_filter: self.path_filter.clone(),
use_guards: self.use_guards.clone(),
guards: self.guards.clone(),
hidden_files: self.hidden_files,
}
}
}
impl Files {
/// Create new `Files` instance for a specified base directory.
///
/// # Argument Order
/// The first argument (`mount_path`) is the root URL at which the static files are served.
/// For example, `/assets` will serve files at `example.com/assets/...`.
///
/// The second argument (`serve_from`) is the location on disk at which files are loaded.
/// This can be a relative path. For example, `./` would serve files from the current
/// working directory.
///
/// # Implementation Notes
/// If the mount path is set as the root path `/`, services registered after this one will
/// be inaccessible. Register more specific handlers and services first.
///
/// `Files` utilizes the existing Tokio thread-pool for blocking filesystem operations.
/// The number of running threads is adjusted over time as needed, up to a maximum of 512 times
/// the number of server [workers](actix_web::HttpServer::workers), by default.
pub fn new<T: Into<PathBuf>>(mount_path: &str, serve_from: T) -> Files {
let orig_dir = serve_from.into();
let dir = match orig_dir.canonicalize() {
Ok(canon_dir) => canon_dir,
Err(_) => {
log::error!("Specified path is not a directory: {:?}", orig_dir);
PathBuf::new()
}
};
Files {
mount_path: mount_path.trim_end_matches('/').to_owned(),
directory: dir,
index: None,
show_index: false,
redirect_to_slash: false,
default: Rc::new(RefCell::new(None)),
renderer: Rc::new(directory_listing),
mime_override: None,
path_filter: None,
file_flags: named::Flags::default(),
use_guards: None,
guards: Vec::new(),
hidden_files: false,
}
}
/// Show files listing for directories.
///
/// By default show files listing is disabled.
///
/// When used with [`Files::index_file()`], files listing is shown as a fallback
/// when the index file is not found.
pub fn show_files_listing(mut self) -> Self {
self.show_index = true;
self
}
/// Redirects to a slash-ended path when browsing a directory.
///
/// By default never redirect.
pub fn redirect_to_slash_directory(mut self) -> Self {
self.redirect_to_slash = true;
self
}
/// Set custom directory renderer.
pub fn files_listing_renderer<F>(mut self, f: F) -> Self
where
for<'r, 's> F:
Fn(&'r Directory, &'s HttpRequest) -> Result<ServiceResponse, io::Error> + 'static,
{
self.renderer = Rc::new(f);
self
}
/// Specifies MIME override callback.
pub fn mime_override<F>(mut self, f: F) -> Self
where
F: Fn(&mime::Name<'_>) -> DispositionType + 'static,
{
self.mime_override = Some(Rc::new(f));
self
}
/// Sets path filtering closure.
///
/// The path provided to the closure is relative to `serve_from` path.
/// You can safely join this path with the `serve_from` path to get the real path.
/// However, the real path may not exist since the filter is called before checking path existence.
///
/// When a path doesn't pass the filter, [`Files::default_handler`] is called if set, otherwise,
/// `404 Not Found` is returned.
///
/// # Examples
/// ```
/// use std::path::Path;
/// use actix_files::Files;
///
/// // prevent searching subdirectories and following symlinks
/// let files_service = Files::new("/", "./static").path_filter(|path, _| {
/// path.components().count() == 1
/// && Path::new("./static")
/// .join(path)
/// .symlink_metadata()
/// .map(|m| !m.file_type().is_symlink())
/// .unwrap_or(false)
/// });
/// ```
pub fn path_filter<F>(mut self, f: F) -> Self
where
F: Fn(&Path, &RequestHead) -> bool + 'static,
{
self.path_filter = Some(Rc::new(f));
self
}
/// Set index file
///
/// Shows specific index file for directories instead of
/// showing files listing.
///
/// If the index file is not found, files listing is shown as a fallback if
/// [`Files::show_files_listing()`] is set.
pub fn index_file<T: Into<String>>(mut self, index: T) -> Self {
self.index = Some(index.into());
self
}
/// Specifies whether to use ETag or not.
///
/// Default is true.
pub fn use_etag(mut self, value: bool) -> Self {
self.file_flags.set(named::Flags::ETAG, value);
self
}
/// Specifies whether to use Last-Modified or not.
///
/// Default is true.
pub fn use_last_modified(mut self, value: bool) -> Self {
self.file_flags.set(named::Flags::LAST_MD, value);
self
}
/// Specifies whether text responses should signal a UTF-8 encoding.
///
/// Default is false (but will default to true in a future version).
pub fn prefer_utf8(mut self, value: bool) -> Self {
self.file_flags.set(named::Flags::PREFER_UTF8, value);
self
}
/// Adds a routing guard.
///
/// Use this to allow multiple chained file services that respond to strictly different
/// properties of a request. Due to the way routing works, if a guard check returns true and the
/// request starts being handled by the file service, it will not be able to back-out and try
/// the next service, you will simply get a 404 (or 405) error response.
///
/// To allow `POST` requests to retrieve files, see [`Files::method_guard()`].
///
/// # Examples
/// ```
/// use actix_web::{guard::Header, App};
/// use actix_files::Files;
///
/// App::new().service(
/// Files::new("/","/my/site/files")
/// .guard(Header("Host", "example.com"))
/// );
/// ```
pub fn guard<G: Guard + 'static>(mut self, guard: G) -> Self {
self.guards.push(Rc::new(guard));
self
}
/// Specifies guard to check before fetching directory listings or files.
///
/// Note that this guard has no effect on routing; it's main use is to guard on the request's
/// method just before serving the file, only allowing `GET` and `HEAD` requests by default.
/// See [`Files::guard`] for routing guards.
pub fn method_guard<G: Guard + 'static>(mut self, guard: G) -> Self {
self.use_guards = Some(Rc::new(guard));
self
}
/// See [`Files::method_guard`].
#[doc(hidden)]
#[deprecated(since = "0.6.0", note = "Renamed to `method_guard`.")]
pub fn use_guards<G: Guard + 'static>(self, guard: G) -> Self {
self.method_guard(guard)
}
/// Disable `Content-Disposition` header.
///
/// By default Content-Disposition` header is enabled.
pub fn disable_content_disposition(mut self) -> Self {
self.file_flags.remove(named::Flags::CONTENT_DISPOSITION);
self
}
/// Sets default handler which is used when no matched file could be found.
///
/// # Examples
/// Setting a fallback static file handler:
/// ```
/// use actix_files::{Files, NamedFile};
/// use actix_web::dev::{ServiceRequest, ServiceResponse, fn_service};
///
/// # fn run() -> Result<(), actix_web::Error> {
/// let files = Files::new("/", "./static")
/// .index_file("index.html")
/// .default_handler(fn_service(|req: ServiceRequest| async {
/// let (req, _) = req.into_parts();
/// let file = NamedFile::open_async("./static/404.html").await?;
/// let res = file.into_response(&req);
/// Ok(ServiceResponse::new(req, res))
/// }));
/// # Ok(())
/// # }
/// ```
pub fn default_handler<F, U>(mut self, f: F) -> Self
where
F: IntoServiceFactory<U, ServiceRequest>,
U: ServiceFactory<ServiceRequest, Config = (), Response = ServiceResponse, Error = Error>
+ 'static,
{
// create and configure default resource
self.default = Rc::new(RefCell::new(Some(Rc::new(boxed::factory(
f.into_factory().map_init_err(|_| ()),
)))));
self
}
/// Enables serving hidden files and directories, allowing a leading dots in url fragments.
pub fn use_hidden_files(mut self) -> Self {
self.hidden_files = true;
self
}
}
impl HttpServiceFactory for Files {
fn register(mut self, config: &mut AppService) {
let guards = if self.guards.is_empty() {
None
} else {
let guards = std::mem::take(&mut self.guards);
Some(
guards
.into_iter()
.map(|guard| -> Box<dyn Guard> { Box::new(guard) })
.collect::<Vec<_>>(),
)
};
if self.default.borrow().is_none() {
*self.default.borrow_mut() = Some(config.default_service());
}
let rdef = if config.is_root() {
ResourceDef::root_prefix(&self.mount_path)
} else {
ResourceDef::prefix(&self.mount_path)
};
config.register_service(rdef, guards, self, None)
}
}
impl ServiceFactory<ServiceRequest> for Files {
type Response = ServiceResponse;
type Error = Error;
type Config = ();
type Service = FilesService;
type InitError = ();
type Future = LocalBoxFuture<'static, Result<Self::Service, Self::InitError>>;
fn new_service(&self, _: ()) -> Self::Future {
let mut inner = FilesServiceInner {
directory: self.directory.clone(),
index: self.index.clone(),
show_index: self.show_index,
redirect_to_slash: self.redirect_to_slash,
default: None,
renderer: self.renderer.clone(),
mime_override: self.mime_override.clone(),
path_filter: self.path_filter.clone(),
file_flags: self.file_flags,
guards: self.use_guards.clone(),
hidden_files: self.hidden_files,
};
if let Some(ref default) = *self.default.borrow() {
let fut = default.new_service(());
Box::pin(async {
match fut.await {
Ok(default) => {
inner.default = Some(default);
Ok(FilesService(Rc::new(inner)))
}
Err(_) => Err(()),
}
})
} else {
Box::pin(async move { Ok(FilesService(Rc::new(inner))) })
}
}
}
#[cfg(test)]
mod tests {
use actix_web::{
http::StatusCode,
test::{self, TestRequest},
App, HttpResponse,
};
use super::*;
#[actix_web::test]
async fn custom_files_listing_renderer() {
let srv = test::init_service(
App::new().service(
Files::new("/", "./tests")
.show_files_listing()
.files_listing_renderer(|dir, req| {
Ok(ServiceResponse::new(
req.clone(),
HttpResponse::Ok().body(dir.path.to_str().unwrap().to_owned()),
))
}),
),
)
.await;
let req = TestRequest::with_uri("/").to_request();
let res = test::call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::OK);
let body = test::read_body(res).await;
let body_str = std::str::from_utf8(&body).unwrap();
let actual_path = Path::new(&body_str);
let expected_path = Path::new("actix-files/tests");
assert!(
actual_path.ends_with(expected_path),
"body {:?} does not end with {:?}",
actual_path,
expected_path
);
}
}

1039
actix-files/src/lib.rs Normal file

File diff suppressed because it is too large Load diff

689
actix-files/src/named.rs Normal file
View file

@ -0,0 +1,689 @@
use std::{
fs::Metadata,
io,
path::{Path, PathBuf},
time::{SystemTime, UNIX_EPOCH},
};
use actix_web::{
body::{self, BoxBody, SizedStream},
dev::{
self, AppService, HttpServiceFactory, ResourceDef, Service, ServiceFactory, ServiceRequest,
ServiceResponse,
},
http::{
header::{
self, Charset, ContentDisposition, ContentEncoding, DispositionParam, DispositionType,
ExtendedValue, HeaderValue,
},
StatusCode,
},
Error, HttpMessage, HttpRequest, HttpResponse, Responder,
};
use bitflags::bitflags;
use derive_more::{Deref, DerefMut};
use futures_core::future::LocalBoxFuture;
use mime::Mime;
use crate::{encoding::equiv_utf8_text, range::HttpRange};
bitflags! {
#[derive(Debug, Clone, Copy)]
pub(crate) struct Flags: u8 {
const ETAG = 0b0000_0001;
const LAST_MD = 0b0000_0010;
const CONTENT_DISPOSITION = 0b0000_0100;
const PREFER_UTF8 = 0b0000_1000;
}
}
impl Default for Flags {
fn default() -> Self {
Flags::from_bits_truncate(0b0000_1111)
}
}
/// A file with an associated name.
///
/// `NamedFile` can be registered as services:
/// ```
/// use actix_web::App;
/// use actix_files::NamedFile;
///
/// # async fn run() -> Result<(), Box<dyn std::error::Error>> {
/// let file = NamedFile::open_async("./static/index.html").await?;
/// let app = App::new().service(file);
/// # Ok(())
/// # }
/// ```
///
/// They can also be returned from handlers:
/// ```
/// use actix_web::{Responder, get};
/// use actix_files::NamedFile;
///
/// #[get("/")]
/// async fn index() -> impl Responder {
/// NamedFile::open_async("./static/index.html").await
/// }
/// ```
#[derive(Debug, Deref, DerefMut)]
pub struct NamedFile {
#[deref]
#[deref_mut]
file: File,
path: PathBuf,
modified: Option<SystemTime>,
pub(crate) md: Metadata,
pub(crate) flags: Flags,
pub(crate) status_code: StatusCode,
pub(crate) content_type: Mime,
pub(crate) content_disposition: ContentDisposition,
pub(crate) encoding: Option<ContentEncoding>,
}
#[cfg(not(feature = "experimental-io-uring"))]
pub(crate) use std::fs::File;
#[cfg(feature = "experimental-io-uring")]
pub(crate) use tokio_uring::fs::File;
use super::chunked;
impl NamedFile {
/// Creates an instance from a previously opened file.
///
/// The given `path` need not exist and is only used to determine the `ContentType` and
/// `ContentDisposition` headers.
///
/// # Examples
/// ```ignore
/// use std::{
/// io::{self, Write as _},
/// env,
/// fs::File
/// };
/// use actix_files::NamedFile;
///
/// let mut file = File::create("foo.txt")?;
/// file.write_all(b"Hello, world!")?;
/// let named_file = NamedFile::from_file(file, "bar.txt")?;
/// # std::fs::remove_file("foo.txt");
/// Ok(())
/// ```
pub fn from_file<P: AsRef<Path>>(file: File, path: P) -> io::Result<NamedFile> {
let path = path.as_ref().to_path_buf();
// Get the name of the file and use it to construct default Content-Type
// and Content-Disposition values
let (content_type, content_disposition) = {
let filename = match path.file_name() {
Some(name) => name.to_string_lossy(),
None => {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Provided path has no filename",
));
}
};
let ct = mime_guess::from_path(&path).first_or_octet_stream();
let disposition = match ct.type_() {
mime::IMAGE | mime::TEXT | mime::AUDIO | mime::VIDEO => DispositionType::Inline,
mime::APPLICATION => match ct.subtype() {
mime::JAVASCRIPT | mime::JSON => DispositionType::Inline,
name if name == "wasm" || name == "xhtml" => DispositionType::Inline,
_ => DispositionType::Attachment,
},
_ => DispositionType::Attachment,
};
// replace special characters in filenames which could occur on some filesystems
let filename_s = filename
.replace('\n', "%0A") // \n line break
.replace('\x0B', "%0B") // \v vertical tab
.replace('\x0C', "%0C") // \f form feed
.replace('\r', "%0D"); // \r carriage return
let mut parameters = vec![DispositionParam::Filename(filename_s)];
if !filename.is_ascii() {
parameters.push(DispositionParam::FilenameExt(ExtendedValue {
charset: Charset::Ext(String::from("UTF-8")),
language_tag: None,
value: filename.into_owned().into_bytes(),
}))
}
let cd = ContentDisposition {
disposition,
parameters,
};
(ct, cd)
};
let md = {
#[cfg(not(feature = "experimental-io-uring"))]
{
file.metadata()?
}
#[cfg(feature = "experimental-io-uring")]
{
use std::os::unix::prelude::{AsRawFd, FromRawFd};
let fd = file.as_raw_fd();
// SAFETY: fd is borrowed and lives longer than the unsafe block
unsafe {
let file = std::fs::File::from_raw_fd(fd);
let md = file.metadata();
// SAFETY: forget the fd before exiting block in success or error case but don't
// run destructor (that would close file handle)
std::mem::forget(file);
md?
}
}
};
let modified = md.modified().ok();
let encoding = None;
Ok(NamedFile {
path,
file,
content_type,
content_disposition,
md,
modified,
encoding,
status_code: StatusCode::OK,
flags: Flags::default(),
})
}
/// Attempts to open a file in read-only mode.
///
/// # Examples
/// ```
/// use actix_files::NamedFile;
/// let file = NamedFile::open("foo.txt");
/// ```
#[cfg(not(feature = "experimental-io-uring"))]
pub fn open<P: AsRef<Path>>(path: P) -> io::Result<NamedFile> {
let file = File::open(&path)?;
Self::from_file(file, path)
}
/// Attempts to open a file asynchronously in read-only mode.
///
/// When the `experimental-io-uring` crate feature is enabled, this will be async. Otherwise, it
/// will behave just like `open`.
///
/// # Examples
/// ```
/// use actix_files::NamedFile;
/// # async fn open() {
/// let file = NamedFile::open_async("foo.txt").await.unwrap();
/// # }
/// ```
pub async fn open_async<P: AsRef<Path>>(path: P) -> io::Result<NamedFile> {
let file = {
#[cfg(not(feature = "experimental-io-uring"))]
{
File::open(&path)?
}
#[cfg(feature = "experimental-io-uring")]
{
File::open(&path).await?
}
};
Self::from_file(file, path)
}
/// Returns reference to the underlying file object.
#[inline]
pub fn file(&self) -> &File {
&self.file
}
/// Returns the filesystem path to this file.
///
/// # Examples
/// ```
/// # use std::io;
/// use actix_files::NamedFile;
///
/// # async fn path() -> io::Result<()> {
/// let file = NamedFile::open_async("test.txt").await?;
/// assert_eq!(file.path().as_os_str(), "foo.txt");
/// # Ok(())
/// # }
/// ```
#[inline]
pub fn path(&self) -> &Path {
self.path.as_path()
}
/// Returns the time the file was last modified.
///
/// Returns `None` only on unsupported platforms; see [`std::fs::Metadata::modified()`].
/// Therefore, it is usually safe to unwrap this.
#[inline]
pub fn modified(&self) -> Option<SystemTime> {
self.modified
}
/// Returns the filesystem metadata associated with this file.
#[inline]
pub fn metadata(&self) -> &Metadata {
&self.md
}
/// Returns the `Content-Type` header that will be used when serving this file.
#[inline]
pub fn content_type(&self) -> &Mime {
&self.content_type
}
/// Returns the `Content-Disposition` that will be used when serving this file.
#[inline]
pub fn content_disposition(&self) -> &ContentDisposition {
&self.content_disposition
}
/// Returns the `Content-Encoding` that will be used when serving this file.
///
/// A return value of `None` indicates that the content is not already using a compressed
/// representation and may be subject to compression downstream.
#[inline]
pub fn content_encoding(&self) -> Option<ContentEncoding> {
self.encoding
}
/// Set response status code.
#[deprecated(since = "0.7.0", note = "Prefer `Responder::customize()`.")]
pub fn set_status_code(mut self, status: StatusCode) -> Self {
self.status_code = status;
self
}
/// Sets the `Content-Type` header that will be used when serving this file. By default the
/// `Content-Type` is inferred from the filename extension.
#[inline]
pub fn set_content_type(mut self, mime_type: Mime) -> Self {
self.content_type = mime_type;
self
}
/// Set the Content-Disposition for serving this file. This allows changing the
/// `inline/attachment` disposition as well as the filename sent to the peer.
///
/// By default the disposition is `inline` for `text/*`, `image/*`, `video/*` and
/// `application/{javascript, json, wasm}` mime types, and `attachment` otherwise, and the
/// filename is taken from the path provided in the `open` method after converting it to UTF-8
/// (using `to_string_lossy`).
#[inline]
pub fn set_content_disposition(mut self, cd: ContentDisposition) -> Self {
self.content_disposition = cd;
self.flags.insert(Flags::CONTENT_DISPOSITION);
self
}
/// Disables `Content-Disposition` header.
///
/// By default, the `Content-Disposition` header is sent.
#[inline]
pub fn disable_content_disposition(mut self) -> Self {
self.flags.remove(Flags::CONTENT_DISPOSITION);
self
}
/// Sets content encoding for this file.
///
/// This prevents the `Compress` middleware from modifying the file contents and signals to
/// browsers/clients how to decode it. For example, if serving a compressed HTML file (e.g.,
/// `index.html.gz`) then use `.set_content_encoding(ContentEncoding::Gzip)`.
#[inline]
pub fn set_content_encoding(mut self, enc: ContentEncoding) -> Self {
self.encoding = Some(enc);
self
}
/// Specifies whether to return `ETag` header in response.
///
/// Default is true.
#[inline]
pub fn use_etag(mut self, value: bool) -> Self {
self.flags.set(Flags::ETAG, value);
self
}
/// Specifies whether to return `Last-Modified` header in response.
///
/// Default is true.
#[inline]
pub fn use_last_modified(mut self, value: bool) -> Self {
self.flags.set(Flags::LAST_MD, value);
self
}
/// Specifies whether text responses should signal a UTF-8 encoding.
///
/// Default is false (but will default to true in a future version).
#[inline]
pub fn prefer_utf8(mut self, value: bool) -> Self {
self.flags.set(Flags::PREFER_UTF8, value);
self
}
/// Creates an `ETag` in a format is similar to Apache's.
pub(crate) fn etag(&self) -> Option<header::EntityTag> {
self.modified.as_ref().map(|mtime| {
let ino = {
#[cfg(unix)]
{
#[cfg(unix)]
use std::os::unix::fs::MetadataExt as _;
self.md.ino()
}
#[cfg(not(unix))]
{
0
}
};
let dur = mtime
.duration_since(UNIX_EPOCH)
.expect("modification time must be after epoch");
header::EntityTag::new_strong(format!(
"{:x}:{:x}:{:x}:{:x}",
ino,
self.md.len(),
dur.as_secs(),
dur.subsec_nanos()
))
})
}
pub(crate) fn last_modified(&self) -> Option<header::HttpDate> {
self.modified.map(|mtime| mtime.into())
}
/// Creates an `HttpResponse` with file as a streaming body.
pub fn into_response(self, req: &HttpRequest) -> HttpResponse<BoxBody> {
if self.status_code != StatusCode::OK {
let mut res = HttpResponse::build(self.status_code);
let ct = if self.flags.contains(Flags::PREFER_UTF8) {
equiv_utf8_text(self.content_type.clone())
} else {
self.content_type
};
res.insert_header((header::CONTENT_TYPE, ct.to_string()));
if self.flags.contains(Flags::CONTENT_DISPOSITION) {
res.insert_header((
header::CONTENT_DISPOSITION,
self.content_disposition.to_string(),
));
}
if let Some(current_encoding) = self.encoding {
res.insert_header((header::CONTENT_ENCODING, current_encoding.as_str()));
}
let reader = chunked::new_chunked_read(self.md.len(), 0, self.file);
return res.streaming(reader);
}
let etag = if self.flags.contains(Flags::ETAG) {
self.etag()
} else {
None
};
let last_modified = if self.flags.contains(Flags::LAST_MD) {
self.last_modified()
} else {
None
};
// check preconditions
let precondition_failed = if !any_match(etag.as_ref(), req) {
true
} else if let (Some(ref m), Some(header::IfUnmodifiedSince(ref since))) =
(last_modified, req.get_header())
{
let t1: SystemTime = (*m).into();
let t2: SystemTime = (*since).into();
match (t1.duration_since(UNIX_EPOCH), t2.duration_since(UNIX_EPOCH)) {
(Ok(t1), Ok(t2)) => t1.as_secs() > t2.as_secs(),
_ => false,
}
} else {
false
};
// check last modified
let not_modified = if !none_match(etag.as_ref(), req) {
true
} else if req.headers().contains_key(header::IF_NONE_MATCH) {
false
} else if let (Some(ref m), Some(header::IfModifiedSince(ref since))) =
(last_modified, req.get_header())
{
let t1: SystemTime = (*m).into();
let t2: SystemTime = (*since).into();
match (t1.duration_since(UNIX_EPOCH), t2.duration_since(UNIX_EPOCH)) {
(Ok(t1), Ok(t2)) => t1.as_secs() <= t2.as_secs(),
_ => false,
}
} else {
false
};
let mut res = HttpResponse::build(self.status_code);
let ct = if self.flags.contains(Flags::PREFER_UTF8) {
equiv_utf8_text(self.content_type.clone())
} else {
self.content_type
};
res.insert_header((header::CONTENT_TYPE, ct.to_string()));
if self.flags.contains(Flags::CONTENT_DISPOSITION) {
res.insert_header((
header::CONTENT_DISPOSITION,
self.content_disposition.to_string(),
));
}
if let Some(current_encoding) = self.encoding {
res.insert_header((header::CONTENT_ENCODING, current_encoding.as_str()));
}
if let Some(lm) = last_modified {
res.insert_header((header::LAST_MODIFIED, lm.to_string()));
}
if let Some(etag) = etag {
res.insert_header((header::ETAG, etag.to_string()));
}
res.insert_header((header::ACCEPT_RANGES, "bytes"));
let mut length = self.md.len();
let mut offset = 0;
// check for range header
if let Some(ranges) = req.headers().get(header::RANGE) {
if let Ok(ranges_header) = ranges.to_str() {
if let Ok(ranges) = HttpRange::parse(ranges_header, length) {
length = ranges[0].length;
offset = ranges[0].start;
// When a Content-Encoding header is present in a 206 partial content response
// for video content, it prevents browser video players from starting playback
// before loading the whole video and also prevents seeking.
//
// See: https://github.com/actix/actix-web/issues/2815
//
// The assumption of this fix is that the video player knows to not send an
// Accept-Encoding header for this request and that downstream middleware will
// not attempt compression for requests without it.
//
// TODO: Solve question around what to do if self.encoding is set and partial
// range is requested. Reject request? Ignoring self.encoding seems wrong, too.
// In practice, it should not come up.
if req.headers().contains_key(&header::ACCEPT_ENCODING) {
// don't allow compression middleware to modify partial content
res.insert_header((
header::CONTENT_ENCODING,
HeaderValue::from_static("identity"),
));
}
res.insert_header((
header::CONTENT_RANGE,
format!("bytes {}-{}/{}", offset, offset + length - 1, self.md.len()),
));
} else {
res.insert_header((header::CONTENT_RANGE, format!("bytes */{}", length)));
return res.status(StatusCode::RANGE_NOT_SATISFIABLE).finish();
};
} else {
return res.status(StatusCode::BAD_REQUEST).finish();
};
};
if precondition_failed {
return res.status(StatusCode::PRECONDITION_FAILED).finish();
} else if not_modified {
return res
.status(StatusCode::NOT_MODIFIED)
.body(body::None::new())
.map_into_boxed_body();
}
let reader = chunked::new_chunked_read(length, offset, self.file);
if offset != 0 || length != self.md.len() {
res.status(StatusCode::PARTIAL_CONTENT);
}
res.body(SizedStream::new(length, reader))
}
}
/// Returns true if `req` has no `If-Match` header or one which matches `etag`.
fn any_match(etag: Option<&header::EntityTag>, req: &HttpRequest) -> bool {
match req.get_header::<header::IfMatch>() {
None | Some(header::IfMatch::Any) => true,
Some(header::IfMatch::Items(ref items)) => {
if let Some(some_etag) = etag {
for item in items {
if item.strong_eq(some_etag) {
return true;
}
}
}
false
}
}
}
/// Returns true if `req` doesn't have an `If-None-Match` header matching `req`.
fn none_match(etag: Option<&header::EntityTag>, req: &HttpRequest) -> bool {
match req.get_header::<header::IfNoneMatch>() {
Some(header::IfNoneMatch::Any) => false,
Some(header::IfNoneMatch::Items(ref items)) => {
if let Some(some_etag) = etag {
for item in items {
if item.weak_eq(some_etag) {
return false;
}
}
}
true
}
None => true,
}
}
impl Responder for NamedFile {
type Body = BoxBody;
fn respond_to(self, req: &HttpRequest) -> HttpResponse<Self::Body> {
self.into_response(req)
}
}
impl ServiceFactory<ServiceRequest> for NamedFile {
type Response = ServiceResponse;
type Error = Error;
type Config = ();
type Service = NamedFileService;
type InitError = ();
type Future = LocalBoxFuture<'static, Result<Self::Service, Self::InitError>>;
fn new_service(&self, _: ()) -> Self::Future {
let service = NamedFileService {
path: self.path.clone(),
};
Box::pin(async move { Ok(service) })
}
}
#[doc(hidden)]
#[derive(Debug)]
pub struct NamedFileService {
path: PathBuf,
}
impl Service<ServiceRequest> for NamedFileService {
type Response = ServiceResponse;
type Error = Error;
type Future = LocalBoxFuture<'static, Result<Self::Response, Self::Error>>;
dev::always_ready!();
fn call(&self, req: ServiceRequest) -> Self::Future {
let (req, _) = req.into_parts();
let path = self.path.clone();
Box::pin(async move {
let file = NamedFile::open_async(path).await?;
let res = file.into_response(&req);
Ok(ServiceResponse::new(req, res))
})
}
}
impl HttpServiceFactory for NamedFile {
fn register(self, config: &mut AppService) {
config.register_service(
ResourceDef::root_prefix(self.path.to_string_lossy().as_ref()),
None,
self,
None,
)
}
}

188
actix-files/src/path_buf.rs Normal file
View file

@ -0,0 +1,188 @@
use std::{
path::{Component, Path, PathBuf},
str::FromStr,
};
use actix_utils::future::{ready, Ready};
use actix_web::{dev::Payload, FromRequest, HttpRequest};
use crate::error::UriSegmentError;
#[derive(Debug, PartialEq, Eq)]
pub(crate) struct PathBufWrap(PathBuf);
impl FromStr for PathBufWrap {
type Err = UriSegmentError;
fn from_str(path: &str) -> Result<Self, Self::Err> {
Self::parse_path(path, false)
}
}
impl PathBufWrap {
/// Parse a path, giving the choice of allowing hidden files to be considered valid segments.
///
/// Path traversal is guarded by this method.
pub fn parse_path(path: &str, hidden_files: bool) -> Result<Self, UriSegmentError> {
let mut buf = PathBuf::new();
// equivalent to `path.split('/').count()`
let mut segment_count = path.matches('/').count() + 1;
// we can decode the whole path here (instead of per-segment decoding)
// because we will reject `%2F` in paths using `segment_count`.
let path = percent_encoding::percent_decode_str(path)
.decode_utf8()
.map_err(|_| UriSegmentError::NotValidUtf8)?;
// disallow decoding `%2F` into `/`
if segment_count != path.matches('/').count() + 1 {
return Err(UriSegmentError::BadChar('/'));
}
for segment in path.split('/') {
if segment == ".." {
segment_count -= 1;
buf.pop();
} else if !hidden_files && segment.starts_with('.') {
return Err(UriSegmentError::BadStart('.'));
} else if segment.starts_with('*') {
return Err(UriSegmentError::BadStart('*'));
} else if segment.ends_with(':') {
return Err(UriSegmentError::BadEnd(':'));
} else if segment.ends_with('>') {
return Err(UriSegmentError::BadEnd('>'));
} else if segment.ends_with('<') {
return Err(UriSegmentError::BadEnd('<'));
} else if segment.is_empty() {
segment_count -= 1;
continue;
} else if cfg!(windows) && segment.contains('\\') {
return Err(UriSegmentError::BadChar('\\'));
} else if cfg!(windows) && segment.contains(':') {
return Err(UriSegmentError::BadChar(':'));
} else {
buf.push(segment)
}
}
// make sure we agree with stdlib parser
for (i, component) in buf.components().enumerate() {
assert!(
matches!(component, Component::Normal(_)),
"component `{:?}` is not normal",
component
);
assert!(i < segment_count);
}
Ok(PathBufWrap(buf))
}
}
impl AsRef<Path> for PathBufWrap {
fn as_ref(&self) -> &Path {
self.0.as_ref()
}
}
impl FromRequest for PathBufWrap {
type Error = UriSegmentError;
type Future = Ready<Result<Self, Self::Error>>;
fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future {
ready(req.match_info().unprocessed().parse())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_path_buf() {
assert_eq!(
PathBufWrap::from_str("/test/.tt").map(|t| t.0),
Err(UriSegmentError::BadStart('.'))
);
assert_eq!(
PathBufWrap::from_str("/test/*tt").map(|t| t.0),
Err(UriSegmentError::BadStart('*'))
);
assert_eq!(
PathBufWrap::from_str("/test/tt:").map(|t| t.0),
Err(UriSegmentError::BadEnd(':'))
);
assert_eq!(
PathBufWrap::from_str("/test/tt<").map(|t| t.0),
Err(UriSegmentError::BadEnd('<'))
);
assert_eq!(
PathBufWrap::from_str("/test/tt>").map(|t| t.0),
Err(UriSegmentError::BadEnd('>'))
);
assert_eq!(
PathBufWrap::from_str("/seg1/seg2/").unwrap().0,
PathBuf::from_iter(vec!["seg1", "seg2"])
);
assert_eq!(
PathBufWrap::from_str("/seg1/../seg2/").unwrap().0,
PathBuf::from_iter(vec!["seg2"])
);
}
#[test]
fn test_parse_path() {
assert_eq!(
PathBufWrap::parse_path("/test/.tt", false).map(|t| t.0),
Err(UriSegmentError::BadStart('.'))
);
assert_eq!(
PathBufWrap::parse_path("/test/.tt", true).unwrap().0,
PathBuf::from_iter(vec!["test", ".tt"])
);
}
#[test]
fn path_traversal() {
assert_eq!(
PathBufWrap::parse_path("/../README.md", false).unwrap().0,
PathBuf::from_iter(vec!["README.md"])
);
assert_eq!(
PathBufWrap::parse_path("/../README.md", true).unwrap().0,
PathBuf::from_iter(vec!["README.md"])
);
assert_eq!(
PathBufWrap::parse_path("/../../../../../../../../../../etc/passwd", false)
.unwrap()
.0,
PathBuf::from_iter(vec!["etc/passwd"])
);
}
#[test]
#[cfg_attr(windows, should_panic)]
fn windows_drive_traversal() {
// detect issues in windows that could lead to path traversal
// see <https://github.com/SergioBenitez/Rocket/issues/1949
assert_eq!(
PathBufWrap::parse_path("C:test.txt", false).unwrap().0,
PathBuf::from_iter(vec!["C:test.txt"])
);
assert_eq!(
PathBufWrap::parse_path("C:../whatever", false).unwrap().0,
PathBuf::from_iter(vec!["C:../whatever"])
);
assert_eq!(
PathBufWrap::parse_path(":test.txt", false).unwrap().0,
PathBuf::from_iter(vec![":test.txt"])
);
}
}

338
actix-files/src/range.rs Normal file
View file

@ -0,0 +1,338 @@
use std::fmt;
use derive_more::Error;
/// Copy of `http_range::HttpRangeParseError`.
#[derive(Debug, Clone)]
enum HttpRangeParseError {
InvalidRange,
NoOverlap,
}
impl From<http_range::HttpRangeParseError> for HttpRangeParseError {
fn from(err: http_range::HttpRangeParseError) -> Self {
match err {
http_range::HttpRangeParseError::InvalidRange => Self::InvalidRange,
http_range::HttpRangeParseError::NoOverlap => Self::NoOverlap,
}
}
}
#[derive(Debug, Clone, Error)]
#[non_exhaustive]
pub struct ParseRangeErr(#[error(not(source))] HttpRangeParseError);
impl fmt::Display for ParseRangeErr {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("invalid Range header: ")?;
f.write_str(match self.0 {
HttpRangeParseError::InvalidRange => "invalid syntax",
HttpRangeParseError::NoOverlap => "range starts after end of content",
})
}
}
/// HTTP Range header representation.
#[derive(Debug, Clone, Copy)]
pub struct HttpRange {
/// Start of range.
pub start: u64,
/// Length of range.
pub length: u64,
}
impl HttpRange {
/// Parses Range HTTP header string as per RFC 2616.
///
/// `header` is HTTP Range header (e.g. `bytes=bytes=0-9`).
/// `size` is full size of response (file).
pub fn parse(header: &str, size: u64) -> Result<Vec<HttpRange>, ParseRangeErr> {
let ranges =
http_range::HttpRange::parse(header, size).map_err(|err| ParseRangeErr(err.into()))?;
Ok(ranges
.iter()
.map(|range| HttpRange {
start: range.start,
length: range.length,
})
.collect())
}
}
#[cfg(test)]
mod tests {
use super::*;
struct T(&'static str, u64, Vec<HttpRange>);
#[test]
fn test_parse() {
let tests = vec![
T("", 0, vec![]),
T("", 1000, vec![]),
T("foo", 0, vec![]),
T("bytes=", 0, vec![]),
T("bytes=7", 10, vec![]),
T("bytes= 7 ", 10, vec![]),
T("bytes=1-", 0, vec![]),
T("bytes=5-4", 10, vec![]),
T("bytes=0-2,5-4", 10, vec![]),
T("bytes=2-5,4-3", 10, vec![]),
T("bytes=--5,4--3", 10, vec![]),
T("bytes=A-", 10, vec![]),
T("bytes=A- ", 10, vec![]),
T("bytes=A-Z", 10, vec![]),
T("bytes= -Z", 10, vec![]),
T("bytes=5-Z", 10, vec![]),
T("bytes=Ran-dom, garbage", 10, vec![]),
T("bytes=0x01-0x02", 10, vec![]),
T("bytes= ", 10, vec![]),
T("bytes= , , , ", 10, vec![]),
T(
"bytes=0-9",
10,
vec![HttpRange {
start: 0,
length: 10,
}],
),
T(
"bytes=0-",
10,
vec![HttpRange {
start: 0,
length: 10,
}],
),
T(
"bytes=5-",
10,
vec![HttpRange {
start: 5,
length: 5,
}],
),
T(
"bytes=0-20",
10,
vec![HttpRange {
start: 0,
length: 10,
}],
),
T(
"bytes=15-,0-5",
10,
vec![HttpRange {
start: 0,
length: 6,
}],
),
T(
"bytes=1-2,5-",
10,
vec![
HttpRange {
start: 1,
length: 2,
},
HttpRange {
start: 5,
length: 5,
},
],
),
T(
"bytes=-2 , 7-",
11,
vec![
HttpRange {
start: 9,
length: 2,
},
HttpRange {
start: 7,
length: 4,
},
],
),
T(
"bytes=0-0 ,2-2, 7-",
11,
vec![
HttpRange {
start: 0,
length: 1,
},
HttpRange {
start: 2,
length: 1,
},
HttpRange {
start: 7,
length: 4,
},
],
),
T(
"bytes=-5",
10,
vec![HttpRange {
start: 5,
length: 5,
}],
),
T(
"bytes=-15",
10,
vec![HttpRange {
start: 0,
length: 10,
}],
),
T(
"bytes=0-499",
10000,
vec![HttpRange {
start: 0,
length: 500,
}],
),
T(
"bytes=500-999",
10000,
vec![HttpRange {
start: 500,
length: 500,
}],
),
T(
"bytes=-500",
10000,
vec![HttpRange {
start: 9500,
length: 500,
}],
),
T(
"bytes=9500-",
10000,
vec![HttpRange {
start: 9500,
length: 500,
}],
),
T(
"bytes=0-0,-1",
10000,
vec![
HttpRange {
start: 0,
length: 1,
},
HttpRange {
start: 9999,
length: 1,
},
],
),
T(
"bytes=500-600,601-999",
10000,
vec![
HttpRange {
start: 500,
length: 101,
},
HttpRange {
start: 601,
length: 399,
},
],
),
T(
"bytes=500-700,601-999",
10000,
vec![
HttpRange {
start: 500,
length: 201,
},
HttpRange {
start: 601,
length: 399,
},
],
),
// Match Apache laxity:
T(
"bytes= 1 -2 , 4- 5, 7 - 8 , ,,",
11,
vec![
HttpRange {
start: 1,
length: 2,
},
HttpRange {
start: 4,
length: 2,
},
HttpRange {
start: 7,
length: 2,
},
],
),
];
for t in tests {
let header = t.0;
let size = t.1;
let expected = t.2;
let res = HttpRange::parse(header, size);
if res.is_err() {
if expected.is_empty() {
continue;
} else {
panic!(
"parse({}, {}) returned error {:?}",
header,
size,
res.unwrap_err()
);
}
}
let got = res.unwrap();
if got.len() != expected.len() {
panic!(
"len(parseRange({}, {})) = {}, want {}",
header,
size,
got.len(),
expected.len()
);
}
for i in 0..expected.len() {
if got[i].start != expected[i].start {
panic!(
"parseRange({}, {})[{}].start = {}, want {}",
header, size, i, got[i].start, expected[i].start
)
}
if got[i].length != expected[i].length {
panic!(
"parseRange({}, {})[{}].length = {}, want {}",
header, size, i, got[i].length, expected[i].length
)
}
}
}
}
}

188
actix-files/src/service.rs Normal file
View file

@ -0,0 +1,188 @@
use std::{fmt, io, ops::Deref, path::PathBuf, rc::Rc};
use actix_web::{
body::BoxBody,
dev::{self, Service, ServiceRequest, ServiceResponse},
error::Error,
guard::Guard,
http::{header, Method},
HttpResponse,
};
use futures_core::future::LocalBoxFuture;
use crate::{
named, Directory, DirectoryRenderer, FilesError, HttpService, MimeOverride, NamedFile,
PathBufWrap, PathFilter,
};
/// Assembled file serving service.
#[derive(Clone)]
pub struct FilesService(pub(crate) Rc<FilesServiceInner>);
impl Deref for FilesService {
type Target = FilesServiceInner;
fn deref(&self) -> &Self::Target {
&self.0
}
}
pub struct FilesServiceInner {
pub(crate) directory: PathBuf,
pub(crate) index: Option<String>,
pub(crate) show_index: bool,
pub(crate) redirect_to_slash: bool,
pub(crate) default: Option<HttpService>,
pub(crate) renderer: Rc<DirectoryRenderer>,
pub(crate) mime_override: Option<Rc<MimeOverride>>,
pub(crate) path_filter: Option<Rc<PathFilter>>,
pub(crate) file_flags: named::Flags,
pub(crate) guards: Option<Rc<dyn Guard>>,
pub(crate) hidden_files: bool,
}
impl fmt::Debug for FilesServiceInner {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("FilesServiceInner")
}
}
impl FilesService {
async fn handle_err(
&self,
err: io::Error,
req: ServiceRequest,
) -> Result<ServiceResponse, Error> {
log::debug!("error handling {}: {}", req.path(), err);
if let Some(ref default) = self.default {
default.call(req).await
} else {
Ok(req.error_response(err))
}
}
fn serve_named_file(&self, req: ServiceRequest, mut named_file: NamedFile) -> ServiceResponse {
if let Some(ref mime_override) = self.mime_override {
let new_disposition = mime_override(&named_file.content_type.type_());
named_file.content_disposition.disposition = new_disposition;
}
named_file.flags = self.file_flags;
let (req, _) = req.into_parts();
let res = named_file.into_response(&req);
ServiceResponse::new(req, res)
}
fn show_index(&self, req: ServiceRequest, path: PathBuf) -> ServiceResponse {
let dir = Directory::new(self.directory.clone(), path);
let (req, _) = req.into_parts();
(self.renderer)(&dir, &req).unwrap_or_else(|e| ServiceResponse::from_err(e, req))
}
}
impl fmt::Debug for FilesService {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("FilesService")
}
}
impl Service<ServiceRequest> for FilesService {
type Response = ServiceResponse<BoxBody>;
type Error = Error;
type Future = LocalBoxFuture<'static, Result<Self::Response, Self::Error>>;
dev::always_ready!();
fn call(&self, req: ServiceRequest) -> Self::Future {
let is_method_valid = if let Some(guard) = &self.guards {
// execute user defined guards
(**guard).check(&req.guard_ctx())
} else {
// default behavior
matches!(*req.method(), Method::HEAD | Method::GET)
};
let this = self.clone();
Box::pin(async move {
if !is_method_valid {
return Ok(req.into_response(
HttpResponse::MethodNotAllowed()
.insert_header(header::ContentType(mime::TEXT_PLAIN_UTF_8))
.body("Request did not meet this resource's requirements."),
));
}
let path_on_disk =
match PathBufWrap::parse_path(req.match_info().unprocessed(), this.hidden_files) {
Ok(item) => item,
Err(err) => return Ok(req.error_response(err)),
};
if let Some(filter) = &this.path_filter {
if !filter(path_on_disk.as_ref(), req.head()) {
if let Some(ref default) = this.default {
return default.call(req).await;
} else {
return Ok(req.into_response(HttpResponse::NotFound().finish()));
}
}
}
// full file path
let path = this.directory.join(&path_on_disk);
if let Err(err) = path.canonicalize() {
return this.handle_err(err, req).await;
}
if path.is_dir() {
if this.redirect_to_slash
&& !req.path().ends_with('/')
&& (this.index.is_some() || this.show_index)
{
let redirect_to = format!("{}/", req.path());
return Ok(req.into_response(
HttpResponse::Found()
.insert_header((header::LOCATION, redirect_to))
.finish(),
));
}
match this.index {
Some(ref index) => {
let named_path = path.join(index);
match NamedFile::open_async(named_path).await {
Ok(named_file) => Ok(this.serve_named_file(req, named_file)),
Err(_) if this.show_index => Ok(this.show_index(req, path)),
Err(err) => this.handle_err(err, req).await,
}
}
None if this.show_index => Ok(this.show_index(req, path)),
None => Ok(ServiceResponse::from_err(
FilesError::IsDirectory,
req.into_parts().0,
)),
}
} else {
match NamedFile::open_async(&path).await {
Ok(mut named_file) => {
if let Some(ref mime_override) = this.mime_override {
let new_disposition = mime_override(&named_file.content_type.type_());
named_file.content_disposition.disposition = new_disposition;
}
named_file.flags = this.file_flags;
let (req, _) = req.into_parts();
let res = named_file.into_response(&req);
Ok(ServiceResponse::new(req, res))
}
Err(err) => this.handle_err(err, req).await,
}
}
})
}
}

View file

@ -0,0 +1,65 @@
use actix_files::{Files, NamedFile};
use actix_web::{
http::{
header::{self, HeaderValue},
StatusCode,
},
test::{self, TestRequest},
web, App,
};
#[actix_web::test]
async fn test_utf8_file_contents() {
// use default ISO-8859-1 encoding
let srv = test::init_service(App::new().service(Files::new("/", "./tests"))).await;
let req = TestRequest::with_uri("/utf8.txt").to_request();
let res = test::call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::OK);
assert_eq!(
res.headers().get(header::CONTENT_TYPE),
Some(&HeaderValue::from_static("text/plain; charset=utf-8")),
);
// disable UTF-8 attribute
let srv =
test::init_service(App::new().service(Files::new("/", "./tests").prefer_utf8(false))).await;
let req = TestRequest::with_uri("/utf8.txt").to_request();
let res = test::call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::OK);
assert_eq!(
res.headers().get(header::CONTENT_TYPE),
Some(&HeaderValue::from_static("text/plain")),
);
}
#[actix_web::test]
async fn partial_range_response_encoding() {
let srv = test::init_service(App::new().default_service(web::to(|| async {
NamedFile::open_async("./tests/test.binary").await.unwrap()
})))
.await;
// range request without accept-encoding returns no content-encoding header
let req = TestRequest::with_uri("/")
.append_header((header::RANGE, "bytes=10-20"))
.to_request();
let res = test::call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::PARTIAL_CONTENT);
assert!(!res.headers().contains_key(header::CONTENT_ENCODING));
// range request with accept-encoding returns a content-encoding header
let req = TestRequest::with_uri("/")
.append_header((header::RANGE, "bytes=10-20"))
.append_header((header::ACCEPT_ENCODING, "identity"))
.to_request();
let res = test::call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::PARTIAL_CONTENT);
assert_eq!(
res.headers().get(header::CONTENT_ENCODING).unwrap(),
"identity"
);
}

View file

@ -0,0 +1 @@
first

View file

@ -0,0 +1 @@
second

View file

@ -0,0 +1,34 @@
use actix_files::Files;
use actix_web::{
guard::Host,
http::StatusCode,
test::{self, TestRequest},
App,
};
use bytes::Bytes;
#[actix_web::test]
async fn test_guard_filter() {
let srv = test::init_service(
App::new()
.service(Files::new("/", "./tests/fixtures/guards/first").guard(Host("first.com")))
.service(Files::new("/", "./tests/fixtures/guards/second").guard(Host("second.com"))),
)
.await;
let req = TestRequest::with_uri("/index.txt")
.append_header(("Host", "first.com"))
.to_request();
let res = test::call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::OK);
assert_eq!(test::read_body(res).await, Bytes::from("first"));
let req = TestRequest::with_uri("/index.txt")
.append_header(("Host", "second.com"))
.to_request();
let res = test::call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::OK);
assert_eq!(test::read_body(res).await, Bytes::from("second"));
}

View file

@ -0,0 +1 @@
test.png

View file

@ -0,0 +1 @@
ÂTÇÉVù2þvI ª\ÇRË™ˆæeÞ<04>vDØ:è—½¬RVÖYpíÿ;ÍÏGñùp!2÷CŒ. <0C>û®õpA !ûߦÙx j+Uc÷±©X”c%Û;ï"yì­AI

View file

@ -0,0 +1 @@
ÂTÇÉVù2þvI ª\ÇRË™ˆæeÞ<04>vDØ:è—½¬RVÖYpíÿ;ÍÏGñùp!2÷CŒ. <0C>û®õpA !ûߦÙx j+Uc÷±©X”c%Û;ï"yì­AI

View file

@ -0,0 +1 @@
// this file is empty.

BIN
actix-files/tests/test.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

View file

@ -0,0 +1,26 @@
use actix_files::Files;
use actix_web::{
http::StatusCode,
test::{self, TestRequest},
App,
};
#[actix_rt::test]
async fn test_directory_traversal_prevention() {
let srv = test::init_service(App::new().service(Files::new("/", "./tests"))).await;
let req = TestRequest::with_uri("/../../../../../../../../../../../etc/passwd").to_request();
let res = test::call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::NOT_FOUND);
let req = TestRequest::with_uri(
"/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd",
)
.to_request();
let res = test::call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::NOT_FOUND);
let req = TestRequest::with_uri("/%00/etc/passwd%00").to_request();
let res = test::call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::NOT_FOUND);
}

View file

@ -0,0 +1,3 @@
中文内容显示正确。
English is OK.

175
actix-http-test/CHANGES.md Normal file
View file

@ -0,0 +1,175 @@
# Changes
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.72.
## 3.2.0
- Minimum supported Rust version (MSRV) is now 1.68 due to transitive `time` dependency.
## 3.1.0
- Minimum supported Rust version (MSRV) is now 1.59.
## 3.0.0
- `TestServer::stop` is now async and will wait for the server and system to shutdown. [#2442]
- Added `TestServer::client_headers` method. [#2097]
- Update `actix-server` dependency to `2`.
- Update `actix-tls` dependency to `3`.
- Update `bytes` to `1.0`. [#1813]
- Minimum supported Rust version (MSRV) is now 1.57.
[#2442]: https://github.com/actix/actix-web/pull/2442
[#2097]: https://github.com/actix/actix-web/pull/2097
[#1813]: https://github.com/actix/actix-web/pull/1813
<details>
<summary>3.0.0 Pre-Releases</summary>
## 3.0.0-beta.13
- No significant changes since `3.0.0-beta.12`.
## 3.0.0-beta.12
- No significant changes since `3.0.0-beta.11`.
## 3.0.0-beta.11
- Minimum supported Rust version (MSRV) is now 1.54.
## 3.0.0-beta.10
- Update `actix-server` to `2.0.0-rc.2`. [#2550]
[#2550]: https://github.com/actix/actix-web/pull/2550
## 3.0.0-beta.9
- No significant changes since `3.0.0-beta.8`.
## 3.0.0-beta.8
- Update `actix-tls` to `3.0.0-rc.1`. [#2474]
[#2474]: https://github.com/actix/actix-web/pull/2474
## 3.0.0-beta.7
- Fix compatibility with experimental `io-uring` feature of `actix-rt`. [#2408]
[#2408]: https://github.com/actix/actix-web/pull/2408
## 3.0.0-beta.6
- `TestServer::stop` is now async and will wait for the server and system to shutdown. [#2442]
- Update `actix-server` to `2.0.0-beta.9`. [#2442]
- Minimum supported Rust version (MSRV) is now 1.52.
[#2442]: https://github.com/actix/actix-web/pull/2442
## 3.0.0-beta.5
- Minimum supported Rust version (MSRV) is now 1.51.
## 3.0.0-beta.4
- Added `TestServer::client_headers` method. [#2097]
[#2097]: https://github.com/actix/actix-web/pull/2097
## 3.0.0-beta.3
- No notable changes.
## 3.0.0-beta.2
- No notable changes.
## 3.0.0-beta.1
- Update `bytes` to `1.0`. [#1813]
[#1813]: https://github.com/actix/actix-web/pull/1813
</details>
## 2.1.0
- Add ability to set address for `TestServer`. [#1645]
- Upgrade `base64` to `0.13`.
- Upgrade `serde_urlencoded` to `0.7`. [#1773]
[#1773]: https://github.com/actix/actix-web/pull/1773
[#1645]: https://github.com/actix/actix-web/pull/1645
## 2.0.0
- Update actix-codec and actix-utils dependencies.
## 2.0.0-alpha.1
- Update the `time` dependency to 0.2.7
- Update `actix-connect` dependency to 2.0.0-alpha.2
- Make `test_server` `async` fn.
- Bump minimum supported Rust version to 1.40
- Replace deprecated `net2` crate with `socket2`
- Update `base64` dependency to 0.12
- Update `env_logger` dependency to 0.7
## 1.0.0
- Replaced `TestServer::start()` with `test_server()`
## 1.0.0-alpha.3
- Migrate to `std::future`
## 0.2.5
- Update serde_urlencoded to "0.6.1"
- Increase TestServerRuntime timeouts from 500ms to 3000ms
- Do not override current `System`
## 0.2.4
- Update actix-server to 0.6
## 0.2.3
- Add `delete`, `options`, `patch` methods to `TestServerRunner`
## 0.2.2
- Add .put() and .sput() methods
## 0.2.1
- Add license files
## 0.2.0
- Update awc and actix-http deps
## 0.1.1
- Always make new connection for http client
## 0.1.0
- No changes
## 0.1.0-alpha.3
- Request functions accept path #743
## 0.1.0-alpha.2
- Added TestServerRuntime::load_body() method
- Update actix-http and awc libraries
## 0.1.0-alpha.1
- Initial impl

View file

@ -0,0 +1,53 @@
[package]
name = "actix-http-test"
version = "3.2.0"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Various helpers for Actix applications to use during testing"
keywords = ["http", "web", "framework", "async", "futures"]
homepage = "https://actix.rs"
repository = "https://github.com/actix/actix-web"
categories = [
"network-programming",
"asynchronous",
"web-programming::http-server",
"web-programming::websocket",
]
license = "MIT OR Apache-2.0"
edition = "2021"
[package.metadata.docs.rs]
features = []
[lib]
name = "actix_http_test"
path = "src/lib.rs"
[features]
default = []
# openssl
openssl = ["tls-openssl", "awc/openssl"]
[dependencies]
actix-service = "2"
actix-codec = "0.5"
actix-tls = "3"
actix-utils = "3"
actix-rt = "2.2"
actix-server = "2"
awc = { version = "3", default-features = false }
bytes = "1"
futures-core = { version = "0.3.17", default-features = false }
http = "0.2.7"
log = "0.4"
socket2 = "0.5"
serde = "1"
serde_json = "1"
slab = "0.4"
serde_urlencoded = "0.7"
tls-openssl = { version = "0.10.55", package = "openssl", optional = true }
tokio = { version = "1.24.2", features = ["sync"] }
[dev-dependencies]
actix-http = "3"

View file

@ -0,0 +1 @@
../LICENSE-APACHE

1
actix-http-test/LICENSE-MIT Symbolic link
View file

@ -0,0 +1 @@
../LICENSE-MIT

16
actix-http-test/README.md Normal file
View file

@ -0,0 +1,16 @@
# `actix-http-test`
> Various helpers for Actix applications to use during testing.
<!-- prettier-ignore-start -->
[![crates.io](https://img.shields.io/crates/v/actix-http-test?label=latest)](https://crates.io/crates/actix-http-test)
[![Documentation](https://docs.rs/actix-http-test/badge.svg?version=3.2.0)](https://docs.rs/actix-http-test/3.2.0)
![Version](https://img.shields.io/badge/rustc-1.72+-ab6000.svg)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-http-test)
<br>
[![Dependency Status](https://deps.rs/crate/actix-http-test/3.2.0/status.svg)](https://deps.rs/crate/actix-http-test/3.2.0)
[![Download](https://img.shields.io/crates/d/actix-http-test.svg)](https://crates.io/crates/actix-http-test)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)
<!-- prettier-ignore-end -->

319
actix-http-test/src/lib.rs Normal file
View file

@ -0,0 +1,319 @@
//! Various helpers for Actix applications to use during testing.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#[cfg(feature = "openssl")]
extern crate tls_openssl as openssl;
use std::{net, thread, time::Duration};
use actix_codec::{AsyncRead, AsyncWrite, Framed};
use actix_rt::{net::TcpStream, System};
use actix_server::{Server, ServerServiceFactory};
use awc::{
error::PayloadError, http::header::HeaderMap, ws, Client, ClientRequest, ClientResponse,
Connector,
};
use bytes::Bytes;
use futures_core::stream::Stream;
use http::Method;
use socket2::{Domain, Protocol, Socket, Type};
use tokio::sync::mpsc;
/// Start test server.
///
/// `TestServer` is very simple test server that simplify process of writing integration tests cases
/// for HTTP applications.
///
/// # Examples
///
/// ```
/// use actix_http::{HttpService, Response, Error, StatusCode};
/// use actix_http_test::test_server;
/// use actix_service::{fn_service, map_config, ServiceFactoryExt as _};
///
/// #[actix_rt::test]
/// # async fn hidden_test() {}
/// async fn test_example() {
/// let srv = test_server(|| {
/// HttpService::build()
/// .h1(fn_service(|req| async move {
/// Ok::<_, Error>(Response::ok())
/// }))
/// .tcp()
/// .map_err(|_| ())
/// })
/// .await;
///
/// let req = srv.get("/");
/// let response = req.send().await.unwrap();
///
/// assert_eq!(response.status(), StatusCode::OK);
/// }
/// # actix_rt::System::new().block_on(test_example());
/// ```
pub async fn test_server<F: ServerServiceFactory<TcpStream>>(factory: F) -> TestServer {
let tcp = net::TcpListener::bind("127.0.0.1:0").unwrap();
test_server_with_addr(tcp, factory).await
}
/// Start [`test server`](test_server()) on an existing address binding.
pub async fn test_server_with_addr<F: ServerServiceFactory<TcpStream>>(
tcp: net::TcpListener,
factory: F,
) -> TestServer {
let (started_tx, started_rx) = std::sync::mpsc::channel();
let (thread_stop_tx, thread_stop_rx) = mpsc::channel(1);
// run server in separate thread
thread::spawn(move || {
System::new().block_on(async move {
let local_addr = tcp.local_addr().unwrap();
let srv = Server::build()
.workers(1)
.disable_signals()
.system_exit()
.listen("test", tcp, factory)
.expect("test server could not be created");
let srv = srv.run();
started_tx
.send((System::current(), srv.handle(), local_addr))
.unwrap();
// drive server loop
srv.await.unwrap();
});
// notify TestServer that server and system have shut down
// all thread managed resources should be dropped at this point
#[allow(clippy::let_underscore_future)]
let _ = thread_stop_tx.send(());
});
let (system, server, addr) = started_rx.recv().unwrap();
let client = {
#[cfg(feature = "openssl")]
let connector = {
use openssl::ssl::{SslConnector, SslMethod, SslVerifyMode};
let mut builder = SslConnector::builder(SslMethod::tls()).unwrap();
builder.set_verify(SslVerifyMode::NONE);
let _ = builder
.set_alpn_protos(b"\x02h2\x08http/1.1")
.map_err(|e| log::error!("Can not set alpn protocol: {:?}", e));
Connector::new()
.conn_lifetime(Duration::from_secs(0))
.timeout(Duration::from_millis(30000))
.openssl(builder.build())
};
#[cfg(not(feature = "openssl"))]
let connector = {
Connector::new()
.conn_lifetime(Duration::from_secs(0))
.timeout(Duration::from_millis(30000))
};
Client::builder().connector(connector).finish()
};
TestServer {
server,
client,
system,
addr,
thread_stop_rx,
}
}
/// Test server controller
pub struct TestServer {
server: actix_server::ServerHandle,
client: awc::Client,
system: actix_rt::System,
addr: net::SocketAddr,
thread_stop_rx: mpsc::Receiver<()>,
}
impl TestServer {
/// Construct test server url
pub fn addr(&self) -> net::SocketAddr {
self.addr
}
/// Construct test server url
pub fn url(&self, uri: &str) -> String {
if uri.starts_with('/') {
format!("http://localhost:{}{}", self.addr.port(), uri)
} else {
format!("http://localhost:{}/{}", self.addr.port(), uri)
}
}
/// Construct test HTTPS server URL.
pub fn surl(&self, uri: &str) -> String {
if uri.starts_with('/') {
format!("https://localhost:{}{}", self.addr.port(), uri)
} else {
format!("https://localhost:{}/{}", self.addr.port(), uri)
}
}
/// Create `GET` request
pub fn get<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.get(self.url(path.as_ref()).as_str())
}
/// Create HTTPS `GET` request
pub fn sget<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.get(self.surl(path.as_ref()).as_str())
}
/// Create `POST` request
pub fn post<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.post(self.url(path.as_ref()).as_str())
}
/// Create HTTPS `POST` request
pub fn spost<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.post(self.surl(path.as_ref()).as_str())
}
/// Create `HEAD` request
pub fn head<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.head(self.url(path.as_ref()).as_str())
}
/// Create HTTPS `HEAD` request
pub fn shead<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.head(self.surl(path.as_ref()).as_str())
}
/// Create `PUT` request
pub fn put<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.put(self.url(path.as_ref()).as_str())
}
/// Create HTTPS `PUT` request
pub fn sput<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.put(self.surl(path.as_ref()).as_str())
}
/// Create `PATCH` request
pub fn patch<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.patch(self.url(path.as_ref()).as_str())
}
/// Create HTTPS `PATCH` request
pub fn spatch<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.patch(self.surl(path.as_ref()).as_str())
}
/// Create `DELETE` request
pub fn delete<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.delete(self.url(path.as_ref()).as_str())
}
/// Create HTTPS `DELETE` request
pub fn sdelete<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.delete(self.surl(path.as_ref()).as_str())
}
/// Create `OPTIONS` request
pub fn options<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.options(self.url(path.as_ref()).as_str())
}
/// Create HTTPS `OPTIONS` request
pub fn soptions<S: AsRef<str>>(&self, path: S) -> ClientRequest {
self.client.options(self.surl(path.as_ref()).as_str())
}
/// Connect to test HTTP server
pub fn request<S: AsRef<str>>(&self, method: Method, path: S) -> ClientRequest {
self.client.request(method, path.as_ref())
}
pub async fn load_body<S>(
&mut self,
mut response: ClientResponse<S>,
) -> Result<Bytes, PayloadError>
where
S: Stream<Item = Result<Bytes, PayloadError>> + Unpin + 'static,
{
response.body().limit(10_485_760).await
}
/// Connect to WebSocket server at a given path.
pub async fn ws_at(
&mut self,
path: &str,
) -> Result<Framed<impl AsyncRead + AsyncWrite, ws::Codec>, awc::error::WsClientError> {
let url = self.url(path);
let connect = self.client.ws(url).connect();
connect.await.map(|(_, framed)| framed)
}
/// Connect to a WebSocket server.
pub async fn ws(
&mut self,
) -> Result<Framed<impl AsyncRead + AsyncWrite, ws::Codec>, awc::error::WsClientError> {
self.ws_at("/").await
}
/// Get default HeaderMap of Client.
///
/// Returns Some(&mut HeaderMap) when Client object is unique
/// (No other clone of client exists at the same time).
pub fn client_headers(&mut self) -> Option<&mut HeaderMap> {
self.client.headers()
}
/// Stop HTTP server.
///
/// Waits for spawned `Server` and `System` to (force) shutdown.
pub async fn stop(&mut self) {
// signal server to stop
self.server.stop(false).await;
// also signal system to stop
// though this is handled by `ServerBuilder::exit_system` too
self.system.stop();
// wait for thread to be stopped but don't care about result
let _ = self.thread_stop_rx.recv().await;
}
}
impl Drop for TestServer {
fn drop(&mut self) {
// calls in this Drop impl should be enough to shut down the server, system, and thread
// without needing to await anything
// signal server to stop
#[allow(clippy::let_underscore_future)]
let _ = self.server.stop(true);
// signal system to stop
self.system.stop();
}
}
/// Get a localhost socket address with random, unused port.
pub fn unused_addr() -> net::SocketAddr {
let addr: net::SocketAddr = "127.0.0.1:0".parse().unwrap();
let socket = Socket::new(Domain::IPV4, Type::STREAM, Some(Protocol::TCP)).unwrap();
socket.bind(&addr.into()).unwrap();
socket.set_reuse_address(true).unwrap();
let tcp = net::TcpListener::from(socket);
tcp.local_addr().unwrap()
}

1392
actix-http/CHANGES.md Normal file

File diff suppressed because it is too large Load diff

164
actix-http/Cargo.toml Normal file
View file

@ -0,0 +1,164 @@
[package]
name = "actix-http"
version = "3.7.0"
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
description = "HTTP types and services for the Actix ecosystem"
keywords = ["actix", "http", "framework", "async", "futures"]
homepage = "https://actix.rs"
repository = "https://github.com/actix/actix-web"
categories = [
"network-programming",
"asynchronous",
"web-programming::http-server",
"web-programming::websocket",
]
license.workspace = true
edition.workspace = true
rust-version.workspace = true
[package.metadata.docs.rs]
rustdoc-args = ["--cfg", "docsrs"]
features = [
"http2",
"ws",
"openssl",
"rustls-0_20",
"rustls-0_21",
"rustls-0_22",
"rustls-0_23",
"compress-brotli",
"compress-gzip",
"compress-zstd",
]
[lib]
name = "actix_http"
path = "src/lib.rs"
[features]
default = []
# HTTP/2 protocol support
http2 = ["h2"]
# WebSocket protocol implementation
ws = [
"local-channel",
"base64",
"rand",
"sha1",
]
# TLS via OpenSSL
openssl = ["actix-tls/accept", "actix-tls/openssl"]
# TLS via Rustls v0.20
rustls = ["rustls-0_20"]
# TLS via Rustls v0.20
rustls-0_20 = ["actix-tls/accept", "actix-tls/rustls-0_20"]
# TLS via Rustls v0.21
rustls-0_21 = ["actix-tls/accept", "actix-tls/rustls-0_21"]
# TLS via Rustls v0.22
rustls-0_22 = ["actix-tls/accept", "actix-tls/rustls-0_22"]
# TLS via Rustls v0.23
rustls-0_23 = ["actix-tls/accept", "actix-tls/rustls-0_23"]
# Compression codecs
compress-brotli = ["__compress", "brotli"]
compress-gzip = ["__compress", "flate2"]
compress-zstd = ["__compress", "zstd"]
# Internal (PRIVATE!) features used to aid testing and checking feature status.
# Don't rely on these whatsoever. They are semver-exempt and may disappear at anytime.
__compress = []
[dependencies]
actix-service = "2"
actix-codec = "0.5"
actix-utils = "3"
actix-rt = { version = "2.2", default-features = false }
ahash = "0.8"
bitflags = "2"
bytes = "1"
bytestring = "1"
derive_more = "0.99.5"
encoding_rs = "0.8"
futures-core = { version = "0.3.17", default-features = false, features = ["alloc"] }
http = "0.2.7"
httparse = "1.5.1"
httpdate = "1.0.1"
itoa = "1"
language-tags = "0.3"
mime = "0.3.4"
percent-encoding = "2.1"
pin-project-lite = "0.2"
smallvec = "1.6.1"
tokio = { version = "1.24.2", features = [] }
tokio-util = { version = "0.7", features = ["io", "codec"] }
tracing = { version = "0.1.30", default-features = false, features = ["log"] }
# http2
h2 = { version = "0.3.24", optional = true }
# websockets
local-channel = { version = "0.1", optional = true }
base64 = { version = "0.22", optional = true }
rand = { version = "0.8", optional = true }
sha1 = { version = "0.10", optional = true }
# openssl/rustls
actix-tls = { version = "3.4", default-features = false, optional = true }
# compress-*
brotli = { version = "6", optional = true }
flate2 = { version = "1.0.13", optional = true }
zstd = { version = "0.13", optional = true }
[dev-dependencies]
actix-http-test = { version = "3", features = ["openssl"] }
actix-server = "2"
actix-tls = { version = "3.4", features = ["openssl", "rustls-0_23-webpki-roots"] }
actix-web = "4"
async-stream = "0.3"
criterion = { version = "0.5", features = ["html_reports"] }
divan = "0.1.8"
env_logger = "0.11"
futures-util = { version = "0.3.17", default-features = false, features = ["alloc"] }
memchr = "2.4"
once_cell = "1.9"
rcgen = "0.13"
regex = "1.3"
rustversion = "1"
rustls-pemfile = "2"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
static_assertions = "1"
tls-openssl = { package = "openssl", version = "0.10.55" }
tls-rustls_023 = { package = "rustls", version = "0.23" }
tokio = { version = "1.24.2", features = ["net", "rt", "macros"] }
[[example]]
name = "ws"
required-features = ["ws", "rustls-0_23"]
[[example]]
name = "tls_rustls"
required-features = ["http2", "rustls-0_23"]
[[bench]]
name = "response-body-compression"
harness = false
required-features = ["compress-brotli", "compress-gzip", "compress-zstd"]
[[bench]]
name = "date-formatting"
harness = false

1
actix-http/LICENSE-APACHE Symbolic link
View file

@ -0,0 +1 @@
../LICENSE-APACHE

1
actix-http/LICENSE-MIT Symbolic link
View file

@ -0,0 +1 @@
../LICENSE-MIT

50
actix-http/README.md Normal file
View file

@ -0,0 +1,50 @@
# `actix-http`
> HTTP types and services for the Actix ecosystem.
<!-- prettier-ignore-start -->
[![crates.io](https://img.shields.io/crates/v/actix-http?label=latest)](https://crates.io/crates/actix-http)
[![Documentation](https://docs.rs/actix-http/badge.svg?version=3.7.0)](https://docs.rs/actix-http/3.7.0)
![Version](https://img.shields.io/badge/rustc-1.72+-ab6000.svg)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-http.svg)
<br />
[![dependency status](https://deps.rs/crate/actix-http/3.7.0/status.svg)](https://deps.rs/crate/actix-http/3.7.0)
[![Download](https://img.shields.io/crates/d/actix-http.svg)](https://crates.io/crates/actix-http)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)
<!-- prettier-ignore-end -->
## Examples
```rust
use std::{env, io};
use actix_http::{HttpService, Response};
use actix_server::Server;
use futures_util::future;
use http::header::HeaderValue;
use tracing::info;
#[actix_rt::main]
async fn main() -> io::Result<()> {
env::set_var("RUST_LOG", "hello_world=info");
env_logger::init();
Server::build()
.bind("hello-world", "127.0.0.1:8080", || {
HttpService::build()
.client_timeout(1000)
.client_disconnect(1000)
.finish(|_req| {
info!("{:?}", _req);
let mut res = Response::Ok();
res.header("x-head", HeaderValue::from_static("dummy value!"));
future::ok::<_, ()>(res.body("Hello world!"))
})
.tcp()
})?
.run()
.await
}
```

View file

@ -0,0 +1,20 @@
use std::time::SystemTime;
use actix_http::header::HttpDate;
use divan::{black_box, AllocProfiler, Bencher};
#[global_allocator]
static ALLOC: AllocProfiler = AllocProfiler::system();
#[divan::bench]
fn date_formatting(b: Bencher<'_, '_>) {
let now = SystemTime::now();
b.bench(|| {
black_box(HttpDate::from(black_box(now)).to_string());
})
}
fn main() {
divan::main();
}

View file

@ -0,0 +1,88 @@
use std::convert::Infallible;
use actix_http::{encoding::Encoder, ContentEncoding, Request, Response, StatusCode};
use actix_service::{fn_service, Service as _};
use criterion::{black_box, criterion_group, criterion_main, Criterion};
static BODY: &[u8] = include_bytes!("../Cargo.toml");
fn compression_responses(c: &mut Criterion) {
let mut group = c.benchmark_group("compression responses");
group.bench_function("identity", |b| {
let rt = actix_rt::Runtime::new().unwrap();
let identity_svc = fn_service(|_: Request| async move {
let mut res = Response::with_body(StatusCode::OK, ());
let body = black_box(Encoder::response(
ContentEncoding::Identity,
res.head_mut(),
BODY,
));
Ok::<_, Infallible>(black_box(res.set_body(black_box(body))))
});
b.iter(|| {
rt.block_on(identity_svc.call(Request::new())).unwrap();
});
});
group.bench_function("gzip", |b| {
let rt = actix_rt::Runtime::new().unwrap();
let identity_svc = fn_service(|_: Request| async move {
let mut res = Response::with_body(StatusCode::OK, ());
let body = black_box(Encoder::response(
ContentEncoding::Gzip,
res.head_mut(),
BODY,
));
Ok::<_, Infallible>(black_box(res.set_body(black_box(body))))
});
b.iter(|| {
rt.block_on(identity_svc.call(Request::new())).unwrap();
});
});
group.bench_function("br", |b| {
let rt = actix_rt::Runtime::new().unwrap();
let identity_svc = fn_service(|_: Request| async move {
let mut res = Response::with_body(StatusCode::OK, ());
let body = black_box(Encoder::response(
ContentEncoding::Brotli,
res.head_mut(),
BODY,
));
Ok::<_, Infallible>(black_box(res.set_body(black_box(body))))
});
b.iter(|| {
rt.block_on(identity_svc.call(Request::new())).unwrap();
});
});
group.bench_function("zstd", |b| {
let rt = actix_rt::Runtime::new().unwrap();
let identity_svc = fn_service(|_: Request| async move {
let mut res = Response::with_body(StatusCode::OK, ());
let body = black_box(Encoder::response(
ContentEncoding::Zstd,
res.head_mut(),
BODY,
));
Ok::<_, Infallible>(black_box(res.set_body(black_box(body))))
});
b.iter(|| {
rt.block_on(identity_svc.call(Request::new())).unwrap();
});
});
group.finish();
}
criterion_group!(benches, compression_responses);
criterion_main!(benches);

View file

@ -0,0 +1,27 @@
use actix_http::HttpService;
use actix_server::Server;
use actix_service::map_config;
use actix_web::{dev::AppConfig, get, App};
#[get("/")]
async fn index() -> &'static str {
"Hello, world. From Actix Web!"
}
#[tokio::main(flavor = "current_thread")]
async fn main() -> std::io::Result<()> {
Server::build()
.bind("hello-world", "127.0.0.1:8080", || {
// construct actix-web app
let app = App::new().service(index);
HttpService::build()
// pass the app to service builder
// map_config is used to map App's configuration to ServiceBuilder
// h1 will configure server to only use HTTP/1.1
.h1(map_config(app, |_| AppConfig::default()))
.tcp()
})?
.run()
.await
}

View file

@ -0,0 +1,27 @@
use std::{convert::Infallible, io, time::Duration};
use actix_http::{HttpService, Request, Response, StatusCode};
use actix_server::Server;
use once_cell::sync::Lazy;
static STR: Lazy<String> = Lazy::new(|| "HELLO WORLD ".repeat(20));
#[actix_rt::main]
async fn main() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
Server::build()
.bind("dispatcher-benchmark", ("127.0.0.1", 8080), || {
HttpService::build()
.client_request_timeout(Duration::from_secs(1))
.finish(|_: Request| async move {
let mut res = Response::build(StatusCode::OK);
Ok::<_, Infallible>(res.body(&**STR))
})
.tcp()
})?
// limiting number of workers so that bench client is not sharing as many resources
.workers(4)
.run()
.await
}

View file

@ -0,0 +1,39 @@
use std::{io, time::Duration};
use actix_http::{Error, HttpService, Request, Response, StatusCode};
use actix_server::Server;
use bytes::BytesMut;
use futures_util::StreamExt as _;
use http::header::HeaderValue;
use tracing::info;
#[actix_rt::main]
async fn main() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
Server::build()
.bind("echo", ("127.0.0.1", 8080), || {
HttpService::build()
.client_request_timeout(Duration::from_secs(1))
.client_disconnect_timeout(Duration::from_secs(1))
// handles HTTP/1.1 and HTTP/2
.finish(|mut req: Request| async move {
let mut body = BytesMut::new();
while let Some(item) = req.payload().next().await {
body.extend_from_slice(&item?);
}
info!("request body: {:?}", body);
let res = Response::build(StatusCode::OK)
.insert_header(("x-head", HeaderValue::from_static("dummy value!")))
.body(body);
Ok::<_, Error>(res)
})
// No TLS
.tcp()
})?
.run()
.await
}

View file

@ -0,0 +1,35 @@
use std::io;
use actix_http::{
body::{BodyStream, MessageBody},
header, Error, HttpMessage, HttpService, Request, Response, StatusCode,
};
async fn handle_request(mut req: Request) -> Result<Response<impl MessageBody>, Error> {
let mut res = Response::build(StatusCode::OK);
if let Some(ct) = req.headers().get(header::CONTENT_TYPE) {
res.insert_header((header::CONTENT_TYPE, ct));
}
// echo request payload stream as (chunked) response body
let res = res.message_body(BodyStream::new(req.payload().take()))?;
Ok(res)
}
#[actix_rt::main]
async fn main() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
actix_server::Server::build()
.bind("echo", ("127.0.0.1", 8080), || {
HttpService::build()
// handles HTTP/1.1 only
.h1(handle_request)
// No TLS
.tcp()
})?
.run()
.await
}

View file

@ -0,0 +1,34 @@
//! An example that supports automatic selection of plaintext h1/h2c connections.
//!
//! Notably, both the following commands will work.
//! ```console
//! $ curl --http1.1 'http://localhost:8080/'
//! $ curl --http2-prior-knowledge 'http://localhost:8080/'
//! ```
use std::{convert::Infallible, io};
use actix_http::{body::BodyStream, HttpService, Request, Response, StatusCode};
use actix_server::Server;
#[tokio::main(flavor = "current_thread")]
async fn main() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
Server::build()
.bind("h2c-detect", ("127.0.0.1", 8080), || {
HttpService::build()
.finish(|_req: Request| async move {
Ok::<_, Infallible>(Response::build(StatusCode::OK).body(BodyStream::new(
futures_util::stream::iter([
Ok::<_, String>("123".into()),
Err("wertyuikmnbvcxdfty6t".to_owned()),
]),
)))
})
.tcp_auto_h2c()
})?
.workers(2)
.run()
.await
}

View file

@ -0,0 +1,25 @@
use std::{convert::Infallible, io};
use actix_http::{HttpService, Request, Response, StatusCode};
use actix_server::Server;
use once_cell::sync::Lazy;
static STR: Lazy<String> = Lazy::new(|| "HELLO WORLD ".repeat(100));
#[actix_rt::main]
async fn main() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
Server::build()
.bind("h2spec", ("127.0.0.1", 8080), || {
HttpService::build()
.h2(|_: Request| async move {
let mut res = Response::build(StatusCode::OK);
Ok::<_, Infallible>(res.body(&**STR))
})
.tcp()
})?
.workers(4)
.run()
.await
}

View file

@ -0,0 +1,34 @@
use std::{convert::Infallible, io, time::Duration};
use actix_http::{header::HeaderValue, HttpService, Request, Response, StatusCode};
use actix_server::Server;
use tracing::info;
#[actix_rt::main]
async fn main() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
Server::build()
.bind("hello-world", ("127.0.0.1", 8080), || {
HttpService::build()
.client_request_timeout(Duration::from_secs(1))
.client_disconnect_timeout(Duration::from_secs(1))
.on_connect_ext(|_, ext| {
ext.insert(42u32);
})
.finish(|req: Request| async move {
info!("{:?}", req);
let mut res = Response::build(StatusCode::OK);
res.insert_header(("x-head", HeaderValue::from_static("dummy value!")));
let forty_two = req.conn_data::<u32>().unwrap().to_string();
res.insert_header(("x-forty-two", HeaderValue::from_str(&forty_two).unwrap()));
Ok::<_, Infallible>(res.body("Hello world!"))
})
.tcp()
})?
.run()
.await
}

View file

@ -0,0 +1,41 @@
//! Example showing response body (chunked) stream erroring.
//!
//! Test using `nc` or `curl`.
//! ```sh
//! $ curl -vN 127.0.0.1:8080
//! $ echo 'GET / HTTP/1.1\n\n' | nc 127.0.0.1 8080
//! ```
use std::{convert::Infallible, io, time::Duration};
use actix_http::{body::BodyStream, HttpService, Response};
use actix_server::Server;
use async_stream::stream;
use bytes::Bytes;
use tracing::info;
#[actix_rt::main]
async fn main() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
Server::build()
.bind("streaming-error", ("127.0.0.1", 8080), || {
HttpService::build()
.finish(|req| async move {
info!("{:?}", req);
let res = Response::ok();
Ok::<_, Infallible>(res.set_body(BodyStream::new(stream! {
yield Ok(Bytes::from("123"));
yield Ok(Bytes::from("456"));
actix_rt::time::sleep(Duration::from_millis(1000)).await;
yield Err(io::Error::new(io::ErrorKind::Other, ""));
})))
})
.tcp()
})?
.run()
.await
}

View file

@ -0,0 +1,76 @@
//! Demonstrates TLS configuration (via Rustls) for HTTP/1.1 and HTTP/2 connections.
//!
//! Test using cURL:
//!
//! ```console
//! $ curl --insecure https://127.0.0.1:8443
//! Hello World!
//! Protocol: HTTP/2.0
//!
//! $ curl --insecure --http1.1 https://127.0.0.1:8443
//! Hello World!
//! Protocol: HTTP/1.1
//! ```
extern crate tls_rustls_023 as rustls;
use std::io;
use actix_http::{Error, HttpService, Request, Response};
use actix_utils::future::ok;
#[actix_rt::main]
async fn main() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
tracing::info!("starting HTTP server at https://127.0.0.1:8443");
actix_server::Server::build()
.bind("echo", ("127.0.0.1", 8443), || {
HttpService::build()
.finish(|req: Request| {
let body = format!(
"Hello World!\n\
Protocol: {:?}",
req.head().version
);
ok::<_, Error>(Response::ok().set_body(body))
})
.rustls_0_23(rustls_config())
})?
.run()
.await
}
fn rustls_config() -> rustls::ServerConfig {
let rcgen::CertifiedKey { cert, key_pair } =
rcgen::generate_simple_self_signed(["localhost".to_owned()]).unwrap();
let cert_file = cert.pem();
let key_file = key_pair.serialize_pem();
let cert_file = &mut io::BufReader::new(cert_file.as_bytes());
let key_file = &mut io::BufReader::new(key_file.as_bytes());
let cert_chain = rustls_pemfile::certs(cert_file)
.collect::<Result<Vec<_>, _>>()
.unwrap();
let mut keys = rustls_pemfile::pkcs8_private_keys(key_file)
.collect::<Result<Vec<_>, _>>()
.unwrap();
let mut config = rustls::ServerConfig::builder()
.with_no_client_auth()
.with_single_cert(
cert_chain,
rustls::pki_types::PrivateKeyDer::Pkcs8(keys.remove(0)),
)
.unwrap();
const H1_ALPN: &[u8] = b"http/1.1";
const H2_ALPN: &[u8] = b"h2";
config.alpn_protocols.push(H2_ALPN.to_vec());
config.alpn_protocols.push(H1_ALPN.to_vec());
config
}

115
actix-http/examples/ws.rs Normal file
View file

@ -0,0 +1,115 @@
//! Sets up a WebSocket server over TCP and TLS.
//! Sends a heartbeat message every 4 seconds but does not respond to any incoming frames.
extern crate tls_rustls_023 as rustls;
use std::{
io,
pin::Pin,
task::{Context, Poll},
time::Duration,
};
use actix_http::{body::BodyStream, error::Error, ws, HttpService, Request, Response};
use actix_rt::time::{interval, Interval};
use actix_server::Server;
use bytes::{Bytes, BytesMut};
use bytestring::ByteString;
use futures_core::{ready, Stream};
use tokio_util::codec::Encoder;
use tracing::{info, trace};
#[actix_rt::main]
async fn main() -> io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
Server::build()
.bind("tcp", ("127.0.0.1", 8080), || {
HttpService::build().h1(handler).tcp()
})?
.bind("tls", ("127.0.0.1", 8443), || {
HttpService::build()
.finish(handler)
.rustls_0_23(tls_config())
})?
.run()
.await
}
async fn handler(req: Request) -> Result<Response<BodyStream<Heartbeat>>, Error> {
info!("handshaking");
let mut res = ws::handshake(req.head())?;
// handshake will always fail under HTTP/2
info!("responding");
res.message_body(BodyStream::new(Heartbeat::new(ws::Codec::new())))
}
struct Heartbeat {
codec: ws::Codec,
interval: Interval,
}
impl Heartbeat {
fn new(codec: ws::Codec) -> Self {
Self {
codec,
interval: interval(Duration::from_secs(4)),
}
}
}
impl Stream for Heartbeat {
type Item = Result<Bytes, Error>;
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
trace!("poll");
ready!(self.as_mut().interval.poll_tick(cx));
let mut buffer = BytesMut::new();
self.as_mut()
.codec
.encode(
ws::Message::Text(ByteString::from_static("hello world")),
&mut buffer,
)
.unwrap();
Poll::Ready(Some(Ok(buffer.freeze())))
}
}
fn tls_config() -> rustls::ServerConfig {
use std::io::BufReader;
use rustls_pemfile::{certs, pkcs8_private_keys};
let rcgen::CertifiedKey { cert, key_pair } =
rcgen::generate_simple_self_signed(["localhost".to_owned()]).unwrap();
let cert_file = cert.pem();
let key_file = key_pair.serialize_pem();
let cert_file = &mut BufReader::new(cert_file.as_bytes());
let key_file = &mut BufReader::new(key_file.as_bytes());
let cert_chain = certs(cert_file).collect::<Result<Vec<_>, _>>().unwrap();
let mut keys = pkcs8_private_keys(key_file)
.collect::<Result<Vec<_>, _>>()
.unwrap();
let mut config = rustls::ServerConfig::builder()
.with_no_client_auth()
.with_single_cert(
cert_chain,
rustls::pki_types::PrivateKeyDer::Pkcs8(keys.remove(0)),
)
.unwrap();
config.alpn_protocols.push(b"http/1.1".to_vec());
config.alpn_protocols.push(b"h2".to_vec());
config
}

View file

@ -0,0 +1,214 @@
use std::{
error::Error as StdError,
pin::Pin,
task::{Context, Poll},
};
use bytes::Bytes;
use futures_core::{ready, Stream};
use pin_project_lite::pin_project;
use super::{BodySize, MessageBody};
pin_project! {
/// Streaming response wrapper.
///
/// Response does not contain `Content-Length` header and appropriate transfer encoding is used.
pub struct BodyStream<S> {
#[pin]
stream: S,
}
}
// TODO: from_infallible method
impl<S, E> BodyStream<S>
where
S: Stream<Item = Result<Bytes, E>>,
E: Into<Box<dyn StdError>> + 'static,
{
#[inline]
pub fn new(stream: S) -> Self {
BodyStream { stream }
}
}
impl<S, E> MessageBody for BodyStream<S>
where
S: Stream<Item = Result<Bytes, E>>,
E: Into<Box<dyn StdError>> + 'static,
{
type Error = E;
#[inline]
fn size(&self) -> BodySize {
BodySize::Stream
}
/// Attempts to pull out the next value of the underlying [`Stream`].
///
/// Empty values are skipped to prevent [`BodyStream`]'s transmission being ended on a
/// zero-length chunk, but rather proceed until the underlying [`Stream`] ends.
fn poll_next(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
loop {
let stream = self.as_mut().project().stream;
let chunk = match ready!(stream.poll_next(cx)) {
Some(Ok(ref bytes)) if bytes.is_empty() => continue,
opt => opt,
};
return Poll::Ready(chunk);
}
}
}
#[cfg(test)]
mod tests {
use std::{convert::Infallible, time::Duration};
use actix_rt::{
pin,
time::{sleep, Sleep},
};
use actix_utils::future::poll_fn;
use derive_more::{Display, Error};
use futures_core::ready;
use futures_util::{stream, FutureExt as _};
use pin_project_lite::pin_project;
use static_assertions::{assert_impl_all, assert_not_impl_any};
use super::*;
use crate::body::to_bytes;
assert_impl_all!(BodyStream<stream::Empty<Result<Bytes, crate::Error>>>: MessageBody);
assert_impl_all!(BodyStream<stream::Empty<Result<Bytes, &'static str>>>: MessageBody);
assert_impl_all!(BodyStream<stream::Repeat<Result<Bytes, &'static str>>>: MessageBody);
assert_impl_all!(BodyStream<stream::Empty<Result<Bytes, Infallible>>>: MessageBody);
assert_impl_all!(BodyStream<stream::Repeat<Result<Bytes, Infallible>>>: MessageBody);
assert_not_impl_any!(BodyStream<stream::Empty<Bytes>>: MessageBody);
assert_not_impl_any!(BodyStream<stream::Repeat<Bytes>>: MessageBody);
// crate::Error is not Clone
assert_not_impl_any!(BodyStream<stream::Repeat<Result<Bytes, crate::Error>>>: MessageBody);
#[actix_rt::test]
async fn skips_empty_chunks() {
let body = BodyStream::new(stream::iter(
["1", "", "2"]
.iter()
.map(|&v| Ok::<_, Infallible>(Bytes::from(v))),
));
pin!(body);
assert_eq!(
poll_fn(|cx| body.as_mut().poll_next(cx))
.await
.unwrap()
.ok(),
Some(Bytes::from("1")),
);
assert_eq!(
poll_fn(|cx| body.as_mut().poll_next(cx))
.await
.unwrap()
.ok(),
Some(Bytes::from("2")),
);
}
#[actix_rt::test]
async fn read_to_bytes() {
let body = BodyStream::new(stream::iter(
["1", "", "2"]
.iter()
.map(|&v| Ok::<_, Infallible>(Bytes::from(v))),
));
assert_eq!(to_bytes(body).await.ok(), Some(Bytes::from("12")));
}
#[derive(Debug, Display, Error)]
#[display(fmt = "stream error")]
struct StreamErr;
#[actix_rt::test]
async fn stream_immediate_error() {
let body = BodyStream::new(stream::once(async { Err(StreamErr) }));
assert!(matches!(to_bytes(body).await, Err(StreamErr)));
}
#[actix_rt::test]
async fn stream_string_error() {
// `&'static str` does not impl `Error`
// but it does impl `Into<Box<dyn Error>>`
let body = BodyStream::new(stream::once(async { Err("stringy error") }));
assert!(matches!(to_bytes(body).await, Err("stringy error")));
}
#[actix_rt::test]
async fn stream_boxed_error() {
// `Box<dyn Error>` does not impl `Error`
// but it does impl `Into<Box<dyn Error>>`
let body = BodyStream::new(stream::once(async {
Err(Box::<dyn StdError>::from("stringy error"))
}));
assert_eq!(
to_bytes(body).await.unwrap_err().to_string(),
"stringy error"
);
}
#[actix_rt::test]
async fn stream_delayed_error() {
let body = BodyStream::new(stream::iter(vec![Ok(Bytes::from("1")), Err(StreamErr)]));
assert!(matches!(to_bytes(body).await, Err(StreamErr)));
pin_project! {
#[derive(Debug)]
#[project = TimeDelayStreamProj]
enum TimeDelayStream {
Start,
Sleep { delay: Pin<Box<Sleep>> },
Done,
}
}
impl Stream for TimeDelayStream {
type Item = Result<Bytes, StreamErr>;
fn poll_next(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Self::Item>> {
match self.as_mut().get_mut() {
TimeDelayStream::Start => {
let sleep = sleep(Duration::from_millis(1));
self.as_mut().set(TimeDelayStream::Sleep {
delay: Box::pin(sleep),
});
cx.waker().wake_by_ref();
Poll::Pending
}
TimeDelayStream::Sleep { ref mut delay } => {
ready!(delay.poll_unpin(cx));
self.set(TimeDelayStream::Done);
cx.waker().wake_by_ref();
Poll::Pending
}
TimeDelayStream::Done => Poll::Ready(Some(Err(StreamErr))),
}
}
}
let body = BodyStream::new(TimeDelayStream::Start);
assert!(matches!(to_bytes(body).await, Err(StreamErr)));
}
}

View file

@ -0,0 +1,121 @@
use std::{
error::Error as StdError,
fmt,
pin::Pin,
task::{Context, Poll},
};
use bytes::Bytes;
use super::{BodySize, MessageBody, MessageBodyMapErr};
use crate::body;
/// A boxed message body with boxed errors.
#[derive(Debug)]
pub struct BoxBody(BoxBodyInner);
enum BoxBodyInner {
None(body::None),
Bytes(Bytes),
Stream(Pin<Box<dyn MessageBody<Error = Box<dyn StdError>>>>),
}
impl fmt::Debug for BoxBodyInner {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::None(arg0) => f.debug_tuple("None").field(arg0).finish(),
Self::Bytes(arg0) => f.debug_tuple("Bytes").field(arg0).finish(),
Self::Stream(_) => f.debug_tuple("Stream").field(&"dyn MessageBody").finish(),
}
}
}
impl BoxBody {
/// Boxes body type, erasing type information.
///
/// If the body type to wrap is unknown or generic it is better to use [`MessageBody::boxed`] to
/// avoid double boxing.
#[inline]
pub fn new<B>(body: B) -> Self
where
B: MessageBody + 'static,
{
match body.size() {
BodySize::None => Self(BoxBodyInner::None(body::None)),
_ => match body.try_into_bytes() {
Ok(bytes) => Self(BoxBodyInner::Bytes(bytes)),
Err(body) => {
let body = MessageBodyMapErr::new(body, Into::into);
Self(BoxBodyInner::Stream(Box::pin(body)))
}
},
}
}
/// Returns a mutable pinned reference to the inner message body type.
#[inline]
pub fn as_pin_mut(&mut self) -> Pin<&mut Self> {
Pin::new(self)
}
}
impl MessageBody for BoxBody {
type Error = Box<dyn StdError>;
#[inline]
fn size(&self) -> BodySize {
match &self.0 {
BoxBodyInner::None(none) => none.size(),
BoxBodyInner::Bytes(bytes) => bytes.size(),
BoxBodyInner::Stream(stream) => stream.size(),
}
}
#[inline]
fn poll_next(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
match &mut self.0 {
BoxBodyInner::None(body) => Pin::new(body).poll_next(cx).map_err(|err| match err {}),
BoxBodyInner::Bytes(body) => Pin::new(body).poll_next(cx).map_err(|err| match err {}),
BoxBodyInner::Stream(body) => Pin::new(body).poll_next(cx),
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
match self.0 {
BoxBodyInner::None(body) => Ok(body.try_into_bytes().unwrap()),
BoxBodyInner::Bytes(body) => Ok(body.try_into_bytes().unwrap()),
_ => Err(self),
}
}
#[inline]
fn boxed(self) -> BoxBody {
self
}
}
#[cfg(test)]
mod tests {
use static_assertions::{assert_impl_all, assert_not_impl_any};
use super::*;
use crate::body::to_bytes;
assert_impl_all!(BoxBody: fmt::Debug, MessageBody, Unpin);
assert_not_impl_any!(BoxBody: Send, Sync);
#[actix_rt::test]
async fn nested_boxed_body() {
let body = Bytes::from_static(&[1, 2, 3]);
let boxed_body = BoxBody::new(BoxBody::new(body));
assert_eq!(
to_bytes(boxed_body).await.unwrap(),
Bytes::from(vec![1, 2, 3]),
);
}
}

View file

@ -0,0 +1,122 @@
use std::{
pin::Pin,
task::{Context, Poll},
};
use bytes::Bytes;
use pin_project_lite::pin_project;
use super::{BodySize, BoxBody, MessageBody};
use crate::Error;
pin_project! {
/// An "either" type specialized for body types.
///
/// It is common, in middleware especially, to conditionally return an inner service's unknown/
/// generic body `B` type or return early with a new response. This type's "right" variant
/// defaults to `BoxBody` since error responses are the common case.
///
/// For example, middleware will often have `type Response = ServiceResponse<EitherBody<B>>`.
/// This means that the inner service's response body type maps to the `Left` variant and the
/// middleware's own error responses use the default `Right` variant of `BoxBody`. Of course,
/// there's no reason it couldn't use `EitherBody<B, String>` instead if its alternative
/// responses have a known type.
#[project = EitherBodyProj]
#[derive(Debug, Clone)]
pub enum EitherBody<L, R = BoxBody> {
/// A body of type `L`.
Left { #[pin] body: L },
/// A body of type `R`.
Right { #[pin] body: R },
}
}
impl<L> EitherBody<L, BoxBody> {
/// Creates new `EitherBody` left variant with a boxed right variant.
///
/// If the expected `R` type will be inferred and is not `BoxBody` then use the
/// [`left`](Self::left) constructor instead.
#[inline]
pub fn new(body: L) -> Self {
Self::Left { body }
}
}
impl<L, R> EitherBody<L, R> {
/// Creates new `EitherBody` using left variant.
#[inline]
pub fn left(body: L) -> Self {
Self::Left { body }
}
/// Creates new `EitherBody` using right variant.
#[inline]
pub fn right(body: R) -> Self {
Self::Right { body }
}
}
impl<L, R> MessageBody for EitherBody<L, R>
where
L: MessageBody + 'static,
R: MessageBody + 'static,
{
type Error = Error;
#[inline]
fn size(&self) -> BodySize {
match self {
EitherBody::Left { body } => body.size(),
EitherBody::Right { body } => body.size(),
}
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
match self.project() {
EitherBodyProj::Left { body } => body
.poll_next(cx)
.map_err(|err| Error::new_body().with_cause(err)),
EitherBodyProj::Right { body } => body
.poll_next(cx)
.map_err(|err| Error::new_body().with_cause(err)),
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
match self {
EitherBody::Left { body } => body
.try_into_bytes()
.map_err(|body| EitherBody::Left { body }),
EitherBody::Right { body } => body
.try_into_bytes()
.map_err(|body| EitherBody::Right { body }),
}
}
#[inline]
fn boxed(self) -> BoxBody {
match self {
EitherBody::Left { body } => body.boxed(),
EitherBody::Right { body } => body.boxed(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn type_parameter_inference() {
let _body: EitherBody<(), _> = EitherBody::new(());
let _body: EitherBody<_, ()> = EitherBody::left(());
let _body: EitherBody<(), _> = EitherBody::right(());
}
}

View file

@ -0,0 +1,740 @@
//! [`MessageBody`] trait and foreign implementations.
use std::{
convert::Infallible,
error::Error as StdError,
mem,
pin::Pin,
task::{Context, Poll},
};
use bytes::{Bytes, BytesMut};
use futures_core::ready;
use pin_project_lite::pin_project;
use super::{BodySize, BoxBody};
/// An interface for types that can be used as a response body.
///
/// It is not usually necessary to create custom body types, this trait is already [implemented for
/// a large number of sensible body types](#foreign-impls) including:
/// - Empty body: `()`
/// - Text-based: `String`, `&'static str`, [`ByteString`](https://docs.rs/bytestring/1).
/// - Byte-based: `Bytes`, `BytesMut`, `Vec<u8>`, `&'static [u8]`;
/// - Streams: [`BodyStream`](super::BodyStream), [`SizedStream`](super::SizedStream)
///
/// # Examples
/// ```
/// # use std::convert::Infallible;
/// # use std::task::{Poll, Context};
/// # use std::pin::Pin;
/// # use bytes::Bytes;
/// # use actix_http::body::{BodySize, MessageBody};
/// struct Repeat {
/// chunk: String,
/// n_times: usize,
/// }
///
/// impl MessageBody for Repeat {
/// type Error = Infallible;
///
/// fn size(&self) -> BodySize {
/// BodySize::Sized((self.chunk.len() * self.n_times) as u64)
/// }
///
/// fn poll_next(
/// self: Pin<&mut Self>,
/// _cx: &mut Context<'_>,
/// ) -> Poll<Option<Result<Bytes, Self::Error>>> {
/// let payload_string = self.chunk.repeat(self.n_times);
/// let payload_bytes = Bytes::from(payload_string);
/// Poll::Ready(Some(Ok(payload_bytes)))
/// }
/// }
/// ```
pub trait MessageBody {
/// The type of error that will be returned if streaming body fails.
///
/// Since it is not appropriate to generate a response mid-stream, it only requires `Error` for
/// internal use and logging.
type Error: Into<Box<dyn StdError>>;
/// Body size hint.
///
/// If [`BodySize::None`] is returned, optimizations that skip reading the body are allowed.
fn size(&self) -> BodySize;
/// Attempt to pull out the next chunk of body bytes.
///
/// # Return Value
/// Similar to the `Stream` interface, there are several possible return values, each indicating
/// a distinct state:
/// - `Poll::Pending` means that this body's next chunk is not ready yet. Implementations must
/// ensure that the current task will be notified when the next chunk may be ready.
/// - `Poll::Ready(Some(val))` means that the body has successfully produced a chunk, `val`,
/// and may produce further values on subsequent `poll_next` calls.
/// - `Poll::Ready(None)` means that the body is complete, and `poll_next` should not be
/// invoked again.
///
/// # Panics
/// Once a body is complete (i.e., `poll_next` returned `Ready(None)`), calling its `poll_next`
/// method again may panic, block forever, or cause other kinds of problems; this trait places
/// no requirements on the effects of such a call. However, as the `poll_next` method is not
/// marked unsafe, Rusts usual rules apply: calls must never cause UB, regardless of its state.
fn poll_next(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>>;
/// Try to convert into the complete chunk of body bytes.
///
/// Override this method if the complete body can be trivially extracted. This is useful for
/// optimizations where `poll_next` calls can be avoided.
///
/// Body types with [`BodySize::None`] are allowed to return empty `Bytes`. Although, if calling
/// this method, it is recommended to check `size` first and return early.
///
/// # Errors
/// The default implementation will error and return the original type back to the caller for
/// further use.
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self>
where
Self: Sized,
{
Err(self)
}
/// Wraps this body into a `BoxBody`.
///
/// No-op when called on a `BoxBody`, meaning there is no risk of double boxing when calling
/// this on a generic `MessageBody`. Prefer this over [`BoxBody::new`] when a boxed body
/// is required.
#[inline]
fn boxed(self) -> BoxBody
where
Self: Sized + 'static,
{
BoxBody::new(self)
}
}
mod foreign_impls {
use std::{borrow::Cow, ops::DerefMut};
use super::*;
impl<B> MessageBody for &mut B
where
B: MessageBody + Unpin + ?Sized,
{
type Error = B::Error;
fn size(&self) -> BodySize {
(**self).size()
}
fn poll_next(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
Pin::new(&mut **self).poll_next(cx)
}
}
impl MessageBody for Infallible {
type Error = Infallible;
fn size(&self) -> BodySize {
match *self {}
}
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
match *self {}
}
}
impl MessageBody for () {
type Error = Infallible;
#[inline]
fn size(&self) -> BodySize {
BodySize::Sized(0)
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
Poll::Ready(None)
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
Ok(Bytes::new())
}
}
impl<B> MessageBody for Box<B>
where
B: MessageBody + Unpin + ?Sized,
{
type Error = B::Error;
#[inline]
fn size(&self) -> BodySize {
self.as_ref().size()
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
Pin::new(self.get_mut().as_mut()).poll_next(cx)
}
}
impl<T, B> MessageBody for Pin<T>
where
T: DerefMut<Target = B> + Unpin,
B: MessageBody + ?Sized,
{
type Error = B::Error;
#[inline]
fn size(&self) -> BodySize {
self.as_ref().size()
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
self.get_mut().as_mut().poll_next(cx)
}
}
impl MessageBody for &'static [u8] {
type Error = Infallible;
#[inline]
fn size(&self) -> BodySize {
BodySize::Sized(self.len() as u64)
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
if self.is_empty() {
Poll::Ready(None)
} else {
Poll::Ready(Some(Ok(Bytes::from_static(mem::take(self.get_mut())))))
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
Ok(Bytes::from_static(self))
}
}
impl MessageBody for Bytes {
type Error = Infallible;
#[inline]
fn size(&self) -> BodySize {
BodySize::Sized(self.len() as u64)
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
if self.is_empty() {
Poll::Ready(None)
} else {
Poll::Ready(Some(Ok(mem::take(self.get_mut()))))
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
Ok(self)
}
}
impl MessageBody for BytesMut {
type Error = Infallible;
#[inline]
fn size(&self) -> BodySize {
BodySize::Sized(self.len() as u64)
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
if self.is_empty() {
Poll::Ready(None)
} else {
Poll::Ready(Some(Ok(mem::take(self.get_mut()).freeze())))
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
Ok(self.freeze())
}
}
impl MessageBody for Vec<u8> {
type Error = Infallible;
#[inline]
fn size(&self) -> BodySize {
BodySize::Sized(self.len() as u64)
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
if self.is_empty() {
Poll::Ready(None)
} else {
Poll::Ready(Some(Ok(mem::take(self.get_mut()).into())))
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
Ok(Bytes::from(self))
}
}
impl MessageBody for Cow<'static, [u8]> {
type Error = Infallible;
#[inline]
fn size(&self) -> BodySize {
BodySize::Sized(self.len() as u64)
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
if self.is_empty() {
Poll::Ready(None)
} else {
let bytes = match mem::take(self.get_mut()) {
Cow::Borrowed(b) => Bytes::from_static(b),
Cow::Owned(b) => Bytes::from(b),
};
Poll::Ready(Some(Ok(bytes)))
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
match self {
Cow::Borrowed(b) => Ok(Bytes::from_static(b)),
Cow::Owned(b) => Ok(Bytes::from(b)),
}
}
}
impl MessageBody for &'static str {
type Error = Infallible;
#[inline]
fn size(&self) -> BodySize {
BodySize::Sized(self.len() as u64)
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
if self.is_empty() {
Poll::Ready(None)
} else {
let string = mem::take(self.get_mut());
let bytes = Bytes::from_static(string.as_bytes());
Poll::Ready(Some(Ok(bytes)))
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
Ok(Bytes::from_static(self.as_bytes()))
}
}
impl MessageBody for String {
type Error = Infallible;
#[inline]
fn size(&self) -> BodySize {
BodySize::Sized(self.len() as u64)
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
if self.is_empty() {
Poll::Ready(None)
} else {
let string = mem::take(self.get_mut());
Poll::Ready(Some(Ok(Bytes::from(string))))
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
Ok(Bytes::from(self))
}
}
impl MessageBody for Cow<'static, str> {
type Error = Infallible;
#[inline]
fn size(&self) -> BodySize {
BodySize::Sized(self.len() as u64)
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
if self.is_empty() {
Poll::Ready(None)
} else {
let bytes = match mem::take(self.get_mut()) {
Cow::Borrowed(s) => Bytes::from_static(s.as_bytes()),
Cow::Owned(s) => Bytes::from(s.into_bytes()),
};
Poll::Ready(Some(Ok(bytes)))
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
match self {
Cow::Borrowed(s) => Ok(Bytes::from_static(s.as_bytes())),
Cow::Owned(s) => Ok(Bytes::from(s.into_bytes())),
}
}
}
impl MessageBody for bytestring::ByteString {
type Error = Infallible;
#[inline]
fn size(&self) -> BodySize {
BodySize::Sized(self.len() as u64)
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
let string = mem::take(self.get_mut());
Poll::Ready(Some(Ok(string.into_bytes())))
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
Ok(self.into_bytes())
}
}
}
pin_project! {
pub(crate) struct MessageBodyMapErr<B, F> {
#[pin]
body: B,
mapper: Option<F>,
}
}
impl<B, F, E> MessageBodyMapErr<B, F>
where
B: MessageBody,
F: FnOnce(B::Error) -> E,
{
pub(crate) fn new(body: B, mapper: F) -> Self {
Self {
body,
mapper: Some(mapper),
}
}
}
impl<B, F, E> MessageBody for MessageBodyMapErr<B, F>
where
B: MessageBody,
F: FnOnce(B::Error) -> E,
E: Into<Box<dyn StdError>>,
{
type Error = E;
#[inline]
fn size(&self) -> BodySize {
self.body.size()
}
fn poll_next(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
let this = self.as_mut().project();
match ready!(this.body.poll_next(cx)) {
Some(Err(err)) => {
let f = self.as_mut().project().mapper.take().unwrap();
let mapped_err = (f)(err);
Poll::Ready(Some(Err(mapped_err)))
}
Some(Ok(val)) => Poll::Ready(Some(Ok(val))),
None => Poll::Ready(None),
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
let Self { body, mapper } = self;
body.try_into_bytes().map_err(|body| Self { body, mapper })
}
}
#[cfg(test)]
mod tests {
use actix_rt::pin;
use actix_utils::future::poll_fn;
use futures_util::stream;
use super::*;
use crate::body::{self, EitherBody};
macro_rules! assert_poll_next {
($pin:expr, $exp:expr) => {
assert_eq!(
poll_fn(|cx| $pin.as_mut().poll_next(cx))
.await
.unwrap() // unwrap option
.unwrap(), // unwrap result
$exp
);
};
}
macro_rules! assert_poll_next_none {
($pin:expr) => {
assert!(poll_fn(|cx| $pin.as_mut().poll_next(cx)).await.is_none());
};
}
#[allow(unused_allocation)] // triggered by `Box::new(()).size()`
#[actix_rt::test]
async fn boxing_equivalence() {
assert_eq!(().size(), BodySize::Sized(0));
assert_eq!(().size(), Box::new(()).size());
assert_eq!(().size(), Box::pin(()).size());
let pl = Box::new(());
pin!(pl);
assert_poll_next_none!(pl);
let mut pl = Box::pin(());
assert_poll_next_none!(pl);
}
#[actix_rt::test]
async fn mut_equivalence() {
assert_eq!(().size(), BodySize::Sized(0));
assert_eq!(().size(), (&(&mut ())).size());
let pl = &mut ();
pin!(pl);
assert_poll_next_none!(pl);
let pl = &mut Box::new(());
pin!(pl);
assert_poll_next_none!(pl);
let mut body = body::SizedStream::new(
8,
stream::iter([
Ok::<_, std::io::Error>(Bytes::from("1234")),
Ok(Bytes::from("5678")),
]),
);
let body = &mut body;
assert_eq!(body.size(), BodySize::Sized(8));
pin!(body);
assert_poll_next!(body, Bytes::from_static(b"1234"));
assert_poll_next!(body, Bytes::from_static(b"5678"));
assert_poll_next_none!(body);
}
#[allow(clippy::let_unit_value)]
#[actix_rt::test]
async fn test_unit() {
let pl = ();
assert_eq!(pl.size(), BodySize::Sized(0));
pin!(pl);
assert_poll_next_none!(pl);
}
#[actix_rt::test]
async fn test_static_str() {
assert_eq!("".size(), BodySize::Sized(0));
assert_eq!("test".size(), BodySize::Sized(4));
let pl = "test";
pin!(pl);
assert_poll_next!(pl, Bytes::from("test"));
}
#[actix_rt::test]
async fn test_static_bytes() {
assert_eq!(b"".as_ref().size(), BodySize::Sized(0));
assert_eq!(b"test".as_ref().size(), BodySize::Sized(4));
let pl = b"test".as_ref();
pin!(pl);
assert_poll_next!(pl, Bytes::from("test"));
}
#[actix_rt::test]
async fn test_vec() {
assert_eq!(vec![0; 0].size(), BodySize::Sized(0));
assert_eq!(Vec::from("test").size(), BodySize::Sized(4));
let pl = Vec::from("test");
pin!(pl);
assert_poll_next!(pl, Bytes::from("test"));
}
#[actix_rt::test]
async fn test_bytes() {
assert_eq!(Bytes::new().size(), BodySize::Sized(0));
assert_eq!(Bytes::from_static(b"test").size(), BodySize::Sized(4));
let pl = Bytes::from_static(b"test");
pin!(pl);
assert_poll_next!(pl, Bytes::from("test"));
}
#[actix_rt::test]
async fn test_bytes_mut() {
assert_eq!(BytesMut::new().size(), BodySize::Sized(0));
assert_eq!(BytesMut::from(b"test".as_ref()).size(), BodySize::Sized(4));
let pl = BytesMut::from("test");
pin!(pl);
assert_poll_next!(pl, Bytes::from("test"));
}
#[actix_rt::test]
async fn test_string() {
assert_eq!(String::new().size(), BodySize::Sized(0));
assert_eq!("test".to_owned().size(), BodySize::Sized(4));
let pl = "test".to_owned();
pin!(pl);
assert_poll_next!(pl, Bytes::from("test"));
}
#[actix_rt::test]
async fn complete_body_combinators() {
let body = Bytes::from_static(b"test");
let body = BoxBody::new(body);
let body = EitherBody::<_, ()>::left(body);
let body = EitherBody::<(), _>::right(body);
// Do not support try_into_bytes:
// let body = Box::new(body);
// let body = Box::pin(body);
assert_eq!(body.try_into_bytes().unwrap(), Bytes::from("test"));
}
#[actix_rt::test]
async fn complete_body_combinators_poll() {
let body = Bytes::from_static(b"test");
let body = BoxBody::new(body);
let body = EitherBody::<_, ()>::left(body);
let body = EitherBody::<(), _>::right(body);
let mut body = body;
assert_eq!(body.size(), BodySize::Sized(4));
assert_poll_next!(Pin::new(&mut body), Bytes::from("test"));
assert_poll_next_none!(Pin::new(&mut body));
}
#[actix_rt::test]
async fn none_body_combinators() {
fn none_body() -> BoxBody {
let body = body::None;
let body = BoxBody::new(body);
let body = EitherBody::<_, ()>::left(body);
let body = EitherBody::<(), _>::right(body);
body.boxed()
}
assert_eq!(none_body().size(), BodySize::None);
assert_eq!(none_body().try_into_bytes().unwrap(), Bytes::new());
assert_poll_next_none!(Pin::new(&mut none_body()));
}
// down-casting used to be done with a method on MessageBody trait
// test is kept to demonstrate equivalence of Any trait
#[actix_rt::test]
async fn test_body_casting() {
let mut body = String::from("hello cast");
// let mut resp_body: &mut dyn MessageBody<Error = Error> = &mut body;
let resp_body: &mut dyn std::any::Any = &mut body;
let body = resp_body.downcast_ref::<String>().unwrap();
assert_eq!(body, "hello cast");
let body = &mut resp_body.downcast_mut::<String>().unwrap();
body.push('!');
let body = resp_body.downcast_ref::<String>().unwrap();
assert_eq!(body, "hello cast!");
let not_body = resp_body.downcast_ref::<()>();
assert!(not_body.is_none());
}
#[actix_rt::test]
async fn non_owning_to_bytes() {
let mut body = BoxBody::new(());
let bytes = body::to_bytes(&mut body).await.unwrap();
assert_eq!(bytes, Bytes::new());
let mut body = body::BodyStream::new(stream::iter([
Ok::<_, std::io::Error>(Bytes::from("1234")),
Ok(Bytes::from("5678")),
]));
let bytes = body::to_bytes(&mut body).await.unwrap();
assert_eq!(bytes, Bytes::from_static(b"12345678"));
}
}

View file

@ -0,0 +1,27 @@
//! Traits and structures to aid consuming and writing HTTP payloads.
//!
//! "Body" and "payload" are used somewhat interchangeably in this documentation.
// Though the spec kinda reads like "payload" is the possibly-transfer-encoded part of the message
// and the "body" is the intended possibly-decoded version of that.
mod body_stream;
mod boxed;
mod either;
mod message_body;
mod none;
mod size;
mod sized_stream;
mod utils;
pub(crate) use self::message_body::MessageBodyMapErr;
pub use self::{
body_stream::BodyStream,
boxed::BoxBody,
either::EitherBody,
message_body::MessageBody,
none::None,
size::BodySize,
sized_stream::SizedStream,
utils::{to_bytes, to_bytes_limited, BodyLimitExceeded},
};

View file

@ -0,0 +1,51 @@
use std::{
convert::Infallible,
pin::Pin,
task::{Context, Poll},
};
use bytes::Bytes;
use super::{BodySize, MessageBody};
/// Body type for responses that forbid payloads.
///
/// This is distinct from an "empty" response which _would_ contain a `Content-Length` header.
/// For an "empty" body, use `()` or `Bytes::new()`.
///
/// For example, the HTTP spec forbids a payload to be sent with a `204 No Content` response.
/// In this case, the payload (or lack thereof) is implicit from the status code, so a
/// `Content-Length` header is not required.
#[derive(Debug, Clone, Copy, Default)]
#[non_exhaustive]
pub struct None;
impl None {
/// Constructs new "none" body.
#[inline]
pub fn new() -> Self {
None
}
}
impl MessageBody for None {
type Error = Infallible;
#[inline]
fn size(&self) -> BodySize {
BodySize::None
}
#[inline]
fn poll_next(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
Poll::Ready(Option::None)
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self> {
Ok(Bytes::new())
}
}

View file

@ -0,0 +1,41 @@
/// Body size hint.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BodySize {
/// Implicitly empty body.
///
/// Will omit the Content-Length header. Used for responses to certain methods (e.g., `HEAD`) or
/// with particular status codes (e.g., 204 No Content). Consumers that read this as a body size
/// hint are allowed to make optimizations that skip reading or writing the payload.
None,
/// Known size body.
///
/// Will write `Content-Length: N` header.
Sized(u64),
/// Unknown size body.
///
/// Will not write Content-Length header. Can be used with chunked Transfer-Encoding.
Stream,
}
impl BodySize {
/// Equivalent to `BodySize::Sized(0)`;
pub const ZERO: Self = Self::Sized(0);
/// Returns true if size hint indicates omitted or empty body.
///
/// Streams will return false because it cannot be known without reading the stream.
///
/// ```
/// # use actix_http::body::BodySize;
/// assert!(BodySize::None.is_eof());
/// assert!(BodySize::Sized(0).is_eof());
///
/// assert!(!BodySize::Sized(64).is_eof());
/// assert!(!BodySize::Stream.is_eof());
/// ```
pub fn is_eof(&self) -> bool {
matches!(self, BodySize::None | BodySize::Sized(0))
}
}

View file

@ -0,0 +1,171 @@
use std::{
error::Error as StdError,
pin::Pin,
task::{Context, Poll},
};
use bytes::Bytes;
use futures_core::{ready, Stream};
use pin_project_lite::pin_project;
use super::{BodySize, MessageBody};
pin_project! {
/// Known sized streaming response wrapper.
///
/// This body implementation should be used if total size of stream is known. Data is sent as-is
/// without using chunked transfer encoding.
pub struct SizedStream<S> {
size: u64,
#[pin]
stream: S,
}
}
impl<S, E> SizedStream<S>
where
S: Stream<Item = Result<Bytes, E>>,
E: Into<Box<dyn StdError>> + 'static,
{
#[inline]
pub fn new(size: u64, stream: S) -> Self {
SizedStream { size, stream }
}
}
// TODO: from_infallible method
impl<S, E> MessageBody for SizedStream<S>
where
S: Stream<Item = Result<Bytes, E>>,
E: Into<Box<dyn StdError>> + 'static,
{
type Error = E;
#[inline]
fn size(&self) -> BodySize {
BodySize::Sized(self.size)
}
/// Attempts to pull out the next value of the underlying [`Stream`].
///
/// Empty values are skipped to prevent [`SizedStream`]'s transmission being
/// ended on a zero-length chunk, but rather proceed until the underlying
/// [`Stream`] ends.
fn poll_next(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
loop {
let stream = self.as_mut().project().stream;
let chunk = match ready!(stream.poll_next(cx)) {
Some(Ok(ref bytes)) if bytes.is_empty() => continue,
val => val,
};
return Poll::Ready(chunk);
}
}
}
#[cfg(test)]
mod tests {
use std::convert::Infallible;
use actix_rt::pin;
use actix_utils::future::poll_fn;
use futures_util::stream;
use static_assertions::{assert_impl_all, assert_not_impl_any};
use super::*;
use crate::body::to_bytes;
assert_impl_all!(SizedStream<stream::Empty<Result<Bytes, crate::Error>>>: MessageBody);
assert_impl_all!(SizedStream<stream::Empty<Result<Bytes, &'static str>>>: MessageBody);
assert_impl_all!(SizedStream<stream::Repeat<Result<Bytes, &'static str>>>: MessageBody);
assert_impl_all!(SizedStream<stream::Empty<Result<Bytes, Infallible>>>: MessageBody);
assert_impl_all!(SizedStream<stream::Repeat<Result<Bytes, Infallible>>>: MessageBody);
assert_not_impl_any!(SizedStream<stream::Empty<Bytes>>: MessageBody);
assert_not_impl_any!(SizedStream<stream::Repeat<Bytes>>: MessageBody);
// crate::Error is not Clone
assert_not_impl_any!(SizedStream<stream::Repeat<Result<Bytes, crate::Error>>>: MessageBody);
#[actix_rt::test]
async fn skips_empty_chunks() {
let body = SizedStream::new(
2,
stream::iter(
["1", "", "2"]
.iter()
.map(|&v| Ok::<_, Infallible>(Bytes::from(v))),
),
);
pin!(body);
assert_eq!(
poll_fn(|cx| body.as_mut().poll_next(cx))
.await
.unwrap()
.ok(),
Some(Bytes::from("1")),
);
assert_eq!(
poll_fn(|cx| body.as_mut().poll_next(cx))
.await
.unwrap()
.ok(),
Some(Bytes::from("2")),
);
}
#[actix_rt::test]
async fn read_to_bytes() {
let body = SizedStream::new(
2,
stream::iter(
["1", "", "2"]
.iter()
.map(|&v| Ok::<_, Infallible>(Bytes::from(v))),
),
);
assert_eq!(to_bytes(body).await.ok(), Some(Bytes::from("12")));
}
#[actix_rt::test]
async fn stream_string_error() {
// `&'static str` does not impl `Error`
// but it does impl `Into<Box<dyn Error>>`
let body = SizedStream::new(0, stream::once(async { Err("stringy error") }));
assert_eq!(to_bytes(body).await, Ok(Bytes::new()));
let body = SizedStream::new(1, stream::once(async { Err("stringy error") }));
assert!(matches!(to_bytes(body).await, Err("stringy error")));
}
#[actix_rt::test]
async fn stream_boxed_error() {
// `Box<dyn Error>` does not impl `Error`
// but it does impl `Into<Box<dyn Error>>`
let body = SizedStream::new(
0,
stream::once(async { Err(Box::<dyn StdError>::from("stringy error")) }),
);
assert_eq!(to_bytes(body).await.unwrap(), Bytes::new());
let body = SizedStream::new(
1,
stream::once(async { Err(Box::<dyn StdError>::from("stringy error")) }),
);
assert_eq!(
to_bytes(body).await.unwrap_err().to_string(),
"stringy error"
);
}
}

View file

@ -0,0 +1,198 @@
use std::task::Poll;
use actix_rt::pin;
use actix_utils::future::poll_fn;
use bytes::{Bytes, BytesMut};
use derive_more::{Display, Error};
use futures_core::ready;
use super::{BodySize, MessageBody};
/// Collects all the bytes produced by `body`.
///
/// Any errors produced by the body stream are returned immediately.
///
/// Consider using [`to_bytes_limited`] instead to protect against memory exhaustion.
///
/// # Examples
///
/// ```
/// use actix_http::body::{self, to_bytes};
/// use bytes::Bytes;
///
/// # actix_rt::System::new().block_on(async {
/// let body = body::None::new();
/// let bytes = to_bytes(body).await.unwrap();
/// assert!(bytes.is_empty());
///
/// let body = Bytes::from_static(b"123");
/// let bytes = to_bytes(body).await.unwrap();
/// assert_eq!(bytes, "123");
/// # });
/// ```
pub async fn to_bytes<B: MessageBody>(body: B) -> Result<Bytes, B::Error> {
to_bytes_limited(body, usize::MAX)
.await
.expect("body should never yield more than usize::MAX bytes")
}
/// Error type returned from [`to_bytes_limited`] when body produced exceeds limit.
#[derive(Debug, Display, Error)]
#[display(fmt = "limit exceeded while collecting body bytes")]
#[non_exhaustive]
pub struct BodyLimitExceeded;
/// Collects the bytes produced by `body`, up to `limit` bytes.
///
/// If a chunk read from `poll_next` causes the total number of bytes read to exceed `limit`, an
/// `Err(BodyLimitExceeded)` is returned.
///
/// Any errors produced by the body stream are returned immediately as `Ok(Err(B::Error))`.
///
/// # Examples
///
/// ```
/// use actix_http::body::{self, to_bytes_limited};
/// use bytes::Bytes;
///
/// # actix_rt::System::new().block_on(async {
/// let body = body::None::new();
/// let bytes = to_bytes_limited(body, 10).await.unwrap().unwrap();
/// assert!(bytes.is_empty());
///
/// let body = Bytes::from_static(b"123");
/// let bytes = to_bytes_limited(body, 10).await.unwrap().unwrap();
/// assert_eq!(bytes, "123");
///
/// let body = Bytes::from_static(b"123");
/// assert!(to_bytes_limited(body, 2).await.is_err());
/// # });
/// ```
pub async fn to_bytes_limited<B: MessageBody>(
body: B,
limit: usize,
) -> Result<Result<Bytes, B::Error>, BodyLimitExceeded> {
/// Sensible default (32kB) for initial, bounded allocation when collecting body bytes.
const INITIAL_ALLOC_BYTES: usize = 32 * 1024;
let cap = match body.size() {
BodySize::None | BodySize::Sized(0) => return Ok(Ok(Bytes::new())),
BodySize::Sized(size) if size as usize > limit => return Err(BodyLimitExceeded),
BodySize::Sized(size) => (size as usize).min(INITIAL_ALLOC_BYTES),
BodySize::Stream => INITIAL_ALLOC_BYTES,
};
let mut exceeded_limit = false;
let mut buf = BytesMut::with_capacity(cap);
pin!(body);
match poll_fn(|cx| loop {
let body = body.as_mut();
match ready!(body.poll_next(cx)) {
Some(Ok(bytes)) => {
// if limit is exceeded...
if buf.len() + bytes.len() > limit {
// ...set flag to true and break out of poll_fn
exceeded_limit = true;
return Poll::Ready(Ok(()));
}
buf.extend_from_slice(&bytes)
}
None => return Poll::Ready(Ok(())),
Some(Err(err)) => return Poll::Ready(Err(err)),
}
})
.await
{
// propagate error returned from body poll
Err(err) => Ok(Err(err)),
// limit was exceeded while reading body
Ok(()) if exceeded_limit => Err(BodyLimitExceeded),
// otherwise return body buffer
Ok(()) => Ok(Ok(buf.freeze())),
}
}
#[cfg(test)]
mod tests {
use std::io;
use futures_util::{stream, StreamExt as _};
use super::*;
use crate::{
body::{BodyStream, SizedStream},
Error,
};
#[actix_rt::test]
async fn to_bytes_complete() {
let bytes = to_bytes(()).await.unwrap();
assert!(bytes.is_empty());
let body = Bytes::from_static(b"123");
let bytes = to_bytes(body).await.unwrap();
assert_eq!(bytes, b"123"[..]);
}
#[actix_rt::test]
async fn to_bytes_streams() {
let stream = stream::iter(vec![Bytes::from_static(b"123"), Bytes::from_static(b"abc")])
.map(Ok::<_, Error>);
let body = BodyStream::new(stream);
let bytes = to_bytes(body).await.unwrap();
assert_eq!(bytes, b"123abc"[..]);
}
#[actix_rt::test]
async fn to_bytes_limited_complete() {
let bytes = to_bytes_limited((), 0).await.unwrap().unwrap();
assert!(bytes.is_empty());
let bytes = to_bytes_limited((), 1).await.unwrap().unwrap();
assert!(bytes.is_empty());
assert!(to_bytes_limited(Bytes::from_static(b"12"), 0)
.await
.is_err());
assert!(to_bytes_limited(Bytes::from_static(b"12"), 1)
.await
.is_err());
assert!(to_bytes_limited(Bytes::from_static(b"12"), 2).await.is_ok());
assert!(to_bytes_limited(Bytes::from_static(b"12"), 3).await.is_ok());
}
#[actix_rt::test]
async fn to_bytes_limited_streams() {
// hinting a larger body fails
let body = SizedStream::new(8, stream::empty().map(Ok::<_, Error>));
assert!(to_bytes_limited(body, 3).await.is_err());
// hinting a smaller body is okay
let body = SizedStream::new(3, stream::empty().map(Ok::<_, Error>));
assert!(to_bytes_limited(body, 3).await.unwrap().unwrap().is_empty());
// hinting a smaller body then returning a larger one fails
let stream = stream::iter(vec![Bytes::from_static(b"1234")]).map(Ok::<_, Error>);
let body = SizedStream::new(3, stream);
assert!(to_bytes_limited(body, 3).await.is_err());
let stream = stream::iter(vec![Bytes::from_static(b"123"), Bytes::from_static(b"abc")])
.map(Ok::<_, Error>);
let body = BodyStream::new(stream);
assert!(to_bytes_limited(body, 3).await.is_err());
}
#[actix_rt::test]
async fn to_body_limit_error() {
let err_stream = stream::once(async { Err(io::Error::new(io::ErrorKind::Other, "")) });
let body = SizedStream::new(8, err_stream);
// not too big, but propagates error from body stream
assert!(to_bytes_limited(body, 10).await.unwrap().is_err());
}
}

258
actix-http/src/builder.rs Normal file
View file

@ -0,0 +1,258 @@
use std::{fmt, marker::PhantomData, net, rc::Rc, time::Duration};
use actix_codec::Framed;
use actix_service::{IntoServiceFactory, Service, ServiceFactory};
use crate::{
body::{BoxBody, MessageBody},
h1::{self, ExpectHandler, H1Service, UpgradeHandler},
service::HttpService,
ConnectCallback, Extensions, KeepAlive, Request, Response, ServiceConfig,
};
/// An HTTP service builder.
///
/// This type can construct an instance of [`HttpService`] through a builder-like pattern.
pub struct HttpServiceBuilder<T, S, X = ExpectHandler, U = UpgradeHandler> {
keep_alive: KeepAlive,
client_request_timeout: Duration,
client_disconnect_timeout: Duration,
secure: bool,
local_addr: Option<net::SocketAddr>,
expect: X,
upgrade: Option<U>,
on_connect_ext: Option<Rc<ConnectCallback<T>>>,
_phantom: PhantomData<S>,
}
impl<T, S> Default for HttpServiceBuilder<T, S, ExpectHandler, UpgradeHandler>
where
S: ServiceFactory<Request, Config = ()>,
S::Error: Into<Response<BoxBody>> + 'static,
S::InitError: fmt::Debug,
<S::Service as Service<Request>>::Future: 'static,
{
fn default() -> Self {
HttpServiceBuilder {
// ServiceConfig parts (make sure defaults match)
keep_alive: KeepAlive::default(),
client_request_timeout: Duration::from_secs(5),
client_disconnect_timeout: Duration::ZERO,
secure: false,
local_addr: None,
// dispatcher parts
expect: ExpectHandler,
upgrade: None,
on_connect_ext: None,
_phantom: PhantomData,
}
}
}
impl<T, S, X, U> HttpServiceBuilder<T, S, X, U>
where
S: ServiceFactory<Request, Config = ()>,
S::Error: Into<Response<BoxBody>> + 'static,
S::InitError: fmt::Debug,
<S::Service as Service<Request>>::Future: 'static,
X: ServiceFactory<Request, Config = (), Response = Request>,
X::Error: Into<Response<BoxBody>>,
X::InitError: fmt::Debug,
U: ServiceFactory<(Request, Framed<T, h1::Codec>), Config = (), Response = ()>,
U::Error: fmt::Display,
U::InitError: fmt::Debug,
{
/// Set connection keep-alive setting.
///
/// Applies to HTTP/1.1 keep-alive and HTTP/2 ping-pong.
///
/// By default keep-alive is 5 seconds.
pub fn keep_alive<W: Into<KeepAlive>>(mut self, val: W) -> Self {
self.keep_alive = val.into();
self
}
/// Set connection secure state
pub fn secure(mut self) -> Self {
self.secure = true;
self
}
/// Set the local address that this service is bound to.
pub fn local_addr(mut self, addr: net::SocketAddr) -> Self {
self.local_addr = Some(addr);
self
}
/// Set client request timeout (for first request).
///
/// Defines a timeout for reading client request header. If the client does not transmit the
/// request head within this duration, the connection is terminated with a `408 Request Timeout`
/// response error.
///
/// A duration of zero disables the timeout.
///
/// By default, the client timeout is 5 seconds.
pub fn client_request_timeout(mut self, dur: Duration) -> Self {
self.client_request_timeout = dur;
self
}
#[doc(hidden)]
#[deprecated(since = "3.0.0", note = "Renamed to `client_request_timeout`.")]
pub fn client_timeout(self, dur: Duration) -> Self {
self.client_request_timeout(dur)
}
/// Set client connection disconnect timeout.
///
/// Defines a timeout for disconnect connection. If a disconnect procedure does not complete
/// within this time, the request get dropped. This timeout affects secure connections.
///
/// A duration of zero disables the timeout.
///
/// By default, the disconnect timeout is disabled.
pub fn client_disconnect_timeout(mut self, dur: Duration) -> Self {
self.client_disconnect_timeout = dur;
self
}
#[doc(hidden)]
#[deprecated(since = "3.0.0", note = "Renamed to `client_disconnect_timeout`.")]
pub fn client_disconnect(self, dur: Duration) -> Self {
self.client_disconnect_timeout(dur)
}
/// Provide service for `EXPECT: 100-Continue` support.
///
/// Service get called with request that contains `EXPECT` header.
/// Service must return request in case of success, in that case
/// request will be forwarded to main service.
pub fn expect<F, X1>(self, expect: F) -> HttpServiceBuilder<T, S, X1, U>
where
F: IntoServiceFactory<X1, Request>,
X1: ServiceFactory<Request, Config = (), Response = Request>,
X1::Error: Into<Response<BoxBody>>,
X1::InitError: fmt::Debug,
{
HttpServiceBuilder {
keep_alive: self.keep_alive,
client_request_timeout: self.client_request_timeout,
client_disconnect_timeout: self.client_disconnect_timeout,
secure: self.secure,
local_addr: self.local_addr,
expect: expect.into_factory(),
upgrade: self.upgrade,
on_connect_ext: self.on_connect_ext,
_phantom: PhantomData,
}
}
/// Provide service for custom `Connection: UPGRADE` support.
///
/// If service is provided then normal requests handling get halted
/// and this service get called with original request and framed object.
pub fn upgrade<F, U1>(self, upgrade: F) -> HttpServiceBuilder<T, S, X, U1>
where
F: IntoServiceFactory<U1, (Request, Framed<T, h1::Codec>)>,
U1: ServiceFactory<(Request, Framed<T, h1::Codec>), Config = (), Response = ()>,
U1::Error: fmt::Display,
U1::InitError: fmt::Debug,
{
HttpServiceBuilder {
keep_alive: self.keep_alive,
client_request_timeout: self.client_request_timeout,
client_disconnect_timeout: self.client_disconnect_timeout,
secure: self.secure,
local_addr: self.local_addr,
expect: self.expect,
upgrade: Some(upgrade.into_factory()),
on_connect_ext: self.on_connect_ext,
_phantom: PhantomData,
}
}
/// Sets the callback to be run on connection establishment.
///
/// Has mutable access to a data container that will be merged into request extensions.
/// This enables transport layer data (like client certificates) to be accessed in middleware
/// and handlers.
pub fn on_connect_ext<F>(mut self, f: F) -> Self
where
F: Fn(&T, &mut Extensions) + 'static,
{
self.on_connect_ext = Some(Rc::new(f));
self
}
/// Finish service configuration and create a service for the HTTP/1 protocol.
pub fn h1<F, B>(self, service: F) -> H1Service<T, S, B, X, U>
where
B: MessageBody,
F: IntoServiceFactory<S, Request>,
S::Error: Into<Response<BoxBody>>,
S::InitError: fmt::Debug,
S::Response: Into<Response<B>>,
{
let cfg = ServiceConfig::new(
self.keep_alive,
self.client_request_timeout,
self.client_disconnect_timeout,
self.secure,
self.local_addr,
);
H1Service::with_config(cfg, service.into_factory())
.expect(self.expect)
.upgrade(self.upgrade)
.on_connect_ext(self.on_connect_ext)
}
/// Finish service configuration and create a service for the HTTP/2 protocol.
#[cfg(feature = "http2")]
pub fn h2<F, B>(self, service: F) -> crate::h2::H2Service<T, S, B>
where
F: IntoServiceFactory<S, Request>,
S::Error: Into<Response<BoxBody>> + 'static,
S::InitError: fmt::Debug,
S::Response: Into<Response<B>> + 'static,
B: MessageBody + 'static,
{
let cfg = ServiceConfig::new(
self.keep_alive,
self.client_request_timeout,
self.client_disconnect_timeout,
self.secure,
self.local_addr,
);
crate::h2::H2Service::with_config(cfg, service.into_factory())
.on_connect_ext(self.on_connect_ext)
}
/// Finish service configuration and create `HttpService` instance.
pub fn finish<F, B>(self, service: F) -> HttpService<T, S, B, X, U>
where
F: IntoServiceFactory<S, Request>,
S::Error: Into<Response<BoxBody>> + 'static,
S::InitError: fmt::Debug,
S::Response: Into<Response<B>> + 'static,
B: MessageBody + 'static,
{
let cfg = ServiceConfig::new(
self.keep_alive,
self.client_request_timeout,
self.client_disconnect_timeout,
self.secure,
self.local_addr,
);
HttpService::with_config(cfg, service.into_factory())
.expect(self.expect)
.upgrade(self.upgrade)
.on_connect_ext(self.on_connect_ext)
}
}

236
actix-http/src/config.rs Normal file
View file

@ -0,0 +1,236 @@
use std::{
net,
rc::Rc,
time::{Duration, Instant},
};
use bytes::BytesMut;
use crate::{date::DateService, KeepAlive};
/// HTTP service configuration.
#[derive(Debug, Clone)]
pub struct ServiceConfig(Rc<Inner>);
#[derive(Debug)]
struct Inner {
keep_alive: KeepAlive,
client_request_timeout: Duration,
client_disconnect_timeout: Duration,
secure: bool,
local_addr: Option<std::net::SocketAddr>,
date_service: DateService,
}
impl Default for ServiceConfig {
fn default() -> Self {
Self::new(
KeepAlive::default(),
Duration::from_secs(5),
Duration::ZERO,
false,
None,
)
}
}
impl ServiceConfig {
/// Create instance of `ServiceConfig`.
pub fn new(
keep_alive: KeepAlive,
client_request_timeout: Duration,
client_disconnect_timeout: Duration,
secure: bool,
local_addr: Option<net::SocketAddr>,
) -> ServiceConfig {
ServiceConfig(Rc::new(Inner {
keep_alive: keep_alive.normalize(),
client_request_timeout,
client_disconnect_timeout,
secure,
local_addr,
date_service: DateService::new(),
}))
}
/// Returns `true` if connection is secure (i.e., using TLS / HTTPS).
#[inline]
pub fn secure(&self) -> bool {
self.0.secure
}
/// Returns the local address that this server is bound to.
///
/// Returns `None` for connections via UDS (Unix Domain Socket).
#[inline]
pub fn local_addr(&self) -> Option<net::SocketAddr> {
self.0.local_addr
}
/// Connection keep-alive setting.
#[inline]
pub fn keep_alive(&self) -> KeepAlive {
self.0.keep_alive
}
/// Creates a time object representing the deadline for this connection's keep-alive period, if
/// enabled.
///
/// When [`KeepAlive::Os`] or [`KeepAlive::Disabled`] is set, this will return `None`.
pub fn keep_alive_deadline(&self) -> Option<Instant> {
match self.keep_alive() {
KeepAlive::Timeout(dur) => Some(self.now() + dur),
KeepAlive::Os => None,
KeepAlive::Disabled => None,
}
}
/// Creates a time object representing the deadline for the client to finish sending the head of
/// its first request.
///
/// Returns `None` if this `ServiceConfig was` constructed with `client_request_timeout: 0`.
pub fn client_request_deadline(&self) -> Option<Instant> {
let timeout = self.0.client_request_timeout;
(timeout != Duration::ZERO).then(|| self.now() + timeout)
}
/// Creates a time object representing the deadline for the client to disconnect.
pub fn client_disconnect_deadline(&self) -> Option<Instant> {
let timeout = self.0.client_disconnect_timeout;
(timeout != Duration::ZERO).then(|| self.now() + timeout)
}
pub(crate) fn now(&self) -> Instant {
self.0.date_service.now()
}
/// Writes date header to `dst` buffer.
///
/// Low-level method that utilizes the built-in efficient date service, requiring fewer syscalls
/// than normal. Note that a CRLF (`\r\n`) is included in what is written.
#[doc(hidden)]
pub fn write_date_header(&self, dst: &mut BytesMut, camel_case: bool) {
let mut buf: [u8; 37] = [0; 37];
buf[..6].copy_from_slice(if camel_case { b"Date: " } else { b"date: " });
self.0
.date_service
.with_date(|date| buf[6..35].copy_from_slice(&date.bytes));
buf[35..].copy_from_slice(b"\r\n");
dst.extend_from_slice(&buf);
}
#[allow(unused)] // used with `http2` feature flag
pub(crate) fn write_date_header_value(&self, dst: &mut BytesMut) {
self.0
.date_service
.with_date(|date| dst.extend_from_slice(&date.bytes));
}
}
#[cfg(test)]
mod tests {
use actix_rt::{
task::yield_now,
time::{sleep, sleep_until},
};
use memchr::memmem;
use super::*;
use crate::{date::DATE_VALUE_LENGTH, notify_on_drop};
#[actix_rt::test]
async fn test_date_service_update() {
let settings =
ServiceConfig::new(KeepAlive::Os, Duration::ZERO, Duration::ZERO, false, None);
yield_now().await;
let mut buf1 = BytesMut::with_capacity(DATE_VALUE_LENGTH + 10);
settings.write_date_header(&mut buf1, false);
let now1 = settings.now();
sleep_until((Instant::now() + Duration::from_secs(2)).into()).await;
yield_now().await;
let now2 = settings.now();
let mut buf2 = BytesMut::with_capacity(DATE_VALUE_LENGTH + 10);
settings.write_date_header(&mut buf2, false);
assert_ne!(now1, now2);
assert_ne!(buf1, buf2);
drop(settings);
// Ensure the task will drop eventually
let mut times = 0;
while !notify_on_drop::is_dropped() {
sleep(Duration::from_millis(100)).await;
times += 1;
assert!(times < 10, "Timeout waiting for task drop");
}
}
#[actix_rt::test]
async fn test_date_service_drop() {
let service = Rc::new(DateService::new());
// yield so date service have a chance to register the spawned timer update task.
yield_now().await;
let clone1 = service.clone();
let clone2 = service.clone();
let clone3 = service.clone();
drop(clone1);
assert!(!notify_on_drop::is_dropped());
drop(clone2);
assert!(!notify_on_drop::is_dropped());
drop(clone3);
assert!(!notify_on_drop::is_dropped());
drop(service);
// Ensure the task will drop eventually
let mut times = 0;
while !notify_on_drop::is_dropped() {
sleep(Duration::from_millis(100)).await;
times += 1;
assert!(times < 10, "Timeout waiting for task drop");
}
}
#[test]
fn test_date_len() {
assert_eq!(DATE_VALUE_LENGTH, "Sun, 06 Nov 1994 08:49:37 GMT".len());
}
#[actix_rt::test]
async fn test_date() {
let settings = ServiceConfig::default();
let mut buf1 = BytesMut::with_capacity(DATE_VALUE_LENGTH + 10);
settings.write_date_header(&mut buf1, false);
let mut buf2 = BytesMut::with_capacity(DATE_VALUE_LENGTH + 10);
settings.write_date_header(&mut buf2, false);
assert_eq!(buf1, buf2);
}
#[actix_rt::test]
async fn test_date_camel_case() {
let settings = ServiceConfig::default();
let mut buf = BytesMut::with_capacity(DATE_VALUE_LENGTH + 10);
settings.write_date_header(&mut buf, false);
assert!(memmem::find(&buf, b"date:").is_some());
let mut buf = BytesMut::with_capacity(DATE_VALUE_LENGTH + 10);
settings.write_date_header(&mut buf, true);
assert!(memmem::find(&buf, b"Date:").is_some());
}
}

92
actix-http/src/date.rs Normal file
View file

@ -0,0 +1,92 @@
use std::{
cell::Cell,
fmt::{self, Write},
rc::Rc,
time::{Duration, Instant, SystemTime},
};
use actix_rt::{task::JoinHandle, time::interval};
/// "Thu, 01 Jan 1970 00:00:00 GMT".len()
pub(crate) const DATE_VALUE_LENGTH: usize = 29;
#[derive(Clone, Copy)]
pub(crate) struct Date {
pub(crate) bytes: [u8; DATE_VALUE_LENGTH],
pos: usize,
}
impl Date {
fn new() -> Date {
let mut date = Date {
bytes: [0; DATE_VALUE_LENGTH],
pos: 0,
};
date.update();
date
}
fn update(&mut self) {
self.pos = 0;
write!(self, "{}", httpdate::HttpDate::from(SystemTime::now())).unwrap();
}
}
impl fmt::Write for Date {
fn write_str(&mut self, s: &str) -> fmt::Result {
let len = s.len();
self.bytes[self.pos..self.pos + len].copy_from_slice(s.as_bytes());
self.pos += len;
Ok(())
}
}
/// Service for update Date and Instant periodically at 500 millis interval.
pub(crate) struct DateService {
current: Rc<Cell<(Date, Instant)>>,
handle: JoinHandle<()>,
}
impl DateService {
pub(crate) fn new() -> Self {
// shared date and timer for DateService and update async task.
let current = Rc::new(Cell::new((Date::new(), Instant::now())));
let current_clone = Rc::clone(&current);
// spawn an async task sleep for 500 millis and update current date/timer in a loop.
// handle is used to stop the task on DateService drop.
let handle = actix_rt::spawn(async move {
#[cfg(test)]
let _notify = crate::notify_on_drop::NotifyOnDrop::new();
let mut interval = interval(Duration::from_millis(500));
loop {
let now = interval.tick().await;
let date = Date::new();
current_clone.set((date, now.into_std()));
}
});
DateService { current, handle }
}
pub(crate) fn now(&self) -> Instant {
self.current.get().1
}
pub(crate) fn with_date<F: FnMut(&Date)>(&self, mut f: F) {
f(&self.current.get().0);
}
}
impl fmt::Debug for DateService {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("DateService").finish_non_exhaustive()
}
}
impl Drop for DateService {
fn drop(&mut self) {
// stop the timer update async task on drop.
self.handle.abort();
}
}

View file

@ -0,0 +1,302 @@
//! Stream decoders.
use std::{
future::Future,
io::{self, Write as _},
pin::Pin,
task::{Context, Poll},
};
use actix_rt::task::{spawn_blocking, JoinHandle};
use bytes::Bytes;
#[cfg(feature = "compress-gzip")]
use flate2::write::{GzDecoder, ZlibDecoder};
use futures_core::{ready, Stream};
#[cfg(feature = "compress-zstd")]
use zstd::stream::write::Decoder as ZstdDecoder;
use crate::{
encoding::Writer,
error::PayloadError,
header::{ContentEncoding, HeaderMap, CONTENT_ENCODING},
};
const MAX_CHUNK_SIZE_DECODE_IN_PLACE: usize = 2049;
pin_project_lite::pin_project! {
pub struct Decoder<S> {
decoder: Option<ContentDecoder>,
#[pin]
stream: S,
eof: bool,
fut: Option<JoinHandle<Result<(Option<Bytes>, ContentDecoder), io::Error>>>,
}
}
impl<S> Decoder<S>
where
S: Stream<Item = Result<Bytes, PayloadError>>,
{
/// Construct a decoder.
#[inline]
pub fn new(stream: S, encoding: ContentEncoding) -> Decoder<S> {
let decoder = match encoding {
#[cfg(feature = "compress-brotli")]
ContentEncoding::Brotli => Some(ContentDecoder::Brotli(Box::new(
brotli::DecompressorWriter::new(Writer::new(), 8_096),
))),
#[cfg(feature = "compress-gzip")]
ContentEncoding::Deflate => Some(ContentDecoder::Deflate(Box::new(ZlibDecoder::new(
Writer::new(),
)))),
#[cfg(feature = "compress-gzip")]
ContentEncoding::Gzip => Some(ContentDecoder::Gzip(Box::new(GzDecoder::new(
Writer::new(),
)))),
#[cfg(feature = "compress-zstd")]
ContentEncoding::Zstd => Some(ContentDecoder::Zstd(Box::new(
ZstdDecoder::new(Writer::new()).expect(
"Failed to create zstd decoder. This is a bug. \
Please report it to the actix-web repository.",
),
))),
_ => None,
};
Decoder {
decoder,
stream,
fut: None,
eof: false,
}
}
/// Construct decoder based on headers.
#[inline]
pub fn from_headers(stream: S, headers: &HeaderMap) -> Decoder<S> {
// check content-encoding
let encoding = headers
.get(&CONTENT_ENCODING)
.and_then(|val| val.to_str().ok())
.and_then(|x| x.parse().ok())
.unwrap_or(ContentEncoding::Identity);
Self::new(stream, encoding)
}
}
impl<S> Stream for Decoder<S>
where
S: Stream<Item = Result<Bytes, PayloadError>>,
{
type Item = Result<Bytes, PayloadError>;
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
let mut this = self.project();
loop {
if let Some(ref mut fut) = this.fut {
let (chunk, decoder) = ready!(Pin::new(fut).poll(cx)).map_err(|_| {
PayloadError::Io(io::Error::new(
io::ErrorKind::Other,
"Blocking task was cancelled unexpectedly",
))
})??;
*this.decoder = Some(decoder);
this.fut.take();
if let Some(chunk) = chunk {
return Poll::Ready(Some(Ok(chunk)));
}
}
if *this.eof {
return Poll::Ready(None);
}
match ready!(this.stream.as_mut().poll_next(cx)) {
Some(Err(err)) => return Poll::Ready(Some(Err(err))),
Some(Ok(chunk)) => {
if let Some(mut decoder) = this.decoder.take() {
if chunk.len() < MAX_CHUNK_SIZE_DECODE_IN_PLACE {
let chunk = decoder.feed_data(chunk)?;
*this.decoder = Some(decoder);
if let Some(chunk) = chunk {
return Poll::Ready(Some(Ok(chunk)));
}
} else {
*this.fut = Some(spawn_blocking(move || {
let chunk = decoder.feed_data(chunk)?;
Ok((chunk, decoder))
}));
}
continue;
} else {
return Poll::Ready(Some(Ok(chunk)));
}
}
None => {
*this.eof = true;
return if let Some(mut decoder) = this.decoder.take() {
match decoder.feed_eof() {
Ok(Some(res)) => Poll::Ready(Some(Ok(res))),
Ok(None) => Poll::Ready(None),
Err(err) => Poll::Ready(Some(Err(err.into()))),
}
} else {
Poll::Ready(None)
};
}
}
}
}
}
enum ContentDecoder {
#[cfg(feature = "compress-gzip")]
Deflate(Box<ZlibDecoder<Writer>>),
#[cfg(feature = "compress-gzip")]
Gzip(Box<GzDecoder<Writer>>),
#[cfg(feature = "compress-brotli")]
Brotli(Box<brotli::DecompressorWriter<Writer>>),
// We need explicit 'static lifetime here because ZstdDecoder need lifetime
// argument, and we use `spawn_blocking` in `Decoder::poll_next` that require `FnOnce() -> R + Send + 'static`
#[cfg(feature = "compress-zstd")]
Zstd(Box<ZstdDecoder<'static, Writer>>),
}
impl ContentDecoder {
fn feed_eof(&mut self) -> io::Result<Option<Bytes>> {
match self {
#[cfg(feature = "compress-brotli")]
ContentDecoder::Brotli(ref mut decoder) => match decoder.flush() {
Ok(()) => {
let b = decoder.get_mut().take();
if !b.is_empty() {
Ok(Some(b))
} else {
Ok(None)
}
}
Err(err) => Err(err),
},
#[cfg(feature = "compress-gzip")]
ContentDecoder::Gzip(ref mut decoder) => match decoder.try_finish() {
Ok(_) => {
let b = decoder.get_mut().take();
if !b.is_empty() {
Ok(Some(b))
} else {
Ok(None)
}
}
Err(err) => Err(err),
},
#[cfg(feature = "compress-gzip")]
ContentDecoder::Deflate(ref mut decoder) => match decoder.try_finish() {
Ok(_) => {
let b = decoder.get_mut().take();
if !b.is_empty() {
Ok(Some(b))
} else {
Ok(None)
}
}
Err(err) => Err(err),
},
#[cfg(feature = "compress-zstd")]
ContentDecoder::Zstd(ref mut decoder) => match decoder.flush() {
Ok(_) => {
let b = decoder.get_mut().take();
if !b.is_empty() {
Ok(Some(b))
} else {
Ok(None)
}
}
Err(err) => Err(err),
},
}
}
fn feed_data(&mut self, data: Bytes) -> io::Result<Option<Bytes>> {
match self {
#[cfg(feature = "compress-brotli")]
ContentDecoder::Brotli(ref mut decoder) => match decoder.write_all(&data) {
Ok(_) => {
decoder.flush()?;
let b = decoder.get_mut().take();
if !b.is_empty() {
Ok(Some(b))
} else {
Ok(None)
}
}
Err(err) => Err(err),
},
#[cfg(feature = "compress-gzip")]
ContentDecoder::Gzip(ref mut decoder) => match decoder.write_all(&data) {
Ok(_) => {
decoder.flush()?;
let b = decoder.get_mut().take();
if !b.is_empty() {
Ok(Some(b))
} else {
Ok(None)
}
}
Err(err) => Err(err),
},
#[cfg(feature = "compress-gzip")]
ContentDecoder::Deflate(ref mut decoder) => match decoder.write_all(&data) {
Ok(_) => {
decoder.flush()?;
let b = decoder.get_mut().take();
if !b.is_empty() {
Ok(Some(b))
} else {
Ok(None)
}
}
Err(err) => Err(err),
},
#[cfg(feature = "compress-zstd")]
ContentDecoder::Zstd(ref mut decoder) => match decoder.write_all(&data) {
Ok(_) => {
decoder.flush()?;
let b = decoder.get_mut().take();
if !b.is_empty() {
Ok(Some(b))
} else {
Ok(None)
}
}
Err(err) => Err(err),
},
}
}
}

View file

@ -0,0 +1,439 @@
//! Stream encoders.
use std::{
error::Error as StdError,
future::Future,
io::{self, Write as _},
pin::Pin,
task::{Context, Poll},
};
use actix_rt::task::{spawn_blocking, JoinHandle};
use bytes::Bytes;
use derive_more::Display;
#[cfg(feature = "compress-gzip")]
use flate2::write::{GzEncoder, ZlibEncoder};
use futures_core::ready;
use pin_project_lite::pin_project;
use tracing::trace;
#[cfg(feature = "compress-zstd")]
use zstd::stream::write::Encoder as ZstdEncoder;
use super::Writer;
use crate::{
body::{self, BodySize, MessageBody},
header::{self, ContentEncoding, HeaderValue, CONTENT_ENCODING},
ResponseHead, StatusCode,
};
const MAX_CHUNK_SIZE_ENCODE_IN_PLACE: usize = 1024;
pin_project! {
pub struct Encoder<B> {
#[pin]
body: EncoderBody<B>,
encoder: Option<ContentEncoder>,
fut: Option<JoinHandle<Result<ContentEncoder, io::Error>>>,
eof: bool,
}
}
impl<B: MessageBody> Encoder<B> {
fn none() -> Self {
Encoder {
body: EncoderBody::None {
body: body::None::new(),
},
encoder: None,
fut: None,
eof: true,
}
}
fn empty() -> Self {
Encoder {
body: EncoderBody::Full { body: Bytes::new() },
encoder: None,
fut: None,
eof: true,
}
}
pub fn response(encoding: ContentEncoding, head: &mut ResponseHead, body: B) -> Self {
// no need to compress empty bodies
match body.size() {
BodySize::None => return Self::none(),
BodySize::Sized(0) => return Self::empty(),
_ => {}
}
let should_encode = !(head.headers().contains_key(&CONTENT_ENCODING)
|| head.status == StatusCode::SWITCHING_PROTOCOLS
|| head.status == StatusCode::NO_CONTENT
|| encoding == ContentEncoding::Identity);
let body = match body.try_into_bytes() {
Ok(body) => EncoderBody::Full { body },
Err(body) => EncoderBody::Stream { body },
};
if should_encode {
// wrap body only if encoder is feature-enabled
if let Some(enc) = ContentEncoder::select(encoding) {
update_head(encoding, head);
return Encoder {
body,
encoder: Some(enc),
fut: None,
eof: false,
};
}
}
Encoder {
body,
encoder: None,
fut: None,
eof: false,
}
}
}
pin_project! {
#[project = EncoderBodyProj]
enum EncoderBody<B> {
None { body: body::None },
Full { body: Bytes },
Stream { #[pin] body: B },
}
}
impl<B> MessageBody for EncoderBody<B>
where
B: MessageBody,
{
type Error = EncoderError;
#[inline]
fn size(&self) -> BodySize {
match self {
EncoderBody::None { body } => body.size(),
EncoderBody::Full { body } => body.size(),
EncoderBody::Stream { body } => body.size(),
}
}
fn poll_next(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
match self.project() {
EncoderBodyProj::None { body } => {
Pin::new(body).poll_next(cx).map_err(|err| match err {})
}
EncoderBodyProj::Full { body } => {
Pin::new(body).poll_next(cx).map_err(|err| match err {})
}
EncoderBodyProj::Stream { body } => body
.poll_next(cx)
.map_err(|err| EncoderError::Body(err.into())),
}
}
#[inline]
fn try_into_bytes(self) -> Result<Bytes, Self>
where
Self: Sized,
{
match self {
EncoderBody::None { body } => Ok(body.try_into_bytes().unwrap()),
EncoderBody::Full { body } => Ok(body.try_into_bytes().unwrap()),
_ => Err(self),
}
}
}
impl<B> MessageBody for Encoder<B>
where
B: MessageBody,
{
type Error = EncoderError;
#[inline]
fn size(&self) -> BodySize {
if self.encoder.is_some() {
BodySize::Stream
} else {
self.body.size()
}
}
fn poll_next(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Bytes, Self::Error>>> {
let mut this = self.project();
loop {
if *this.eof {
return Poll::Ready(None);
}
if let Some(ref mut fut) = this.fut {
let mut encoder = ready!(Pin::new(fut).poll(cx))
.map_err(|_| {
EncoderError::Io(io::Error::new(
io::ErrorKind::Other,
"Blocking task was cancelled unexpectedly",
))
})?
.map_err(EncoderError::Io)?;
let chunk = encoder.take();
*this.encoder = Some(encoder);
this.fut.take();
if !chunk.is_empty() {
return Poll::Ready(Some(Ok(chunk)));
}
}
let result = ready!(this.body.as_mut().poll_next(cx));
match result {
Some(Err(err)) => return Poll::Ready(Some(Err(err))),
Some(Ok(chunk)) => {
if let Some(mut encoder) = this.encoder.take() {
if chunk.len() < MAX_CHUNK_SIZE_ENCODE_IN_PLACE {
encoder.write(&chunk).map_err(EncoderError::Io)?;
let chunk = encoder.take();
*this.encoder = Some(encoder);
if !chunk.is_empty() {
return Poll::Ready(Some(Ok(chunk)));
}
} else {
*this.fut = Some(spawn_blocking(move || {
encoder.write(&chunk)?;
Ok(encoder)
}));
}
} else {
return Poll::Ready(Some(Ok(chunk)));
}
}
None => {
if let Some(encoder) = this.encoder.take() {
let chunk = encoder.finish().map_err(EncoderError::Io)?;
if chunk.is_empty() {
return Poll::Ready(None);
} else {
*this.eof = true;
return Poll::Ready(Some(Ok(chunk)));
}
} else {
return Poll::Ready(None);
}
}
}
}
}
#[inline]
fn try_into_bytes(mut self) -> Result<Bytes, Self>
where
Self: Sized,
{
if self.encoder.is_some() {
Err(self)
} else {
match self.body.try_into_bytes() {
Ok(body) => Ok(body),
Err(body) => {
self.body = body;
Err(self)
}
}
}
}
}
fn update_head(encoding: ContentEncoding, head: &mut ResponseHead) {
head.headers_mut()
.insert(header::CONTENT_ENCODING, encoding.to_header_value());
head.headers_mut()
.append(header::VARY, HeaderValue::from_static("accept-encoding"));
head.no_chunking(false);
}
enum ContentEncoder {
#[cfg(feature = "compress-gzip")]
Deflate(ZlibEncoder<Writer>),
#[cfg(feature = "compress-gzip")]
Gzip(GzEncoder<Writer>),
#[cfg(feature = "compress-brotli")]
Brotli(Box<brotli::CompressorWriter<Writer>>),
// Wwe need explicit 'static lifetime here because ZstdEncoder needs a lifetime argument and we
// use `spawn_blocking` in `Encoder::poll_next` that requires `FnOnce() -> R + Send + 'static`.
#[cfg(feature = "compress-zstd")]
Zstd(ZstdEncoder<'static, Writer>),
}
impl ContentEncoder {
fn select(encoding: ContentEncoding) -> Option<Self> {
match encoding {
#[cfg(feature = "compress-gzip")]
ContentEncoding::Deflate => Some(ContentEncoder::Deflate(ZlibEncoder::new(
Writer::new(),
flate2::Compression::fast(),
))),
#[cfg(feature = "compress-gzip")]
ContentEncoding::Gzip => Some(ContentEncoder::Gzip(GzEncoder::new(
Writer::new(),
flate2::Compression::fast(),
))),
#[cfg(feature = "compress-brotli")]
ContentEncoding::Brotli => Some(ContentEncoder::Brotli(new_brotli_compressor())),
#[cfg(feature = "compress-zstd")]
ContentEncoding::Zstd => {
let encoder = ZstdEncoder::new(Writer::new(), 3).ok()?;
Some(ContentEncoder::Zstd(encoder))
}
_ => None,
}
}
#[inline]
pub(crate) fn take(&mut self) -> Bytes {
match *self {
#[cfg(feature = "compress-brotli")]
ContentEncoder::Brotli(ref mut encoder) => encoder.get_mut().take(),
#[cfg(feature = "compress-gzip")]
ContentEncoder::Deflate(ref mut encoder) => encoder.get_mut().take(),
#[cfg(feature = "compress-gzip")]
ContentEncoder::Gzip(ref mut encoder) => encoder.get_mut().take(),
#[cfg(feature = "compress-zstd")]
ContentEncoder::Zstd(ref mut encoder) => encoder.get_mut().take(),
}
}
fn finish(self) -> Result<Bytes, io::Error> {
match self {
#[cfg(feature = "compress-brotli")]
ContentEncoder::Brotli(mut encoder) => match encoder.flush() {
Ok(()) => Ok(encoder.into_inner().buf.freeze()),
Err(err) => Err(err),
},
#[cfg(feature = "compress-gzip")]
ContentEncoder::Gzip(encoder) => match encoder.finish() {
Ok(writer) => Ok(writer.buf.freeze()),
Err(err) => Err(err),
},
#[cfg(feature = "compress-gzip")]
ContentEncoder::Deflate(encoder) => match encoder.finish() {
Ok(writer) => Ok(writer.buf.freeze()),
Err(err) => Err(err),
},
#[cfg(feature = "compress-zstd")]
ContentEncoder::Zstd(encoder) => match encoder.finish() {
Ok(writer) => Ok(writer.buf.freeze()),
Err(err) => Err(err),
},
}
}
fn write(&mut self, data: &[u8]) -> Result<(), io::Error> {
match *self {
#[cfg(feature = "compress-brotli")]
ContentEncoder::Brotli(ref mut encoder) => match encoder.write_all(data) {
Ok(_) => Ok(()),
Err(err) => {
trace!("Error decoding br encoding: {}", err);
Err(err)
}
},
#[cfg(feature = "compress-gzip")]
ContentEncoder::Gzip(ref mut encoder) => match encoder.write_all(data) {
Ok(_) => Ok(()),
Err(err) => {
trace!("Error decoding gzip encoding: {}", err);
Err(err)
}
},
#[cfg(feature = "compress-gzip")]
ContentEncoder::Deflate(ref mut encoder) => match encoder.write_all(data) {
Ok(_) => Ok(()),
Err(err) => {
trace!("Error decoding deflate encoding: {}", err);
Err(err)
}
},
#[cfg(feature = "compress-zstd")]
ContentEncoder::Zstd(ref mut encoder) => match encoder.write_all(data) {
Ok(_) => Ok(()),
Err(err) => {
trace!("Error decoding ztsd encoding: {}", err);
Err(err)
}
},
}
}
}
#[cfg(feature = "compress-brotli")]
fn new_brotli_compressor() -> Box<brotli::CompressorWriter<Writer>> {
Box::new(brotli::CompressorWriter::new(
Writer::new(),
32 * 1024, // 32 KiB buffer
3, // BROTLI_PARAM_QUALITY
22, // BROTLI_PARAM_LGWIN
))
}
#[derive(Debug, Display)]
#[non_exhaustive]
pub enum EncoderError {
/// Wrapped body stream error.
#[display(fmt = "body")]
Body(Box<dyn StdError>),
/// Generic I/O error.
#[display(fmt = "io")]
Io(io::Error),
}
impl StdError for EncoderError {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
match self {
EncoderError::Body(err) => Some(&**err),
EncoderError::Io(err) => Some(err),
}
}
}
impl From<EncoderError> for crate::Error {
fn from(err: EncoderError) -> Self {
crate::Error::new_encoder().with_cause(err)
}
}

View file

@ -0,0 +1,40 @@
//! Content-Encoding support.
use std::io;
use bytes::{Bytes, BytesMut};
mod decoder;
mod encoder;
pub use self::{decoder::Decoder, encoder::Encoder};
/// Special-purpose writer for streaming (de-)compression.
///
/// Pre-allocates 8KiB of capacity.
struct Writer {
buf: BytesMut,
}
impl Writer {
fn new() -> Writer {
Writer {
buf: BytesMut::with_capacity(8192),
}
}
fn take(&mut self) -> Bytes {
self.buf.split().freeze()
}
}
impl io::Write for Writer {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.buf.extend_from_slice(buf);
Ok(buf.len())
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}

488
actix-http/src/error.rs Normal file
View file

@ -0,0 +1,488 @@
//! Error and Result module
use std::{error::Error as StdError, fmt, io, str::Utf8Error, string::FromUtf8Error};
use derive_more::{Display, Error, From};
pub use http::Error as HttpError;
use http::{uri::InvalidUri, StatusCode};
use crate::{body::BoxBody, Response};
pub struct Error {
inner: Box<ErrorInner>,
}
pub(crate) struct ErrorInner {
#[allow(dead_code)]
kind: Kind,
cause: Option<Box<dyn StdError>>,
}
impl Error {
fn new(kind: Kind) -> Self {
Self {
inner: Box::new(ErrorInner { kind, cause: None }),
}
}
pub(crate) fn with_cause(mut self, cause: impl Into<Box<dyn StdError>>) -> Self {
self.inner.cause = Some(cause.into());
self
}
pub(crate) fn new_http() -> Self {
Self::new(Kind::Http)
}
pub(crate) fn new_parse() -> Self {
Self::new(Kind::Parse)
}
pub(crate) fn new_payload() -> Self {
Self::new(Kind::Payload)
}
pub(crate) fn new_body() -> Self {
Self::new(Kind::Body)
}
pub(crate) fn new_send_response() -> Self {
Self::new(Kind::SendResponse)
}
#[allow(unused)] // available for future use
pub(crate) fn new_io() -> Self {
Self::new(Kind::Io)
}
#[allow(unused)] // used in encoder behind feature flag so ignore unused warning
pub(crate) fn new_encoder() -> Self {
Self::new(Kind::Encoder)
}
#[allow(unused)] // used with `ws` feature flag
pub(crate) fn new_ws() -> Self {
Self::new(Kind::Ws)
}
}
impl From<Error> for Response<BoxBody> {
fn from(err: Error) -> Self {
// TODO: more appropriate error status codes, usage assessment needed
let status_code = match err.inner.kind {
Kind::Parse => StatusCode::BAD_REQUEST,
_ => StatusCode::INTERNAL_SERVER_ERROR,
};
Response::new(status_code).set_body(BoxBody::new(err.to_string()))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Display)]
pub(crate) enum Kind {
#[display(fmt = "error processing HTTP")]
Http,
#[display(fmt = "error parsing HTTP message")]
Parse,
#[display(fmt = "request payload read error")]
Payload,
#[display(fmt = "response body write error")]
Body,
#[display(fmt = "send response error")]
SendResponse,
#[display(fmt = "error in WebSocket process")]
Ws,
#[display(fmt = "connection error")]
Io,
#[display(fmt = "encoder error")]
Encoder,
}
impl fmt::Debug for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("actix_http::Error")
.field("kind", &self.inner.kind)
.field("cause", &self.inner.cause)
.finish()
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self.inner.cause.as_ref() {
Some(err) => write!(f, "{}: {}", &self.inner.kind, err),
None => write!(f, "{}", &self.inner.kind),
}
}
}
impl StdError for Error {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
self.inner.cause.as_ref().map(Box::as_ref)
}
}
impl From<std::convert::Infallible> for Error {
fn from(err: std::convert::Infallible) -> Self {
match err {}
}
}
impl From<HttpError> for Error {
fn from(err: HttpError) -> Self {
Self::new_http().with_cause(err)
}
}
#[cfg(feature = "ws")]
impl From<crate::ws::HandshakeError> for Error {
fn from(err: crate::ws::HandshakeError) -> Self {
Self::new_ws().with_cause(err)
}
}
#[cfg(feature = "ws")]
impl From<crate::ws::ProtocolError> for Error {
fn from(err: crate::ws::ProtocolError) -> Self {
Self::new_ws().with_cause(err)
}
}
/// A set of errors that can occur during parsing HTTP streams.
#[derive(Debug, Display, Error)]
#[non_exhaustive]
pub enum ParseError {
/// An invalid `Method`, such as `GE.T`.
#[display(fmt = "invalid method specified")]
Method,
/// An invalid `Uri`, such as `exam ple.domain`.
#[display(fmt = "URI error: {}", _0)]
Uri(InvalidUri),
/// An invalid `HttpVersion`, such as `HTP/1.1`
#[display(fmt = "invalid HTTP version specified")]
Version,
/// An invalid `Header`.
#[display(fmt = "invalid Header provided")]
Header,
/// A message head is too large to be reasonable.
#[display(fmt = "message head is too large")]
TooLarge,
/// A message reached EOF, but is not complete.
#[display(fmt = "message is incomplete")]
Incomplete,
/// An invalid `Status`, such as `1337 ELITE`.
#[display(fmt = "invalid status provided")]
Status,
/// A timeout occurred waiting for an IO event.
#[allow(dead_code)]
#[display(fmt = "timeout")]
Timeout,
/// An I/O error that occurred while trying to read or write to a network stream.
#[display(fmt = "I/O error: {}", _0)]
Io(io::Error),
/// Parsing a field as string failed.
#[display(fmt = "UTF-8 error: {}", _0)]
Utf8(Utf8Error),
}
impl From<io::Error> for ParseError {
fn from(err: io::Error) -> ParseError {
ParseError::Io(err)
}
}
impl From<InvalidUri> for ParseError {
fn from(err: InvalidUri) -> ParseError {
ParseError::Uri(err)
}
}
impl From<Utf8Error> for ParseError {
fn from(err: Utf8Error) -> ParseError {
ParseError::Utf8(err)
}
}
impl From<FromUtf8Error> for ParseError {
fn from(err: FromUtf8Error) -> ParseError {
ParseError::Utf8(err.utf8_error())
}
}
impl From<httparse::Error> for ParseError {
fn from(err: httparse::Error) -> ParseError {
match err {
httparse::Error::HeaderName
| httparse::Error::HeaderValue
| httparse::Error::NewLine
| httparse::Error::Token => ParseError::Header,
httparse::Error::Status => ParseError::Status,
httparse::Error::TooManyHeaders => ParseError::TooLarge,
httparse::Error::Version => ParseError::Version,
}
}
}
impl From<ParseError> for Error {
fn from(err: ParseError) -> Self {
Self::new_parse().with_cause(err)
}
}
impl From<ParseError> for Response<BoxBody> {
fn from(err: ParseError) -> Self {
Error::from(err).into()
}
}
/// A set of errors that can occur during payload parsing.
#[derive(Debug, Display)]
#[non_exhaustive]
pub enum PayloadError {
/// A payload reached EOF, but is not complete.
#[display(fmt = "payload reached EOF before completing: {:?}", _0)]
Incomplete(Option<io::Error>),
/// Content encoding stream corruption.
#[display(fmt = "can not decode content-encoding")]
EncodingCorrupted,
/// Payload reached size limit.
#[display(fmt = "payload reached size limit")]
Overflow,
/// Payload length is unknown.
#[display(fmt = "payload length is unknown")]
UnknownLength,
/// HTTP/2 payload error.
#[cfg(feature = "http2")]
#[display(fmt = "{}", _0)]
Http2Payload(::h2::Error),
/// Generic I/O error.
#[display(fmt = "{}", _0)]
Io(io::Error),
}
impl std::error::Error for PayloadError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
PayloadError::Incomplete(None) => None,
PayloadError::Incomplete(Some(err)) => Some(err),
PayloadError::EncodingCorrupted => None,
PayloadError::Overflow => None,
PayloadError::UnknownLength => None,
#[cfg(feature = "http2")]
PayloadError::Http2Payload(err) => Some(err),
PayloadError::Io(err) => Some(err),
}
}
}
#[cfg(feature = "http2")]
impl From<::h2::Error> for PayloadError {
fn from(err: ::h2::Error) -> Self {
PayloadError::Http2Payload(err)
}
}
impl From<Option<io::Error>> for PayloadError {
fn from(err: Option<io::Error>) -> Self {
PayloadError::Incomplete(err)
}
}
impl From<io::Error> for PayloadError {
fn from(err: io::Error) -> Self {
PayloadError::Incomplete(Some(err))
}
}
impl From<PayloadError> for Error {
fn from(err: PayloadError) -> Self {
Self::new_payload().with_cause(err)
}
}
/// A set of errors that can occur during dispatching HTTP requests.
#[derive(Debug, Display, From)]
#[non_exhaustive]
pub enum DispatchError {
/// Service error.
#[display(fmt = "service error")]
Service(Response<BoxBody>),
/// Body streaming error.
#[display(fmt = "body error: {}", _0)]
Body(Box<dyn StdError>),
/// Upgrade service error.
#[display(fmt = "upgrade error")]
Upgrade,
/// An `io::Error` that occurred while trying to read or write to a network stream.
#[display(fmt = "I/O error: {}", _0)]
Io(io::Error),
/// Request parse error.
#[display(fmt = "request parse error: {}", _0)]
Parse(ParseError),
/// HTTP/2 error.
#[display(fmt = "{}", _0)]
#[cfg(feature = "http2")]
H2(h2::Error),
/// The first request did not complete within the specified timeout.
#[display(fmt = "request did not complete within the specified timeout")]
SlowRequestTimeout,
/// Disconnect timeout. Makes sense for TLS streams.
#[display(fmt = "connection shutdown timeout")]
DisconnectTimeout,
/// Handler dropped payload before reading EOF.
#[display(fmt = "handler dropped payload before reading EOF")]
HandlerDroppedPayload,
/// Internal error.
#[display(fmt = "internal error")]
InternalError,
}
impl StdError for DispatchError {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
match self {
DispatchError::Service(_res) => None,
DispatchError::Body(err) => Some(&**err),
DispatchError::Io(err) => Some(err),
DispatchError::Parse(err) => Some(err),
#[cfg(feature = "http2")]
DispatchError::H2(err) => Some(err),
_ => None,
}
}
}
/// A set of error that can occur during parsing content type.
#[derive(Debug, Display, Error)]
#[cfg_attr(test, derive(PartialEq, Eq))]
#[non_exhaustive]
pub enum ContentTypeError {
/// Can not parse content type.
#[display(fmt = "could not parse content type")]
ParseError,
/// Unknown content encoding.
#[display(fmt = "unknown content encoding")]
UnknownEncoding,
}
#[cfg(test)]
mod tests {
use http::Error as HttpError;
use super::*;
#[test]
fn test_into_response() {
let resp: Response<BoxBody> = ParseError::Incomplete.into();
assert_eq!(resp.status(), StatusCode::BAD_REQUEST);
let err: HttpError = StatusCode::from_u16(10000).err().unwrap().into();
let resp: Response<BoxBody> = Error::new_http().with_cause(err).into();
assert_eq!(resp.status(), StatusCode::INTERNAL_SERVER_ERROR);
}
#[test]
fn test_as_response() {
let orig = io::Error::new(io::ErrorKind::Other, "other");
let err: Error = ParseError::Io(orig).into();
assert_eq!(
format!("{}", err),
"error parsing HTTP message: I/O error: other"
);
}
#[test]
fn test_error_display() {
let orig = io::Error::new(io::ErrorKind::Other, "other");
let err = Error::new_io().with_cause(orig);
assert_eq!("connection error: other", err.to_string());
}
#[test]
fn test_error_http_response() {
let orig = io::Error::new(io::ErrorKind::Other, "other");
let err = Error::new_io().with_cause(orig);
let resp: Response<BoxBody> = err.into();
assert_eq!(resp.status(), StatusCode::INTERNAL_SERVER_ERROR);
}
#[test]
fn test_payload_error() {
let err: PayloadError = io::Error::new(io::ErrorKind::Other, "ParseError").into();
assert!(err.to_string().contains("ParseError"));
let err = PayloadError::Incomplete(None);
assert_eq!(
err.to_string(),
"payload reached EOF before completing: None"
);
}
macro_rules! from {
($from:expr => $error:pat) => {
match ParseError::from($from) {
err @ $error => {
assert!(err.to_string().len() >= 5);
}
err => unreachable!("{:?}", err),
}
};
}
macro_rules! from_and_cause {
($from:expr => $error:pat) => {
match ParseError::from($from) {
e @ $error => {
let desc = format!("{}", e);
assert_eq!(desc, format!("I/O error: {}", $from));
}
_ => unreachable!("{:?}", $from),
}
};
}
#[test]
fn test_from() {
from_and_cause!(io::Error::new(io::ErrorKind::Other, "other") => ParseError::Io(..));
from!(httparse::Error::HeaderName => ParseError::Header);
from!(httparse::Error::HeaderName => ParseError::Header);
from!(httparse::Error::HeaderValue => ParseError::Header);
from!(httparse::Error::NewLine => ParseError::Header);
from!(httparse::Error::Status => ParseError::Status);
from!(httparse::Error::Token => ParseError::Header);
from!(httparse::Error::TooManyHeaders => ParseError::TooLarge);
from!(httparse::Error::Version => ParseError::Version);
}
}

View file

@ -0,0 +1,301 @@
use std::{
any::{Any, TypeId},
collections::HashMap,
fmt,
hash::{BuildHasherDefault, Hasher},
};
/// A hasher for `TypeId`s that takes advantage of its known characteristics.
///
/// Author of `anymap` crate has done research on the topic:
/// https://github.com/chris-morgan/anymap/blob/2e9a5704/src/lib.rs#L599
#[derive(Debug, Default)]
struct NoOpHasher(u64);
impl Hasher for NoOpHasher {
fn write(&mut self, _bytes: &[u8]) {
unimplemented!("This NoOpHasher can only handle u64s")
}
fn write_u64(&mut self, i: u64) {
self.0 = i;
}
fn finish(&self) -> u64 {
self.0
}
}
/// A type map for request extensions.
///
/// All entries into this map must be owned types (or static references).
#[derive(Default)]
pub struct Extensions {
/// Use AHasher with a std HashMap with for faster lookups on the small `TypeId` keys.
map: HashMap<TypeId, Box<dyn Any>, BuildHasherDefault<NoOpHasher>>,
}
impl Extensions {
/// Creates an empty `Extensions`.
#[inline]
pub fn new() -> Extensions {
Extensions {
map: HashMap::default(),
}
}
/// Insert an item into the map.
///
/// If an item of this type was already stored, it will be replaced and returned.
///
/// ```
/// # use actix_http::Extensions;
/// let mut map = Extensions::new();
/// assert_eq!(map.insert(""), None);
/// assert_eq!(map.insert(1u32), None);
/// assert_eq!(map.insert(2u32), Some(1u32));
/// assert_eq!(*map.get::<u32>().unwrap(), 2u32);
/// ```
pub fn insert<T: 'static>(&mut self, val: T) -> Option<T> {
self.map
.insert(TypeId::of::<T>(), Box::new(val))
.and_then(downcast_owned)
}
/// Check if map contains an item of a given type.
///
/// ```
/// # use actix_http::Extensions;
/// let mut map = Extensions::new();
/// assert!(!map.contains::<u32>());
///
/// assert_eq!(map.insert(1u32), None);
/// assert!(map.contains::<u32>());
/// ```
pub fn contains<T: 'static>(&self) -> bool {
self.map.contains_key(&TypeId::of::<T>())
}
/// Get a reference to an item of a given type.
///
/// ```
/// # use actix_http::Extensions;
/// let mut map = Extensions::new();
/// map.insert(1u32);
/// assert_eq!(map.get::<u32>(), Some(&1u32));
/// ```
pub fn get<T: 'static>(&self) -> Option<&T> {
self.map
.get(&TypeId::of::<T>())
.and_then(|boxed| boxed.downcast_ref())
}
/// Get a mutable reference to an item of a given type.
///
/// ```
/// # use actix_http::Extensions;
/// let mut map = Extensions::new();
/// map.insert(1u32);
/// assert_eq!(map.get_mut::<u32>(), Some(&mut 1u32));
/// ```
pub fn get_mut<T: 'static>(&mut self) -> Option<&mut T> {
self.map
.get_mut(&TypeId::of::<T>())
.and_then(|boxed| boxed.downcast_mut())
}
/// Remove an item from the map of a given type.
///
/// If an item of this type was already stored, it will be returned.
///
/// ```
/// # use actix_http::Extensions;
/// let mut map = Extensions::new();
///
/// map.insert(1u32);
/// assert_eq!(map.get::<u32>(), Some(&1u32));
///
/// assert_eq!(map.remove::<u32>(), Some(1u32));
/// assert!(!map.contains::<u32>());
/// ```
pub fn remove<T: 'static>(&mut self) -> Option<T> {
self.map.remove(&TypeId::of::<T>()).and_then(downcast_owned)
}
/// Clear the `Extensions` of all inserted extensions.
///
/// ```
/// # use actix_http::Extensions;
/// let mut map = Extensions::new();
///
/// map.insert(1u32);
/// assert!(map.contains::<u32>());
///
/// map.clear();
/// assert!(!map.contains::<u32>());
/// ```
#[inline]
pub fn clear(&mut self) {
self.map.clear();
}
/// Extends self with the items from another `Extensions`.
pub fn extend(&mut self, other: Extensions) {
self.map.extend(other.map);
}
}
impl fmt::Debug for Extensions {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Extensions").finish()
}
}
fn downcast_owned<T: 'static>(boxed: Box<dyn Any>) -> Option<T> {
boxed.downcast().ok().map(|boxed| *boxed)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_remove() {
let mut map = Extensions::new();
map.insert::<i8>(123);
assert!(map.get::<i8>().is_some());
map.remove::<i8>();
assert!(map.get::<i8>().is_none());
}
#[test]
fn test_clear() {
let mut map = Extensions::new();
map.insert::<i8>(8);
map.insert::<i16>(16);
map.insert::<i32>(32);
assert!(map.contains::<i8>());
assert!(map.contains::<i16>());
assert!(map.contains::<i32>());
map.clear();
assert!(!map.contains::<i8>());
assert!(!map.contains::<i16>());
assert!(!map.contains::<i32>());
map.insert::<i8>(10);
assert_eq!(*map.get::<i8>().unwrap(), 10);
}
#[test]
fn test_integers() {
static A: u32 = 8;
let mut map = Extensions::new();
map.insert::<i8>(8);
map.insert::<i16>(16);
map.insert::<i32>(32);
map.insert::<i64>(64);
map.insert::<i128>(128);
map.insert::<u8>(8);
map.insert::<u16>(16);
map.insert::<u32>(32);
map.insert::<u64>(64);
map.insert::<u128>(128);
map.insert::<&'static u32>(&A);
assert!(map.get::<i8>().is_some());
assert!(map.get::<i16>().is_some());
assert!(map.get::<i32>().is_some());
assert!(map.get::<i64>().is_some());
assert!(map.get::<i128>().is_some());
assert!(map.get::<u8>().is_some());
assert!(map.get::<u16>().is_some());
assert!(map.get::<u32>().is_some());
assert!(map.get::<u64>().is_some());
assert!(map.get::<u128>().is_some());
assert!(map.get::<&'static u32>().is_some());
}
#[test]
fn test_composition() {
struct Magi<T>(pub T);
struct Madoka {
pub god: bool,
}
struct Homura {
pub attempts: usize,
}
struct Mami {
pub guns: usize,
}
let mut map = Extensions::new();
map.insert(Magi(Madoka { god: false }));
map.insert(Magi(Homura { attempts: 0 }));
map.insert(Magi(Mami { guns: 999 }));
assert!(!map.get::<Magi<Madoka>>().unwrap().0.god);
assert_eq!(0, map.get::<Magi<Homura>>().unwrap().0.attempts);
assert_eq!(999, map.get::<Magi<Mami>>().unwrap().0.guns);
}
#[test]
fn test_extensions() {
#[derive(Debug, PartialEq)]
struct MyType(i32);
let mut extensions = Extensions::new();
extensions.insert(5i32);
extensions.insert(MyType(10));
assert_eq!(extensions.get(), Some(&5i32));
assert_eq!(extensions.get_mut(), Some(&mut 5i32));
assert_eq!(extensions.remove::<i32>(), Some(5i32));
assert!(extensions.get::<i32>().is_none());
assert_eq!(extensions.get::<bool>(), None);
assert_eq!(extensions.get(), Some(&MyType(10)));
}
#[test]
fn test_extend() {
#[derive(Debug, PartialEq)]
struct MyType(i32);
let mut extensions = Extensions::new();
extensions.insert(5i32);
extensions.insert(MyType(10));
let mut other = Extensions::new();
other.insert(15i32);
other.insert(20u8);
extensions.extend(other);
assert_eq!(extensions.get(), Some(&15i32));
assert_eq!(extensions.get_mut(), Some(&mut 15i32));
assert_eq!(extensions.remove::<i32>(), Some(15i32));
assert!(extensions.get::<i32>().is_none());
assert_eq!(extensions.get::<bool>(), None);
assert_eq!(extensions.get(), Some(&MyType(10)));
assert_eq!(extensions.get(), Some(&20u8));
assert_eq!(extensions.get_mut(), Some(&mut 20u8));
}
}

View file

@ -0,0 +1,427 @@
use std::{io, task::Poll};
use bytes::{Buf as _, Bytes, BytesMut};
use tracing::{debug, trace};
macro_rules! byte (
($rdr:ident) => ({
if $rdr.len() > 0 {
let b = $rdr[0];
$rdr.advance(1);
b
} else {
return Poll::Pending
}
})
);
#[derive(Debug, Clone, PartialEq, Eq)]
pub(super) enum ChunkedState {
Size,
SizeLws,
Extension,
SizeLf,
Body,
BodyCr,
BodyLf,
EndCr,
EndLf,
End,
}
impl ChunkedState {
pub(super) fn step(
&self,
body: &mut BytesMut,
size: &mut u64,
buf: &mut Option<Bytes>,
) -> Poll<Result<ChunkedState, io::Error>> {
use self::ChunkedState::*;
match *self {
Size => ChunkedState::read_size(body, size),
SizeLws => ChunkedState::read_size_lws(body),
Extension => ChunkedState::read_extension(body),
SizeLf => ChunkedState::read_size_lf(body, *size),
Body => ChunkedState::read_body(body, size, buf),
BodyCr => ChunkedState::read_body_cr(body),
BodyLf => ChunkedState::read_body_lf(body),
EndCr => ChunkedState::read_end_cr(body),
EndLf => ChunkedState::read_end_lf(body),
End => Poll::Ready(Ok(ChunkedState::End)),
}
}
fn read_size(rdr: &mut BytesMut, size: &mut u64) -> Poll<Result<ChunkedState, io::Error>> {
let radix = 16;
let rem = match byte!(rdr) {
b @ b'0'..=b'9' => b - b'0',
b @ b'a'..=b'f' => b + 10 - b'a',
b @ b'A'..=b'F' => b + 10 - b'A',
b'\t' | b' ' => return Poll::Ready(Ok(ChunkedState::SizeLws)),
b';' => return Poll::Ready(Ok(ChunkedState::Extension)),
b'\r' => return Poll::Ready(Ok(ChunkedState::SizeLf)),
_ => {
return Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Invalid chunk size line: Invalid Size",
)));
}
};
match size.checked_mul(radix) {
Some(n) => {
*size = n;
*size += rem as u64;
Poll::Ready(Ok(ChunkedState::Size))
}
None => {
debug!("chunk size would overflow u64");
Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Invalid chunk size line: Size is too big",
)))
}
}
}
fn read_size_lws(rdr: &mut BytesMut) -> Poll<Result<ChunkedState, io::Error>> {
match byte!(rdr) {
// LWS can follow the chunk size, but no more digits can come
b'\t' | b' ' => Poll::Ready(Ok(ChunkedState::SizeLws)),
b';' => Poll::Ready(Ok(ChunkedState::Extension)),
b'\r' => Poll::Ready(Ok(ChunkedState::SizeLf)),
_ => Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Invalid chunk size linear white space",
))),
}
}
fn read_extension(rdr: &mut BytesMut) -> Poll<Result<ChunkedState, io::Error>> {
match byte!(rdr) {
b'\r' => Poll::Ready(Ok(ChunkedState::SizeLf)),
// strictly 0x20 (space) should be disallowed but we don't parse quoted strings here
0x00..=0x08 | 0x0a..=0x1f | 0x7f => Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Invalid character in chunk extension",
))),
_ => Poll::Ready(Ok(ChunkedState::Extension)), // no supported extensions
}
}
fn read_size_lf(rdr: &mut BytesMut, size: u64) -> Poll<Result<ChunkedState, io::Error>> {
match byte!(rdr) {
b'\n' if size > 0 => Poll::Ready(Ok(ChunkedState::Body)),
b'\n' if size == 0 => Poll::Ready(Ok(ChunkedState::EndCr)),
_ => Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Invalid chunk size LF",
))),
}
}
fn read_body(
rdr: &mut BytesMut,
rem: &mut u64,
buf: &mut Option<Bytes>,
) -> Poll<Result<ChunkedState, io::Error>> {
trace!("Chunked read, remaining={:?}", rem);
let len = rdr.len() as u64;
if len == 0 {
Poll::Ready(Ok(ChunkedState::Body))
} else {
let slice;
if *rem > len {
slice = rdr.split().freeze();
*rem -= len;
} else {
slice = rdr.split_to(*rem as usize).freeze();
*rem = 0;
}
*buf = Some(slice);
if *rem > 0 {
Poll::Ready(Ok(ChunkedState::Body))
} else {
Poll::Ready(Ok(ChunkedState::BodyCr))
}
}
}
fn read_body_cr(rdr: &mut BytesMut) -> Poll<Result<ChunkedState, io::Error>> {
match byte!(rdr) {
b'\r' => Poll::Ready(Ok(ChunkedState::BodyLf)),
_ => Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Invalid chunk body CR",
))),
}
}
fn read_body_lf(rdr: &mut BytesMut) -> Poll<Result<ChunkedState, io::Error>> {
match byte!(rdr) {
b'\n' => Poll::Ready(Ok(ChunkedState::Size)),
_ => Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Invalid chunk body LF",
))),
}
}
fn read_end_cr(rdr: &mut BytesMut) -> Poll<Result<ChunkedState, io::Error>> {
match byte!(rdr) {
b'\r' => Poll::Ready(Ok(ChunkedState::EndLf)),
_ => Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Invalid chunk end CR",
))),
}
}
fn read_end_lf(rdr: &mut BytesMut) -> Poll<Result<ChunkedState, io::Error>> {
match byte!(rdr) {
b'\n' => Poll::Ready(Ok(ChunkedState::End)),
_ => Poll::Ready(Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Invalid chunk end LF",
))),
}
}
}
#[cfg(test)]
mod tests {
use actix_codec::Decoder as _;
use bytes::{Bytes, BytesMut};
use http::Method;
use crate::{
error::ParseError,
h1::decoder::{MessageDecoder, PayloadItem},
HttpMessage as _, Request,
};
macro_rules! parse_ready {
($e:expr) => {{
match MessageDecoder::<Request>::default().decode($e) {
Ok(Some((msg, _))) => msg,
Ok(_) => unreachable!("Eof during parsing http request"),
Err(err) => unreachable!("Error during parsing http request: {:?}", err),
}
}};
}
macro_rules! expect_parse_err {
($e:expr) => {{
match MessageDecoder::<Request>::default().decode($e) {
Err(err) => match err {
ParseError::Io(_) => unreachable!("Parse error expected"),
_ => {}
},
_ => unreachable!("Error expected"),
}
}};
}
#[test]
fn test_parse_chunked_payload_chunk_extension() {
let mut buf = BytesMut::from(
"GET /test HTTP/1.1\r\n\
transfer-encoding: chunked\r\n\
\r\n",
);
let mut reader = MessageDecoder::<Request>::default();
let (msg, pl) = reader.decode(&mut buf).unwrap().unwrap();
let mut pl = pl.unwrap();
assert!(msg.chunked().unwrap());
buf.extend(b"4;test\r\ndata\r\n4\r\nline\r\n0\r\n\r\n"); // test: test\r\n\r\n")
let chunk = pl.decode(&mut buf).unwrap().unwrap().chunk();
assert_eq!(chunk, Bytes::from_static(b"data"));
let chunk = pl.decode(&mut buf).unwrap().unwrap().chunk();
assert_eq!(chunk, Bytes::from_static(b"line"));
let msg = pl.decode(&mut buf).unwrap().unwrap();
assert!(msg.eof());
}
#[test]
fn test_request_chunked() {
let mut buf = BytesMut::from(
"GET /test HTTP/1.1\r\n\
transfer-encoding: chunked\r\n\r\n",
);
let req = parse_ready!(&mut buf);
if let Ok(val) = req.chunked() {
assert!(val);
} else {
unreachable!("Error");
}
// intentional typo in "chunked"
let mut buf = BytesMut::from(
"GET /test HTTP/1.1\r\n\
transfer-encoding: chnked\r\n\r\n",
);
expect_parse_err!(&mut buf);
}
#[test]
fn test_http_request_chunked_payload() {
let mut buf = BytesMut::from(
"GET /test HTTP/1.1\r\n\
transfer-encoding: chunked\r\n\r\n",
);
let mut reader = MessageDecoder::<Request>::default();
let (req, pl) = reader.decode(&mut buf).unwrap().unwrap();
let mut pl = pl.unwrap();
assert!(req.chunked().unwrap());
buf.extend(b"4\r\ndata\r\n4\r\nline\r\n0\r\n\r\n");
assert_eq!(
pl.decode(&mut buf).unwrap().unwrap().chunk().as_ref(),
b"data"
);
assert_eq!(
pl.decode(&mut buf).unwrap().unwrap().chunk().as_ref(),
b"line"
);
assert!(pl.decode(&mut buf).unwrap().unwrap().eof());
}
#[test]
fn test_http_request_chunked_payload_and_next_message() {
let mut buf = BytesMut::from(
"GET /test HTTP/1.1\r\n\
transfer-encoding: chunked\r\n\r\n",
);
let mut reader = MessageDecoder::<Request>::default();
let (req, pl) = reader.decode(&mut buf).unwrap().unwrap();
let mut pl = pl.unwrap();
assert!(req.chunked().unwrap());
buf.extend(
b"4\r\ndata\r\n4\r\nline\r\n0\r\n\r\n\
POST /test2 HTTP/1.1\r\n\
transfer-encoding: chunked\r\n\r\n"
.iter(),
);
let msg = pl.decode(&mut buf).unwrap().unwrap();
assert_eq!(msg.chunk().as_ref(), b"data");
let msg = pl.decode(&mut buf).unwrap().unwrap();
assert_eq!(msg.chunk().as_ref(), b"line");
let msg = pl.decode(&mut buf).unwrap().unwrap();
assert!(msg.eof());
let (req, _) = reader.decode(&mut buf).unwrap().unwrap();
assert!(req.chunked().unwrap());
assert_eq!(*req.method(), Method::POST);
assert!(req.chunked().unwrap());
}
#[test]
fn test_http_request_chunked_payload_chunks() {
let mut buf = BytesMut::from(
"GET /test HTTP/1.1\r\n\
transfer-encoding: chunked\r\n\r\n",
);
let mut reader = MessageDecoder::<Request>::default();
let (req, pl) = reader.decode(&mut buf).unwrap().unwrap();
let mut pl = pl.unwrap();
assert!(req.chunked().unwrap());
buf.extend(b"4\r\n1111\r\n");
let msg = pl.decode(&mut buf).unwrap().unwrap();
assert_eq!(msg.chunk().as_ref(), b"1111");
buf.extend(b"4\r\ndata\r");
let msg = pl.decode(&mut buf).unwrap().unwrap();
assert_eq!(msg.chunk().as_ref(), b"data");
buf.extend(b"\n4");
assert!(pl.decode(&mut buf).unwrap().is_none());
buf.extend(b"\r");
assert!(pl.decode(&mut buf).unwrap().is_none());
buf.extend(b"\n");
assert!(pl.decode(&mut buf).unwrap().is_none());
buf.extend(b"li");
let msg = pl.decode(&mut buf).unwrap().unwrap();
assert_eq!(msg.chunk().as_ref(), b"li");
//trailers
//buf.feed_data("test: test\r\n");
//not_ready!(reader.parse(&mut buf, &mut readbuf));
buf.extend(b"ne\r\n0\r\n");
let msg = pl.decode(&mut buf).unwrap().unwrap();
assert_eq!(msg.chunk().as_ref(), b"ne");
assert!(pl.decode(&mut buf).unwrap().is_none());
buf.extend(b"\r\n");
assert!(pl.decode(&mut buf).unwrap().unwrap().eof());
}
#[test]
fn chunk_extension_quoted() {
let mut buf = BytesMut::from(
"GET /test HTTP/1.1\r\n\
Host: localhost:8080\r\n\
Transfer-Encoding: chunked\r\n\
\r\n\
2;hello=b;one=\"1 2 3\"\r\n\
xx",
);
let mut reader = MessageDecoder::<Request>::default();
let (_msg, pl) = reader.decode(&mut buf).unwrap().unwrap();
let mut pl = pl.unwrap();
let chunk = pl.decode(&mut buf).unwrap().unwrap();
assert_eq!(chunk, PayloadItem::Chunk(Bytes::from_static(b"xx")));
}
#[test]
fn hrs_chunk_extension_invalid() {
let mut buf = BytesMut::from(
"GET / HTTP/1.1\r\n\
Host: localhost:8080\r\n\
Transfer-Encoding: chunked\r\n\
\r\n\
2;x\nx\r\n\
4c\r\n\
0\r\n",
);
let mut reader = MessageDecoder::<Request>::default();
let (_msg, pl) = reader.decode(&mut buf).unwrap().unwrap();
let mut pl = pl.unwrap();
let err = pl.decode(&mut buf).unwrap_err();
assert!(err
.to_string()
.contains("Invalid character in chunk extension"));
}
#[test]
fn hrs_chunk_size_overflow() {
let mut buf = BytesMut::from(
"GET / HTTP/1.1\r\n\
Host: example.com\r\n\
Transfer-Encoding: chunked\r\n\
\r\n\
f0000000000000003\r\n\
abc\r\n\
0\r\n",
);
let mut reader = MessageDecoder::<Request>::default();
let (_msg, pl) = reader.decode(&mut buf).unwrap().unwrap();
let mut pl = pl.unwrap();
let err = pl.decode(&mut buf).unwrap_err();
assert!(err
.to_string()
.contains("Invalid chunk size line: Size is too big"));
}
}

240
actix-http/src/h1/client.rs Normal file
View file

@ -0,0 +1,240 @@
use std::{fmt, io};
use bitflags::bitflags;
use bytes::{Bytes, BytesMut};
use http::{Method, Version};
use tokio_util::codec::{Decoder, Encoder};
use super::{
decoder::{self, PayloadDecoder, PayloadItem, PayloadType},
encoder, reserve_readbuf, Message, MessageType,
};
use crate::{
body::BodySize,
error::{ParseError, PayloadError},
ConnectionType, RequestHeadType, ResponseHead, ServiceConfig,
};
bitflags! {
#[derive(Debug, Clone, Copy)]
struct Flags: u8 {
const HEAD = 0b0000_0001;
const KEEP_ALIVE_ENABLED = 0b0000_1000;
const STREAM = 0b0001_0000;
}
}
/// HTTP/1 Codec
pub struct ClientCodec {
inner: ClientCodecInner,
}
/// HTTP/1 Payload Codec
pub struct ClientPayloadCodec {
inner: ClientCodecInner,
}
struct ClientCodecInner {
config: ServiceConfig,
decoder: decoder::MessageDecoder<ResponseHead>,
payload: Option<PayloadDecoder>,
version: Version,
conn_type: ConnectionType,
// encoder part
flags: Flags,
encoder: encoder::MessageEncoder<RequestHeadType>,
}
impl Default for ClientCodec {
fn default() -> Self {
ClientCodec::new(ServiceConfig::default())
}
}
impl fmt::Debug for ClientCodec {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("h1::ClientCodec")
.field("flags", &self.inner.flags)
.finish_non_exhaustive()
}
}
impl ClientCodec {
/// Create HTTP/1 codec.
///
/// `keepalive_enabled` how response `connection` header get generated.
pub fn new(config: ServiceConfig) -> Self {
let flags = if config.keep_alive().enabled() {
Flags::KEEP_ALIVE_ENABLED
} else {
Flags::empty()
};
ClientCodec {
inner: ClientCodecInner {
config,
decoder: decoder::MessageDecoder::default(),
payload: None,
version: Version::HTTP_11,
conn_type: ConnectionType::Close,
flags,
encoder: encoder::MessageEncoder::default(),
},
}
}
/// Check if request is upgrade
pub fn upgrade(&self) -> bool {
self.inner.conn_type == ConnectionType::Upgrade
}
/// Check if last response is keep-alive
pub fn keep_alive(&self) -> bool {
self.inner.conn_type == ConnectionType::KeepAlive
}
/// Check last request's message type
pub fn message_type(&self) -> MessageType {
if self.inner.flags.contains(Flags::STREAM) {
MessageType::Stream
} else if self.inner.payload.is_none() {
MessageType::None
} else {
MessageType::Payload
}
}
/// Convert message codec to a payload codec
pub fn into_payload_codec(self) -> ClientPayloadCodec {
ClientPayloadCodec { inner: self.inner }
}
}
impl ClientPayloadCodec {
/// Check if last response is keep-alive
pub fn keep_alive(&self) -> bool {
self.inner.conn_type == ConnectionType::KeepAlive
}
/// Transform payload codec to a message codec
pub fn into_message_codec(self) -> ClientCodec {
ClientCodec { inner: self.inner }
}
}
impl Decoder for ClientCodec {
type Item = ResponseHead;
type Error = ParseError;
fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
debug_assert!(
self.inner.payload.is_none(),
"Payload decoder should not be set"
);
if let Some((req, payload)) = self.inner.decoder.decode(src)? {
if let Some(conn_type) = req.conn_type() {
// do not use peer's keep-alive
self.inner.conn_type = if conn_type == ConnectionType::KeepAlive {
self.inner.conn_type
} else {
conn_type
};
}
if !self.inner.flags.contains(Flags::HEAD) {
match payload {
PayloadType::None => self.inner.payload = None,
PayloadType::Payload(pl) => self.inner.payload = Some(pl),
PayloadType::Stream(pl) => {
self.inner.payload = Some(pl);
self.inner.flags.insert(Flags::STREAM);
}
}
} else {
self.inner.payload = None;
}
reserve_readbuf(src);
Ok(Some(req))
} else {
Ok(None)
}
}
}
impl Decoder for ClientPayloadCodec {
type Item = Option<Bytes>;
type Error = PayloadError;
fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
debug_assert!(
self.inner.payload.is_some(),
"Payload decoder is not specified"
);
Ok(match self.inner.payload.as_mut().unwrap().decode(src)? {
Some(PayloadItem::Chunk(chunk)) => {
reserve_readbuf(src);
Some(Some(chunk))
}
Some(PayloadItem::Eof) => {
self.inner.payload.take();
Some(None)
}
None => None,
})
}
}
impl Encoder<Message<(RequestHeadType, BodySize)>> for ClientCodec {
type Error = io::Error;
fn encode(
&mut self,
item: Message<(RequestHeadType, BodySize)>,
dst: &mut BytesMut,
) -> Result<(), Self::Error> {
match item {
Message::Item((mut head, length)) => {
let inner = &mut self.inner;
inner.version = head.as_ref().version;
inner
.flags
.set(Flags::HEAD, head.as_ref().method == Method::HEAD);
// connection status
inner.conn_type = match head.as_ref().connection_type() {
ConnectionType::KeepAlive => {
if inner.flags.contains(Flags::KEEP_ALIVE_ENABLED) {
ConnectionType::KeepAlive
} else {
ConnectionType::Close
}
}
ConnectionType::Upgrade => ConnectionType::Upgrade,
ConnectionType::Close => ConnectionType::Close,
};
inner.encoder.encode(
dst,
&mut head,
false,
false,
inner.version,
length,
inner.conn_type,
&inner.config,
)?;
}
Message::Chunk(Some(bytes)) => {
self.inner.encoder.encode_chunk(bytes.as_ref(), dst)?;
}
Message::Chunk(None) => {
self.inner.encoder.encode_eof(dst)?;
}
}
Ok(())
}
}

240
actix-http/src/h1/codec.rs Normal file
View file

@ -0,0 +1,240 @@
use std::{fmt, io};
use bitflags::bitflags;
use bytes::BytesMut;
use http::{Method, Version};
use tokio_util::codec::{Decoder, Encoder};
use super::{
decoder::{self, PayloadDecoder, PayloadItem, PayloadType},
encoder, Message, MessageType,
};
use crate::{body::BodySize, error::ParseError, ConnectionType, Request, Response, ServiceConfig};
bitflags! {
#[derive(Debug, Clone, Copy)]
struct Flags: u8 {
const HEAD = 0b0000_0001;
const KEEP_ALIVE_ENABLED = 0b0000_0010;
const STREAM = 0b0000_0100;
}
}
/// HTTP/1 Codec
pub struct Codec {
config: ServiceConfig,
decoder: decoder::MessageDecoder<Request>,
payload: Option<PayloadDecoder>,
version: Version,
conn_type: ConnectionType,
// encoder part
flags: Flags,
encoder: encoder::MessageEncoder<Response<()>>,
}
impl Default for Codec {
fn default() -> Self {
Codec::new(ServiceConfig::default())
}
}
impl fmt::Debug for Codec {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("h1::Codec")
.field("flags", &self.flags)
.finish_non_exhaustive()
}
}
impl Codec {
/// Create HTTP/1 codec.
///
/// `keepalive_enabled` how response `connection` header get generated.
pub fn new(config: ServiceConfig) -> Self {
let flags = if config.keep_alive().enabled() {
Flags::KEEP_ALIVE_ENABLED
} else {
Flags::empty()
};
Codec {
config,
flags,
decoder: decoder::MessageDecoder::default(),
payload: None,
version: Version::HTTP_11,
conn_type: ConnectionType::Close,
encoder: encoder::MessageEncoder::default(),
}
}
/// Check if request is upgrade.
#[inline]
pub fn upgrade(&self) -> bool {
self.conn_type == ConnectionType::Upgrade
}
/// Check if last response is keep-alive.
#[inline]
pub fn keep_alive(&self) -> bool {
self.conn_type == ConnectionType::KeepAlive
}
/// Check if keep-alive enabled on server level.
#[inline]
pub fn keep_alive_enabled(&self) -> bool {
self.flags.contains(Flags::KEEP_ALIVE_ENABLED)
}
/// Check last request's message type.
#[inline]
pub fn message_type(&self) -> MessageType {
if self.flags.contains(Flags::STREAM) {
MessageType::Stream
} else if self.payload.is_none() {
MessageType::None
} else {
MessageType::Payload
}
}
#[inline]
pub fn config(&self) -> &ServiceConfig {
&self.config
}
}
impl Decoder for Codec {
type Item = Message<Request>;
type Error = ParseError;
fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
if let Some(ref mut payload) = self.payload {
Ok(match payload.decode(src)? {
Some(PayloadItem::Chunk(chunk)) => Some(Message::Chunk(Some(chunk))),
Some(PayloadItem::Eof) => {
self.payload.take();
Some(Message::Chunk(None))
}
None => None,
})
} else if let Some((req, payload)) = self.decoder.decode(src)? {
let head = req.head();
self.flags.set(Flags::HEAD, head.method == Method::HEAD);
self.version = head.version;
self.conn_type = head.connection_type();
if self.conn_type == ConnectionType::KeepAlive
&& !self.flags.contains(Flags::KEEP_ALIVE_ENABLED)
{
self.conn_type = ConnectionType::Close
}
match payload {
PayloadType::None => self.payload = None,
PayloadType::Payload(pl) => self.payload = Some(pl),
PayloadType::Stream(pl) => {
self.payload = Some(pl);
self.flags.insert(Flags::STREAM);
}
}
Ok(Some(Message::Item(req)))
} else {
Ok(None)
}
}
}
impl Encoder<Message<(Response<()>, BodySize)>> for Codec {
type Error = io::Error;
fn encode(
&mut self,
item: Message<(Response<()>, BodySize)>,
dst: &mut BytesMut,
) -> Result<(), Self::Error> {
match item {
Message::Item((mut res, length)) => {
// set response version
res.head_mut().version = self.version;
// connection status
self.conn_type = if let Some(ct) = res.head().conn_type() {
if ct == ConnectionType::KeepAlive {
self.conn_type
} else {
ct
}
} else {
self.conn_type
};
// encode message
self.encoder.encode(
dst,
&mut res,
self.flags.contains(Flags::HEAD),
self.flags.contains(Flags::STREAM),
self.version,
length,
self.conn_type,
&self.config,
)?;
}
Message::Chunk(Some(bytes)) => {
self.encoder.encode_chunk(bytes.as_ref(), dst)?;
}
Message::Chunk(None) => {
self.encoder.encode_eof(dst)?;
}
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::HttpMessage as _;
#[actix_rt::test]
async fn test_http_request_chunked_payload_and_next_message() {
let mut codec = Codec::default();
let mut buf = BytesMut::from(
"GET /test HTTP/1.1\r\n\
transfer-encoding: chunked\r\n\r\n",
);
let item = codec.decode(&mut buf).unwrap().unwrap();
let req = item.message();
assert_eq!(req.method(), Method::GET);
assert!(req.chunked().unwrap());
buf.extend(
b"4\r\ndata\r\n4\r\nline\r\n0\r\n\r\n\
POST /test2 HTTP/1.1\r\n\
transfer-encoding: chunked\r\n\r\n"
.iter(),
);
let msg = codec.decode(&mut buf).unwrap().unwrap();
assert_eq!(msg.chunk().as_ref(), b"data");
let msg = codec.decode(&mut buf).unwrap().unwrap();
assert_eq!(msg.chunk().as_ref(), b"line");
let msg = codec.decode(&mut buf).unwrap().unwrap();
assert!(msg.eof());
// decode next message
let item = codec.decode(&mut buf).unwrap().unwrap();
let req = item.message();
assert_eq!(*req.method(), Method::POST);
assert!(req.chunked().unwrap());
}
}

1185
actix-http/src/h1/decoder.rs Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,972 @@
use std::{future::Future, str, task::Poll, time::Duration};
use actix_codec::Framed;
use actix_rt::{pin, time::sleep};
use actix_service::{fn_service, Service};
use actix_utils::future::{ready, Ready};
use bytes::{Buf, Bytes, BytesMut};
use futures_util::future::lazy;
use super::dispatcher::{Dispatcher, DispatcherState, DispatcherStateProj, Flags};
use crate::{
body::MessageBody,
config::ServiceConfig,
h1::{Codec, ExpectHandler, UpgradeHandler},
service::HttpFlow,
test::{TestBuffer, TestSeqBuffer},
Error, HttpMessage, KeepAlive, Method, OnConnectData, Request, Response, StatusCode,
};
fn find_slice(haystack: &[u8], needle: &[u8], from: usize) -> Option<usize> {
memchr::memmem::find(&haystack[from..], needle)
}
fn stabilize_date_header(payload: &mut [u8]) {
let mut from = 0;
while let Some(pos) = find_slice(payload, b"date", from) {
payload[(from + pos)..(from + pos + 35)]
.copy_from_slice(b"date: Thu, 01 Jan 1970 12:34:56 UTC");
from += 35;
}
}
fn ok_service() -> impl Service<Request, Response = Response<impl MessageBody>, Error = Error> {
status_service(StatusCode::OK)
}
fn status_service(
status: StatusCode,
) -> impl Service<Request, Response = Response<impl MessageBody>, Error = Error> {
fn_service(move |_req: Request| ready(Ok::<_, Error>(Response::new(status))))
}
fn echo_path_service() -> impl Service<Request, Response = Response<impl MessageBody>, Error = Error>
{
fn_service(|req: Request| {
let path = req.path().as_bytes();
ready(Ok::<_, Error>(
Response::ok().set_body(Bytes::copy_from_slice(path)),
))
})
}
fn drop_payload_service() -> impl Service<Request, Response = Response<&'static str>, Error = Error>
{
fn_service(|mut req: Request| async move {
let _ = req.take_payload();
Ok::<_, Error>(Response::with_body(StatusCode::OK, "payload dropped"))
})
}
fn echo_payload_service() -> impl Service<Request, Response = Response<Bytes>, Error = Error> {
fn_service(|mut req: Request| {
Box::pin(async move {
use futures_util::StreamExt as _;
let mut pl = req.take_payload();
let mut body = BytesMut::new();
while let Some(chunk) = pl.next().await {
body.extend_from_slice(chunk.unwrap().chunk())
}
Ok::<_, Error>(Response::ok().set_body(body.freeze()))
})
})
}
#[actix_rt::test]
async fn late_request() {
let mut buf = TestBuffer::empty();
let cfg = ServiceConfig::new(
KeepAlive::Disabled,
Duration::from_millis(100),
Duration::ZERO,
false,
None,
);
let services = HttpFlow::new(ok_service(), ExpectHandler, None);
let h1 = Dispatcher::<_, _, _, _, UpgradeHandler>::new(
buf.clone(),
services,
cfg,
None,
OnConnectData::default(),
);
pin!(h1);
lazy(|cx| {
assert!(matches!(&h1.inner, DispatcherState::Normal { .. }));
match h1.as_mut().poll(cx) {
Poll::Ready(_) => panic!("first poll should not be ready"),
Poll::Pending => {}
}
// polls: initial
assert_eq!(h1.poll_count, 1);
buf.extend_read_buf("GET /abcd HTTP/1.1\r\nConnection: close\r\n\r\n");
match h1.as_mut().poll(cx) {
Poll::Pending => panic!("second poll should not be pending"),
Poll::Ready(res) => assert!(res.is_ok()),
}
// polls: initial pending => handle req => shutdown
assert_eq!(h1.poll_count, 3);
let mut res = buf.take_write_buf().to_vec();
stabilize_date_header(&mut res);
let res = &res[..];
let exp = b"\
HTTP/1.1 200 OK\r\n\
content-length: 0\r\n\
connection: close\r\n\
date: Thu, 01 Jan 1970 12:34:56 UTC\r\n\r\n\
";
assert_eq!(
res,
exp,
"\nexpected response not in write buffer:\n\
response: {:?}\n\
expected: {:?}",
String::from_utf8_lossy(res),
String::from_utf8_lossy(exp)
);
})
.await;
}
#[actix_rt::test]
async fn oneshot_connection() {
let buf = TestBuffer::new("GET /abcd HTTP/1.1\r\n\r\n");
let cfg = ServiceConfig::new(
KeepAlive::Disabled,
Duration::from_millis(100),
Duration::ZERO,
false,
None,
);
let services = HttpFlow::new(echo_path_service(), ExpectHandler, None);
let h1 = Dispatcher::<_, _, _, _, UpgradeHandler>::new(
buf.clone(),
services,
cfg,
None,
OnConnectData::default(),
);
pin!(h1);
lazy(|cx| {
assert!(matches!(&h1.inner, DispatcherState::Normal { .. }));
match h1.as_mut().poll(cx) {
Poll::Pending => panic!("first poll should not be pending"),
Poll::Ready(res) => assert!(res.is_ok()),
}
// polls: initial => shutdown
assert_eq!(h1.poll_count, 2);
let mut res = buf.take_write_buf().to_vec();
stabilize_date_header(&mut res);
let res = &res[..];
let exp = http_msg(
r"
HTTP/1.1 200 OK
content-length: 5
connection: close
date: Thu, 01 Jan 1970 12:34:56 UTC
/abcd
",
);
assert_eq!(
res,
exp,
"\nexpected response not in write buffer:\n\
response: {:?}\n\
expected: {:?}",
String::from_utf8_lossy(res),
String::from_utf8_lossy(&exp)
);
})
.await;
}
#[actix_rt::test]
async fn keep_alive_timeout() {
let buf = TestBuffer::new("GET /abcd HTTP/1.1\r\n\r\n");
let cfg = ServiceConfig::new(
KeepAlive::Timeout(Duration::from_millis(200)),
Duration::from_millis(100),
Duration::ZERO,
false,
None,
);
let services = HttpFlow::new(echo_path_service(), ExpectHandler, None);
let h1 = Dispatcher::<_, _, _, _, UpgradeHandler>::new(
buf.clone(),
services,
cfg,
None,
OnConnectData::default(),
);
pin!(h1);
lazy(|cx| {
assert!(matches!(&h1.inner, DispatcherState::Normal { .. }));
assert!(
h1.as_mut().poll(cx).is_pending(),
"keep-alive should prevent poll from resolving"
);
// polls: initial
assert_eq!(h1.poll_count, 1);
let mut res = buf.take_write_buf().to_vec();
stabilize_date_header(&mut res);
let res = &res[..];
let exp = b"\
HTTP/1.1 200 OK\r\n\
content-length: 5\r\n\
date: Thu, 01 Jan 1970 12:34:56 UTC\r\n\r\n\
/abcd\
";
assert_eq!(
res,
exp,
"\nexpected response not in write buffer:\n\
response: {:?}\n\
expected: {:?}",
String::from_utf8_lossy(res),
String::from_utf8_lossy(exp)
);
})
.await;
// sleep slightly longer than keep-alive timeout
sleep(Duration::from_millis(250)).await;
lazy(|cx| {
assert!(
h1.as_mut().poll(cx).is_ready(),
"keep-alive should have resolved",
);
// polls: initial => keep-alive wake-up shutdown
assert_eq!(h1.poll_count, 2);
if let DispatcherStateProj::Normal { inner } = h1.project().inner.project() {
// connection closed
assert!(inner.flags.contains(Flags::SHUTDOWN));
assert!(inner.flags.contains(Flags::WRITE_DISCONNECT));
// and nothing added to write buffer
assert!(buf.write_buf_slice().is_empty());
}
})
.await;
}
#[actix_rt::test]
async fn keep_alive_follow_up_req() {
let mut buf = TestBuffer::new("GET /abcd HTTP/1.1\r\n\r\n");
let cfg = ServiceConfig::new(
KeepAlive::Timeout(Duration::from_millis(500)),
Duration::from_millis(100),
Duration::ZERO,
false,
None,
);
let services = HttpFlow::new(echo_path_service(), ExpectHandler, None);
let h1 = Dispatcher::<_, _, _, _, UpgradeHandler>::new(
buf.clone(),
services,
cfg,
None,
OnConnectData::default(),
);
pin!(h1);
lazy(|cx| {
assert!(matches!(&h1.inner, DispatcherState::Normal { .. }));
assert!(
h1.as_mut().poll(cx).is_pending(),
"keep-alive should prevent poll from resolving"
);
// polls: initial
assert_eq!(h1.poll_count, 1);
let mut res = buf.take_write_buf().to_vec();
stabilize_date_header(&mut res);
let res = &res[..];
let exp = b"\
HTTP/1.1 200 OK\r\n\
content-length: 5\r\n\
date: Thu, 01 Jan 1970 12:34:56 UTC\r\n\r\n\
/abcd\
";
assert_eq!(
res,
exp,
"\nexpected response not in write buffer:\n\
response: {:?}\n\
expected: {:?}",
String::from_utf8_lossy(res),
String::from_utf8_lossy(exp)
);
})
.await;
// sleep for less than KA timeout
sleep(Duration::from_millis(100)).await;
lazy(|cx| {
assert!(
h1.as_mut().poll(cx).is_pending(),
"keep-alive should not have resolved dispatcher yet",
);
// polls: initial => manual
assert_eq!(h1.poll_count, 2);
if let DispatcherStateProj::Normal { inner } = h1.as_mut().project().inner.project() {
// connection not closed
assert!(!inner.flags.contains(Flags::SHUTDOWN));
assert!(!inner.flags.contains(Flags::WRITE_DISCONNECT));
// and nothing added to write buffer
assert!(buf.write_buf_slice().is_empty());
}
})
.await;
lazy(|cx| {
buf.extend_read_buf(
"\
GET /efg HTTP/1.1\r\n\
Connection: close\r\n\
\r\n\r\n",
);
assert!(
h1.as_mut().poll(cx).is_ready(),
"connection close header should override keep-alive setting",
);
// polls: initial => manual => follow-up req => shutdown
assert_eq!(h1.poll_count, 4);
if let DispatcherStateProj::Normal { inner } = h1.as_mut().project().inner.project() {
// connection closed
assert!(inner.flags.contains(Flags::SHUTDOWN));
assert!(!inner.flags.contains(Flags::WRITE_DISCONNECT));
}
let mut res = buf.take_write_buf().to_vec();
stabilize_date_header(&mut res);
let res = &res[..];
let exp = b"\
HTTP/1.1 200 OK\r\n\
content-length: 4\r\n\
connection: close\r\n\
date: Thu, 01 Jan 1970 12:34:56 UTC\r\n\r\n\
/efg\
";
assert_eq!(
res,
exp,
"\nexpected response not in write buffer:\n\
response: {:?}\n\
expected: {:?}",
String::from_utf8_lossy(res),
String::from_utf8_lossy(exp)
);
})
.await;
}
#[actix_rt::test]
async fn req_parse_err() {
lazy(|cx| {
let buf = TestBuffer::new("GET /test HTTP/1\r\n\r\n");
let services = HttpFlow::new(ok_service(), ExpectHandler, None);
let h1 = Dispatcher::<_, _, _, _, UpgradeHandler>::new(
buf.clone(),
services,
ServiceConfig::default(),
None,
OnConnectData::default(),
);
pin!(h1);
match h1.as_mut().poll(cx) {
Poll::Pending => panic!(),
Poll::Ready(res) => assert!(res.is_err()),
}
if let DispatcherStateProj::Normal { inner } = h1.project().inner.project() {
assert!(inner.flags.contains(Flags::READ_DISCONNECT));
assert_eq!(
&buf.write_buf_slice()[..26],
b"HTTP/1.1 400 Bad Request\r\n"
);
}
})
.await;
}
#[actix_rt::test]
async fn pipelining_ok_then_ok() {
lazy(|cx| {
let buf = TestBuffer::new(
"\
GET /abcd HTTP/1.1\r\n\r\n\
GET /def HTTP/1.1\r\n\r\n\
",
);
let cfg = ServiceConfig::new(
KeepAlive::Disabled,
Duration::from_millis(1),
Duration::from_millis(1),
false,
None,
);
let services = HttpFlow::new(echo_path_service(), ExpectHandler, None);
let h1 = Dispatcher::<_, _, _, _, UpgradeHandler>::new(
buf.clone(),
services,
cfg,
None,
OnConnectData::default(),
);
pin!(h1);
assert!(matches!(&h1.inner, DispatcherState::Normal { .. }));
match h1.as_mut().poll(cx) {
Poll::Pending => panic!("first poll should not be pending"),
Poll::Ready(res) => assert!(res.is_ok()),
}
// polls: initial => shutdown
assert_eq!(h1.poll_count, 2);
let mut res = buf.write_buf_slice_mut();
stabilize_date_header(&mut res);
let res = &res[..];
let exp = b"\
HTTP/1.1 200 OK\r\n\
content-length: 5\r\n\
connection: close\r\n\
date: Thu, 01 Jan 1970 12:34:56 UTC\r\n\r\n\
/abcd\
HTTP/1.1 200 OK\r\n\
content-length: 4\r\n\
connection: close\r\n\
date: Thu, 01 Jan 1970 12:34:56 UTC\r\n\r\n\
/def\
";
assert_eq!(
res,
exp,
"\nexpected response not in write buffer:\n\
response: {:?}\n\
expected: {:?}",
String::from_utf8_lossy(res),
String::from_utf8_lossy(exp)
);
})
.await;
}
#[actix_rt::test]
async fn pipelining_ok_then_bad() {
lazy(|cx| {
let buf = TestBuffer::new(
"\
GET /abcd HTTP/1.1\r\n\r\n\
GET /def HTTP/1\r\n\r\n\
",
);
let cfg = ServiceConfig::new(
KeepAlive::Disabled,
Duration::from_millis(1),
Duration::from_millis(1),
false,
None,
);
let services = HttpFlow::new(echo_path_service(), ExpectHandler, None);
let h1 = Dispatcher::<_, _, _, _, UpgradeHandler>::new(
buf.clone(),
services,
cfg,
None,
OnConnectData::default(),
);
pin!(h1);
assert!(matches!(&h1.inner, DispatcherState::Normal { .. }));
match h1.as_mut().poll(cx) {
Poll::Pending => panic!("first poll should not be pending"),
Poll::Ready(res) => assert!(res.is_err()),
}
// polls: initial => shutdown
assert_eq!(h1.poll_count, 1);
let mut res = buf.write_buf_slice_mut();
stabilize_date_header(&mut res);
let res = &res[..];
let exp = b"\
HTTP/1.1 200 OK\r\n\
content-length: 5\r\n\
connection: close\r\n\
date: Thu, 01 Jan 1970 12:34:56 UTC\r\n\r\n\
/abcd\
HTTP/1.1 400 Bad Request\r\n\
content-length: 0\r\n\
connection: close\r\n\
date: Thu, 01 Jan 1970 12:34:56 UTC\r\n\r\n\
";
assert_eq!(
res,
exp,
"\nexpected response not in write buffer:\n\
response: {:?}\n\
expected: {:?}",
String::from_utf8_lossy(res),
String::from_utf8_lossy(exp)
);
})
.await;
}
#[actix_rt::test]
async fn expect_handling() {
lazy(|cx| {
let mut buf = TestSeqBuffer::empty();
let cfg = ServiceConfig::new(
KeepAlive::Disabled,
Duration::ZERO,
Duration::ZERO,
false,
None,
);
let services = HttpFlow::new(echo_payload_service(), ExpectHandler, None);
let h1 = Dispatcher::<_, _, _, _, UpgradeHandler>::new(
buf.clone(),
services,
cfg,
None,
OnConnectData::default(),
);
buf.extend_read_buf(
"\
POST /upload HTTP/1.1\r\n\
Content-Length: 5\r\n\
Expect: 100-continue\r\n\
\r\n\
",
);
pin!(h1);
assert!(h1.as_mut().poll(cx).is_pending());
assert!(matches!(&h1.inner, DispatcherState::Normal { .. }));
// polls: manual
assert_eq!(h1.poll_count, 1);
if let DispatcherState::Normal { ref inner } = h1.inner {
let io = inner.io.as_ref().unwrap();
let res = &io.write_buf()[..];
assert_eq!(
str::from_utf8(res).unwrap(),
"HTTP/1.1 100 Continue\r\n\r\n"
);
}
buf.extend_read_buf("12345");
assert!(h1.as_mut().poll(cx).is_ready());
// polls: manual manual shutdown
assert_eq!(h1.poll_count, 3);
if let DispatcherState::Normal { ref inner } = h1.inner {
let io = inner.io.as_ref().unwrap();
let mut res = io.write_buf()[..].to_owned();
stabilize_date_header(&mut res);
assert_eq!(
str::from_utf8(&res).unwrap(),
"\
HTTP/1.1 100 Continue\r\n\
\r\n\
HTTP/1.1 200 OK\r\n\
content-length: 5\r\n\
connection: close\r\n\
date: Thu, 01 Jan 1970 12:34:56 UTC\r\n\
\r\n\
12345\
"
);
}
})
.await;
}
#[actix_rt::test]
async fn expect_eager() {
lazy(|cx| {
let mut buf = TestSeqBuffer::empty();
let cfg = ServiceConfig::new(
KeepAlive::Disabled,
Duration::ZERO,
Duration::ZERO,
false,
None,
);
let services = HttpFlow::new(echo_path_service(), ExpectHandler, None);
let h1 = Dispatcher::<_, _, _, _, UpgradeHandler>::new(
buf.clone(),
services,
cfg,
None,
OnConnectData::default(),
);
buf.extend_read_buf(
"\
POST /upload HTTP/1.1\r\n\
Content-Length: 5\r\n\
Expect: 100-continue\r\n\
\r\n\
",
);
pin!(h1);
assert!(h1.as_mut().poll(cx).is_ready());
assert!(matches!(&h1.inner, DispatcherState::Normal { .. }));
// polls: manual shutdown
assert_eq!(h1.poll_count, 2);
if let DispatcherState::Normal { ref inner } = h1.inner {
let io = inner.io.as_ref().unwrap();
let mut res = io.write_buf()[..].to_owned();
stabilize_date_header(&mut res);
// Despite the content-length header and even though the request payload has not
// been sent, this test expects a complete service response since the payload
// is not used at all. The service passed to dispatcher is path echo and doesn't
// consume payload bytes.
assert_eq!(
str::from_utf8(&res).unwrap(),
"\
HTTP/1.1 100 Continue\r\n\
\r\n\
HTTP/1.1 200 OK\r\n\
content-length: 7\r\n\
connection: close\r\n\
date: Thu, 01 Jan 1970 12:34:56 UTC\r\n\
\r\n\
/upload\
"
);
}
})
.await;
}
#[actix_rt::test]
async fn upgrade_handling() {
struct TestUpgrade;
impl<T> Service<(Request, Framed<T, Codec>)> for TestUpgrade {
type Response = ();
type Error = Error;
type Future = Ready<Result<Self::Response, Self::Error>>;
actix_service::always_ready!();
fn call(&self, (req, _framed): (Request, Framed<T, Codec>)) -> Self::Future {
assert_eq!(req.method(), Method::GET);
assert!(req.upgrade());
assert_eq!(req.headers().get("upgrade").unwrap(), "websocket");
ready(Ok(()))
}
}
lazy(|cx| {
let mut buf = TestSeqBuffer::empty();
let cfg = ServiceConfig::new(
KeepAlive::Disabled,
Duration::ZERO,
Duration::ZERO,
false,
None,
);
let services = HttpFlow::new(ok_service(), ExpectHandler, Some(TestUpgrade));
let h1 = Dispatcher::<_, _, _, _, TestUpgrade>::new(
buf.clone(),
services,
cfg,
None,
OnConnectData::default(),
);
buf.extend_read_buf(
"\
GET /ws HTTP/1.1\r\n\
Connection: Upgrade\r\n\
Upgrade: websocket\r\n\
\r\n\
",
);
pin!(h1);
assert!(h1.as_mut().poll(cx).is_ready());
assert!(matches!(&h1.inner, DispatcherState::Upgrade { .. }));
// polls: manual shutdown
assert_eq!(h1.poll_count, 2);
})
.await;
}
// fix in #2624 reverted temporarily
// complete fix tracked in #2745
#[ignore]
#[actix_rt::test]
async fn handler_drop_payload() {
let _ = env_logger::try_init();
let mut buf = TestBuffer::new(http_msg(
r"
POST /drop-payload HTTP/1.1
Content-Length: 3
abc
",
));
let services = HttpFlow::new(
drop_payload_service(),
ExpectHandler,
None::<UpgradeHandler>,
);
let h1 = Dispatcher::new(
buf.clone(),
services,
ServiceConfig::default(),
None,
OnConnectData::default(),
);
pin!(h1);
lazy(|cx| {
assert!(h1.as_mut().poll(cx).is_pending());
// polls: manual
assert_eq!(h1.poll_count, 1);
let mut res = BytesMut::from(buf.take_write_buf().as_ref());
stabilize_date_header(&mut res);
let res = &res[..];
let exp = http_msg(
r"
HTTP/1.1 200 OK
content-length: 15
date: Thu, 01 Jan 1970 12:34:56 UTC
payload dropped
",
);
assert_eq!(
res,
exp,
"\nexpected response not in write buffer:\n\
response: {:?}\n\
expected: {:?}",
String::from_utf8_lossy(res),
String::from_utf8_lossy(&exp)
);
if let DispatcherStateProj::Normal { inner } = h1.as_mut().project().inner.project() {
assert!(inner.state.is_none());
}
})
.await;
lazy(|cx| {
// add message that claims to have payload longer than provided
buf.extend_read_buf(http_msg(
r"
POST /drop-payload HTTP/1.1
Content-Length: 200
abc
",
));
assert!(h1.as_mut().poll(cx).is_pending());
// polls: manual => manual
assert_eq!(h1.poll_count, 2);
let mut res = BytesMut::from(buf.take_write_buf().as_ref());
stabilize_date_header(&mut res);
let res = &res[..];
// expect response immediately even though request side has not finished reading payload
let exp = http_msg(
r"
HTTP/1.1 200 OK
content-length: 15
date: Thu, 01 Jan 1970 12:34:56 UTC
payload dropped
",
);
assert_eq!(
res,
exp,
"\nexpected response not in write buffer:\n\
response: {:?}\n\
expected: {:?}",
String::from_utf8_lossy(res),
String::from_utf8_lossy(&exp)
);
})
.await;
lazy(|cx| {
assert!(h1.as_mut().poll(cx).is_ready());
// polls: manual => manual => manual
assert_eq!(h1.poll_count, 3);
let mut res = BytesMut::from(buf.take_write_buf().as_ref());
stabilize_date_header(&mut res);
let res = &res[..];
// expect that unrequested error response is sent back since connection could not be cleaned
let exp = http_msg(
r"
HTTP/1.1 500 Internal Server Error
content-length: 0
connection: close
date: Thu, 01 Jan 1970 12:34:56 UTC
",
);
assert_eq!(
res,
exp,
"\nexpected response not in write buffer:\n\
response: {:?}\n\
expected: {:?}",
String::from_utf8_lossy(res),
String::from_utf8_lossy(&exp)
);
})
.await;
}
fn http_msg(msg: impl AsRef<str>) -> BytesMut {
let mut msg = msg
.as_ref()
.trim()
.split('\n')
.map(|line| [line.trim_start(), "\r"].concat())
.collect::<Vec<_>>()
.join("\n");
// remove trailing \r
msg.pop();
if !msg.is_empty() && !msg.contains("\r\n\r\n") {
msg.push_str("\r\n\r\n");
}
BytesMut::from(msg.as_bytes())
}
#[test]
fn http_msg_creates_msg() {
assert_eq!(http_msg(r""), "");
assert_eq!(
http_msg(
r"
POST / HTTP/1.1
Content-Length: 3
abc
"
),
"POST / HTTP/1.1\r\nContent-Length: 3\r\n\r\nabc"
);
assert_eq!(
http_msg(
r"
GET / HTTP/1.1
Content-Length: 3
"
),
"GET / HTTP/1.1\r\nContent-Length: 3\r\n\r\n"
);
}

View file

@ -0,0 +1,671 @@
use std::{
cmp,
io::{self, Write as _},
marker::PhantomData,
ptr::copy_nonoverlapping,
slice::from_raw_parts_mut,
};
use bytes::{BufMut, BytesMut};
use crate::{
body::BodySize,
header::{
map::Value, HeaderMap, HeaderName, CONNECTION, CONTENT_LENGTH, DATE, TRANSFER_ENCODING,
},
helpers, ConnectionType, RequestHeadType, Response, ServiceConfig, StatusCode, Version,
};
const AVERAGE_HEADER_SIZE: usize = 30;
#[derive(Debug)]
pub(crate) struct MessageEncoder<T: MessageType> {
#[allow(dead_code)]
pub length: BodySize,
pub te: TransferEncoding,
_phantom: PhantomData<T>,
}
impl<T: MessageType> Default for MessageEncoder<T> {
fn default() -> Self {
MessageEncoder {
length: BodySize::None,
te: TransferEncoding::empty(),
_phantom: PhantomData,
}
}
}
pub(crate) trait MessageType: Sized {
fn status(&self) -> Option<StatusCode>;
fn headers(&self) -> &HeaderMap;
fn extra_headers(&self) -> Option<&HeaderMap>;
fn camel_case(&self) -> bool {
false
}
fn chunked(&self) -> bool;
fn encode_status(&mut self, dst: &mut BytesMut) -> io::Result<()>;
fn encode_headers(
&mut self,
dst: &mut BytesMut,
version: Version,
mut length: BodySize,
conn_type: ConnectionType,
config: &ServiceConfig,
) -> io::Result<()> {
let chunked = self.chunked();
let mut skip_len = length != BodySize::Stream;
let camel_case = self.camel_case();
// Content length
if let Some(status) = self.status() {
match status {
StatusCode::CONTINUE
| StatusCode::SWITCHING_PROTOCOLS
| StatusCode::PROCESSING
| StatusCode::NO_CONTENT => {
// skip content-length and transfer-encoding headers
// see https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.1
// and https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.2
skip_len = true;
length = BodySize::None
}
StatusCode::NOT_MODIFIED => {
// 304 responses should never have a body but should retain a manually set
// content-length header
// see https://datatracker.ietf.org/doc/html/rfc7232#section-4.1
skip_len = false;
length = BodySize::None;
}
_ => {}
}
}
match length {
BodySize::Stream => {
if chunked {
skip_len = true;
if camel_case {
dst.put_slice(b"\r\nTransfer-Encoding: chunked\r\n")
} else {
dst.put_slice(b"\r\ntransfer-encoding: chunked\r\n")
}
} else {
skip_len = false;
dst.put_slice(b"\r\n");
}
}
BodySize::Sized(0) if camel_case => dst.put_slice(b"\r\nContent-Length: 0\r\n"),
BodySize::Sized(0) => dst.put_slice(b"\r\ncontent-length: 0\r\n"),
BodySize::Sized(len) => helpers::write_content_length(len, dst, camel_case),
BodySize::None => dst.put_slice(b"\r\n"),
}
// Connection
match conn_type {
ConnectionType::Upgrade => dst.put_slice(b"connection: upgrade\r\n"),
ConnectionType::KeepAlive if version < Version::HTTP_11 => {
if camel_case {
dst.put_slice(b"Connection: keep-alive\r\n")
} else {
dst.put_slice(b"connection: keep-alive\r\n")
}
}
ConnectionType::Close if version >= Version::HTTP_11 => {
if camel_case {
dst.put_slice(b"Connection: close\r\n")
} else {
dst.put_slice(b"connection: close\r\n")
}
}
_ => {}
}
// write headers
let mut has_date = false;
let mut buf = dst.chunk_mut().as_mut_ptr();
let mut remaining = dst.capacity() - dst.len();
// tracks bytes written since last buffer resize
// since buf is a raw pointer to a bytes container storage but is written to without the
// container's knowledge, this is used to sync the containers cursor after data is written
let mut pos = 0;
self.write_headers(|key, value| {
match *key {
CONNECTION => return,
TRANSFER_ENCODING | CONTENT_LENGTH if skip_len => return,
DATE => has_date = true,
_ => {}
}
let k = key.as_str().as_bytes();
let k_len = k.len();
for val in value.iter() {
let v = val.as_ref();
let v_len = v.len();
// key length + value length + colon + space + \r\n
let len = k_len + v_len + 4;
if len > remaining {
// SAFETY: all the bytes written up to position "pos" are initialized
// the written byte count and pointer advancement are kept in sync
unsafe {
dst.advance_mut(pos);
}
pos = 0;
dst.reserve(len * 2);
remaining = dst.capacity() - dst.len();
// re-assign buf raw pointer since it's possible that the buffer was
// reallocated and/or resized
buf = dst.chunk_mut().as_mut_ptr();
}
// SAFETY: on each write, it is enough to ensure that the advancement of
// the cursor matches the number of bytes written
unsafe {
if camel_case {
// use Camel-Case headers
write_camel_case(k, buf, k_len);
} else {
write_data(k, buf, k_len);
}
buf = buf.add(k_len);
write_data(b": ", buf, 2);
buf = buf.add(2);
write_data(v, buf, v_len);
buf = buf.add(v_len);
write_data(b"\r\n", buf, 2);
buf = buf.add(2);
};
pos += len;
remaining -= len;
}
});
// final cursor synchronization with the bytes container
//
// SAFETY: all the bytes written up to position "pos" are initialized
// the written byte count and pointer advancement are kept in sync
unsafe {
dst.advance_mut(pos);
}
if !has_date {
// optimized date header, write_date_header writes its own \r\n
config.write_date_header(dst, camel_case);
}
// end-of-headers marker
dst.extend_from_slice(b"\r\n");
Ok(())
}
fn write_headers<F>(&mut self, mut f: F)
where
F: FnMut(&HeaderName, &Value),
{
match self.extra_headers() {
Some(headers) => {
// merging headers from head and extra headers.
self.headers()
.inner
.iter()
.filter(|(name, _)| !headers.contains_key(*name))
.chain(headers.inner.iter())
.for_each(|(k, v)| f(k, v))
}
None => self.headers().inner.iter().for_each(|(k, v)| f(k, v)),
}
}
}
impl MessageType for Response<()> {
fn status(&self) -> Option<StatusCode> {
Some(self.head().status)
}
fn chunked(&self) -> bool {
self.head().chunked()
}
fn headers(&self) -> &HeaderMap {
&self.head().headers
}
fn extra_headers(&self) -> Option<&HeaderMap> {
None
}
fn camel_case(&self) -> bool {
self.head()
.flags
.contains(crate::message::Flags::CAMEL_CASE)
}
fn encode_status(&mut self, dst: &mut BytesMut) -> io::Result<()> {
let head = self.head();
let reason = head.reason().as_bytes();
dst.reserve(256 + head.headers.len() * AVERAGE_HEADER_SIZE + reason.len());
// status line
helpers::write_status_line(head.version, head.status.as_u16(), dst);
dst.put_slice(reason);
Ok(())
}
}
impl MessageType for RequestHeadType {
fn status(&self) -> Option<StatusCode> {
None
}
fn chunked(&self) -> bool {
self.as_ref().chunked()
}
fn camel_case(&self) -> bool {
self.as_ref().camel_case_headers()
}
fn headers(&self) -> &HeaderMap {
self.as_ref().headers()
}
fn extra_headers(&self) -> Option<&HeaderMap> {
self.extra_headers()
}
fn encode_status(&mut self, dst: &mut BytesMut) -> io::Result<()> {
let head = self.as_ref();
dst.reserve(256 + head.headers.len() * AVERAGE_HEADER_SIZE);
write!(
helpers::MutWriter(dst),
"{} {} {}",
head.method,
head.uri.path_and_query().map(|u| u.as_str()).unwrap_or("/"),
match head.version {
Version::HTTP_09 => "HTTP/0.9",
Version::HTTP_10 => "HTTP/1.0",
Version::HTTP_11 => "HTTP/1.1",
Version::HTTP_2 => "HTTP/2.0",
Version::HTTP_3 => "HTTP/3.0",
_ => return Err(io::Error::new(io::ErrorKind::Other, "unsupported version")),
}
)
.map_err(|e| io::Error::new(io::ErrorKind::Other, e))
}
}
impl<T: MessageType> MessageEncoder<T> {
/// Encode chunk.
pub fn encode_chunk(&mut self, msg: &[u8], buf: &mut BytesMut) -> io::Result<bool> {
self.te.encode(msg, buf)
}
/// Encode EOF.
pub fn encode_eof(&mut self, buf: &mut BytesMut) -> io::Result<()> {
self.te.encode_eof(buf)
}
/// Encode message.
pub fn encode(
&mut self,
dst: &mut BytesMut,
message: &mut T,
head: bool,
stream: bool,
version: Version,
length: BodySize,
conn_type: ConnectionType,
config: &ServiceConfig,
) -> io::Result<()> {
// transfer encoding
if !head {
self.te = match length {
BodySize::Sized(0) => TransferEncoding::empty(),
BodySize::Sized(len) => TransferEncoding::length(len),
BodySize::Stream => {
if message.chunked() && !stream {
TransferEncoding::chunked()
} else {
TransferEncoding::eof()
}
}
BodySize::None => TransferEncoding::empty(),
};
} else {
self.te = TransferEncoding::empty();
}
message.encode_status(dst)?;
message.encode_headers(dst, version, length, conn_type, config)
}
}
/// Encoders to handle different Transfer-Encodings.
#[derive(Debug)]
pub(crate) struct TransferEncoding {
kind: TransferEncodingKind,
}
#[derive(Debug, PartialEq, Clone)]
enum TransferEncodingKind {
/// An Encoder for when Transfer-Encoding includes `chunked`.
Chunked(bool),
/// An Encoder for when Content-Length is set.
///
/// Enforces that the body is not longer than the Content-Length header.
Length(u64),
/// An Encoder for when Content-Length is not known.
///
/// Application decides when to stop writing.
Eof,
}
impl TransferEncoding {
#[inline]
pub fn empty() -> TransferEncoding {
TransferEncoding {
kind: TransferEncodingKind::Length(0),
}
}
#[inline]
pub fn eof() -> TransferEncoding {
TransferEncoding {
kind: TransferEncodingKind::Eof,
}
}
#[inline]
pub fn chunked() -> TransferEncoding {
TransferEncoding {
kind: TransferEncodingKind::Chunked(false),
}
}
#[inline]
pub fn length(len: u64) -> TransferEncoding {
TransferEncoding {
kind: TransferEncodingKind::Length(len),
}
}
/// Encode message. Return `EOF` state of encoder
#[inline]
pub fn encode(&mut self, msg: &[u8], buf: &mut BytesMut) -> io::Result<bool> {
match self.kind {
TransferEncodingKind::Eof => {
let eof = msg.is_empty();
buf.extend_from_slice(msg);
Ok(eof)
}
TransferEncodingKind::Chunked(ref mut eof) => {
if *eof {
return Ok(true);
}
if msg.is_empty() {
*eof = true;
buf.extend_from_slice(b"0\r\n\r\n");
} else {
writeln!(helpers::MutWriter(buf), "{:X}\r", msg.len())
.map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
buf.reserve(msg.len() + 2);
buf.extend_from_slice(msg);
buf.extend_from_slice(b"\r\n");
}
Ok(*eof)
}
TransferEncodingKind::Length(ref mut remaining) => {
if *remaining > 0 {
if msg.is_empty() {
return Ok(*remaining == 0);
}
let len = cmp::min(*remaining, msg.len() as u64);
buf.extend_from_slice(&msg[..len as usize]);
*remaining -= len;
Ok(*remaining == 0)
} else {
Ok(true)
}
}
}
}
/// Encode eof. Return `EOF` state of encoder
#[inline]
pub fn encode_eof(&mut self, buf: &mut BytesMut) -> io::Result<()> {
match self.kind {
TransferEncodingKind::Eof => Ok(()),
TransferEncodingKind::Length(rem) => {
if rem != 0 {
Err(io::Error::new(io::ErrorKind::UnexpectedEof, ""))
} else {
Ok(())
}
}
TransferEncodingKind::Chunked(ref mut eof) => {
if !*eof {
*eof = true;
buf.extend_from_slice(b"0\r\n\r\n");
}
Ok(())
}
}
}
}
/// # Safety
/// Callers must ensure that the given `len` matches the given `value` length and that `buf` is
/// valid for writes of at least `len` bytes.
unsafe fn write_data(value: &[u8], buf: *mut u8, len: usize) {
debug_assert_eq!(value.len(), len);
copy_nonoverlapping(value.as_ptr(), buf, len);
}
/// # Safety
/// Callers must ensure that the given `len` matches the given `value` length and that `buf` is
/// valid for writes of at least `len` bytes.
unsafe fn write_camel_case(value: &[u8], buf: *mut u8, len: usize) {
// first copy entire (potentially wrong) slice to output
write_data(value, buf, len);
// SAFETY: We just initialized the buffer with `value`
let buffer = from_raw_parts_mut(buf, len);
let mut iter = value.iter();
// first character should be uppercase
if let Some(c @ b'a'..=b'z') = iter.next() {
buffer[0] = c & 0b1101_1111;
}
// track 1 ahead of the current position since that's the location being assigned to
let mut index = 2;
// remaining characters after hyphens should also be uppercase
while let Some(&c) = iter.next() {
if c == b'-' {
// advance iter by one and uppercase if needed
if let Some(c @ b'a'..=b'z') = iter.next() {
buffer[index] = c & 0b1101_1111;
}
index += 1;
}
index += 1;
}
}
#[cfg(test)]
mod tests {
use std::rc::Rc;
use bytes::Bytes;
use http::header::{AUTHORIZATION, UPGRADE_INSECURE_REQUESTS};
use super::*;
use crate::{
header::{HeaderValue, CONTENT_TYPE},
RequestHead,
};
#[test]
fn test_chunked_te() {
let mut bytes = BytesMut::new();
let mut enc = TransferEncoding::chunked();
{
assert!(!enc.encode(b"test", &mut bytes).ok().unwrap());
assert!(enc.encode(b"", &mut bytes).ok().unwrap());
}
assert_eq!(
bytes.split().freeze(),
Bytes::from_static(b"4\r\ntest\r\n0\r\n\r\n")
);
}
#[actix_rt::test]
async fn test_camel_case() {
let mut bytes = BytesMut::with_capacity(2048);
let mut head = RequestHead::default();
head.set_camel_case_headers(true);
head.headers.insert(DATE, HeaderValue::from_static("date"));
head.headers
.insert(CONTENT_TYPE, HeaderValue::from_static("plain/text"));
head.headers
.insert(UPGRADE_INSECURE_REQUESTS, HeaderValue::from_static("1"));
let mut head = RequestHeadType::Owned(head);
let _ = head.encode_headers(
&mut bytes,
Version::HTTP_11,
BodySize::Sized(0),
ConnectionType::Close,
&ServiceConfig::default(),
);
let data = String::from_utf8(Vec::from(bytes.split().freeze().as_ref())).unwrap();
assert!(data.contains("Content-Length: 0\r\n"));
assert!(data.contains("Connection: close\r\n"));
assert!(data.contains("Content-Type: plain/text\r\n"));
assert!(data.contains("Date: date\r\n"));
assert!(data.contains("Upgrade-Insecure-Requests: 1\r\n"));
let _ = head.encode_headers(
&mut bytes,
Version::HTTP_11,
BodySize::Stream,
ConnectionType::KeepAlive,
&ServiceConfig::default(),
);
let data = String::from_utf8(Vec::from(bytes.split().freeze().as_ref())).unwrap();
assert!(data.contains("Transfer-Encoding: chunked\r\n"));
assert!(data.contains("Content-Type: plain/text\r\n"));
assert!(data.contains("Date: date\r\n"));
let mut head = RequestHead::default();
head.set_camel_case_headers(false);
head.headers.insert(DATE, HeaderValue::from_static("date"));
head.headers
.insert(CONTENT_TYPE, HeaderValue::from_static("plain/text"));
head.headers
.append(CONTENT_TYPE, HeaderValue::from_static("xml"));
let mut head = RequestHeadType::Owned(head);
let _ = head.encode_headers(
&mut bytes,
Version::HTTP_11,
BodySize::Stream,
ConnectionType::KeepAlive,
&ServiceConfig::default(),
);
let data = String::from_utf8(Vec::from(bytes.split().freeze().as_ref())).unwrap();
assert!(data.contains("transfer-encoding: chunked\r\n"));
assert!(data.contains("content-type: xml\r\n"));
assert!(data.contains("content-type: plain/text\r\n"));
assert!(data.contains("date: date\r\n"));
}
#[actix_rt::test]
async fn test_extra_headers() {
let mut bytes = BytesMut::with_capacity(2048);
let mut head = RequestHead::default();
head.headers.insert(
AUTHORIZATION,
HeaderValue::from_static("some authorization"),
);
let mut extra_headers = HeaderMap::new();
extra_headers.insert(
AUTHORIZATION,
HeaderValue::from_static("another authorization"),
);
extra_headers.insert(DATE, HeaderValue::from_static("date"));
let mut head = RequestHeadType::Rc(Rc::new(head), Some(extra_headers));
let _ = head.encode_headers(
&mut bytes,
Version::HTTP_11,
BodySize::Sized(0),
ConnectionType::Close,
&ServiceConfig::default(),
);
let data = String::from_utf8(Vec::from(bytes.split().freeze().as_ref())).unwrap();
assert!(data.contains("content-length: 0\r\n"));
assert!(data.contains("connection: close\r\n"));
assert!(data.contains("authorization: another authorization\r\n"));
assert!(data.contains("date: date\r\n"));
}
#[actix_rt::test]
async fn test_no_content_length() {
let mut bytes = BytesMut::with_capacity(2048);
let mut res = Response::with_body(StatusCode::SWITCHING_PROTOCOLS, ());
res.headers_mut().insert(DATE, HeaderValue::from_static(""));
res.headers_mut()
.insert(CONTENT_LENGTH, HeaderValue::from_static("0"));
let _ = res.encode_headers(
&mut bytes,
Version::HTTP_11,
BodySize::Stream,
ConnectionType::Upgrade,
&ServiceConfig::default(),
);
let data = String::from_utf8(Vec::from(bytes.split().freeze().as_ref())).unwrap();
assert!(!data.contains("content-length: 0\r\n"));
assert!(!data.contains("transfer-encoding: chunked\r\n"));
}
}

View file

@ -0,0 +1,33 @@
use actix_service::{Service, ServiceFactory};
use actix_utils::future::{ready, Ready};
use crate::{Error, Request};
pub struct ExpectHandler;
impl ServiceFactory<Request> for ExpectHandler {
type Response = Request;
type Error = Error;
type Config = ();
type Service = ExpectHandler;
type InitError = Error;
type Future = Ready<Result<Self::Service, Self::InitError>>;
fn new_service(&self, _: Self::Config) -> Self::Future {
ready(Ok(ExpectHandler))
}
}
impl Service<Request> for ExpectHandler {
type Response = Request;
type Error = Error;
type Future = Ready<Result<Self::Response, Self::Error>>;
actix_service::always_ready!();
fn call(&self, req: Request) -> Self::Future {
ready(Ok(req))
// TODO: add some way to trigger error
// Err(error::ErrorExpectationFailed("test"))
}
}

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