aboutsummaryrefslogtreecommitdiff
path: root/src/call/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/call/server.rs')
-rw-r--r--src/call/server.rs20
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)
}