|
|
@ -31,8 +31,20 @@ module Landline |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
# Ephemeral proxy class to which callback execution binds |
|
|
|
class PathExecutionOrigin |
|
|
|
def initialize(request, properties) |
|
|
|
@request = request |
|
|
|
@properties = Landline::Util::LookupROProxy.new(properties) |
|
|
|
end |
|
|
|
|
|
|
|
attr_accessor :response |
|
|
|
attr_reader :request, :properties |
|
|
|
end |
|
|
|
|
|
|
|
# Primary building block of request navigation. |
|
|
|
class Path < Landline::Node |
|
|
|
ExecutionOrigin = Landline::PathExecutionOrigin |
|
|
|
ProcContext = Landline::ProcessorContext |
|
|
|
Context = Landline::PathContext |
|
|
|
|
|
|
@ -50,8 +62,6 @@ module Landline |
|
|
|
# Contexts setup |
|
|
|
context = self.class::Context.new(self) |
|
|
|
context.instance_exec(&setup) |
|
|
|
# TODO: This isn't fine |
|
|
|
@proccontext = self.class::ProcContext.new(self) |
|
|
|
end |
|
|
|
|
|
|
|
# Method callback on successful request navigation. |
|
|
@ -96,12 +106,19 @@ module Landline |
|
|
|
|
|
|
|
private |
|
|
|
|
|
|
|
# Create an execution context for in-path processing blocks |
|
|
|
def get_context(request) |
|
|
|
exec_origin = self.class::ExecutionOrigin.new(request, @properties) |
|
|
|
self.class::ProcContext.new(exec_origin) |
|
|
|
end |
|
|
|
|
|
|
|
# Sequentially run through all filters and drop request if one is false |
|
|
|
# @param request [Landline::Request] |
|
|
|
# @return [Boolean] true if request passed all filters |
|
|
|
def run_filters(request) |
|
|
|
proccontext = get_context(request) |
|
|
|
@filters.each do |filter| |
|
|
|
return false unless @proccontext.instance_exec(request, &filter) |
|
|
|
return false unless proccontext.instance_exec(request, &filter) |
|
|
|
end |
|
|
|
true |
|
|
|
end |
|
|
@ -109,8 +126,9 @@ module Landline |
|
|
|
# Sequentially run all preprocessors on a request |
|
|
|
# @param request [Landline::Request] |
|
|
|
def run_preprocessors(request) |
|
|
|
proccontext = get_context(request) |
|
|
|
@preprocessors.each do |preproc| |
|
|
|
@proccontext.instance_exec(request, &preproc) |
|
|
|
proccontext.instance_exec(request, &preproc) |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
@ -126,7 +144,6 @@ module Landline |
|
|
|
# @return [Boolean] true if further navigation will be done |
|
|
|
# @raise [UncaughtThrowError] by default throws :response if no matches found. |
|
|
|
def process_wrapped(request) |
|
|
|
@request = request |
|
|
|
return false unless run_filters(request) |
|
|
|
|
|
|
|
run_preprocessors(request) |
|
|
@ -149,7 +166,7 @@ module Landline |
|
|
|
# @param request [Landline::Request] |
|
|
|
def exit_stack(request, response = nil) |
|
|
|
request.run_postprocessors(response) |
|
|
|
false |
|
|
|
response |
|
|
|
end |
|
|
|
|
|
|
|
# Try to perform indexing on the path if possible |
|
|
@ -174,8 +191,9 @@ module Landline |
|
|
|
# @param backtrace [Array(String), nil] |
|
|
|
# @raise [UncaughtThrowError] throws :finish to stop processing |
|
|
|
def _die(errorcode, backtrace: nil) |
|
|
|
proccontext = get_context(request) |
|
|
|
throw :finish, [errorcode].append( |
|
|
|
*@proccontext.instance_exec( |
|
|
|
*proccontext.instance_exec( |
|
|
|
errorcode, |
|
|
|
backtrace: backtrace, |
|
|
|
&(@properties["handle.#{errorcode}"] or |
|
|
|