1
0
mirror of https://github.com/fafhrd91/actix-web synced 2024-11-24 00:21:08 +01:00
actix-web/actix-http
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
..
benches increase content-length fast path to responses up to 1MB 2020-02-24 20:58:41 +00:00
examples Fix actix-http examples (#1259) 2020-01-07 00:15:04 +09:00
src Remove uses of Pin::new_unchecked in h1 Dispatcher (#1374) 2020-02-26 08:21:05 +09:00
tests Fix poll_ready call for WebSockets upgrade (#1219) 2019-12-17 13:34:25 +06:00
.appveyor.yml Merge actix-http project 2019-03-26 11:54:35 -07:00
Cargo.toml Merge branch 'master' into replace-unsafe-content-length-helper 2020-02-25 14:30:04 +09:00
CHANGES.md actix-http: update time to 0.2.7 2020-02-23 07:09:00 +09:00
CODE_OF_CONDUCT.md Merge actix-http project 2019-03-26 11:54:35 -07:00
LICENSE-APACHE Merge actix-http project 2019-03-26 11:54:35 -07:00
LICENSE-MIT Merge actix-http project 2019-03-26 11:54:35 -07:00
README.md update readme 2019-04-08 17:53:19 -07:00
rustfmt.toml Merge actix-http project 2019-03-26 11:54:35 -07:00

Actix http Build Status codecov crates.io Join the chat at https://gitter.im/actix/actix

Actix http

Documentation & community resources

Example

// see examples/framed_hello.rs for complete list of used crates.
extern crate actix_http;
use actix_http::{h1, Response, ServiceConfig};

fn main() {
    Server::new().bind("framed_hello", "127.0.0.1:8080", || {
        IntoFramed::new(|| h1::Codec::new(ServiceConfig::default()))	// <- create h1 codec
            .and_then(TakeItem::new().map_err(|_| ()))	                // <- read one request
            .and_then(|(_req, _framed): (_, Framed<_, _>)| {	        // <- send response and close conn
                SendResponse::send(_framed, Response::Ok().body("Hello world!"))
                    .map_err(|_| ())
                    .map(|_| ())
            })
    }).unwrap().run();
}

License

This project is licensed under either of

at your option.

Code of Conduct

Contribution to the actix-http crate is organized under the terms of the Contributor Covenant, the maintainer of actix-http, @fafhrd91, promises to intervene to uphold that code of conduct.