melib/jmap: add jmap-trace feature

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
pull/279/head
Manos Pitsidianakis 2023-08-13 14:29:00 +03:00
parent 3433f7c41e
commit f7a4741bf1
Signed by: Manos Pitsidianakis
GPG Key ID: 7729C7707F7E09D0
5 changed files with 67 additions and 45 deletions

View File

@ -71,6 +71,7 @@ http-static = ["isahc", "isahc/static-curl"]
imap = ["imap-codec", "tls"]
imap-trace = ["imap"]
jmap = ["http"]
jmap-trace = ["jmap"]
nntp = ["tls"]
nntp-trace = ["nntp"]
maildir = ["notify"]

View File

@ -280,14 +280,15 @@ impl JmapConnection {
} else {
return Ok(());
}
let api_url = self.session.lock().unwrap().api_url.clone();
let mut res = self
.client
.post_async(api_url.as_str(), serde_json::to_string(&req)?)
.await?;
let mut res = self.post_async(None, serde_json::to_string(&req)?).await?;
let res_text = res.text().await?;
debug!(&res_text);
if cfg!(feature = "jmap-trace") {
log::trace!(
"email_changes(): for mailbox {mailbox_hash} response {:?}",
res_text
);
}
let mut v: MethodResponse = match deserialize_from_str(&res_text) {
Err(err) => {
*self.store.online_status.lock().await = (Instant::now(), Err(err.clone()));
@ -410,8 +411,16 @@ impl JmapConnection {
}
Ok(_) => {}
Err(err) => {
debug!(mailbox_hash);
debug!(err);
log::error!(
"Could not deserialize EmailQueryChangesResponse from server response:
- mailbox_hash: {mailbox_hash}
- error: {err}
- debug details:
Json request was: {:?}
Json reply was: {}",
serde_json::to_string(&req),
res_text
);
}
}
let GetResponse::<EmailObject> { list, .. } =
@ -456,11 +465,15 @@ impl JmapConnection {
}
pub async fn send_request(&self, request: String) -> Result<String> {
let api_url = self.session.lock().unwrap().api_url.clone();
let mut res = self.client.post_async(api_url.as_str(), request).await?;
if cfg!(feature = "jmap-trace") {
log::trace!("send_request(): request {:?}", request);
}
let mut res = self.post_async(None, request).await?;
let res_text = res.text().await?;
debug!(&res_text);
if cfg!(feature = "jmap-trace") {
log::trace!("send_request(): response {:?}", res_text);
}
let _: MethodResponse = match deserialize_from_str(&res_text) {
Err(err) => {
log::error!("{}", &err);
@ -471,4 +484,34 @@ impl JmapConnection {
};
Ok(res_text)
}
pub async fn get_async(&self, url: &str) -> Result<isahc::Response<isahc::AsyncBody>> {
if cfg!(feature = "jmap-trace") {
let res = self.client.get_async(url).await;
log::trace!("get_async(): url `{}` response {:?}", url, res);
Ok(res?)
} else {
Ok(self.client.get_async(url).await?)
}
}
pub async fn post_async<T: Into<Vec<u8>> + Send + Sync>(
&self,
api_url: Option<&str>,
request: T,
) -> Result<isahc::Response<isahc::AsyncBody>> {
let request: Vec<u8> = request.into();
if cfg!(feature = "jmap-trace") {
log::trace!(
"post_async(): request {:?}",
String::from_utf8_lossy(&request)
);
}
if let Some(api_url) = api_url {
Ok(self.client.post_async(api_url, request).await?)
} else {
let api_url = self.session.lock().unwrap().api_url.clone();
Ok(self.client.post_async(api_url.as_str(), request).await?)
}
}
}

View File

@ -423,14 +423,13 @@ impl MailBackend for JmapType {
* 1. upload binary blob, get blobId
* 2. Email/import
*/
let (api_url, upload_url) = {
let lck = conn.session.lock().unwrap();
(lck.api_url.clone(), lck.upload_url.clone())
};
let upload_url = { conn.session.lock().unwrap().upload_url.clone() };
let mut res = conn
.client
.post_async(
&upload_request_format(upload_url.as_str(), &conn.mail_account_id()),
Some(&upload_request_format(
upload_url.as_str(),
&conn.mail_account_id(),
)),
bytes,
)
.await?;
@ -472,10 +471,7 @@ impl MailBackend for JmapType {
.emails(email_imports);
req.add_call(&import_call);
let mut res = conn
.client
.post_async(api_url.as_str(), serde_json::to_string(&req)?)
.await?;
let mut res = conn.post_async(None, serde_json::to_string(&req)?).await?;
let res_text = res.text().await?;
let mut v: MethodResponse = match deserialize_from_str(&res_text) {
@ -549,12 +545,8 @@ impl MailBackend for JmapType {
let mut req = Request::new(conn.request_no.clone());
req.add_call(&email_call);
let api_url = conn.session.lock().unwrap().api_url.clone();
let mut res = conn
.client
.post_async(api_url.as_str(), serde_json::to_string(&req)?)
.await?;
let mut res = conn.post_async(None, serde_json::to_string(&req)?).await?;
let res_text = res.text().await?;
let mut v: MethodResponse = match deserialize_from_str(&res_text) {
@ -672,7 +664,6 @@ impl MailBackend for JmapType {
}
}
let conn = connection.lock().await;
let api_url = conn.session.lock().unwrap().api_url.clone();
let email_set_call: EmailSet = EmailSet::new(
Set::<EmailObject>::new()
@ -683,10 +674,7 @@ impl MailBackend for JmapType {
let mut req = Request::new(conn.request_no.clone());
let _prev_seq = req.add_call(&email_set_call);
let mut res = conn
.client
.post_async(api_url.as_str(), serde_json::to_string(&req)?)
.await?;
let mut res = conn.post_async(None, serde_json::to_string(&req)?).await?;
let res_text = res.text().await?;
@ -789,12 +777,8 @@ impl MailBackend for JmapType {
);
req.add_call(&email_call);
let api_url = conn.session.lock().unwrap().api_url.clone();
//debug!(serde_json::to_string(&req)?);
let mut res = conn
.client
.post_async(api_url.as_str(), serde_json::to_string(&req)?)
.await?;
let mut res = conn.post_async(None, serde_json::to_string(&req)?).await?;
let res_text = res.text().await?;
/*

View File

@ -62,7 +62,6 @@ impl BackendOp for JmapOp {
conn.connect().await?;
let download_url = conn.session.lock().unwrap().download_url.clone();
let mut res = conn
.client
.get_async(&download_request_format(
download_url.as_str(),
&conn.mail_account_id(),

View File

@ -185,11 +185,7 @@ pub async fn get_message_list(
let mut req = Request::new(conn.request_no.clone());
req.add_call(&email_call);
let api_url = conn.session.lock().unwrap().api_url.clone();
let mut res = conn
.client
.post_async(api_url.as_str(), serde_json::to_string(&req)?)
.await?;
let mut res = conn.post_async(None, serde_json::to_string(&req)?).await?;
let res_text = res.text().await?;
let mut v: MethodResponse = match deserialize_from_str(&res_text) {
@ -216,8 +212,7 @@ pub async fn get_message(conn: &JmapConnection, ids: &[String]) -> Result<Vec<En
let mut req = Request::new(conn.request_no.clone());
req.add_call(&email_call);
let mut res = conn
.client
.post_async(&conn.session.api_url, serde_json::to_string(&req)?)
.post_async(None, serde_json::to_string(&req)?)
.await?;
let res_text = res.text().await?;