actix-web/actix-http
Huston Bokinsky 9d7b6f401d Hide continuation frames from application layer.
This commit asserts that continuation frames are an implementation
detail of the websocket layer, and should remain hidden from the
application layer.  That is:
  - a codec should write only frames to the wire, and read only frames from the wire
  - when sending messages, the websocket implementation should break large
    text and binary messages into continuation frames -- the application should
    not have to be aware of this.
  - when receiving messages, the websocket implementation should reconstitute
    continuation frames into their original messages -- the application should
    not have to handle this.
  - the application should only have to send and receive complete websocket messages

Here, the reconstitution of continuation frames into their original messages is
done by the Stream implementation of actix_web_actors::ws::WsStream, by adding
a continuation frame buffer and not issuing a Poll::Ready(Some(Ok)) result until
a complete message has been buffered.  A test in actix_web_actors::tests::test_ws.rs
checks this.

The breaking of large message payloads into sequential continuation frames is
done by the addition of an actix_http::ws::frame_iters module, which introduces
two structs ContinuationBins and ContinuationTexts.  These are iterators over
either single Frame::Binary or Frame::Text frames, if the payloads are small,
or over sequences of Frame::Continuation's with appropriate Items FirstBinary/FirstText,
Continue, and Last.  New tests in actix_http::ws::frame_iters verify this
functionality.
2020-04-19 22:32:28 -07:00
..
benches increase content-length fast path to responses up to 1MB 2020-02-24 20:58:41 +00:00
examples Run rustfmt 2020-02-27 11:10:55 +09:00
src Hide continuation frames from application layer. 2020-04-19 22:32:28 -07:00
tests Hide continuation frames from application layer. 2020-04-19 22:32:28 -07:00
.appveyor.yml Merge actix-http project 2019-03-26 11:54:35 -07:00
CHANGES.md actix-http: Remove `failure` support (#1449) 2020-04-16 06:54:34 +09:00
CODE_OF_CONDUCT.md Merge actix-http project 2019-03-26 11:54:35 -07:00
Cargo.toml actix-http: Remove `failure` support (#1449) 2020-04-16 06:54:34 +09: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 example 2020-03-08 00:43:01 +09:00
rustfmt.toml Merge actix-http project 2019-03-26 11:54:35 -07:00

README.md

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.
use std::{env, io};

use actix_http::{HttpService, Response};
use actix_server::Server;
use futures::future;
use http::header::HeaderValue;
use log::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
}

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.