extern crate env_logger;
extern crate futures;
extern crate hyper;
extern crate messagebird_async as messagebird;
extern crate tokio_core;
use futures::{future, Future};
use hyper::client::HttpConnector;
use hyper::service::service_fn;
use hyper::{Body, Client, Method, Request, Response, Server, StatusCode};
use std::sync::{Arc, RwLock};
static NOTFOUND: &[u8] = b"Not Found";
fn incoming(
req: Request
,
_client: &Client,
latest: &Arc>>,
) -> Box, Error = hyper::Error> + Send> {
println!("incoming!");
let method = req.method();
let uri = req.uri();
match (method, uri.path(), uri.query()) {
(&Method::GET, "/vmn", Some(query)) => {
let x = query
.parse::()
.expect("Failed to parse");
let mut guard = latest.write().unwrap();
*guard = Some(format!("vmn {}", query));
println!("notfied of vmn sms {:?}", x);
let body = format!("notfied of shortcode sms {:?}", x);
let response = Response::builder()
.status(StatusCode::OK)
.header(hyper::header::CONTENT_LENGTH, format!("{}", body.len()))
.body(body.into())
.unwrap();
Box::new(future::ok(response))
}
(&Method::GET, "/short", Some(query)) | (&Method::GET, "/shortcode", Some(query)) => {
let x = query
.parse::()
.expect("Failed to parse");
let mut guard = latest.write().unwrap();
*guard = Some(format!("shortcode {}", query));
println!("notfied of shortcode sms {:?}", x);
let body = format!("notfied of shortcode sms {:?}", x);
let response = Response::builder()
.status(StatusCode::OK)
.header(hyper::header::CONTENT_LENGTH, format!("{}", body.len()))
.body(body.into())
.unwrap();
Box::new(future::ok(response))
}
(&Method::GET, "/latest", None) => {
let guard = latest.read().unwrap();
let body = format!("latest: {:?}", *guard);
let response = Response::builder()
.status(StatusCode::OK)
.header(hyper::header::CONTENT_LENGTH, format!("{}", body.len()))
.body(body.into())
.unwrap();
Box::new(future::ok(response))
}
_ => {
// Return 404 not found response.
let body = Body::from(NOTFOUND);
let response = Response::builder()
.status(StatusCode::NOT_FOUND)
.body(body)
.unwrap();
Box::new(future::ok(response))
}
}
}
fn main() {
env_logger::init();
let addr = "127.0.0.1:8181".parse().unwrap();
let latest: Option = None;
let latest = Arc::new(RwLock::new(latest));
hyper::rt::run(future::lazy(move || {
let client = Client::new();
let service = move || {
let client = client.clone();
let latest = latest.clone();
service_fn(move |req| incoming(req, &client, &latest))
};
let server = Server::bind(&addr)
.serve(service)
.map_err(|e| eprintln!("server error: {}", e));
println!("Listening on http://{}", addr);
server
}));
}