mirror of
https://github.com/zigzap/zap.git
synced 2025-10-20 15:14:08 +00:00
Merge pull request #120 from cosmicboots/endpoint-middleware
Create options for EndpointHandler
This commit is contained in:
commit
e7a6849028
2 changed files with 33 additions and 16 deletions
|
@ -123,19 +123,17 @@ const SessionMiddleWare = struct {
|
||||||
//
|
//
|
||||||
// !!!! ENDPOINT !!!
|
// !!!! ENDPOINT !!!
|
||||||
//
|
//
|
||||||
// We define an endpoint as we usually would.
|
// We define an endpoint as we usually would; however,
|
||||||
// NO ROUTING IS PERFORMED
|
// NO ROUTING IS PERFORMED BY DEFAULT!
|
||||||
// as we are just going to wrap it in a bunch of Middleware components
|
|
||||||
// and therefore NOT using an endpoint listener that would the routing for us
|
|
||||||
//
|
//
|
||||||
// Hence, the endpoint should check r.path in its on_request to check wether
|
// This can be changed using the EndpointHandlerOptions passed into the
|
||||||
// it is adressed or not.
|
// EndpointHandler.init() method.
|
||||||
//
|
//
|
||||||
// N.B. the EndpointHandler checks if the endpoint turned the request into
|
// N.B. the EndpointHandler checks if the endpoint turned the request into
|
||||||
// "finished" state, e.g. by sending anything. If the endpoint didn't finish the
|
// "finished" state, e.g. by sending anything. If the endpoint didn't finish the
|
||||||
// request, the EndpointHandler will pass the request on to the next handler in
|
// request, the EndpointHandler will pass the request on to the next handler in
|
||||||
// the chain if there is one. See also the EndpointHandler's `breakOnFinish`
|
// the chain if there is one. See also the EndpointHandlerOptions's
|
||||||
// parameter.
|
// `breakOnFinish` parameter.
|
||||||
//
|
//
|
||||||
const HtmlEndpoint = struct {
|
const HtmlEndpoint = struct {
|
||||||
ep: zap.Endpoint = undefined,
|
ep: zap.Endpoint = undefined,
|
||||||
|
@ -210,7 +208,7 @@ pub fn main() !void {
|
||||||
var htmlHandler = zap.Middleware.EndpointHandler(Handler, Context).init(
|
var htmlHandler = zap.Middleware.EndpointHandler(Handler, Context).init(
|
||||||
htmlEndpoint.endpoint(), // the endpoint
|
htmlEndpoint.endpoint(), // the endpoint
|
||||||
null, // no other handler (we are the last in the chain)
|
null, // no other handler (we are the last in the chain)
|
||||||
true, // break on finish. See EndpointHandler for this. Not applicable here.
|
.{}, // We can set custom EndpointHandlerOptions here
|
||||||
);
|
);
|
||||||
|
|
||||||
// we wrap it in the session Middleware component
|
// we wrap it in the session Middleware component
|
||||||
|
|
|
@ -51,23 +51,38 @@ pub fn Handler(comptime ContextType: anytype) type {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Options used to change the behavior of an `EndpointHandler`
|
||||||
|
pub const EndpointHandlerOptions = struct {
|
||||||
|
/// If `true`, the handler will stop handing requests down the chain if the
|
||||||
|
/// endpoint processed the request.
|
||||||
|
breakOnFinish: bool = true,
|
||||||
|
|
||||||
|
/// If `true`, the handler will only execute against requests that match
|
||||||
|
/// the endpoint's `path` setting.
|
||||||
|
checkPath: bool = false,
|
||||||
|
};
|
||||||
|
|
||||||
/// A convenience handler for artibrary zap.Endpoint
|
/// A convenience handler for artibrary zap.Endpoint
|
||||||
pub fn EndpointHandler(comptime HandlerType: anytype, comptime ContextType: anytype) type {
|
pub fn EndpointHandler(comptime HandlerType: anytype, comptime ContextType: anytype) type {
|
||||||
return struct {
|
return struct {
|
||||||
handler: HandlerType,
|
handler: HandlerType,
|
||||||
endpoint: *zap.Endpoint,
|
endpoint: *zap.Endpoint,
|
||||||
breakOnFinish: bool,
|
options: EndpointHandlerOptions,
|
||||||
|
|
||||||
const Self = @This();
|
const Self = @This();
|
||||||
|
|
||||||
/// Create an endpointhandler from an endpoint and pass in the next (other) handler in the chain.
|
/// Create an endpointhandler from an endpoint and pass in the next (other) handler in the chain.
|
||||||
/// If `breakOnFinish` is `true`, the handler will stop handing requests down the chain if
|
///
|
||||||
/// the endpoint processed the request.
|
/// By default no routing is performed on requests. This behavior can be changed by setting
|
||||||
pub fn init(endpoint: *zap.Endpoint, other: ?*HandlerType, breakOnFinish: bool) Self {
|
/// `checkPath` in the provided options.
|
||||||
|
///
|
||||||
|
/// If the `breakOnFinish` option is `true`, the handler will stop handing requests down the chain
|
||||||
|
/// if the endpoint processed the request.
|
||||||
|
pub fn init(endpoint: *zap.Endpoint, other: ?*HandlerType, options: EndpointHandlerOptions) Self {
|
||||||
return .{
|
return .{
|
||||||
.handler = HandlerType.init(onRequest, other),
|
.handler = HandlerType.init(onRequest, other),
|
||||||
.endpoint = endpoint,
|
.endpoint = endpoint,
|
||||||
.breakOnFinish = breakOnFinish,
|
.options = options,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,10 +99,14 @@ pub fn EndpointHandler(comptime HandlerType: anytype, comptime ContextType: anyt
|
||||||
pub fn onRequest(handler: *HandlerType, r: zap.Request, context: *ContextType) bool {
|
pub fn onRequest(handler: *HandlerType, r: zap.Request, context: *ContextType) bool {
|
||||||
const self: *Self = @fieldParentPtr("handler", handler);
|
const self: *Self = @fieldParentPtr("handler", handler);
|
||||||
r.setUserContext(context);
|
r.setUserContext(context);
|
||||||
self.endpoint.onRequest(r);
|
if (!self.options.checkPath or
|
||||||
|
std.mem.startsWith(u8, r.path orelse "", self.endpoint.settings.path))
|
||||||
|
{
|
||||||
|
self.endpoint.onRequest(r);
|
||||||
|
}
|
||||||
|
|
||||||
// if the request was handled by the endpoint, we may break the chain here
|
// if the request was handled by the endpoint, we may break the chain here
|
||||||
if (r.isFinished() and self.breakOnFinish) {
|
if (r.isFinished() and self.options.breakOnFinish) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return self.handler.handleOther(r, context);
|
return self.handler.handleOther(r, context);
|
||||||
|
|
Loading…
Add table
Reference in a new issue