Add response
This commit is contained in:
parent
4914c45377
commit
bdae537fe7
1 changed files with 13 additions and 6 deletions
|
@ -21,7 +21,7 @@ const MAX_PIPELINED_COMMANDS: usize = 10;
|
||||||
|
|
||||||
struct Message {
|
struct Message {
|
||||||
req: Request,
|
req: Request,
|
||||||
tx: oneshot::Sender<Response>,
|
tx: oneshot::Sender<Result<Response, BalError>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Manager {
|
pub struct Manager {
|
||||||
|
@ -55,10 +55,13 @@ impl Manager {
|
||||||
|
|
||||||
// @FIXME add a timeout, handle a session that fails.
|
// @FIXME add a timeout, handle a session that fails.
|
||||||
async {
|
async {
|
||||||
rx.await.or_else(|e| {
|
match rx.await {
|
||||||
|
Ok(r) => r,
|
||||||
|
Err(e) => {
|
||||||
tracing::warn!("Got error {:#?}", e);
|
tracing::warn!("Got error {:#?}", e);
|
||||||
Response::bad("No response from the session handler")
|
Response::bad("No response from the session handler")
|
||||||
})
|
},
|
||||||
|
}
|
||||||
}.boxed()
|
}.boxed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,7 +88,7 @@ impl Instance {
|
||||||
|
|
||||||
while let Some(msg) = self.rx.recv().await {
|
while let Some(msg) = self.rx.recv().await {
|
||||||
let mut cmd = command::Command::new(msg.req.tag, self);
|
let mut cmd = command::Command::new(msg.req.tag, self);
|
||||||
let _ = match msg.req.body {
|
let res = match msg.req.body {
|
||||||
CommandBody::Capability => cmd.capability().await,
|
CommandBody::Capability => cmd.capability().await,
|
||||||
CommandBody::Login { username, password } => cmd.login(username, password).await,
|
CommandBody::Login { username, password } => cmd.login(username, password).await,
|
||||||
CommandBody::Lsub { reference, mailbox_wildcard } => cmd.lsub(reference, mailbox_wildcard).await,
|
CommandBody::Lsub { reference, mailbox_wildcard } => cmd.lsub(reference, mailbox_wildcard).await,
|
||||||
|
@ -94,6 +97,10 @@ impl Instance {
|
||||||
CommandBody::Fetch { sequence_set, attributes, uid } => cmd.fetch(sequence_set, attributes, uid).await,
|
CommandBody::Fetch { sequence_set, attributes, uid } => cmd.fetch(sequence_set, attributes, uid).await,
|
||||||
_ => Response::bad("Error in IMAP command received by server."),
|
_ => Response::bad("Error in IMAP command received by server."),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//@FIXME I think we should quit this thread on error and having our manager watch it,
|
||||||
|
// and then abort the session as it is corrupted.
|
||||||
|
msg.tx.send(res).unwrap_or_else(|e| tracing::warn!("failed to send imap response to manager: {:#?}", e));
|
||||||
}
|
}
|
||||||
|
|
||||||
//@FIXME add more info about the runner
|
//@FIXME add more info about the runner
|
||||||
|
|
Loading…
Reference in a new issue