Skip to content

Commit e500426

Browse files
committed
refactor: move get origin to from pattern
1 parent 6e455a4 commit e500426

File tree

2 files changed

+17
-13
lines changed

2 files changed

+17
-13
lines changed

crates/origin/src/lib.rs

+14
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,20 @@ pub enum Origin {
1717
GitLab,
1818
}
1919

20+
impl<'a> TryFrom<&'a HeaderMap> for Origin {
21+
type Error = Error;
22+
23+
fn try_from(headers: &'a HeaderMap) -> Result<Self, Self::Error> {
24+
if headers.contains_key("X-GitHub-Event") {
25+
Ok(Origin::GitHub)
26+
} else if headers.contains_key("X-Gitlab-Event") {
27+
Ok(Origin::GitLab)
28+
} else {
29+
Err(Self::Error::MissingHeader("X-*-Event"))
30+
}
31+
}
32+
}
33+
2034
pub trait WebhookOrigin {
2135
fn validate_headers(&self, headers: &HeaderMap) -> Result<(), Error>;
2236
fn extract_event_type(&self, headers: &HeaderMap) -> Result<String, Error>;

src/validator.rs

+3-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use axum::{
22
extract::{Path, Request, State},
3-
http::HeaderMap,
43
middleware::Next,
54
response::Response,
65
};
@@ -14,7 +13,7 @@ pub async fn validate_headers(
1413
next: Next,
1514
) -> Result<Response, HeaderValidationError> {
1615
let headers = request.headers();
17-
let origin = determine_origin(headers)?;
16+
let origin = Origin::try_from(headers)?;
1817
origin.validate_headers(headers)?;
1918
Ok(next.run(request).await)
2019
}
@@ -27,6 +26,7 @@ pub async fn validate_signature_middleware(
2726
) -> Result<Response, HeaderValidationError> {
2827
let config = config.read().await;
2928
let headers = request.headers().clone();
29+
let origin = Origin::try_from(&headers)?;
3030

3131
let webhook_config = config
3232
.webhooks
@@ -44,21 +44,11 @@ pub async fn validate_signature_middleware(
4444
.await
4545
.map_err(HeaderValidationError::AxumError)?;
4646

47-
validator.validate_signature(&headers, &secret, &bytes)?;
47+
origin.validate_signature(&headers, &secret, &bytes)?;
4848

4949
let request = Request::from_parts(parts, axum::body::Body::from(bytes));
5050
Ok(next.run(request).await)
5151
} else {
5252
Ok(next.run(request).await)
5353
}
5454
}
55-
56-
fn determine_origin(headers: &HeaderMap) -> Result<Origin, OriginError> {
57-
if headers.contains_key("X-GitHub-Event") {
58-
Ok(Origin::GitHub)
59-
} else if headers.contains_key("X-Gitlab-Event") {
60-
Ok(Origin::GitLab)
61-
} else {
62-
Err(OriginError::MissingHeader("X-*-Event"))
63-
}
64-
}

0 commit comments

Comments
 (0)