Move handle_upload_result to upload::receive module
This commit is contained in:
parent
d689759439
commit
97f4232db7
3 changed files with 68 additions and 60 deletions
|
@ -71,7 +71,8 @@ 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 = upload::handle_upload_result(&from, iq.id, payload, agent).await;
|
||||
let new_events =
|
||||
upload::receive::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) {
|
||||
|
|
|
@ -4,62 +4,4 @@
|
|||
// 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![];
|
||||
}
|
||||
pub mod receive;
|
||||
|
|
65
xmpp/src/upload/receive.rs
Normal file
65
xmpp/src/upload/receive.rs
Normal file
|
@ -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![];
|
||||
}
|
Loading…
Reference in a new issue