Compare commits
2 commits
05b5efc8bf
...
921ea05f89
Author | SHA1 | Date | |
---|---|---|---|
921ea05f89 | |||
7e8f445967 |
4 changed files with 39 additions and 22 deletions
|
@ -6,8 +6,12 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bytes = "1.1"
|
bytes = "1.1"
|
||||||
|
|
||||||
|
miette = "4.7"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
|
tracing-futures = "0.2"
|
||||||
|
|
||||||
# IMAP
|
# IMAP
|
||||||
imap-codec = "0.5"
|
imap-codec = "0.5"
|
||||||
|
@ -16,11 +20,13 @@ imap-codec = "0.5"
|
||||||
async-compat = "0.2"
|
async-compat = "0.2"
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
pin-project = "1.0"
|
pin-project = "1.0"
|
||||||
|
|
||||||
tokio = { version = "1.18", features = ["full"] }
|
tokio = { version = "1.18", features = ["full"] }
|
||||||
tokio-tower = "0.6"
|
tokio-tower = "0.6"
|
||||||
tower = { version = "0.4", features = ["full"] }
|
tower = { version = "0.4", features = ["full"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
eyre = "0.6"
|
miette = { version = "4.7", features = ["fancy"] }
|
||||||
|
|
||||||
tracing-subscriber = "0.3"
|
tracing-subscriber = "0.3"
|
||||||
console-subscriber = "0.1"
|
console-subscriber = "0.1"
|
||||||
|
|
|
@ -10,6 +10,12 @@ This example is meant to show basic service-based IMAP server with boitalettres
|
||||||
$ cargo run --example simple
|
$ cargo run --example simple
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you want to trace this `simple` example with the [`tokio-console`](https://github.com/tokio-rs/console/tree/main/tokio-console) utility, run:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ RUSTFLAGS="tokio_unstable" cargo run --example simple --features "tokio/tracing"
|
||||||
|
```
|
||||||
|
|
||||||
- [Basic python testing script](../scripts/test_imap.py)
|
- [Basic python testing script](../scripts/test_imap.py)
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
|
use miette::{IntoDiagnostic, Result};
|
||||||
use boitalettres::proto::{Request, Response};
|
use boitalettres::proto::{Request, Response};
|
||||||
use boitalettres::server::accept::addr::{AddrIncoming, AddrStream};
|
use boitalettres::server::accept::addr::{AddrIncoming, AddrStream};
|
||||||
use boitalettres::server::Server;
|
use boitalettres::server::Server;
|
||||||
|
|
||||||
async fn handle_req(req: Request) -> eyre::Result<Response> {
|
async fn handle_req(req: Request) -> Result<Response> {
|
||||||
use imap_codec::types::response::Status;
|
use imap_codec::types::response::Status;
|
||||||
|
|
||||||
tracing::debug!("Got request: {:#?}", req);
|
tracing::debug!("Got request: {:#?}", req);
|
||||||
|
@ -13,10 +14,12 @@ async fn handle_req(req: Request) -> eyre::Result<Response> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> eyre::Result<()> {
|
async fn main() -> Result<()> {
|
||||||
setup_logging();
|
setup_logging();
|
||||||
|
|
||||||
let incoming = AddrIncoming::new("127.0.0.1:4567").await?;
|
let incoming = AddrIncoming::new("127.0.0.1:4567")
|
||||||
|
.await
|
||||||
|
.into_diagnostic()?;
|
||||||
|
|
||||||
let make_service = tower::service_fn(|addr: &AddrStream| {
|
let make_service = tower::service_fn(|addr: &AddrStream| {
|
||||||
tracing::debug!(remote_addr = %addr.remote_addr, local_addr = %addr.local_addr, "accept");
|
tracing::debug!(remote_addr = %addr.remote_addr, local_addr = %addr.local_addr, "accept");
|
||||||
|
@ -29,27 +32,28 @@ async fn main() -> eyre::Result<()> {
|
||||||
});
|
});
|
||||||
|
|
||||||
let server = Server::new(incoming).serve(make_service);
|
let server = Server::new(incoming).serve(make_service);
|
||||||
let _ = server.await?;
|
|
||||||
|
|
||||||
Ok(())
|
server.await.map_err(Into::into)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't mind this, this is just for debugging.
|
// Don't mind this, this is just for debugging.
|
||||||
fn setup_logging() {
|
fn setup_logging() {
|
||||||
use tracing_subscriber::prelude::*;
|
use tracing_subscriber::prelude::*;
|
||||||
|
|
||||||
tracing_subscriber::registry()
|
let registry = tracing_subscriber::registry().with(
|
||||||
.with(console_subscriber::spawn())
|
tracing_subscriber::fmt::layer().with_filter(
|
||||||
.with(
|
tracing_subscriber::filter::Targets::new()
|
||||||
tracing_subscriber::fmt::layer().with_filter(
|
.with_default(tracing::Level::DEBUG)
|
||||||
tracing_subscriber::filter::Targets::new()
|
.with_target("boitalettres", tracing::Level::TRACE)
|
||||||
.with_default(tracing::Level::DEBUG)
|
.with_target("simple", tracing::Level::TRACE)
|
||||||
.with_target("boitalettres", tracing::Level::TRACE)
|
.with_target("tower", tracing::Level::TRACE)
|
||||||
.with_target("simple", tracing::Level::TRACE)
|
.with_target("tokio_tower", tracing::Level::TRACE)
|
||||||
.with_target("tower", tracing::Level::TRACE)
|
.with_target("mio", tracing::Level::TRACE),
|
||||||
.with_target("tokio_tower", tracing::Level::TRACE)
|
),
|
||||||
.with_target("mio", tracing::Level::TRACE),
|
);
|
||||||
),
|
|
||||||
)
|
#[cfg(tokio_unstable)]
|
||||||
.init();
|
let registry = registry.with(console_subscriber::spawn());
|
||||||
|
|
||||||
|
registry.init();
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,8 @@ mod conn;
|
||||||
mod pipeline;
|
mod pipeline;
|
||||||
mod service;
|
mod service;
|
||||||
|
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error, miette::Diagnostic)]
|
||||||
pub enum Error<A> {
|
pub enum Error<A: std::error::Error + 'static> {
|
||||||
#[error("Error occured when accepting new connections")]
|
#[error("Error occured when accepting new connections")]
|
||||||
Accept(#[source] A),
|
Accept(#[source] A),
|
||||||
#[error("Error occured on service creation")]
|
#[error("Error occured on service creation")]
|
||||||
|
@ -50,6 +50,7 @@ impl<I, S> Future for Server<I, S>
|
||||||
where
|
where
|
||||||
I: Accept,
|
I: Accept,
|
||||||
I::Conn: AsyncRead + AsyncWrite + Unpin + Send + 'static,
|
I::Conn: AsyncRead + AsyncWrite + Unpin + Send + 'static,
|
||||||
|
I::Error: 'static,
|
||||||
S: MakeServiceRef<I::Conn, Request, Response = Response>,
|
S: MakeServiceRef<I::Conn, Request, Response = Response>,
|
||||||
S::MakeError: Into<tower::BoxError> + std::fmt::Display,
|
S::MakeError: Into<tower::BoxError> + std::fmt::Display,
|
||||||
S::Error: std::fmt::Display,
|
S::Error: std::fmt::Display,
|
||||||
|
|
Loading…
Reference in a new issue