From 3cb7c65b70250a6a7837291386d0f7f9ebd43ec6 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 2 Jun 2022 17:59:29 +0200 Subject: Working server --- src/main.rs | 5 ++-- src/server.rs | 81 +++++++++++++++++++++++++++++++++++------------------------ 2 files changed, 51 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/main.rs b/src/main.rs index ada94fc..3c2ef7f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -111,9 +111,10 @@ struct UserSecretsArgs { #[tokio::main] async fn main() -> Result<()> { if std::env::var("RUST_LOG").is_err() { - std::env::set_var("RUST_LOG", "mailrage=info,k2v_client=info") + std::env::set_var("RUST_LOG", "main=info,mailrage=info,k2v_client=info") } - pretty_env_logger::init(); + + tracing_subscriber::fmt::init(); let args = Args::parse(); diff --git a/src/server.rs b/src/server.rs index b06299c..cd15bef 100644 --- a/src/server.rs +++ b/src/server.rs @@ -10,14 +10,10 @@ use crate::mailbox::Mailbox; use boitalettres::proto::{Request, Response}; use boitalettres::server::accept::addr::{AddrIncoming, AddrStream}; use boitalettres::server::Server as ImapServer; -use tracing_subscriber; +use std::pin::Pin; use std::task::{Context, Poll}; use tower::Service; -use std::future::Future; -use std::pin::Pin; - -use std::error::Error; pub struct Server { pub login_provider: Box, @@ -25,38 +21,57 @@ pub struct Server { struct Connection; impl Service for Connection { - type Response = Response; - type Error = anyhow::Error; - type Future = Pin> + Send>>; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: Request) -> Self::Future { - Box::pin(async move { - println!("Got request: {:#?}", req); - Ok(Response::ok("Done")?) - }) - } + type Response = Response; + type Error = anyhow::Error; + type Future = Pin> + Send>>; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, req: Request) -> Self::Future { + tracing::debug!("Got request: {:#?}", req); + Box::pin(async move { + use imap_codec::types::{ + command::CommandBody, + response::{Capability, Data}, + }; + + let r = match req.body { + CommandBody::Capability => { + let capabilities = vec![Capability::Imap4Rev1, Capability::Idle]; + let body = vec![Data::Capability(capabilities)]; + Response::ok( + "Pre-login capabilities listed, post-login capabilities have more.", + )? + .with_body(body) + } + CommandBody::Login { + username: _, + password: _, + } => Response::ok("Logged in")?, + _ => Response::bad("Error in IMAP command received by server.")?, + }; + + Ok(r) + }) + } } struct Instance; impl<'a> Service<&'a AddrStream> for Instance { - type Response = Connection; - type Error = anyhow::Error; - type Future = Pin> + Send>>; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, addr: &'a AddrStream) -> Self::Future { - println!("{}, {}", addr.remote_addr, addr.local_addr); - Box::pin(async { - Ok(Connection) - }) - } + type Response = Connection; + type Error = anyhow::Error; + type Future = Pin> + Send>>; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, addr: &'a AddrStream) -> Self::Future { + tracing::info!(remote_addr = %addr.remote_addr, local_addr = %addr.local_addr, "accept"); + Box::pin(async { Ok(Connection) }) + } } impl Server { -- cgit v1.2.3