1
0
mirror of https://github.com/actix/actix-extras.git synced 2024-11-30 18:34:36 +01:00

disable shutdown atm

This commit is contained in:
Nikolay Kim 2018-10-09 09:45:24 -07:00
parent 93b1c5fd46
commit c3ad516f56

View File

@ -49,8 +49,8 @@ where
T: IoStream, T: IoStream,
H: HttpHandler + 'static, H: HttpHandler + 'static,
{ {
node: Node<HttpProtocol<T, H>>, proto: HttpProtocol<T, H>,
node_reg: bool, node: Option<Node<()>>,
ka_timeout: Option<Delay>, ka_timeout: Option<Delay>,
} }
@ -64,12 +64,8 @@ where
HttpChannel { HttpChannel {
ka_timeout, ka_timeout,
node_reg: false, node: None,
node: Node::new(HttpProtocol::Unknown( proto: HttpProtocol::Unknown(settings, io, BytesMut::with_capacity(8192)),
settings,
io,
BytesMut::with_capacity(8192),
)),
} }
} }
} }
@ -80,7 +76,9 @@ where
H: HttpHandler + 'static, H: HttpHandler + 'static,
{ {
fn drop(&mut self) { fn drop(&mut self) {
self.node.remove(); if let Some(mut node) = self.node.take() {
node.remove()
}
} }
} }
@ -98,16 +96,15 @@ where
match self.ka_timeout.as_mut().unwrap().poll() { match self.ka_timeout.as_mut().unwrap().poll() {
Ok(Async::Ready(_)) => { Ok(Async::Ready(_)) => {
trace!("Slow request timed out, close connection"); trace!("Slow request timed out, close connection");
let proto = mem::replace(self.node.get_mut(), HttpProtocol::None); let proto = mem::replace(&mut self.proto, HttpProtocol::None);
if let HttpProtocol::Unknown(settings, io, buf) = proto { if let HttpProtocol::Unknown(settings, io, buf) = proto {
*self.node.get_mut() = self.proto = HttpProtocol::H1(h1::Http1Dispatcher::for_error(
HttpProtocol::H1(h1::Http1Dispatcher::for_error( settings,
settings, io,
io, StatusCode::REQUEST_TIMEOUT,
StatusCode::REQUEST_TIMEOUT, self.ka_timeout.take(),
self.ka_timeout.take(), buf,
buf, ));
));
return self.poll(); return self.poll();
} }
return Ok(Async::Ready(())); return Ok(Async::Ready(()));
@ -117,19 +114,24 @@ where
} }
} }
if !self.node_reg { if self.node.is_none() {
self.node_reg = true; self.node = Some(Node::new(()));
let settings = match self.node.get_mut() { let _ = match self.proto {
HttpProtocol::H1(ref mut h1) => h1.settings().clone(), HttpProtocol::H1(ref mut h1) => {
HttpProtocol::H2(ref mut h2) => h2.settings().clone(), self.node.as_mut().map(|n| h1.settings().head().insert(n))
HttpProtocol::Unknown(ref mut settings, _, _) => settings.clone(), }
HttpProtocol::H2(ref mut h2) => {
self.node.as_mut().map(|n| h2.settings().head().insert(n))
}
HttpProtocol::Unknown(ref mut settings, _, _) => {
self.node.as_mut().map(|n| settings.head().insert(n))
}
HttpProtocol::None => unreachable!(), HttpProtocol::None => unreachable!(),
}; };
settings.head().insert(&mut self.node);
} }
let mut is_eof = false; let mut is_eof = false;
let kind = match self.node.get_mut() { let kind = match self.proto {
HttpProtocol::H1(ref mut h1) => return h1.poll(), HttpProtocol::H1(ref mut h1) => return h1.poll(),
HttpProtocol::H2(ref mut h2) => return h2.poll(), HttpProtocol::H2(ref mut h2) => return h2.poll(),
HttpProtocol::Unknown(_, ref mut io, ref mut buf) => { HttpProtocol::Unknown(_, ref mut io, ref mut buf) => {
@ -169,11 +171,11 @@ where
}; };
// upgrade to specific http protocol // upgrade to specific http protocol
let proto = mem::replace(self.node.get_mut(), HttpProtocol::None); let proto = mem::replace(&mut self.proto, HttpProtocol::None);
if let HttpProtocol::Unknown(settings, io, buf) = proto { if let HttpProtocol::Unknown(settings, io, buf) = proto {
match kind { match kind {
ProtocolKind::Http1 => { ProtocolKind::Http1 => {
*self.node.get_mut() = HttpProtocol::H1(h1::Http1Dispatcher::new( self.proto = HttpProtocol::H1(h1::Http1Dispatcher::new(
settings, settings,
io, io,
buf, buf,
@ -183,7 +185,7 @@ where
return self.poll(); return self.poll();
} }
ProtocolKind::Http2 => { ProtocolKind::Http2 => {
*self.node.get_mut() = HttpProtocol::H2(h2::Http2::new( self.proto = HttpProtocol::H2(h2::Http2::new(
settings, settings,
io, io,
buf.freeze(), buf.freeze(),
@ -203,8 +205,8 @@ where
T: IoStream, T: IoStream,
H: HttpHandler + 'static, H: HttpHandler + 'static,
{ {
node: Node<HttpProtocol<T, H>>, proto: HttpProtocol<T, H>,
node_reg: bool, node: Option<Node<()>>,
} }
impl<T, H> H1Channel<T, H> impl<T, H> H1Channel<T, H>
@ -214,14 +216,14 @@ where
{ {
pub(crate) fn new(settings: ServiceConfig<H>, io: T) -> H1Channel<T, H> { pub(crate) fn new(settings: ServiceConfig<H>, io: T) -> H1Channel<T, H> {
H1Channel { H1Channel {
node_reg: false, node: None,
node: Node::new(HttpProtocol::H1(h1::Http1Dispatcher::new( proto: HttpProtocol::H1(h1::Http1Dispatcher::new(
settings, settings,
io, io,
BytesMut::with_capacity(8192), BytesMut::with_capacity(8192),
false, false,
None, None,
))), )),
} }
} }
} }
@ -232,7 +234,9 @@ where
H: HttpHandler + 'static, H: HttpHandler + 'static,
{ {
fn drop(&mut self) { fn drop(&mut self) {
self.node.remove(); if let Some(mut node) = self.node.take() {
node.remove();
}
} }
} }
@ -245,16 +249,17 @@ where
type Error = HttpDispatchError; type Error = HttpDispatchError;
fn poll(&mut self) -> Poll<Self::Item, Self::Error> { fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
if !self.node_reg { if self.node.is_none() {
self.node_reg = true; self.node = Some(Node::new(()));
let settings = match self.node.get_mut() { match self.proto {
HttpProtocol::H1(ref mut h1) => h1.settings().clone(), HttpProtocol::H1(ref mut h1) => {
self.node.as_mut().map(|n| h1.settings().head().insert(n));
}
_ => unreachable!(), _ => unreachable!(),
}; };
settings.head().insert(&mut self.node);
} }
match self.node.get_mut() { match self.proto {
HttpProtocol::H1(ref mut h1) => h1.poll(), HttpProtocol::H1(ref mut h1) => h1.poll(),
_ => unreachable!(), _ => unreachable!(),
} }
@ -276,10 +281,6 @@ impl<T> Node<T> {
} }
} }
fn get_mut(&mut self) -> &mut T {
&mut self.element
}
fn insert<I>(&mut self, next_el: &mut Node<I>) { fn insert<I>(&mut self, next_el: &mut Node<I>) {
let next: *mut Node<T> = next_el as *const _ as *mut _; let next: *mut Node<T> = next_el as *const _ as *mut _;