Skip to main content

kget/sftp/
mod.rs

1use std::error::Error;
2use std::io::Read;
3use crate::config::ProxyConfig;
4use crate::optimization::Optimizer;
5
6pub struct SftpDownloader {
7    url: String,
8    output: String,
9    quiet: bool,
10    #[allow(dead_code)]
11    proxy: ProxyConfig,
12    #[allow(dead_code)]
13    optimizer: Optimizer,
14}
15
16impl SftpDownloader {
17    pub fn new(url: String, output: String, quiet: bool, proxy: ProxyConfig, optimizer: Optimizer) -> Self {
18        Self {
19            url,
20            output,
21            quiet,
22            proxy,
23            optimizer,
24        }
25    }
26
27    pub fn download(&self) -> Result<(), Box<dyn Error + Send + Sync>> {
28        let tcp = std::net::TcpStream::connect(&self.url)?;
29        let mut sess = ssh2::Session::new()?;
30        sess.set_tcp_stream(tcp);
31        sess.handshake()?;
32        
33        let sftp = sess.sftp()?;
34        let mut remote_file = sftp.open(std::path::Path::new(&self.url))?;
35        let mut contents = Vec::new();
36        remote_file.read_to_end(&mut contents)?;
37        
38        std::fs::write(&self.output, contents)?;
39        
40        if !self.quiet {
41            println!("Downloaded {} to {}", self.url, self.output);
42        }
43        Ok(())
44    }
45}