diff options
Diffstat (limited to 'src/call/server.rs')
-rw-r--r-- | src/call/server.rs | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/call/server.rs b/src/call/server.rs index add9874..875555e 100644 --- a/src/call/server.rs +++ b/src/call/server.rs @@ -25,8 +25,10 @@ use crate::codec::{DeserializeFn, SerializeFn}; use crate::cq::CompletionQueue; use crate::error::{Error, Result}; use crate::metadata::Metadata; +use crate::server::ServerChecker; use crate::server::{BoxHandler, RequestCallContext}; use crate::task::{BatchFuture, CallTag, Executor, Kicker}; +use crate::CheckResult; pub struct Deadline { spec: gpr_timespec, @@ -74,12 +76,13 @@ impl RequestContext { cq: &CompletionQueue, rc: &mut RequestCallContext, ) -> result::Result<(), Self> { + let checker = rc.get_checker(); let handler = unsafe { rc.get_handler(self.method()) }; match handler { Some(handler) => match handler.method_type() { MethodType::Unary | MethodType::ServerStreaming => Err(self), _ => { - execute(self, cq, None, handler); + execute(self, cq, None, handler, checker); Ok(()) } }, @@ -225,9 +228,10 @@ impl UnaryRequestContext { cq: &CompletionQueue, reader: Option<MessageReader>, ) { + let checker = rc.get_checker(); let handler = unsafe { rc.get_handler(self.request.method()).unwrap() }; if reader.is_some() { - return execute(self.request, cq, reader, handler); + return execute(self.request, cq, reader, handler, checker); } let status = RpcStatus::new(RpcStatusCode::INTERNAL, Some("No payload".to_owned())); @@ -775,7 +779,19 @@ fn execute( cq: &CompletionQueue, payload: Option<MessageReader>, f: &mut BoxHandler, + mut checkers: Vec<Box<dyn ServerChecker>>, ) { let rpc_ctx = RpcContext::new(ctx, cq); + + for handler in checkers.iter_mut() { + match handler.check(&rpc_ctx) { + CheckResult::Continue => {} + CheckResult::Abort(status) => { + rpc_ctx.call().abort(&status); + return; + } + } + } + f.handle(rpc_ctx, payload) } |