Move handle_upload_result to upload module

xmppftw created

Change summary

xmpp/src/iq/mod.rs     |  4 +-
xmpp/src/lib.rs        | 54 +-----------------------------------
xmpp/src/upload/mod.rs | 65 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 69 insertions(+), 54 deletions(-)

Detailed changes

xmpp/src/iq/mod.rs 🔗

@@ -13,7 +13,7 @@ use tokio_xmpp::parsers::{
     stanza_error::{DefinedCondition, ErrorType, StanzaError},
 };
 
-use crate::{handle_upload_result, pubsub, Agent, Event};
+use crate::{pubsub, upload, Agent, Event};
 
 pub async fn handle_iq(agent: &mut Agent, iq: Iq) -> Vec<Event> {
     let mut events = vec![];
@@ -71,7 +71,7 @@ pub async fn handle_iq(agent: &mut Agent, iq: Iq) -> Vec<Event> {
             let new_events = pubsub::handle_iq_result(&from, payload);
             events.extend(new_events);
         } else if payload.is("slot", ns::HTTP_UPLOAD) {
-            let new_events = handle_upload_result(&from, iq.id, payload, agent).await;
+            let new_events = upload::handle_upload_result(&from, iq.id, payload, agent).await;
             events.extend(new_events);
         } else if payload.is("query", ns::PRIVATE) {
             match PrivateXMLQuery::try_from(payload) {

xmpp/src/lib.rs 🔗

@@ -7,20 +7,16 @@
 #![deny(bare_trait_objects)]
 
 use futures::stream::StreamExt;
-use reqwest::{
-    header::HeaderMap as ReqwestHeaderMap, Body as ReqwestBody, Client as ReqwestClient,
-};
 use std::path::{Path, PathBuf};
 use std::sync::{Arc, RwLock};
 use tokio::fs::File;
-use tokio_util::codec::{BytesCodec, FramedRead};
 pub use tokio_xmpp::parsers;
 use tokio_xmpp::parsers::{
     bookmarks, bookmarks2,
     caps::{compute_disco, hash_caps, Caps},
     disco::{DiscoInfoQuery, DiscoInfoResult, Feature, Identity},
     hashes::Algo,
-    http_upload::{Header as HttpUploadHeader, SlotRequest, SlotResult},
+    http_upload::SlotRequest,
     iq::Iq,
     message::{Body, Message, MessageType},
     muc::{user::MucUser, Muc},
@@ -40,6 +36,7 @@ pub mod iq;
 pub mod message;
 pub mod presence;
 pub mod pubsub;
+pub mod upload;
 
 pub type Error = tokio_xmpp::Error;
 
@@ -485,53 +482,6 @@ impl Agent {
     }
 }
 
-async fn handle_upload_result(
-    from: &Jid,
-    iqid: String,
-    elem: Element,
-    agent: &mut Agent,
-) -> impl IntoIterator<Item = Event> {
-    let mut res: Option<(usize, PathBuf)> = None;
-
-    for (i, (id, to, filepath)) in agent.uploads.iter().enumerate() {
-        if to == from && id == &iqid {
-            res = Some((i, filepath.to_path_buf()));
-            break;
-        }
-    }
-
-    if let Some((index, file)) = res {
-        agent.uploads.remove(index);
-        let slot = SlotResult::try_from(elem).unwrap();
-
-        let mut headers = ReqwestHeaderMap::new();
-        for header in slot.put.headers {
-            let (attr, val) = match header {
-                HttpUploadHeader::Authorization(val) => ("Authorization", val),
-                HttpUploadHeader::Cookie(val) => ("Cookie", val),
-                HttpUploadHeader::Expires(val) => ("Expires", val),
-            };
-            headers.insert(attr, val.parse().unwrap());
-        }
-
-        let web = ReqwestClient::new();
-        let stream = FramedRead::new(File::open(file).await.unwrap(), BytesCodec::new());
-        let body = ReqwestBody::wrap_stream(stream);
-        let res = web
-            .put(slot.put.url.as_str())
-            .headers(headers)
-            .body(body)
-            .send()
-            .await
-            .unwrap();
-        if res.status() == 201 {
-            return vec![Event::HttpUploadedFile(slot.get.url)];
-        }
-    }
-
-    return vec![];
-}
-
 #[cfg(test)]
 mod tests {
     use super::{Agent, BareJid, ClientBuilder, ClientFeature, ClientType, Event};

xmpp/src/upload/mod.rs 🔗

@@ -0,0 +1,65 @@
+// Copyright (c) 2023 xmpp-rs contributors.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use reqwest::{
+    header::HeaderMap as ReqwestHeaderMap, Body as ReqwestBody, Client as ReqwestClient,
+};
+use std::path::PathBuf;
+use tokio::fs::File;
+use tokio_util::codec::{BytesCodec, FramedRead};
+use tokio_xmpp::{
+    parsers::http_upload::{Header as HttpUploadHeader, SlotResult},
+    Element, Jid,
+};
+
+use crate::{Agent, Event};
+
+pub async fn handle_upload_result(
+    from: &Jid,
+    iqid: String,
+    elem: Element,
+    agent: &mut Agent,
+) -> impl IntoIterator<Item = Event> {
+    let mut res: Option<(usize, PathBuf)> = None;
+
+    for (i, (id, to, filepath)) in agent.uploads.iter().enumerate() {
+        if to == from && id == &iqid {
+            res = Some((i, filepath.to_path_buf()));
+            break;
+        }
+    }
+
+    if let Some((index, file)) = res {
+        agent.uploads.remove(index);
+        let slot = SlotResult::try_from(elem).unwrap();
+
+        let mut headers = ReqwestHeaderMap::new();
+        for header in slot.put.headers {
+            let (attr, val) = match header {
+                HttpUploadHeader::Authorization(val) => ("Authorization", val),
+                HttpUploadHeader::Cookie(val) => ("Cookie", val),
+                HttpUploadHeader::Expires(val) => ("Expires", val),
+            };
+            headers.insert(attr, val.parse().unwrap());
+        }
+
+        let web = ReqwestClient::new();
+        let stream = FramedRead::new(File::open(file).await.unwrap(), BytesCodec::new());
+        let body = ReqwestBody::wrap_stream(stream);
+        let res = web
+            .put(slot.put.url.as_str())
+            .headers(headers)
+            .body(body)
+            .send()
+            .await
+            .unwrap();
+        if res.status() == 201 {
+            return vec![Event::HttpUploadedFile(slot.get.url)];
+        }
+    }
+
+    return vec![];
+}