pub struct WebhookConfig {
pub secret: Arc<dyn WebhookSecretResolver>,
pub branch: Option<String>,
pub repo: Option<String>,
pub dedup: Arc<Mutex<DeliveryDedupCache>>,
pub extractor: Arc<dyn WebhookPayloadExtractor>,
pub concurrency: Option<Arc<WebhookConcurrencyLimit>>,
pub rate_limit: Option<Arc<WebhookRateLimiter>>,
}Expand description
Per-route config attached to the webhook handler.
Fields§
§secret: Arc<dyn WebhookSecretResolver>Resolves the shared secret on every request so a wizard rotate flow doesn’t require a router rebuild.
branch: Option<String>When Some(branch), only payloads whose ref equals
refs/heads/<branch> trigger a scan. None accepts any branch.
repo: Option<String>Optional repo filter forwarded to the ScanTrigger. None
scans every enabled repo, matching the API’s manual-trigger
behaviour.
dedup: Arc<Mutex<DeliveryDedupCache>>Bounded set of delivery ids already processed, so a webhook-UI redelivery (or a hostile replay of a captured-and-still-valid HMAC body) does not retrigger the dispatcher. Shared across clones of the config so a router rebuild keeps the cache hot.
extractor: Arc<dyn WebhookPayloadExtractor>Provider-specific decoder for the verified push body. Operators
pick this via [triggers].webhook_provider; the default
(refheads) covers GitHub / Gitea / Forgejo / Gogs / GitLab,
which all ship the branch under top-level ref.
concurrency: Option<Arc<WebhookConcurrencyLimit>>Optional cap on simultaneous in-flight handler invocations.
None disables the gate (every request is admitted). When
set, requests past the cap return 429 before HMAC verification
so a flood of valid-signed pushes cannot peg the executor.
rate_limit: Option<Arc<WebhookRateLimiter>>Optional per-source-IP token bucket. None disables the gate
(every IP is admitted). When set, requests past the per-IP
budget return 429 before HMAC verification. The handler
reads the source IP from the request’s ConnectInfo
extension; deployments that route through a reverse proxy
without preserving the peer address will not see per-IP
throttling and fall back to the global concurrency cap.
Implementations§
Source§impl WebhookConfig
impl WebhookConfig
Sourcepub fn new(
secret: Arc<dyn WebhookSecretResolver>,
branch: Option<String>,
repo: Option<String>,
) -> Self
pub fn new( secret: Arc<dyn WebhookSecretResolver>, branch: Option<String>, repo: Option<String>, ) -> Self
Build a webhook config with a fresh dedup cache and the default
ref: refs/heads/<branch> extractor.
Sourcepub fn with_extractor(
secret: Arc<dyn WebhookSecretResolver>,
branch: Option<String>,
repo: Option<String>,
extractor: Arc<dyn WebhookPayloadExtractor>,
) -> Self
pub fn with_extractor( secret: Arc<dyn WebhookSecretResolver>, branch: Option<String>, repo: Option<String>, extractor: Arc<dyn WebhookPayloadExtractor>, ) -> Self
Build a webhook config with a fresh dedup cache and an explicit
extractor. Used when the operator’s [triggers].webhook_provider
names a non-default shape (Bitbucket Server, Sourcehut, …).
Sourcepub fn with_concurrency_limit(self, limit: Arc<WebhookConcurrencyLimit>) -> Self
pub fn with_concurrency_limit(self, limit: Arc<WebhookConcurrencyLimit>) -> Self
Attach a concurrency cap. Subsequent requests past the cap return 429 before HMAC verification.
Sourcepub fn with_rate_limit(self, limit: Arc<WebhookRateLimiter>) -> Self
pub fn with_rate_limit(self, limit: Arc<WebhookRateLimiter>) -> Self
Attach a per-source-IP rate limiter. Requests past the per-IP budget return 429 before HMAC verification.
Trait Implementations§
Source§impl Clone for WebhookConfig
impl Clone for WebhookConfig
Source§fn clone(&self) -> WebhookConfig
fn clone(&self) -> WebhookConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for WebhookConfig
impl !RefUnwindSafe for WebhookConfig
impl Send for WebhookConfig
impl Sync for WebhookConfig
impl Unpin for WebhookConfig
impl UnsafeUnpin for WebhookConfig
impl !UnwindSafe for WebhookConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more