Add more parameters to cureq example (#371)

This commit is contained in:
Jacob Hoffman-Andrews
2021-04-17 12:04:44 -07:00
committed by GitHub
parent 4ade506047
commit 5e4b37a393

View File

@@ -1,6 +1,7 @@
use std::error;
use std::fmt;
use std::io;
use std::thread;
use std::time::Duration;
use std::{env, sync::Arc};
@@ -64,8 +65,19 @@ impl From<io::Error> for Error {
}
}
fn get(agent: &ureq::Agent, url: &str, print_headers: bool) -> Result<(), Error> {
let response = agent.get(url).call()?;
fn perform(
agent: &ureq::Agent,
method: &str,
url: &str,
data: &[u8],
print_headers: bool,
) -> Result<(), Error> {
let req = agent.request(method, url);
let response = if method == "GET" && data.len() == 0 {
req.call()?
} else {
req.send_bytes(data)?
};
if print_headers {
println!(
"{} {} {}",
@@ -108,29 +120,43 @@ fn main() {
}
fn main2() -> Result<(), Error> {
let mut args: Vec<String> = env::args().collect();
if args.len() == 1 {
let mut args = env::args();
if args.next().is_none() {
println!(
r##"Usage: {:#?} url [url ...]
-i Include headers when printing response
-X <method> Use the given request method (GET, POST, etc)
-d <string> Use the given data as the request body (useful for POST)
--wait <n> Wait n seconds between requests
-k Ignore certificate errors
Fetch url and copy it to stdout.
"##,
env::current_exe()?
);
return Ok(());
}
args.remove(0);
env_logger::init();
let mut builder = ureq::builder()
.timeout_connect(Duration::from_secs(30))
.timeout(Duration::from_secs(300));
let flags: Vec<&String> = args.iter().filter(|s| s.starts_with("-")).collect();
let nonflags: Vec<&String> = args.iter().filter(|s| !s.starts_with("-")).collect();
let mut nonflags: Vec<String> = vec![];
let mut print_headers: bool = false;
for flag in flags {
match flag.as_ref() {
let mut method: String = "GET".into();
let mut data: Vec<u8> = vec![];
let mut wait = Duration::new(0, 0);
while let Some(arg) = args.next() {
match arg.as_ref() {
"-i" => print_headers = true,
"-X" => method = args.next().expect("flag -X requires a value"),
"-d" => data = args.next().expect("flag -d requires a value").into(),
"--wait" => {
let wait_string: String = args.next().expect("flag --wait requires a value").into();
let wait_seconds: u64 = wait_string.parse().expect("invalid --wait flag");
wait = Duration::from_secs(wait_seconds);
}
"-k" => {
let mut client_config = ClientConfig::new();
client_config
@@ -138,14 +164,22 @@ Fetch url and copy it to stdout.
.set_certificate_verifier(Arc::new(AcceptAll {}));
builder = builder.tls_config(Arc::new(client_config));
}
f => Err(StringError(format!("unrecognized flag '{}'", f)))?,
arg => {
if arg.starts_with("-") {
Err(StringError(format!("unrecognized flag '{}'", arg)))?;
}
nonflags.push(arg.to_owned());
}
}
}
let agent = builder.build();
for url in nonflags {
get(&agent, &url, print_headers)?;
for (i, url) in nonflags.iter().enumerate() {
perform(&agent, &method, &url, &data, print_headers)?;
if i != nonflags.len() - 1 {
thread::sleep(wait);
}
}
Ok(())
}