xmpp: pass in headers for http upload

Maxime “pep” Buquet created

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>

Change summary

xmpp/src/lib.rs | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)

Detailed changes

xmpp/src/lib.rs 🔗

@@ -7,7 +7,9 @@
 #![deny(bare_trait_objects)]
 
 use futures::stream::StreamExt;
-use reqwest::{Body as ReqwestBody, Client as ReqwestClient};
+use reqwest::{
+    header::HeaderMap as ReqwestHeaderMap, Body as ReqwestBody, Client as ReqwestClient,
+};
 use std::cell::RefCell;
 use std::convert::TryFrom;
 use std::path::{Path, PathBuf};
@@ -20,7 +22,7 @@ use xmpp_parsers::{
     caps::{compute_disco, hash_caps, Caps},
     disco::{DiscoInfoQuery, DiscoInfoResult, Feature, Identity},
     hashes::Algo,
-    http_upload::{SlotRequest, SlotResult},
+    http_upload::{Header as HttpUploadHeader, SlotRequest, SlotResult},
     iq::{Iq, IqType},
     message::{Body, Message, MessageType},
     muc::{
@@ -468,11 +470,23 @@ async fn handle_upload_result(
     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