request validation uses results instead of just returning true or false
This commit is contained in:
parent
52f1a9034c
commit
d4c3ec39c0
|
@ -26,10 +26,14 @@ pub fn hub(state: web::Data<AppState>, _req: HttpRequest, params: String) -> Htt
|
||||||
parameters.insert(key.to_string(), value.to_string());
|
parameters.insert(key.to_string(), value.to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
if !validate_parsed_data(¶meters) {
|
match validate_parsed_data(¶meters) {
|
||||||
return HttpResponse::Ok()
|
Ok(_) => debug!(log, "Valid request."),
|
||||||
.status(http::StatusCode::BAD_REQUEST)
|
Err(reason) => {
|
||||||
.finish();
|
return HttpResponse::Ok()
|
||||||
|
.status(http::StatusCode::BAD_REQUEST)
|
||||||
|
.content_type("text/plain")
|
||||||
|
.body(reason)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handle_subscription(db, ¶meters);
|
handle_subscription(db, ¶meters);
|
||||||
|
|
14
src/main.rs
14
src/main.rs
|
@ -9,7 +9,7 @@ extern crate slog;
|
||||||
extern crate slog_async;
|
extern crate slog_async;
|
||||||
extern crate slog_term;
|
extern crate slog_term;
|
||||||
extern crate url;
|
extern crate url;
|
||||||
use actix::{System};
|
use actix::System;
|
||||||
use actix_web::{web, App, HttpServer};
|
use actix_web::{web, App, HttpServer};
|
||||||
use clap::Arg;
|
use clap::Arg;
|
||||||
use controllers::{hub, index};
|
use controllers::{hub, index};
|
||||||
|
@ -24,8 +24,6 @@ mod schema;
|
||||||
mod utils;
|
mod utils;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let log = setup_logging();
|
|
||||||
info!(log, "Launching hub");
|
|
||||||
let matches = clap::App::new("Rusty Hub")
|
let matches = clap::App::new("Rusty Hub")
|
||||||
.version("0.1.0")
|
.version("0.1.0")
|
||||||
.author("Gonçalo Valério <gon@ovalerio.net>")
|
.author("Gonçalo Valério <gon@ovalerio.net>")
|
||||||
|
@ -35,23 +33,27 @@ fn main() {
|
||||||
.short("c")
|
.short("c")
|
||||||
.long("config")
|
.long("config")
|
||||||
.value_name("FILE")
|
.value_name("FILE")
|
||||||
.help("Sets a custom config file")
|
.help("Set a custom config file")
|
||||||
.takes_value(true),
|
.takes_value(true),
|
||||||
)
|
)
|
||||||
.get_matches();
|
.get_matches();
|
||||||
|
|
||||||
|
let log = setup_logging();
|
||||||
|
info!(log, "Launching hub");
|
||||||
|
|
||||||
let address = "127.0.0.1";
|
let address = "127.0.0.1";
|
||||||
let port = "8888";
|
let port = "8888";
|
||||||
|
let storage = "local.db";
|
||||||
|
|
||||||
info!(log, "Loading configuration");
|
info!(log, "Loading configuration");
|
||||||
let config = matches.value_of("config").unwrap_or("");
|
let config = matches.value_of("config").unwrap_or("");
|
||||||
if !config.is_empty() {
|
if !config.is_empty() {
|
||||||
println!("Not implemented");
|
error!(log, "Configuration not implemented yet");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let sys = System::new("rusty-hub");
|
let sys = System::new("rusty-hub");
|
||||||
let manager = ConnectionManager::<SqliteConnection>::new("local.db");
|
let manager = ConnectionManager::<SqliteConnection>::new(storage);
|
||||||
let pool = r2d2::Pool::builder()
|
let pool = r2d2::Pool::builder()
|
||||||
.build(manager)
|
.build(manager)
|
||||||
.expect("Failed to create pool.");
|
.expect("Failed to create pool.");
|
||||||
|
|
45
src/utils.rs
45
src/utils.rs
|
@ -19,39 +19,62 @@ pub fn setup_logging() -> slog::Logger {
|
||||||
slog::Logger::root(drain, o!())
|
slog::Logger::root(drain, o!())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn validate_parsed_data(parameters: &HashMap<String,String>) -> bool {
|
pub fn validate_parsed_data(parameters: &HashMap<String, String>) -> Result<(), String> {
|
||||||
let callback;
|
let callback;
|
||||||
let mode;
|
let mode;
|
||||||
let topic;
|
let topic;
|
||||||
|
|
||||||
match parameters.get("hub.callback") {
|
match parameters.get("hub.callback") {
|
||||||
Some(value) => callback = value,
|
Some(value) => callback = value,
|
||||||
None => return false,
|
None => return Err("No hub.callback specified".to_owned()),
|
||||||
};
|
};
|
||||||
|
|
||||||
match parameters.get("hub.mode") {
|
match parameters.get("hub.mode") {
|
||||||
Some(value) => mode = value,
|
Some(value) => mode = value,
|
||||||
None => return false,
|
None => return Err("No hub.mode specified".to_owned()),
|
||||||
};
|
};
|
||||||
|
|
||||||
match parameters.get("hub.topic") {
|
match parameters.get("hub.topic") {
|
||||||
Some(value) => topic = value,
|
Some(value) => topic = value,
|
||||||
None => return false,
|
None => return Err("No hub.topicspecified".to_owned()),
|
||||||
};
|
};
|
||||||
|
|
||||||
if mode != &"subscribe" && mode != &"unsubscribe" {
|
if mode != &"subscribe" && mode != &"unsubscribe" {
|
||||||
debug!(setup_logging(), "Invalid Method: {}", mode);
|
return Err(format!("Invalid Method: {}", mode));
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
match Url::parse(callback) {
|
match Url::parse(callback) {
|
||||||
Ok(value) => debug!(setup_logging(), "Valid Callback: {}", value),
|
Ok(value) => debug!(setup_logging(), "Valid Callback: {}", value),
|
||||||
Err(_) => return false,
|
Err(_) => return Err("hub.callback is not a valid URL".to_owned()),
|
||||||
}
|
};
|
||||||
|
|
||||||
match Url::parse(topic) {
|
match Url::parse(topic) {
|
||||||
Ok(value) => debug!(setup_logging(), "Valid Topic: {}", value),
|
Ok(value) => debug!(setup_logging(), "Valid Topic: {}", value),
|
||||||
Err(_) => return false,
|
Err(_) => return Err("hub.topic is not a valid URL".to_owned()),
|
||||||
}
|
};
|
||||||
true
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_validate_parsed_data_is_valid() {
|
||||||
|
let mut params = HashMap::new();
|
||||||
|
params.insert("hub.callback".to_string(), "http://example.com".to_string());
|
||||||
|
params.insert("hub.topic".to_string(), "http://example2.com".to_string());
|
||||||
|
params.insert("hub.mode".to_string(), "subscribe".to_string());
|
||||||
|
|
||||||
|
let result = validate_parsed_data(¶ms);
|
||||||
|
assert_eq!(result.is_ok(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_validate_parsed_data_is_invalid() {
|
||||||
|
let params = HashMap::new();
|
||||||
|
let result = validate_parsed_data(¶ms);
|
||||||
|
assert_eq!(result.is_ok(), false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue