From 1b4e220b52ff77b4411c20539abb99aa5d9d8010 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Tue, 25 Oct 2016 05:02:26 -0400 Subject: [PATCH] Cleanup, error handling --- TODO.md | 4 ++ deploy.sh | 3 +- src/error.rs | 22 +++++++++++ src/handlers/audio_synth_handler.rs | 61 ++++++++++++++--------------- src/handlers/file_server_handler.rs | 9 +++-- web/index.html | 21 +++++----- web/robots.txt | 2 + 7 files changed, 75 insertions(+), 47 deletions(-) create mode 100644 web/robots.txt diff --git a/TODO.md b/TODO.md index bc6c925f1b..80904d3b5b 100644 --- a/TODO.md +++ b/TODO.md @@ -42,6 +42,10 @@ Scaling 4. Prevent others from calling it 5. Caching strategy +Server + 1. Favicon, .ico and apple icon + 2. robots.txt + Hardening 1. Reduce API surface 2. Limit length of input sentences diff --git a/deploy.sh b/deploy.sh index 2e40e4f809..22b380d3a1 100755 --- a/deploy.sh +++ b/deploy.sh @@ -12,8 +12,7 @@ rsync -utrv config.toml bt@jungle.horse:/home/bt/dev/trumpet # Frontend rsync -utrv web/images bt@jungle.horse:/home/bt/dev/trumpet/web -rsync -utrv web/*css bt@jungle.horse:/home/bt/dev/trumpet/web -rsync -utrv web/*html bt@jungle.horse:/home/bt/dev/trumpet/web +rsync -utrv web/{*css,*html,*txt} bt@jungle.horse:/home/bt/dev/trumpet/web pushd frontend webpack popd diff --git a/src/error.rs b/src/error.rs index 1697a8438d..48e47cbdb0 100644 --- a/src/error.rs +++ b/src/error.rs @@ -2,6 +2,8 @@ use hound::Error as HoundError; use std::convert::From; +use std::error::Error; +use std::fmt; use std::io; /** The common error type used throughout the synthesizer. */ @@ -13,6 +15,9 @@ pub enum SynthError { /// The file was empty or did not have parsable contents. EmptyFile, + /// Could not obtain the lock. + LockError, + /// Wraps an IoError. IoError { cause: io::Error }, @@ -20,6 +25,23 @@ pub enum SynthError { AudioError { cause: HoundError }, } +impl fmt::Display for SynthError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "Synthesis Error") + } +} + +impl Error for SynthError { + fn description(&self) -> &str { + "Synthesis Error" // TODO + } + + /*fn cause(&self) -> Option<&Error> { + Some(&self) + }*/ +} + + impl From for SynthError { fn from(error: io::Error) -> SynthError { SynthError::IoError { cause: error } diff --git a/src/handlers/audio_synth_handler.rs b/src/handlers/audio_synth_handler.rs index 9a5407ba4b..97466aa6d2 100644 --- a/src/handlers/audio_synth_handler.rs +++ b/src/handlers/audio_synth_handler.rs @@ -4,7 +4,9 @@ use config::Config; use crypto::digest::Digest; use crypto::sha1::Sha1; +use error::SynthError; use iron::Handler; +use iron::IronError; use iron::Plugin; use iron::headers::ETag; use iron::headers::EntityTag; @@ -317,7 +319,7 @@ impl Handler for AudioSynthHandler { } let start = PreciseTime::now(); - let result = self.create_audio(request); + let result = try!(self.create_audio(request)); info!(target: "timing", "Total parsing and synthesis took: {}", start.to(PreciseTime::now())); @@ -340,39 +342,29 @@ impl AudioSynthHandler { } } - // TODO: Return errors. /// Create audio from the sentence. - fn create_audio(&self, request: SpeakRequest) -> Vec { - match self.synthesizer.read() { - Err(_) => Vec::new(), // TODO Actual error. - Ok(synth) => { - let params = SynthesisParams { - use_words: request.use_words, - use_phonemes: request.use_phonemes, - use_diphones: request.use_diphones, - use_n_phones: request.use_n_phones, - use_ends: request.use_ends, - volume: request.volume, - speed: request.speed, - monophone_padding_start: request.monophone_padding_start, - monophone_padding_end: request.monophone_padding_end, - polyphone_padding_end: request.polyphone_padding_end, - word_padding_start: request.word_padding_start, - word_padding_end: request.word_padding_end, - }; + fn create_audio(&self, request: SpeakRequest) -> Result, SynthError> { + let synth = match self.synthesizer.read() { + Err(_) => { return Err(SynthError::LockError); }, + Ok(synth) => synth, + }; - let generated = synth.generate(&request.sentence, &request.speaker, - params); + let params = SynthesisParams { + use_words: request.use_words, + use_phonemes: request.use_phonemes, + use_diphones: request.use_diphones, + use_n_phones: request.use_n_phones, + use_ends: request.use_ends, + volume: request.volume, + speed: request.speed, + monophone_padding_start: request.monophone_padding_start, + monophone_padding_end: request.monophone_padding_end, + polyphone_padding_end: request.polyphone_padding_end, + word_padding_start: request.word_padding_start, + word_padding_end: request.word_padding_end, + }; - match generated { - Err(e) => { - warn!("Error synthesizing: {:?}", e); - Vec::new() // TODO FIXME - }, - Ok(wav) => wav, - } - } - } + synth.generate(&request.sentence, &request.speaker, params) } fn sha_digest(&self, request: &SpeakRequest) -> String { @@ -416,3 +408,10 @@ fn get_u16(params: &QueryParams, param_name: &str) -> Option { .and_then(|d| if d == 0 { None } else { Some(d) } ) } +impl From for IronError { + fn from(error: SynthError) -> IronError { + let mime = "text/plain".parse::().unwrap(); + let response = (mime, status::InternalServerError, "Service Error"); + IronError::new(error, response) + } +} diff --git a/src/handlers/file_server_handler.rs b/src/handlers/file_server_handler.rs index 5ad07a26b6..ae6f276af7 100644 --- a/src/handlers/file_server_handler.rs +++ b/src/handlers/file_server_handler.rs @@ -30,10 +30,11 @@ impl Handler for FileServerHandler { let filename = self.get_filename(&req); let mime = match &filename { - s if s.ends_with(".css") => { "text/css" }, - s if s.ends_with(".html") => { "text/html" }, - s if s.ends_with(".js") => { "application/javascript" }, - _ => { "text/plain" }, + s if s.ends_with(".css") => "text/css", + s if s.ends_with(".html") => "text/html", + s if s.ends_with(".js") => "application/javascript", + s if s.ends_with(".txt") => "text/plain", + _ => "text/plain", }; match self.open_file(&filename) { diff --git a/web/index.html b/web/index.html index 37a8ccc886..1829a13b2b 100644 --- a/web/index.html +++ b/web/index.html @@ -1,20 +1,21 @@ - + - Jungle Horse + Jungle Horse — Text to Trump - + + - - + + -
+
+ +
diff --git a/web/robots.txt b/web/robots.txt new file mode 100644 index 0000000000..c2a49f4fb8 --- /dev/null +++ b/web/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: /