retry rate limit bypass; new speakers

This commit is contained in:
Brandon Thomas committed 2020-09-10 04:30:32 -04:00
1 parent 08a94bccb7
commit 5f02cb0df9
8 files changed
+62 -8

No files matched your search

+14
View File
@@ -1,3 +1,17 @@
[[speakers]]
name = "Michael Rosen"
slug = "michael-rosen"
model_pipeline = "ArpabetGlowTtsMelgan"
glow_tts = "glow-tts_michael-rosen_ljstx_2020.09.05_expr-1_chkpt-5682.torchjit"
melgan = "melgan_manyvoice5.0_2020-07-23_12d5838_10760.torchjit"
[[speakers]]
name = "Wizard (Death Battle!)"
slug = "wizard"
model_pipeline = "ArpabetGlowTtsMelgan"
glow_tts = "glow-tts_wiz_ljstx_2020.09.05_expr-1_chkpt-4500.torchjit"
melgan = "melgan_wiz_2020.09.07_d3b9647_17000.torchjit"
[[speakers]]
name = "Tucker Carlson"
slug = "tucker-carlson"
+16 -2
View File
@@ -4,10 +4,24 @@ name = "Current Experiment"
slug = "experiment"
model_pipeline = "ArpabetGlowTtsMelgan"
glow_tts = "glow_tts_single_speaker.torchjit"
melgan = "melgan_manyvoice5.0_2020-07-23_12d5838_10760.torchjit"
#melgan = "melgan_manyvoice5.0_2020-07-23_12d5838_10760.torchjit"
#melgan = "melgan_manyvoice2.0_2020-07-08_12d5838_9330.torchjit"
#melgan = "manyvoice1.0_2020-06-28_12d5838_6610.torchjit"
#melgan = "melgan-vocodes.torchjit"
melgan = "melgan-vocodes.torchjit"
[[speakers]]
name = "Michael Rosen"
slug = "michael-rosen"
model_pipeline = "ArpabetGlowTtsMelgan"
glow_tts = "glow-tts_michael-rosen_ljstx_2020.09.05_expr-1_chkpt-5682.torchjit"
melgan = "melgan_manyvoice5.0_2020-07-23_12d5838_10760.torchjit"
[[speakers]]
name = "Wizard (Death Battle!)"
slug = "wizard"
model_pipeline = "ArpabetGlowTtsMelgan"
glow_tts = "glow-tts_wiz_ljstx_2020.09.05_expr-1_chkpt-4500.torchjit"
melgan = "melgan_wiz_2020.09.07_d3b9647_17000.torchjit"
[[speakers]]
name = "Tucker Carlson"
+11
View File
@@ -8,8 +8,19 @@ use std::fmt;
pub struct SpeakRequest {
/// Slug for the speaker
pub speaker: String,
/// Raw text to be spoken
pub text: String,
/// Retry attempt.
/// The first request is "0", and all subsequent requests are incremented.
/// Subsequent requests do not trigger the rate limiter.
#[serde(default)]
pub retry_attempt_number: u8,
/// Admin/debug requests get to skip the rate limiter.
#[serde(default)]
pub skip_rate_limiter: bool,
}
#[derive(Serialize,Debug)]
+1 -1
View File
@@ -35,7 +35,7 @@ pub async fn post_speak(request: HttpRequest,
let ip_address = get_request_ip(&request);
if let Err(_err) = app_state.rate_limiter.maybe_ratelimit_request(&ip_address, &request.headers()) {
if let Err(_err) = app_state.rate_limiter.maybe_ratelimit_request(&ip_address, &request.headers(), &query) {
return Err(SpeakError::rate_limited());
}
@@ -55,7 +55,7 @@ pub async fn post_speak_with_spectrogram(request: HttpRequest,
let ip_address = get_request_ip(&request);
if let Err(_err) = app_state.rate_limiter.maybe_ratelimit_request(&ip_address, &request.headers()) {
if let Err(_err) = app_state.rate_limiter.maybe_ratelimit_request(&ip_address, &request.headers(), &query) {
return Err(SpeakError::rate_limited());
}
@@ -1,11 +1,13 @@
use crate::rate_limiter::rate_limiter::{RateLimiter, RateLimiterError};
use actix_web::HttpRequest;
use actix_web::http::HeaderMap;
use crate::endpoints::speak::api::SpeakRequest;
pub struct NoOpRateLimiter {}
impl RateLimiter for NoOpRateLimiter {
fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap) -> Result<(), RateLimiterError> {
fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap,
speak_request: &SpeakRequest) -> Result<(), RateLimiterError> {
Ok(())
}
+3 -1
View File
@@ -1,5 +1,6 @@
use actix_web::HttpRequest;
use actix_web::http::header::HeaderMap;
use crate::endpoints::speak::api::SpeakRequest;
#[derive(Debug)]
pub enum RateLimiterError {
@@ -14,7 +15,8 @@ pub enum RateLimiterError {
pub trait RateLimiter : Send + Sync {
/// Potentially try to rate limit.
/// Certain headers can be used to bypass.
fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap) -> Result<(), RateLimiterError>;
fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap,
speak_request: &SpeakRequest) -> Result<(), RateLimiterError>;
/// Attempt to acquire the rate limiter.
fn acquire(&self, rate_limit_key: &str) -> Result<(), RateLimiterError>;
@@ -8,6 +8,7 @@ use actix_web::HttpRequest;
use crate::endpoints::helpers::ip_address::get_request_ip;
use actix_web::http::header::HeaderMap;
use actix_web::http::HeaderName;
use crate::endpoints::speak::api::SpeakRequest;
const RATE_LIMIT_BYPASS_HEADER : &'static str = "limitless";
@@ -71,9 +72,19 @@ impl RedisRateLimiter {
}
impl RateLimiter for RedisRateLimiter {
fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap) -> Result<(), RateLimiterError> {
fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap, speak_request: &SpeakRequest) -> Result<(), RateLimiterError> {
if speak_request.skip_rate_limiter {
info!("Bypassing rate limiter with request param.");
return Ok(());
}
if headers.contains_key(&self.rate_limit_bypass_header) {
info!("Bypassing rate limiter");
info!("Bypassing rate limiter with admin debug header.");
return Ok(());
}
if speak_request.retry_attempt_number > 0 {
info!("Retries bypass the rate limiter.");
return Ok(());
}