Skip to content

Commit 7b0fcf1

Browse files
authored
Merge pull request #34 from lsk569937453/dev
Add the "-o" and "-r" for ftp/ftps.
2 parents 012d3f8 + 9245398 commit 7b0fcf1

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

Diff for: Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rcurl"
3-
version = "0.0.20"
3+
version = "0.0.21"
44
edition = "2021"
55

66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -25,6 +25,7 @@ indicatif = "0.17.7"
2525
mime_guess = "2.0.4"
2626
openssl = { version = "0.10", features = ["vendored"] }
2727
pki-types = { package = "rustls-pki-types", version = "1" }
28+
http-range-header = "0.4.1"
2829
rustls = { version = "0.23.5", default-features = false, features = [
2930
"logging",
3031
"ring",

Diff for: src/ftp/handler.rs

+32-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::cli::app_config::Cli;
22
use crate::ftp;
3+
use async_std::fs::File;
34
use async_std::path::Path;
45
use env_logger::Builder;
56
use futures::io::BufReader;
@@ -8,13 +9,13 @@ use indicatif::ProgressStyle;
89
use log::LevelFilter;
910
use std::pin::Pin;
1011
use std::task::Context;
11-
12-
use async_std::fs::File;
1312
use std::task::Poll;
1413
use suppaftp::async_native_tls::TlsConnector;
1514
use suppaftp::types::FileType;
1615
use suppaftp::{AsyncNativeTlsConnector, AsyncNativeTlsFtpStream};
16+
use tokio::fs::OpenOptions;
1717
use tokio::io::AsyncReadExt;
18+
use tokio::io::AsyncWriteExt;
1819
use tokio::io::{self, AsyncBufReadExt};
1920
#[derive(Debug)]
2021
pub struct ProgressBarIter<T> {
@@ -58,7 +59,7 @@ pub async fn ftp_request(cli: Cli, scheme: &str) -> Result<(), anyhow::Error> {
5859
.await?;
5960
};
6061

61-
if let Some(authority) = cli.authority_option {
62+
if let Some(authority) = cli.authority_option.clone() {
6263
let split: Vec<&str> = authority.splitn(2, ':').collect();
6364
ensure!(split.len() == 2, "User data error");
6465
ftp_stream
@@ -89,14 +90,40 @@ pub async fn ftp_request(cli: Cli, scheme: &str) -> Result<(), anyhow::Error> {
8990
};
9091
let _ = ftp_stream.put_file(String::from(file_name), &mut pro).await;
9192
pb.finish_with_message("upload success");
92-
} else if let Some(quote) = cli.quote_option {
93+
} else if let Some(quote) = cli.quote_option.clone() {
9394
let response = ftp_stream.site(quote).await?;
9495
} else {
9596
let file_list = ftp_stream
9697
.list(None)
9798
.await
9899
.map_err(|e| anyhow!("Command failed, error:{}", e))?;
99-
file_list.iter().for_each(|f| println!("{f}"));
100+
let str = format!("{:?}", file_list);
101+
output(cli, str.as_bytes().to_vec()).await?;
102+
}
103+
Ok(())
104+
}
105+
async fn output(cli: Cli, mut item: Vec<u8>) -> Result<(), anyhow::Error> {
106+
if let Some(range) = cli.range_option {
107+
let parsed_range = http_range_header::parse_range_header(&range)?;
108+
let vec_ranges = parsed_range.validate(item.len() as u64)?;
109+
let mut concatenated_bytes = Vec::new();
110+
for range in vec_ranges {
111+
let start = *range.start() as usize;
112+
let end = *range.end() as usize;
113+
let bytes = item[start..end].to_vec();
114+
concatenated_bytes.extend(bytes);
115+
}
116+
item = concatenated_bytes.clone();
117+
}
118+
if let Some(file_path) = cli.file_path_option {
119+
let mut file = OpenOptions::new()
120+
.write(true)
121+
.create(true)
122+
.open(file_path)
123+
.await?;
124+
let _ = file.write_all(item.as_slice()).await;
125+
} else {
126+
println!("{}", String::from_utf8_lossy(item.as_slice()));
100127
}
101128
Ok(())
102129
}

0 commit comments

Comments
 (0)