1
1
use crate :: cli:: app_config:: Cli ;
2
2
use crate :: ftp;
3
+ use async_std:: fs:: File ;
3
4
use async_std:: path:: Path ;
4
5
use env_logger:: Builder ;
5
6
use futures:: io:: BufReader ;
@@ -8,13 +9,13 @@ use indicatif::ProgressStyle;
8
9
use log:: LevelFilter ;
9
10
use std:: pin:: Pin ;
10
11
use std:: task:: Context ;
11
-
12
- use async_std:: fs:: File ;
13
12
use std:: task:: Poll ;
14
13
use suppaftp:: async_native_tls:: TlsConnector ;
15
14
use suppaftp:: types:: FileType ;
16
15
use suppaftp:: { AsyncNativeTlsConnector , AsyncNativeTlsFtpStream } ;
16
+ use tokio:: fs:: OpenOptions ;
17
17
use tokio:: io:: AsyncReadExt ;
18
+ use tokio:: io:: AsyncWriteExt ;
18
19
use tokio:: io:: { self , AsyncBufReadExt } ;
19
20
#[ derive( Debug ) ]
20
21
pub struct ProgressBarIter < T > {
@@ -58,7 +59,7 @@ pub async fn ftp_request(cli: Cli, scheme: &str) -> Result<(), anyhow::Error> {
58
59
. await ?;
59
60
} ;
60
61
61
- if let Some ( authority) = cli. authority_option {
62
+ if let Some ( authority) = cli. authority_option . clone ( ) {
62
63
let split: Vec < & str > = authority. splitn ( 2 , ':' ) . collect ( ) ;
63
64
ensure ! ( split. len( ) == 2 , "User data error" ) ;
64
65
ftp_stream
@@ -89,14 +90,40 @@ pub async fn ftp_request(cli: Cli, scheme: &str) -> Result<(), anyhow::Error> {
89
90
} ;
90
91
let _ = ftp_stream. put_file ( String :: from ( file_name) , & mut pro) . await ;
91
92
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 ( ) {
93
94
let response = ftp_stream. site ( quote) . await ?;
94
95
} else {
95
96
let file_list = ftp_stream
96
97
. list ( None )
97
98
. await
98
99
. 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( ) ) ) ;
100
127
}
101
128
Ok ( ( ) )
102
129
}
0 commit comments