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    proxy: ProxyConfig,
11    optimizer: Optimizer,
12}
13
14impl SftpDownloader {
15    pub fn new(url: String, output: String, quiet: bool, proxy: ProxyConfig, optimizer: Optimizer) -> Self {
16        Self {
17            url,
18            output,
19            quiet,
20            proxy,
21            optimizer,
22        }
23    }
24
25    pub fn download(&self) -> Result<(), Box<dyn Error + Send + Sync>> {
26        let tcp = std::net::TcpStream::connect(&self.url)?;
27        let mut sess = ssh2::Session::new()?;
28        sess.set_tcp_stream(tcp);
29        sess.handshake()?;
30        
31        let sftp = sess.sftp()?;
32        let mut remote_file = sftp.open(std::path::Path::new(&self.url))?;
33        let mut contents = Vec::new();
34        remote_file.read_to_end(&mut contents)?;
35        
36        std::fs::write(&self.output, contents)?;
37        
38        if !self.quiet {
39            println!("Downloaded {} to {}", self.url, self.output);
40        }
41        Ok(())
42    }
43}