feat: update osssendfile-rs
This commit is contained in:
@@ -8,12 +8,13 @@
|
||||
//! hex = "0.4.3"
|
||||
//! oss = "0.3.2"
|
||||
//! rand = "0.8.5"
|
||||
//! reqwest = "0.12"
|
||||
//! reqwest = { version = "0.12", features = ["stream"] }
|
||||
//! rust_util = "0.6.47"
|
||||
//! serde = { version = "1.0", features = ["derive"] }
|
||||
//! serde_json = "1.0"
|
||||
//! sha2 = "0.10.8"
|
||||
//! tokio = { version = "1.39", features = ["full"] }
|
||||
//! tokio-util = "0.7.11"
|
||||
//! ```
|
||||
|
||||
use aes_gcm_stream::Aes128GcmStreamEncryptor;
|
||||
@@ -21,21 +22,21 @@ use base64::engine::general_purpose::STANDARD;
|
||||
use base64::Engine;
|
||||
use clap::Parser;
|
||||
use oss::OSSClient;
|
||||
use reqwest::{Client, Response};
|
||||
use reqwest::{Body, Client, Response};
|
||||
use rust_util::util_io::DEFAULT_BUF_SIZE;
|
||||
use rust_util::{
|
||||
failure, information, opt_result, opt_value_result, simple_error, success,
|
||||
util_file, util_size, util_time, warning, XResult,
|
||||
};
|
||||
use rust_util::{failure, information, opt_result, opt_value_result, simple_error, success, util_file, util_msg, util_size, util_time, warning, XResult};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::Value;
|
||||
use sha2::Digest;
|
||||
use sha2::Sha256;
|
||||
use std::collections::HashMap;
|
||||
use std::fs;
|
||||
use std::fs::File;
|
||||
use std::io::{ErrorKind, Read, Write};
|
||||
use std::path::PathBuf;
|
||||
use std::{fs, io};
|
||||
use tokio::fs::File as TokioFile;
|
||||
use tokio_util::bytes::BytesMut;
|
||||
use tokio_util::codec::{Decoder, FramedRead};
|
||||
|
||||
const OSS_SEND_FILE_CONFIG_FILE: &str = "~/.jssp/config/osssendfile.json";
|
||||
const CREATE_STS_URL: &str = "https://hatter.ink/oidc/create_sts.json";
|
||||
@@ -104,6 +105,45 @@ struct SendFileResponse {
|
||||
sha256: String,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Default)]
|
||||
pub struct CustomBytesCodec {
|
||||
read_len: u64,
|
||||
total_len: u64,
|
||||
}
|
||||
|
||||
impl CustomBytesCodec {
|
||||
pub fn new(total_len: u64) -> CustomBytesCodec {
|
||||
CustomBytesCodec {
|
||||
read_len: 0,
|
||||
total_len,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Decoder for CustomBytesCodec {
|
||||
type Item = BytesMut;
|
||||
type Error = io::Error;
|
||||
|
||||
fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<BytesMut>, io::Error> {
|
||||
if !buf.is_empty() {
|
||||
let len = buf.len();
|
||||
self.read_len += len as u64;
|
||||
util_msg::print_lastline(&format!(
|
||||
"Copied {}, total: {}",
|
||||
util_size::get_display_size(self.read_len as i64),
|
||||
if self.total_len == 0 {
|
||||
"-".to_string()
|
||||
} else {
|
||||
util_size::get_display_size(self.total_len as i64)
|
||||
}
|
||||
));
|
||||
Ok(Some(buf.split_to(len)))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> XResult<()> {
|
||||
let args = OssSendFileArgs::parse();
|
||||
@@ -147,10 +187,17 @@ async fn main() -> XResult<()> {
|
||||
|
||||
let temp_oss_filename = format!("tempfiles/temp_transfer_{}.{}", util_time::get_current_millis(), filename_ext);
|
||||
|
||||
let temp_file_len = temp_file.metadata().map(|m| m.len()).unwrap_or(0);
|
||||
information!("Put object {:?} -> {}", &temp_file, &temp_oss_filename);
|
||||
let temp_file_read = opt_result!(File::open(&temp_file), "Read temp file failed: {}");
|
||||
let put_object_response = oss_client.put_file(
|
||||
&oss_send_file_config.bucket, &temp_oss_filename, 600, temp_file_read).await?;
|
||||
// thanks: https://stackoverflow.com/questions/65814450/how-to-post-a-file-using-reqwest
|
||||
let temp_file_read = opt_result!(TokioFile::open(&temp_file).await, "Read temp file failed: {}");
|
||||
let temp_file_stream = FramedRead::new(temp_file_read, CustomBytesCodec::new(temp_file_len));
|
||||
let temp_file_body = Body::wrap_stream(temp_file_stream);
|
||||
|
||||
let put_object_response = oss_client.put_body(
|
||||
&oss_send_file_config.bucket, &temp_oss_filename, 600, temp_file_body).await?;
|
||||
|
||||
util_msg::clear_lastline();
|
||||
if !put_object_response.status().is_success() {
|
||||
return simple_error!("Put object failed, status: {}", put_object_response.status().as_u16());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user