Skip to content

Instantly share code, notes, and snippets.

@badboy
Last active April 16, 2018 17:33
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save badboy/7b740a22b606cd544a5d3dd369e42541 to your computer and use it in GitHub Desktop.
Save badboy/7b740a22b606cd544a5d3dd369e42541 to your computer and use it in GitHub Desktop.
extern crate reqwest;
extern crate flate2;
extern crate chrono;
#[macro_use]
extern crate log;
extern crate env_logger;
use std::process;
use std::env;
use std::fs::{self, File};
use std::io::BufReader;
use std::io::prelude::*;
use std::time::SystemTime;
use flate2::bufread::GzEncoder;
use flate2::Compression;
use reqwest::StatusCode;
use reqwest::header::{Headers, UserAgent, ContentEncoding, Encoding, Date, HttpDate};
const USER_AGENT : &str = "pingsender/1.0";
const CUSTOM_VERSION_HEADER : &str = "X-PingSenderVersion";
const CUSTOM_VERSION: &str = "1.0";
fn main() {
env_logger::init();
match run() {
Ok(()) => {},
Err(e) => {
warn!("{}", e);
process::exit(1);
}
}
}
fn run() -> Result<(), &'static str> {
let args = env::args().skip(1).collect::<Vec<_>>();
if args.len() != 2 {
return Err("Usage pingsender URL PATH");
}
let url = &args[0];
let path = &args[1];
let f = File::open(path).map_err(|_| "Could not open ping file")?;
let reader = BufReader::new(f);
let level = Compression::new(6); // default compression level
let mut gz = GzEncoder::new(reader, level);
let mut buffer = Vec::new();
gz.read_to_end(&mut buffer).map_err(|_| "Could not read ping file")?;
let mut headers = Headers::new();
headers.set(UserAgent::new(USER_AGENT));
headers.set(ContentEncoding(vec![Encoding::Gzip]));
headers.set(Date(HttpDate::from(SystemTime::now())));
headers.set_raw(CUSTOM_VERSION_HEADER, CUSTOM_VERSION);
let client = reqwest::Client::new();
let res = client.post(url)
.headers(headers)
.body(buffer)
.send().map_err(|_| "Could not send HTTP request")?;
if res.status() == StatusCode::Ok {
fs::remove_file(path).map_err(|_| "Could not remove ping file")
} else {
Err("Failed to send HTTP request")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment