-
Notifications
You must be signed in to change notification settings - Fork 5
/
xfeature_compression.rs
81 lines (69 loc) · 2.12 KB
/
xfeature_compression.rs
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
80
81
use brokaw::types::command::{XFeatureCompress, XOver};
use brokaw::types::ArticleNumber;
use brokaw::*;
use log::*;
use structopt::StructOpt;
/// A program for getting compressed headers
#[derive(Debug, StructOpt)]
struct Opt {
#[structopt(long, short)]
address: String,
#[structopt(long, short, default_value = "563")]
port: u16,
/// The group to read the headers from
#[structopt(long, short)]
group: String,
/// The number of headers to retrieve
#[structopt(long, short)]
num_headers: ArticleNumber,
#[structopt(long)]
username: String,
#[structopt(long)]
password: Option<String>,
}
fn main() -> anyhow::Result<()> {
env_logger::from_env(env_logger::Env::default().default_filter_or("debug")).init();
let Opt {
address,
port,
group,
num_headers,
username,
password,
} = Opt::from_args();
let password = if let Some(pw) = password {
pw
} else {
rpassword::prompt_password_stderr("Password: ")?
};
info!("Creating client...");
let mut client = ClientConfig::default()
.group(Some(group.clone()))
.authinfo_user_pass(username, password)
.connection_config(
ConnectionConfig::new()
.compression(Some(Compression::XFeature))
.default_tls(&address)?
.to_owned(),
)
.connect((address.as_str(), port))?;
let group = client.group().unwrap().to_owned();
info!(
"Group {name} has a {number} headers ranging from {low} to {high}",
name = group.name,
low = group.low,
high = group.high,
number = group.number
);
info!("Enabling header compression");
client.command(XFeatureCompress)?.fail_unless(290)?;
let high = group.high;
let low = high - num_headers;
info!("Retrieving headers {} through {}", low, high);
let resp = client.conn().command(&XOver::Range { low, high })?;
resp.data_blocks().unwrap().lines().for_each(|header| {
let s = String::from_utf8_lossy(header).to_string();
println!("{}", s);
});
Ok(())
}