summaryrefslogtreecommitdiff
path: root/src/modules/switch.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/switch.rs')
-rw-r--r--src/modules/switch.rs17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/modules/switch.rs b/src/modules/switch.rs
index 289c406..466bdd8 100644
--- a/src/modules/switch.rs
+++ b/src/modules/switch.rs
@@ -3,6 +3,7 @@ use crate::{config::DynNode, error::ServiceError};
use anyhow::Result;
use futures::Future;
use headers::{HeaderMapExt, Upgrade};
+use http::Version;
use hyper::Method;
use serde::Deserialize;
use std::{pin::Pin, sync::Arc};
@@ -52,9 +53,13 @@ enum Condition {
IsWebsocketUpgrade,
IsPost,
IsGet,
+ IsPut,
+ IsPatch,
+ IsOptions,
HasHeader(String),
PathStartsWith(String),
PathIs(String),
+ HttpVersion(u8),
}
impl Condition {
@@ -66,10 +71,22 @@ impl Condition {
Condition::HasHeader(name) => req.headers().contains_key(name),
Condition::PathStartsWith(path_prefix) => req.uri().path().starts_with(path_prefix),
Condition::PathIs(path) => req.uri().path() == path,
+ Condition::IsPut => req.method() == Method::PUT,
+ Condition::IsPatch => req.method() == Method::PATCH,
+ Condition::IsOptions => req.method() == Method::OPTIONS,
Condition::IsPost => req.method() == Method::POST,
Condition::IsGet => req.method() == Method::GET,
Condition::Any(conds) => conds.iter().any(|c| c.test(req)),
Condition::All(conds) => conds.iter().all(|c| c.test(req)),
+ Condition::HttpVersion(n) => {
+ if req.version() == Version::HTTP_3 {
+ *n == 3
+ } else if req.version() == Version::HTTP_2 {
+ *n == 2
+ } else {
+ *n == 1
+ }
+ }
}
}
}