mirror of
https://github.com/actix/actix-extras.git
synced 2024-11-24 07:53:00 +01:00
fix expect service registration and tests
This commit is contained in:
parent
53da55aa3c
commit
a7fdac1043
@ -87,6 +87,27 @@ where
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 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, U>(self, expect: F) -> HttpServiceBuilder<T, S, U>
|
||||||
|
where
|
||||||
|
F: IntoNewService<U>,
|
||||||
|
U: NewService<Request = Request, Response = Request>,
|
||||||
|
U::Error: Into<Error>,
|
||||||
|
U::InitError: fmt::Debug,
|
||||||
|
{
|
||||||
|
HttpServiceBuilder {
|
||||||
|
keep_alive: self.keep_alive,
|
||||||
|
client_timeout: self.client_timeout,
|
||||||
|
client_disconnect: self.client_disconnect,
|
||||||
|
expect: expect.into_new_service(),
|
||||||
|
_t: PhantomData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// #[cfg(feature = "ssl")]
|
// #[cfg(feature = "ssl")]
|
||||||
// /// Configure alpn protocols for SslAcceptorBuilder.
|
// /// Configure alpn protocols for SslAcceptorBuilder.
|
||||||
// pub fn configure_openssl(
|
// pub fn configure_openssl(
|
||||||
@ -142,7 +163,7 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Finish service configuration and create `HttpService` instance.
|
/// Finish service configuration and create `HttpService` instance.
|
||||||
pub fn finish<F, P, B>(self, service: F) -> HttpService<T, P, S, B>
|
pub fn finish<F, P, B>(self, service: F) -> HttpService<T, P, S, B, X>
|
||||||
where
|
where
|
||||||
B: MessageBody + 'static,
|
B: MessageBody + 'static,
|
||||||
F: IntoNewService<S, SrvConfig>,
|
F: IntoNewService<S, SrvConfig>,
|
||||||
@ -156,6 +177,6 @@ where
|
|||||||
self.client_timeout,
|
self.client_timeout,
|
||||||
self.client_disconnect,
|
self.client_disconnect,
|
||||||
);
|
);
|
||||||
HttpService::with_config(cfg, service.into_new_service())
|
HttpService::with_config(cfg, service.into_new_service()).expect(self.expect)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ use std::{net, thread};
|
|||||||
use actix_codec::{AsyncRead, AsyncWrite};
|
use actix_codec::{AsyncRead, AsyncWrite};
|
||||||
use actix_http_test::TestServer;
|
use actix_http_test::TestServer;
|
||||||
use actix_server_config::ServerConfig;
|
use actix_server_config::ServerConfig;
|
||||||
use actix_service::{fn_cfg_factory, NewService};
|
use actix_service::{fn_cfg_factory, fn_service, NewService};
|
||||||
use bytes::{Bytes, BytesMut};
|
use bytes::{Bytes, BytesMut};
|
||||||
use futures::future::{self, ok, Future};
|
use futures::future::{self, ok, Future};
|
||||||
use futures::stream::{once, Stream};
|
use futures::stream::{once, Stream};
|
||||||
@ -153,6 +153,60 @@ fn test_h2_body() -> std::io::Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_expect_continue() {
|
||||||
|
let srv = TestServer::new(|| {
|
||||||
|
HttpService::build()
|
||||||
|
.expect(fn_service(|req: Request| {
|
||||||
|
if req.head().uri.query() == Some("yes=") {
|
||||||
|
Ok(req)
|
||||||
|
} else {
|
||||||
|
Err(error::ErrorPreconditionFailed("error"))
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
.finish(|_| future::ok::<_, ()>(Response::Ok().finish()))
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut stream = net::TcpStream::connect(srv.addr()).unwrap();
|
||||||
|
let _ = stream.write_all(b"GET /test HTTP/1.1\r\nexpect: 100-continue\r\n\r\n");
|
||||||
|
let mut data = String::new();
|
||||||
|
let _ = stream.read_to_string(&mut data);
|
||||||
|
assert!(data.starts_with("HTTP/1.1 412 Precondition Failed\r\ncontent-length"));
|
||||||
|
|
||||||
|
let mut stream = net::TcpStream::connect(srv.addr()).unwrap();
|
||||||
|
let _ = stream.write_all(b"GET /test?yes= HTTP/1.1\r\nexpect: 100-continue\r\n\r\n");
|
||||||
|
let mut data = String::new();
|
||||||
|
let _ = stream.read_to_string(&mut data);
|
||||||
|
assert!(data.starts_with("HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_expect_continue_h1() {
|
||||||
|
let srv = TestServer::new(|| {
|
||||||
|
HttpService::build()
|
||||||
|
.expect(fn_service(|req: Request| {
|
||||||
|
if req.head().uri.query() == Some("yes=") {
|
||||||
|
Ok(req)
|
||||||
|
} else {
|
||||||
|
Err(error::ErrorPreconditionFailed("error"))
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
.h1(|_| future::ok::<_, ()>(Response::Ok().finish()))
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut stream = net::TcpStream::connect(srv.addr()).unwrap();
|
||||||
|
let _ = stream.write_all(b"GET /test HTTP/1.1\r\nexpect: 100-continue\r\n\r\n");
|
||||||
|
let mut data = String::new();
|
||||||
|
let _ = stream.read_to_string(&mut data);
|
||||||
|
assert!(data.starts_with("HTTP/1.1 412 Precondition Failed\r\ncontent-length"));
|
||||||
|
|
||||||
|
let mut stream = net::TcpStream::connect(srv.addr()).unwrap();
|
||||||
|
let _ = stream.write_all(b"GET /test?yes= HTTP/1.1\r\nexpect: 100-continue\r\n\r\n");
|
||||||
|
let mut data = String::new();
|
||||||
|
let _ = stream.read_to_string(&mut data);
|
||||||
|
assert!(data.starts_with("HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\n"));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_slow_request() {
|
fn test_slow_request() {
|
||||||
let srv = TestServer::new(|| {
|
let srv = TestServer::new(|| {
|
||||||
|
Loading…
Reference in New Issue
Block a user