mirror of
https://github.com/ntex-rs/ntex.git
synced 2025-04-04 21:37:58 +03:00
Better io tags handling (#269)
This commit is contained in:
parent
6adeadfff0
commit
fb1d2a268d
14 changed files with 108 additions and 60 deletions
|
@ -1,5 +1,9 @@
|
||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
## [0.3.4] - 2023-12-14
|
||||||
|
|
||||||
|
* Better io tag handling
|
||||||
|
|
||||||
## [0.3.3] - 2023-12-12
|
## [0.3.3] - 2023-12-12
|
||||||
|
|
||||||
* Add io tag support
|
* Add io tag support
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "ntex-connect"
|
name = "ntex-connect"
|
||||||
version = "0.3.3"
|
version = "0.3.4"
|
||||||
authors = ["ntex contributors <team@ntex.rs>"]
|
authors = ["ntex contributors <team@ntex.rs>"]
|
||||||
description = "ntexwork connect utils for ntex framework"
|
description = "ntexwork connect utils for ntex framework"
|
||||||
keywords = ["network", "framework", "async", "futures"]
|
keywords = ["network", "framework", "async", "futures"]
|
||||||
|
@ -37,7 +37,7 @@ async-std = ["ntex-rt/async-std", "ntex-async-std"]
|
||||||
ntex-service = "1.2.7"
|
ntex-service = "1.2.7"
|
||||||
ntex-bytes = "0.1.21"
|
ntex-bytes = "0.1.21"
|
||||||
ntex-http = "0.1.11"
|
ntex-http = "0.1.11"
|
||||||
ntex-io = "0.3.15"
|
ntex-io = "0.3.16"
|
||||||
ntex-rt = "0.4.7"
|
ntex-rt = "0.4.7"
|
||||||
ntex-tls = "0.3.3"
|
ntex-tls = "0.3.3"
|
||||||
ntex-util = "0.3.4"
|
ntex-util = "0.3.4"
|
||||||
|
|
|
@ -56,7 +56,7 @@ impl<T: Address> Connector<T> {
|
||||||
let openssl = self.openssl.clone();
|
let openssl = self.openssl.clone();
|
||||||
|
|
||||||
let io = conn.await?;
|
let io = conn.await?;
|
||||||
trace!("{}SSL Handshake start for: {:?}", io.tag(), host);
|
trace!("{}: SSL Handshake start for: {:?}", io.tag(), host);
|
||||||
|
|
||||||
match openssl.configure() {
|
match openssl.configure() {
|
||||||
Err(e) => Err(io::Error::new(io::ErrorKind::Other, e).into()),
|
Err(e) => Err(io::Error::new(io::ErrorKind::Other, e).into()),
|
||||||
|
@ -67,11 +67,11 @@ impl<T: Address> Connector<T> {
|
||||||
let tag = io.tag();
|
let tag = io.tag();
|
||||||
match IoSslConnector::new(ssl).create(io).await {
|
match IoSslConnector::new(ssl).create(io).await {
|
||||||
Ok(io) => {
|
Ok(io) => {
|
||||||
trace!("{}SSL Handshake success: {:?}", tag, host);
|
trace!("{}: SSL Handshake success: {:?}", tag, host);
|
||||||
Ok(io)
|
Ok(io)
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
trace!("{}SSL Handshake error: {:?}", tag, e);
|
trace!("{}: SSL Handshake error: {:?}", tag, e);
|
||||||
Err(io::Error::new(io::ErrorKind::Other, format!("{}", e)).into())
|
Err(io::Error::new(io::ErrorKind::Other, format!("{}", e)).into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@ impl<T: Address + 'static> Connector<T> {
|
||||||
let connector = self.inner.clone();
|
let connector = self.inner.clone();
|
||||||
|
|
||||||
let io = conn.await?;
|
let io = conn.await?;
|
||||||
trace!("{}SSL Handshake start for: {:?}", io.tag(), host);
|
trace!("{}: SSL Handshake start for: {:?}", io.tag(), host);
|
||||||
|
|
||||||
let tag = io.tag();
|
let tag = io.tag();
|
||||||
let host = ServerName::try_from(host.as_str())
|
let host = ServerName::try_from(host.as_str())
|
||||||
|
@ -73,11 +73,11 @@ impl<T: Address + 'static> Connector<T> {
|
||||||
|
|
||||||
match connector.create(io).await {
|
match connector.create(io).await {
|
||||||
Ok(io) => {
|
Ok(io) => {
|
||||||
trace!("{}TLS Handshake success: {:?}", tag, &host);
|
trace!("{}: TLS Handshake success: {:?}", tag, &host);
|
||||||
Ok(io)
|
Ok(io)
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
trace!("{}TLS Handshake error: {:?}", tag, e);
|
trace!("{}: TLS Handshake error: {:?}", tag, e);
|
||||||
Err(io::Error::new(io::ErrorKind::Other, format!("{}", e)).into())
|
Err(io::Error::new(io::ErrorKind::Other, format!("{}", e)).into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -169,7 +169,7 @@ impl<'f, T: Address> Future for ConnectServiceResponse<'f, T> {
|
||||||
));
|
));
|
||||||
self.poll(cx)
|
self.poll(cx)
|
||||||
} else {
|
} else {
|
||||||
error!("{}TCP connector: got unresolved address", self.tag);
|
error!("{}: TCP connector: got unresolved address", self.tag);
|
||||||
Poll::Ready(Err(ConnectError::Unresolved))
|
Poll::Ready(Err(ConnectError::Unresolved))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
## [0.3.16] - 2023-12-14
|
||||||
|
|
||||||
|
* Better io tags handling
|
||||||
|
|
||||||
## [0.3.15] - 2023-12-12
|
## [0.3.15] - 2023-12-12
|
||||||
|
|
||||||
* Add io tags for logging
|
* Add io tags for logging
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "ntex-io"
|
name = "ntex-io"
|
||||||
version = "0.3.15"
|
version = "0.3.16"
|
||||||
authors = ["ntex contributors <team@ntex.rs>"]
|
authors = ["ntex contributors <team@ntex.rs>"]
|
||||||
description = "Utilities for encoding and decoding frames"
|
description = "Utilities for encoding and decoding frames"
|
||||||
keywords = ["network", "framework", "async", "futures"]
|
keywords = ["network", "framework", "async", "futures"]
|
||||||
|
|
|
@ -338,7 +338,7 @@ where
|
||||||
}
|
}
|
||||||
Err(RecvError::Stop) => {
|
Err(RecvError::Stop) => {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Dispatcher is instructed to stop",
|
"{}: Dispatcher is instructed to stop",
|
||||||
slf.shared.io.tag()
|
slf.shared.io.tag()
|
||||||
);
|
);
|
||||||
slf.st = DispatcherState::Stop;
|
slf.st = DispatcherState::Stop;
|
||||||
|
@ -351,7 +351,7 @@ where
|
||||||
}
|
}
|
||||||
Err(RecvError::Decoder(err)) => {
|
Err(RecvError::Decoder(err)) => {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Decoder error, stopping dispatcher: {:?}",
|
"{}: Decoder error, stopping dispatcher: {:?}",
|
||||||
slf.shared.io.tag(),
|
slf.shared.io.tag(),
|
||||||
err
|
err
|
||||||
);
|
);
|
||||||
|
@ -360,7 +360,7 @@ where
|
||||||
}
|
}
|
||||||
Err(RecvError::PeerGone(err)) => {
|
Err(RecvError::PeerGone(err)) => {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Peer is gone, stopping dispatcher: {:?}",
|
"{}: Peer is gone, stopping dispatcher: {:?}",
|
||||||
slf.shared.io.tag(),
|
slf.shared.io.tag(),
|
||||||
err
|
err
|
||||||
);
|
);
|
||||||
|
@ -443,7 +443,7 @@ where
|
||||||
DispatcherState::Shutdown => {
|
DispatcherState::Shutdown => {
|
||||||
return if slf.shared.service.poll_shutdown(cx).is_ready() {
|
return if slf.shared.service.poll_shutdown(cx).is_ready() {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Service shutdown is completed, stop",
|
"{}: Service shutdown is completed, stop",
|
||||||
slf.shared.io.tag()
|
slf.shared.io.tag()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -472,7 +472,7 @@ where
|
||||||
// check for errors
|
// check for errors
|
||||||
Poll::Ready(if let Some(err) = self.shared.error.take() {
|
Poll::Ready(if let Some(err) = self.shared.error.take() {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Error occured, stopping dispatcher",
|
"{}: Error occured, stopping dispatcher",
|
||||||
self.shared.io.tag()
|
self.shared.io.tag()
|
||||||
);
|
);
|
||||||
self.st = DispatcherState::Stop;
|
self.st = DispatcherState::Stop;
|
||||||
|
@ -493,7 +493,7 @@ where
|
||||||
// pause io read task
|
// pause io read task
|
||||||
Poll::Pending => {
|
Poll::Pending => {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Service is not ready, register dispatch task",
|
"{}: Service is not ready, register dispatch task",
|
||||||
self.shared.io.tag()
|
self.shared.io.tag()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -504,7 +504,7 @@ where
|
||||||
match ready!(self.shared.io.poll_read_pause(cx)) {
|
match ready!(self.shared.io.poll_read_pause(cx)) {
|
||||||
IoStatusUpdate::KeepAlive => {
|
IoStatusUpdate::KeepAlive => {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Keep-alive error, stopping dispatcher during pause",
|
"{}: Keep-alive error, stopping dispatcher during pause",
|
||||||
self.shared.io.tag()
|
self.shared.io.tag()
|
||||||
);
|
);
|
||||||
self.st = DispatcherState::Stop;
|
self.st = DispatcherState::Stop;
|
||||||
|
@ -512,7 +512,7 @@ where
|
||||||
}
|
}
|
||||||
IoStatusUpdate::Stop => {
|
IoStatusUpdate::Stop => {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Dispatcher is instructed to stop during pause",
|
"{}: Dispatcher is instructed to stop during pause",
|
||||||
self.shared.io.tag()
|
self.shared.io.tag()
|
||||||
);
|
);
|
||||||
self.st = DispatcherState::Stop;
|
self.st = DispatcherState::Stop;
|
||||||
|
@ -520,7 +520,7 @@ where
|
||||||
}
|
}
|
||||||
IoStatusUpdate::PeerGone(err) => {
|
IoStatusUpdate::PeerGone(err) => {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Peer is gone during pause, stopping dispatcher: {:?}",
|
"{}: Peer is gone during pause, stopping dispatcher: {:?}",
|
||||||
self.shared.io.tag(),
|
self.shared.io.tag(),
|
||||||
err
|
err
|
||||||
);
|
);
|
||||||
|
@ -533,7 +533,7 @@ where
|
||||||
// handle service readiness error
|
// handle service readiness error
|
||||||
Poll::Ready(Err(err)) => {
|
Poll::Ready(Err(err)) => {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Service readiness check failed, stopping",
|
"{}: Service readiness check failed, stopping",
|
||||||
self.shared.io.tag()
|
self.shared.io.tag()
|
||||||
);
|
);
|
||||||
self.st = DispatcherState::Stop;
|
self.st = DispatcherState::Stop;
|
||||||
|
@ -558,7 +558,7 @@ where
|
||||||
&& !self.flags.contains(Flags::KA_TIMEOUT)
|
&& !self.flags.contains(Flags::KA_TIMEOUT)
|
||||||
{
|
{
|
||||||
log::debug!(
|
log::debug!(
|
||||||
"{}Start keep-alive timer {:?}",
|
"{}: Start keep-alive timer {:?}",
|
||||||
self.shared.io.tag(),
|
self.shared.io.tag(),
|
||||||
self.cfg.keepalive_timeout_secs()
|
self.cfg.keepalive_timeout_secs()
|
||||||
);
|
);
|
||||||
|
@ -599,7 +599,7 @@ where
|
||||||
|
|
||||||
if max.is_zero() || !self.read_max_timeout.is_zero() {
|
if max.is_zero() || !self.read_max_timeout.is_zero() {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Frame read rate {:?}, extend timer",
|
"{}: Frame read rate {:?}, extend timer",
|
||||||
self.shared.io.tag(),
|
self.shared.io.tag(),
|
||||||
total
|
total
|
||||||
);
|
);
|
||||||
|
@ -607,7 +607,7 @@ where
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Max payload timeout has been reached",
|
"{}: Max payload timeout has been reached",
|
||||||
self.shared.io.tag()
|
self.shared.io.tag()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -616,7 +616,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Keep-alive error, stopping dispatcher",
|
"{}: Keep-alive error, stopping dispatcher",
|
||||||
self.shared.io.tag()
|
self.shared.io.tag()
|
||||||
);
|
);
|
||||||
Err(DispatchItem::KeepAliveTimeout)
|
Err(DispatchItem::KeepAliveTimeout)
|
||||||
|
|
|
@ -71,6 +71,8 @@ pub(crate) struct IoState {
|
||||||
pub(super) on_disconnect: Cell<Option<Box<Vec<LocalWaker>>>>,
|
pub(super) on_disconnect: Cell<Option<Box<Vec<LocalWaker>>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const DEFAULT_TAG: &str = "IO";
|
||||||
|
|
||||||
impl IoState {
|
impl IoState {
|
||||||
pub(super) fn insert_flags(&self, f: Flags) {
|
pub(super) fn insert_flags(&self, f: Flags) {
|
||||||
let mut flags = self.flags.get();
|
let mut flags = self.flags.get();
|
||||||
|
@ -90,7 +92,7 @@ impl IoState {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn notify_timeout(&self) {
|
pub(super) fn notify_timeout(&self) {
|
||||||
log::trace!("{}Timeout, notify dispatcher", self.tag.get());
|
log::trace!("{}: Timeout, notify dispatcher", self.tag.get());
|
||||||
|
|
||||||
let mut flags = self.flags.get();
|
let mut flags = self.flags.get();
|
||||||
if !flags.contains(Flags::DSP_TIMEOUT) {
|
if !flags.contains(Flags::DSP_TIMEOUT) {
|
||||||
|
@ -130,7 +132,7 @@ impl IoState {
|
||||||
.intersects(Flags::IO_STOPPED | Flags::IO_STOPPING | Flags::IO_STOPPING_FILTERS)
|
.intersects(Flags::IO_STOPPED | Flags::IO_STOPPING | Flags::IO_STOPPING_FILTERS)
|
||||||
{
|
{
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Initiate io shutdown {:?}",
|
"{}: Initiate io shutdown {:?}",
|
||||||
self.tag.get(),
|
self.tag.get(),
|
||||||
self.flags.get()
|
self.flags.get()
|
||||||
);
|
);
|
||||||
|
@ -203,7 +205,7 @@ impl Io {
|
||||||
handle: Cell::new(None),
|
handle: Cell::new(None),
|
||||||
timeout: Cell::new(TimerHandle::default()),
|
timeout: Cell::new(TimerHandle::default()),
|
||||||
on_disconnect: Cell::new(None),
|
on_disconnect: Cell::new(None),
|
||||||
tag: Cell::new(""),
|
tag: Cell::new(DEFAULT_TAG),
|
||||||
});
|
});
|
||||||
|
|
||||||
let filter = Box::new(Base::new(IoRef(inner.clone())));
|
let filter = Box::new(Base::new(IoRef(inner.clone())));
|
||||||
|
@ -260,7 +262,7 @@ impl<F> Io<F> {
|
||||||
handle: Cell::new(None),
|
handle: Cell::new(None),
|
||||||
timeout: Cell::new(TimerHandle::default()),
|
timeout: Cell::new(TimerHandle::default()),
|
||||||
on_disconnect: Cell::new(None),
|
on_disconnect: Cell::new(None),
|
||||||
tag: Cell::new(""),
|
tag: Cell::new(DEFAULT_TAG),
|
||||||
});
|
});
|
||||||
|
|
||||||
let state = mem::replace(&mut self.0, IoRef(inner));
|
let state = mem::replace(&mut self.0, IoRef(inner));
|
||||||
|
@ -552,7 +554,7 @@ impl<F> Io<F> {
|
||||||
Poll::Pending | Poll::Ready(Ok(Some(()))) => {
|
Poll::Pending | Poll::Ready(Ok(Some(()))) => {
|
||||||
if log::log_enabled!(log::Level::Debug) && decoded.remains != 0 {
|
if log::log_enabled!(log::Level::Debug) && decoded.remains != 0 {
|
||||||
log::debug!(
|
log::debug!(
|
||||||
"{}Not enough data to decode next frame",
|
"{}: Not enough data to decode next frame",
|
||||||
self.tag()
|
self.tag()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -702,7 +704,7 @@ impl<F> Drop for Io<F> {
|
||||||
|
|
||||||
if !self.0.flags().contains(Flags::IO_STOPPED) && self.1.is_set() {
|
if !self.0.flags().contains(Flags::IO_STOPPED) && self.1.is_set() {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Io is dropped, force stopping io streams {:?}",
|
"{}: Io is dropped, force stopping io streams {:?}",
|
||||||
self.tag(),
|
self.tag(),
|
||||||
self.0.flags()
|
self.0.flags()
|
||||||
);
|
);
|
||||||
|
|
|
@ -62,7 +62,7 @@ impl IoRef {
|
||||||
/// Dispatcher does not wait for uncompleted responses. Io stream get terminated
|
/// Dispatcher does not wait for uncompleted responses. Io stream get terminated
|
||||||
/// without any graceful period.
|
/// without any graceful period.
|
||||||
pub fn force_close(&self) {
|
pub fn force_close(&self) {
|
||||||
log::trace!("{}Force close io stream object", self.tag());
|
log::trace!("{}: Force close io stream object", self.tag());
|
||||||
self.0.insert_flags(
|
self.0.insert_flags(
|
||||||
Flags::DSP_STOP
|
Flags::DSP_STOP
|
||||||
| Flags::IO_STOPPED
|
| Flags::IO_STOPPED
|
||||||
|
@ -84,7 +84,7 @@ impl IoRef {
|
||||||
.intersects(Flags::IO_STOPPED | Flags::IO_STOPPING | Flags::IO_STOPPING_FILTERS)
|
.intersects(Flags::IO_STOPPED | Flags::IO_STOPPING | Flags::IO_STOPPING_FILTERS)
|
||||||
{
|
{
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Initiate io shutdown {:?}",
|
"{}: Initiate io shutdown {:?}",
|
||||||
self.tag(),
|
self.tag(),
|
||||||
self.0.flags.get()
|
self.0.flags.get()
|
||||||
);
|
);
|
||||||
|
@ -122,7 +122,7 @@ impl IoRef {
|
||||||
.map_or_else(
|
.map_or_else(
|
||||||
|err| {
|
|err| {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Got io error while encoding, error: {:?}",
|
"{}: Got io error while encoding, error: {:?}",
|
||||||
self.tag(),
|
self.tag(),
|
||||||
err
|
err
|
||||||
);
|
);
|
||||||
|
@ -132,7 +132,7 @@ impl IoRef {
|
||||||
|item| item,
|
|item| item,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
log::trace!("{}Io is closed/closing, skip frame encoding", self.tag());
|
log::trace!("{}: Io is closed/closing, skip frame encoding", self.tag());
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -248,12 +248,12 @@ impl IoRef {
|
||||||
if cur_hnd.is_set() {
|
if cur_hnd.is_set() {
|
||||||
let hnd = timer::update(cur_hnd, timeout, self);
|
let hnd = timer::update(cur_hnd, timeout, self);
|
||||||
if hnd != cur_hnd {
|
if hnd != cur_hnd {
|
||||||
log::debug!("{}Update timer {:?}", self.tag(), timeout);
|
log::debug!("{}: Update timer {:?}", self.tag(), timeout);
|
||||||
self.0.timeout.set(hnd);
|
self.0.timeout.set(hnd);
|
||||||
}
|
}
|
||||||
hnd
|
hnd
|
||||||
} else {
|
} else {
|
||||||
log::debug!("{}Start timer {:?}", self.tag(), timeout);
|
log::debug!("{}: Start timer {:?}", self.tag(), timeout);
|
||||||
let hnd = timer::register(timeout, self);
|
let hnd = timer::register(timeout, self);
|
||||||
self.0.timeout.set(hnd);
|
self.0.timeout.set(hnd);
|
||||||
hnd
|
hnd
|
||||||
|
@ -272,7 +272,7 @@ impl IoRef {
|
||||||
pub fn stop_timer(&self) {
|
pub fn stop_timer(&self) {
|
||||||
let hnd = self.0.timeout.get();
|
let hnd = self.0.timeout.get();
|
||||||
if hnd.is_set() {
|
if hnd.is_set() {
|
||||||
log::debug!("{}Stop timer", self.tag());
|
log::debug!("{}: Stop timer", self.tag());
|
||||||
self.0.timeout.set(timer::TimerHandle::ZERO);
|
self.0.timeout.set(timer::TimerHandle::ZERO);
|
||||||
timer::unregister(hnd, self)
|
timer::unregister(hnd, self)
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ impl ReadContext {
|
||||||
// dest buffer has new data, wake up dispatcher
|
// dest buffer has new data, wake up dispatcher
|
||||||
if inner.buffer.read_destination_size() >= hw {
|
if inner.buffer.read_destination_size() >= hw {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"{}Io read buffer is too large {}, enable read back-pressure",
|
"{}: Io read buffer is too large {}, enable read back-pressure",
|
||||||
self.0.tag(),
|
self.0.tag(),
|
||||||
total
|
total
|
||||||
);
|
);
|
||||||
|
@ -62,7 +62,7 @@ impl ReadContext {
|
||||||
inner.read_task.wake();
|
inner.read_task.wake();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log::trace!("{}New {} bytes available, wakeup dispatcher", self.0.tag(), nbytes);
|
log::trace!("{}: New {} bytes available, wakeup dispatcher", self.0.tag(), nbytes);
|
||||||
inner.dispatch_task.wake();
|
inner.dispatch_task.wake();
|
||||||
} else {
|
} else {
|
||||||
if nbytes >= hw {
|
if nbytes >= hw {
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
## [0.7.15] - 2023-12-14
|
||||||
|
|
||||||
|
* Better io tags handling
|
||||||
|
|
||||||
## [0.7.14] - 2023-12-12
|
## [0.7.14] - 2023-12-12
|
||||||
|
|
||||||
* Add io tag support for server
|
* Add io tag support for server
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "ntex"
|
name = "ntex"
|
||||||
version = "0.7.14"
|
version = "0.7.15"
|
||||||
authors = ["ntex contributors <team@ntex.rs>"]
|
authors = ["ntex contributors <team@ntex.rs>"]
|
||||||
description = "Framework for composable network services"
|
description = "Framework for composable network services"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
@ -49,7 +49,7 @@ async-std = ["ntex-rt/async-std", "ntex-async-std", "ntex-connect/async-std"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ntex-codec = "0.6.2"
|
ntex-codec = "0.6.2"
|
||||||
ntex-connect = "0.3.3"
|
ntex-connect = "0.3.4"
|
||||||
ntex-http = "0.1.11"
|
ntex-http = "0.1.11"
|
||||||
ntex-router = "0.5.2"
|
ntex-router = "0.5.2"
|
||||||
ntex-service = "1.2.7"
|
ntex-service = "1.2.7"
|
||||||
|
@ -58,7 +58,7 @@ ntex-util = "0.3.4"
|
||||||
ntex-bytes = "0.1.21"
|
ntex-bytes = "0.1.21"
|
||||||
ntex-h2 = "0.4.4"
|
ntex-h2 = "0.4.4"
|
||||||
ntex-rt = "0.4.11"
|
ntex-rt = "0.4.11"
|
||||||
ntex-io = "0.3.15"
|
ntex-io = "0.3.16"
|
||||||
ntex-tls = "0.3.3"
|
ntex-tls = "0.3.3"
|
||||||
ntex-tokio = { version = "0.3.1", optional = true }
|
ntex-tokio = { version = "0.3.1", optional = true }
|
||||||
ntex-glommio = { version = "0.3.1", optional = true }
|
ntex-glommio = { version = "0.3.1", optional = true }
|
||||||
|
|
|
@ -250,7 +250,8 @@ where
|
||||||
});
|
});
|
||||||
if result.is_err() {
|
if result.is_err() {
|
||||||
log::error!(
|
log::error!(
|
||||||
"Expect handler returned error: {:?}",
|
"{}: Expect handler returned error: {:?}",
|
||||||
|
this.inner.io.tag(),
|
||||||
result.err().unwrap()
|
result.err().unwrap()
|
||||||
);
|
);
|
||||||
*this.st = State::Stop;
|
*this.st = State::Stop;
|
||||||
|
@ -385,7 +386,11 @@ where
|
||||||
let io = this.inner.io.take();
|
let io = this.inner.io.take();
|
||||||
let req = req.take().unwrap();
|
let req = req.take().unwrap();
|
||||||
|
|
||||||
log::trace!("switching to upgrade service for {:?}", req);
|
log::trace!(
|
||||||
|
"{}: Switching to upgrade service for {:?}",
|
||||||
|
this.inner.io.tag(),
|
||||||
|
req
|
||||||
|
);
|
||||||
|
|
||||||
// Handle UPGRADE request
|
// Handle UPGRADE request
|
||||||
let config = this.inner.config.clone();
|
let config = this.inner.config.clone();
|
||||||
|
@ -494,7 +499,7 @@ where
|
||||||
cx: &mut Context<'_>,
|
cx: &mut Context<'_>,
|
||||||
call_state: &mut std::pin::Pin<&mut CallState<S, X>>,
|
call_state: &mut std::pin::Pin<&mut CallState<S, X>>,
|
||||||
) -> Poll<State<B>> {
|
) -> Poll<State<B>> {
|
||||||
log::trace!("Trying to read http message");
|
log::trace!("{}: Trying to read http message", self.io.tag());
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let result = match self.io.poll_recv_decode(&self.codec, cx) {
|
let result = match self.io.poll_recv_decode(&self.codec, cx) {
|
||||||
|
@ -515,7 +520,12 @@ where
|
||||||
// decode incoming bytes stream
|
// decode incoming bytes stream
|
||||||
return match result {
|
return match result {
|
||||||
Ok((mut req, pl)) => {
|
Ok((mut req, pl)) => {
|
||||||
log::trace!("Http message is received: {:?} and payload {:?}", req, pl);
|
log::trace!(
|
||||||
|
"{}: Http message is received: {:?} and payload {:?}",
|
||||||
|
self.io.tag(),
|
||||||
|
req,
|
||||||
|
pl
|
||||||
|
);
|
||||||
|
|
||||||
// configure request payload
|
// configure request payload
|
||||||
let upgrade = match pl {
|
let upgrade = match pl {
|
||||||
|
@ -541,7 +551,7 @@ where
|
||||||
|
|
||||||
if upgrade {
|
if upgrade {
|
||||||
// Handle UPGRADE request
|
// Handle UPGRADE request
|
||||||
log::trace!("Prepare io for upgrade handler");
|
log::trace!("{}: Prepare io for upgrade handler", self.io.tag(),);
|
||||||
Poll::Ready(State::Upgrade(Some(req)))
|
Poll::Ready(State::Upgrade(Some(req)))
|
||||||
} else {
|
} else {
|
||||||
if req.upgrade() {
|
if req.upgrade() {
|
||||||
|
@ -563,7 +573,7 @@ where
|
||||||
}
|
}
|
||||||
Err(RecvError::WriteBackpressure) => {
|
Err(RecvError::WriteBackpressure) => {
|
||||||
if let Err(err) = ready!(self.io.poll_flush(cx, false)) {
|
if let Err(err) = ready!(self.io.poll_flush(cx, false)) {
|
||||||
log::trace!("Peer is gone with {:?}", err);
|
log::trace!("{}: Peer is gone with {:?}", self.io.tag(), err);
|
||||||
self.error = Some(DispatchError::PeerGone(Some(err)));
|
self.error = Some(DispatchError::PeerGone(Some(err)));
|
||||||
Poll::Ready(State::Stop)
|
Poll::Ready(State::Stop)
|
||||||
} else {
|
} else {
|
||||||
|
@ -572,24 +582,24 @@ where
|
||||||
}
|
}
|
||||||
Err(RecvError::Decoder(err)) => {
|
Err(RecvError::Decoder(err)) => {
|
||||||
// Malformed requests, respond with 400
|
// Malformed requests, respond with 400
|
||||||
log::trace!("Malformed request: {:?}", err);
|
log::trace!("{}: Malformed request: {:?}", self.io.tag(), err);
|
||||||
let (res, body) = Response::BadRequest().finish().into_parts();
|
let (res, body) = Response::BadRequest().finish().into_parts();
|
||||||
self.error = Some(DispatchError::Parse(err));
|
self.error = Some(DispatchError::Parse(err));
|
||||||
Poll::Ready(self.send_response(res, body.into_body()))
|
Poll::Ready(self.send_response(res, body.into_body()))
|
||||||
}
|
}
|
||||||
Err(RecvError::PeerGone(err)) => {
|
Err(RecvError::PeerGone(err)) => {
|
||||||
log::trace!("Peer is gone with {:?}", err);
|
log::trace!("{}: Peer is gone with {:?}", self.io.tag(), err);
|
||||||
self.error = Some(DispatchError::PeerGone(err));
|
self.error = Some(DispatchError::PeerGone(err));
|
||||||
Poll::Ready(State::Stop)
|
Poll::Ready(State::Stop)
|
||||||
}
|
}
|
||||||
Err(RecvError::Stop) => {
|
Err(RecvError::Stop) => {
|
||||||
log::trace!("Dispatcher is instructed to stop");
|
log::trace!("{}: Dispatcher is instructed to stop", self.io.tag());
|
||||||
Poll::Ready(State::Stop)
|
Poll::Ready(State::Stop)
|
||||||
}
|
}
|
||||||
Err(RecvError::KeepAlive) => {
|
Err(RecvError::KeepAlive) => {
|
||||||
if self.flags.contains(Flags::READ_HDRS_TIMEOUT) {
|
if self.flags.contains(Flags::READ_HDRS_TIMEOUT) {
|
||||||
if let Err(err) = self.handle_timeout() {
|
if let Err(err) = self.handle_timeout() {
|
||||||
log::trace!("Slow request timeout");
|
log::trace!("{}: Slow request timeout", self.io.tag());
|
||||||
let (req, body) =
|
let (req, body) =
|
||||||
Response::RequestTimeout().finish().into_parts();
|
Response::RequestTimeout().finish().into_parts();
|
||||||
let _ = self.send_response(req, body.into_body());
|
let _ = self.send_response(req, body.into_body());
|
||||||
|
@ -598,7 +608,10 @@ where
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log::trace!("Keep-alive timeout, close connection");
|
log::trace!(
|
||||||
|
"{}: Keep-alive timeout, close connection",
|
||||||
|
self.io.tag()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
Poll::Ready(State::Stop)
|
Poll::Ready(State::Stop)
|
||||||
}
|
}
|
||||||
|
@ -607,7 +620,12 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_response(&mut self, msg: Response<()>, body: ResponseBody<B>) -> State<B> {
|
fn send_response(&mut self, msg: Response<()>, body: ResponseBody<B>) -> State<B> {
|
||||||
trace!("Sending response: {:?} body: {:?}", msg, body.size());
|
trace!(
|
||||||
|
"{}: Sending response: {:?} body: {:?}",
|
||||||
|
self.io.tag(),
|
||||||
|
msg,
|
||||||
|
body.size()
|
||||||
|
);
|
||||||
// we dont need to process responses if socket is disconnected
|
// we dont need to process responses if socket is disconnected
|
||||||
// but we still want to handle requests with app service
|
// but we still want to handle requests with app service
|
||||||
// so we skip response processing for droppped connection
|
// so we skip response processing for droppped connection
|
||||||
|
@ -649,7 +667,7 @@ where
|
||||||
) -> Option<State<B>> {
|
) -> Option<State<B>> {
|
||||||
match item {
|
match item {
|
||||||
Some(Ok(item)) => {
|
Some(Ok(item)) => {
|
||||||
trace!("Got response chunk: {:?}", item.len());
|
trace!("{}: Got response chunk: {:?}", self.io.tag(), item.len());
|
||||||
match self.io.encode(Message::Chunk(Some(item)), &self.codec) {
|
match self.io.encode(Message::Chunk(Some(item)), &self.codec) {
|
||||||
Ok(_) => None,
|
Ok(_) => None,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
|
@ -659,7 +677,7 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
trace!("Response payload eof {:?}", self.flags);
|
trace!("{}: Response payload eof {:?}", self.io.tag(), self.flags);
|
||||||
if let Err(err) = self.io.encode(Message::Chunk(None), &self.codec) {
|
if let Err(err) = self.io.encode(Message::Chunk(None), &self.codec) {
|
||||||
self.error = Some(DispatchError::Encode(err));
|
self.error = Some(DispatchError::Encode(err));
|
||||||
Some(State::Stop)
|
Some(State::Stop)
|
||||||
|
@ -672,7 +690,11 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(Err(e)) => {
|
Some(Err(e)) => {
|
||||||
trace!("Error during response body poll: {:?}", e);
|
trace!(
|
||||||
|
"{}: Error during response body poll: {:?}",
|
||||||
|
self.io.tag(),
|
||||||
|
e
|
||||||
|
);
|
||||||
self.error = Some(DispatchError::ResponsePayload(e));
|
self.error = Some(DispatchError::ResponsePayload(e));
|
||||||
Some(State::Stop)
|
Some(State::Stop)
|
||||||
}
|
}
|
||||||
|
@ -859,7 +881,11 @@ where
|
||||||
|
|
||||||
// start timer for next period
|
// start timer for next period
|
||||||
if cfg.max_timeout.is_zero() || !self.read_max_timeout.is_zero() {
|
if cfg.max_timeout.is_zero() || !self.read_max_timeout.is_zero() {
|
||||||
log::trace!("Bytes read rate {:?}, extend timer", total);
|
log::trace!(
|
||||||
|
"{}: Bytes read rate {:?}, extend timer",
|
||||||
|
self.io.tag(),
|
||||||
|
total
|
||||||
|
);
|
||||||
self.io.start_timer_secs(cfg.timeout);
|
self.io.start_timer_secs(cfg.timeout);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
@ -900,7 +926,11 @@ where
|
||||||
// no new data, start keep-alive timer
|
// no new data, start keep-alive timer
|
||||||
if self.codec.keepalive() {
|
if self.codec.keepalive() {
|
||||||
if !self.flags.contains(Flags::READ_KA_TIMEOUT) {
|
if !self.flags.contains(Flags::READ_KA_TIMEOUT) {
|
||||||
log::debug!("Start keep-alive timer {:?}", self.config.keep_alive);
|
log::debug!(
|
||||||
|
"{}: Start keep-alive timer {:?}",
|
||||||
|
self.io.tag(),
|
||||||
|
self.config.keep_alive
|
||||||
|
);
|
||||||
self.flags.insert(Flags::READ_KA_TIMEOUT);
|
self.flags.insert(Flags::READ_KA_TIMEOUT);
|
||||||
if self.config.keep_alive_enabled() {
|
if self.config.keep_alive_enabled() {
|
||||||
self.io.start_timer_secs(self.config.keep_alive);
|
self.io.start_timer_secs(self.config.keep_alive);
|
||||||
|
@ -911,7 +941,11 @@ where
|
||||||
return Some(State::Stop);
|
return Some(State::Stop);
|
||||||
}
|
}
|
||||||
} else if let Some(ref cfg) = self.config.headers_read_rate {
|
} else if let Some(ref cfg) = self.config.headers_read_rate {
|
||||||
log::debug!("Start headers read timer {:?}", cfg.timeout);
|
log::debug!(
|
||||||
|
"{}: Start headers read timer {:?}",
|
||||||
|
self.io.tag(),
|
||||||
|
cfg.timeout
|
||||||
|
);
|
||||||
|
|
||||||
// we got new data but not enough to parse single frame
|
// we got new data but not enough to parse single frame
|
||||||
// start read timer
|
// start read timer
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue