1
0
mirror of https://github.com/fafhrd91/actix-web synced 2024-12-18 01:43:58 +01:00

stop claiming actor support

This commit is contained in:
Rob Ede 2021-02-11 21:44:22 +00:00
parent ceace26ed4
commit 871ca5e4ae
No known key found for this signature in database
GPG Key ID: C2A3B36E841A91E6
4 changed files with 10 additions and 81 deletions

View File

@ -32,7 +32,6 @@
* SSL support using OpenSSL or Rustls * SSL support using OpenSSL or Rustls
* Middlewares ([Logger, Session, CORS, etc](https://actix.rs/docs/middleware/)) * Middlewares ([Logger, Session, CORS, etc](https://actix.rs/docs/middleware/))
* Includes an async [HTTP client](https://actix.rs/actix-web/actix_web/client/index.html) * Includes an async [HTTP client](https://actix.rs/actix-web/actix_web/client/index.html)
* Supports [Actix actor framework](https://github.com/actix/actix)
* Runs on stable Rust 1.46+ * Runs on stable Rust 1.46+
## Documentation ## Documentation

View File

@ -356,6 +356,7 @@ where
this.state.set(State::ServiceCall(task)); this.state.set(State::ServiceCall(task));
}; };
} }
// handle error message. // handle error message.
Some(DispatcherMessage::Error(res)) => { Some(DispatcherMessage::Error(res)) => {
// send_response would update InnerDispatcher state to SendPayload or // send_response would update InnerDispatcher state to SendPayload or
@ -364,10 +365,12 @@ where
self.as_mut() self.as_mut()
.send_response(res, ResponseBody::Other(Body::Empty))?; .send_response(res, ResponseBody::Other(Body::Empty))?;
} }
// return with upgrade request and poll it exclusively. // return with upgrade request and poll it exclusively.
Some(DispatcherMessage::Upgrade(req)) => { Some(DispatcherMessage::Upgrade(req)) => {
return Ok(PollResponse::Upgrade(req)); return Ok(PollResponse::Upgrade(req));
} }
// all messages are dealt with. // all messages are dealt with.
None => return Ok(PollResponse::DoNothing), None => return Ok(PollResponse::DoNothing),
}, },
@ -377,12 +380,14 @@ where
let (res, body) = res.into().replace_body(()); let (res, body) = res.into().replace_body(());
self.as_mut().send_response(res, body)?; self.as_mut().send_response(res, body)?;
} }
// send service call error as response // send service call error as response
Poll::Ready(Err(e)) => { Poll::Ready(Err(e)) => {
let res: Response = e.into().into(); let res: Response = e.into().into();
let (res, body) = res.replace_body(()); let (res, body) = res.replace_body(());
self.as_mut().send_response(res, body.into_body())?; self.as_mut().send_response(res, body.into_body())?;
} }
// service call pending and could be waiting for more chunk messages. // service call pending and could be waiting for more chunk messages.
// (pipeline message limit and/or payload can_read limit) // (pipeline message limit and/or payload can_read limit)
Poll::Pending => { Poll::Pending => {
@ -394,6 +399,7 @@ where
// otherwise keep loop. // otherwise keep loop.
} }
}, },
StateProj::SendPayload(mut stream) => { StateProj::SendPayload(mut stream) => {
// keep populate writer buffer until buffer size limit hit, // keep populate writer buffer until buffer size limit hit,
// get blocked or finished. // get blocked or finished.
@ -405,6 +411,7 @@ where
&mut this.write_buf, &mut this.write_buf,
)?; )?;
} }
Poll::Ready(None) => { Poll::Ready(None) => {
this.codec this.codec
.encode(Message::Chunk(None), &mut this.write_buf)?; .encode(Message::Chunk(None), &mut this.write_buf)?;
@ -413,9 +420,11 @@ where
this.state.set(State::None); this.state.set(State::None);
continue 'res; continue 'res;
} }
Poll::Ready(Some(Err(e))) => { Poll::Ready(Some(Err(e))) => {
return Err(DispatchError::Service(e)) return Err(DispatchError::Service(e))
} }
Poll::Pending => return Ok(PollResponse::DoNothing), Poll::Pending => return Ok(PollResponse::DoNothing),
} }
} }
@ -423,6 +432,7 @@ where
// return and try to write the whole buffer to io stream. // return and try to write the whole buffer to io stream.
return Ok(PollResponse::DrainWriteBuf); return Ok(PollResponse::DrainWriteBuf);
} }
StateProj::ExpectCall(fut) => match fut.poll(cx) { StateProj::ExpectCall(fut) => match fut.poll(cx) {
// expect resolved. write continue to buffer and set InnerDispatcher state // expect resolved. write continue to buffer and set InnerDispatcher state
// to service call. // to service call.

View File

@ -56,7 +56,6 @@
//! * SSL support using OpenSSL or Rustls //! * SSL support using OpenSSL or Rustls
//! * Middlewares ([Logger, Session, CORS, etc](https://actix.rs/docs/middleware/)) //! * Middlewares ([Logger, Session, CORS, etc](https://actix.rs/docs/middleware/))
//! * Includes an async [HTTP client](https://actix.rs/actix-web/actix_web/client/index.html) //! * Includes an async [HTTP client](https://actix.rs/actix-web/actix_web/client/index.html)
//! * Supports [Actix actor framework](https://github.com/actix/actix)
//! * Runs on stable Rust 1.46+ //! * Runs on stable Rust 1.46+
//! //!
//! ## Crate Features //! ## Crate Features
@ -203,29 +202,3 @@ pub mod dev {
} }
} }
} }
pub mod client {
//! Actix Web async HTTP client.
//!
//! ```rust
//! use actix_web::client::Client;
//!
//! #[actix_web::main]
//! async fn main() {
//! let mut client = Client::default();
//!
//! // Create request builder and send request
//! let response = client.get("http://www.rust-lang.org")
//! .insert_header(("User-Agent", "actix-web/3.0"))
//! .send() // <- Send request
//! .await; // <- Wait for response
//!
//! println!("Response: {:?}", response);
//! }
//! ```
pub use awc::error::*;
pub use awc::{
test, Client, ClientBuilder, ClientRequest, ClientResponse, Connector,
};
}

View File

@ -1246,57 +1246,4 @@ mod tests {
let res = app.call(req).await.unwrap(); let res = app.call(req).await.unwrap();
assert!(res.status().is_success()); assert!(res.status().is_success());
} }
#[actix_rt::test]
async fn test_actor() {
use crate::Error;
use actix::prelude::*;
struct MyActor;
impl Actor for MyActor {
type Context = Context<Self>;
}
struct Num(usize);
impl Message for Num {
type Result = usize;
}
impl Handler<Num> for MyActor {
type Result = usize;
fn handle(&mut self, msg: Num, _: &mut Self::Context) -> Self::Result {
msg.0
}
}
let addr = MyActor.start();
async fn actor_handler(
addr: Data<Addr<MyActor>>,
) -> Result<impl Responder, Error> {
let res = addr
.send(Num(1))
.await
.map_err(crate::error::ErrorInternalServerError)?;
if res == 1 {
Ok(HttpResponse::Ok())
} else {
Ok(HttpResponse::BadRequest())
}
}
let srv = App::new()
.data(addr.clone())
.service(web::resource("/").to(actor_handler));
let app = init_service(srv).await;
let req = TestRequest::post().uri("/").to_request();
let res = app.call(req).await.unwrap();
assert!(res.status().is_success());
}
} }