fix(tonic): make Interceptor UnwindSafe (#641)
This commit is contained in:
@@ -1,8 +1,15 @@
|
|||||||
use crate::{Request, Status};
|
use crate::{Request, Status};
|
||||||
|
use std::panic::{RefUnwindSafe, UnwindSafe};
|
||||||
use std::{fmt, sync::Arc};
|
use std::{fmt, sync::Arc};
|
||||||
|
|
||||||
type InterceptorFn =
|
type InterceptorFn = Arc<
|
||||||
Arc<dyn Fn(Request<()>) -> Result<Request<()>, Status> + Send + Sync + 'static>;
|
dyn Fn(Request<()>) -> Result<Request<()>, Status>
|
||||||
|
+ Send
|
||||||
|
+ Sync
|
||||||
|
+ UnwindSafe
|
||||||
|
+ RefUnwindSafe
|
||||||
|
+ 'static,
|
||||||
|
>;
|
||||||
|
|
||||||
/// Represents a gRPC interceptor.
|
/// Represents a gRPC interceptor.
|
||||||
///
|
///
|
||||||
@@ -25,7 +32,12 @@ pub struct Interceptor {
|
|||||||
impl Interceptor {
|
impl Interceptor {
|
||||||
/// Create a new `Interceptor` from the provided function.
|
/// Create a new `Interceptor` from the provided function.
|
||||||
pub fn new(
|
pub fn new(
|
||||||
f: impl Fn(Request<()>) -> Result<Request<()>, Status> + Send + Sync + 'static,
|
f: impl Fn(Request<()>) -> Result<Request<()>, Status>
|
||||||
|
+ Send
|
||||||
|
+ Sync
|
||||||
|
+ UnwindSafe
|
||||||
|
+ RefUnwindSafe
|
||||||
|
+ 'static,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Interceptor { f: Arc::new(f) }
|
Interceptor { f: Arc::new(f) }
|
||||||
}
|
}
|
||||||
@@ -43,7 +55,12 @@ impl Interceptor {
|
|||||||
|
|
||||||
impl<F> From<F> for Interceptor
|
impl<F> From<F> for Interceptor
|
||||||
where
|
where
|
||||||
F: Fn(Request<()>) -> Result<Request<()>, Status> + Send + Sync + 'static,
|
F: Fn(Request<()>) -> Result<Request<()>, Status>
|
||||||
|
+ Send
|
||||||
|
+ Sync
|
||||||
|
+ UnwindSafe
|
||||||
|
+ RefUnwindSafe
|
||||||
|
+ 'static,
|
||||||
{
|
{
|
||||||
fn from(f: F) -> Self {
|
fn from(f: F) -> Self {
|
||||||
Interceptor::new(f)
|
Interceptor::new(f)
|
||||||
@@ -55,3 +72,15 @@ impl fmt::Debug for Interceptor {
|
|||||||
f.debug_struct("Interceptor").finish()
|
f.debug_struct("Interceptor").finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[allow(unused_imports)]
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn interceptor_fn_is_unwind_safe() {
|
||||||
|
fn is_unwind_safe<T: UnwindSafe + RefUnwindSafe>() {}
|
||||||
|
is_unwind_safe::<InterceptorFn>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user