File: mod.rs

package info (click to toggle)
rust-binary-install 0.4.1%2Bds-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 280 kB
  • sloc: makefile: 2; sh: 1
file content (79 lines) | stat: -rw-r--r-- 2,137 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use flate2::write::GzEncoder;
use flate2::Compression;
use std::fs::{File, OpenOptions};
use std::io::{self, Read, Write};
use std::net::TcpListener;
use std::sync::mpsc::{channel, Receiver};
use std::thread;

pub const TEST_SERVER_HOST: &'static str = "localhost";

pub fn start_server(tarball: Option<Vec<u8>>, server_port: Option<u16>) -> Receiver<u16> {
    let (sender, receiver) = channel();

    thread::spawn(move || {
        TcpListener::bind(format!(
            "{}:{}",
            TEST_SERVER_HOST,
            server_port.unwrap_or_else(|| 0)
        ))
        .map(|listener| {
            sender.send(listener.local_addr().unwrap().port()).unwrap();

            for stream in listener.incoming() {
                let mut stream = stream.unwrap();

                let mut buffer = [0; 512];

                stream.read(&mut buffer).unwrap();

                let response = "HTTP/1.1 200 OK\r\n\r\n";

                stream.write(response.as_bytes()).unwrap();

                match tarball.to_owned() {
                    Some(tar) => {
                        stream.write(tar.as_ref()).unwrap();
                    }
                    None => {}
                }

                stream.flush().unwrap();
            }
        })
        .unwrap();
    });

    receiver
}

pub fn create_tarball(binary_name: &str) -> Result<Vec<u8>, io::Error> {
    let temp_dir = tempfile::TempDir::new().unwrap();
    let full_path = temp_dir.path().join(binary_name.to_owned() + ".tar.gz");

    let tar = OpenOptions::new()
        .create(true)
        .read(true)
        .write(true)
        .open(&full_path)?;

    let mut file = OpenOptions::new()
        .create(true)
        .read(true)
        .write(true)
        .open(temp_dir.path().join(binary_name))?;

    let mut encoder = GzEncoder::new(tar, Compression::default());
    {
        let mut archive = tar::Builder::new(&mut encoder);
        archive.append_file(binary_name, &mut file)?;
    }

    let mut contents = vec![];

    encoder.finish()?;

    File::open(temp_dir.path().join(&full_path))?.read_to_end(&mut contents)?;

    Ok(contents)
}