mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 21:15:32 +09:00
fix(push): stop retrying relay rate limit refusals (#2993)
This commit is contained in:
1 parent
30ba55bd4d
commit
e2d05a44a8
1 file changed
+43
-1
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
use crate::crypto;
|
use crate::crypto;
|
||||||
use crate::payload::{self, RecordKind};
|
use crate::payload::{self, RecordKind};
|
||||||
use crate::providers::SendOutcome;
|
use crate::providers::{SendOutcome, own_relay};
|
||||||
use crate::resolver;
|
use crate::resolver;
|
||||||
use crate::server::AppState;
|
use crate::server::AppState;
|
||||||
use crate::subscription::Subscription;
|
use crate::subscription::Subscription;
|
||||||
@@ -38,6 +38,8 @@ const AES128GCM: &str = "aes128gcm";
|
|||||||
const NOT_FOUND: u16 = 404;
|
const NOT_FOUND: u16 = 404;
|
||||||
const GONE: u16 = 410;
|
const GONE: u16 = 410;
|
||||||
const INSUFFICIENT_STORAGE: u16 = 507;
|
const INSUFFICIENT_STORAGE: u16 = 507;
|
||||||
|
const TOO_MANY_REQUESTS: u16 = 429;
|
||||||
|
const RELAY_RATE_LIMITED: &str = "relay_rate_limited";
|
||||||
const MAX_HOSTNAME_BYTES: usize = 253;
|
const MAX_HOSTNAME_BYTES: usize = 253;
|
||||||
const MAX_LABEL_BYTES: usize = 63;
|
const MAX_LABEL_BYTES: usize = 63;
|
||||||
|
|
||||||
@@ -111,6 +113,9 @@ pub async fn send(state: &AppState, sub: &Subscription, envelope: &Value) -> Sen
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
if is_relay_quota_refusal(status, &sub.endpoint, &state.cfg.managed_relay_hosts) {
|
||||||
|
return SendOutcome::permanent(RELAY_RATE_LIMITED);
|
||||||
|
}
|
||||||
if should_retry(status, attempt) {
|
if should_retry(status, attempt) {
|
||||||
tokio::time::sleep(retry_delay(attempt)).await;
|
tokio::time::sleep(retry_delay(attempt)).await;
|
||||||
attempt += 1;
|
attempt += 1;
|
||||||
@@ -128,6 +133,10 @@ fn delivery_headers(envelope: &Value) -> (&'static str, &'static str) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_relay_quota_refusal(status: u16, endpoint: &str, managed_relay_hosts: &[String]) -> bool {
|
||||||
|
status == TOO_MANY_REQUESTS && own_relay::is_managed(endpoint, managed_relay_hosts)
|
||||||
|
}
|
||||||
|
|
||||||
fn should_retry(status: u16, attempt: u32) -> bool {
|
fn should_retry(status: u16, attempt: u32) -> bool {
|
||||||
is_transient_status(status) && status != INSUFFICIENT_STORAGE && attempt < MAX_TRANSIENT_RETRIES
|
is_transient_status(status) && status != INSUFFICIENT_STORAGE && attempt < MAX_TRANSIENT_RETRIES
|
||||||
}
|
}
|
||||||
@@ -242,6 +251,39 @@ mod retry_tests {
|
|||||||
assert!(!should_retry(INSUFFICIENT_STORAGE, 0));
|
assert!(!should_retry(INSUFFICIENT_STORAGE, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const TOKEN: &str = "3dbc5a5ef1a1c1666afc26f466e1b3ebaaf4c66d92dddeb0fd1b69c49641d4cd";
|
||||||
|
|
||||||
|
fn managed_hosts() -> Vec<String> {
|
||||||
|
vec!["push.fluxer.com".to_owned()]
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn a_relay_over_its_device_quota_is_not_retried() {
|
||||||
|
let endpoint = format!("https://push.fluxer.com/relay/v1/fcm/stable/{TOKEN}");
|
||||||
|
assert!(is_relay_quota_refusal(
|
||||||
|
TOO_MANY_REQUESTS,
|
||||||
|
&endpoint,
|
||||||
|
&managed_hosts()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn a_rate_limited_third_party_push_service_is_still_retried() {
|
||||||
|
let endpoint = "https://ntfy.sh/upZzH87cT9jJCc?up=1";
|
||||||
|
assert!(!is_relay_quota_refusal(
|
||||||
|
TOO_MANY_REQUESTS,
|
||||||
|
endpoint,
|
||||||
|
&managed_hosts()
|
||||||
|
));
|
||||||
|
assert!(should_retry(TOO_MANY_REQUESTS, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn an_unavailable_relay_is_still_retried() {
|
||||||
|
let endpoint = format!("https://push.fluxer.com/relay/v1/fcm/stable/{TOKEN}");
|
||||||
|
assert!(!is_relay_quota_refusal(503, &endpoint, &managed_hosts()));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn an_unavailable_push_service_is_retried_until_the_budget_runs_out() {
|
fn an_unavailable_push_service_is_retried_until_the_budget_runs_out() {
|
||||||
assert!(should_retry(503, 0));
|
assert!(should_retry(503, 0));
|
||||||
|
|||||||
Reference in new issue
Block a user