Sha256: b59c48dd59373c6e1336f65153ff4cfd87faa9355b11b0c00cdf2c1b5eeaa154

Contents?: true

Size: 1.71 KB

Versions: 1

Compression:

Stored size: 1.71 KB

Contents

class Rack::App::Endpoint

  attr_reader :properties

  LAST_MODIFIED_HEADER = "Last-Modified".freeze

  def initialize(properties)
    @properties = properties

    @app_class = properties[:app_class]
    @error_handler = properties[:error_handler] || Rack::App::ErrorHandler.new
    @serializer = properties[:serializer] || Rack::App::Serializer.new

    middleware = (properties[:middleware] || Rack::Builder.new).dup
    middleware.run(lambda { |env| self.call_without_middlewares(env) })
    @endpoint_method_name = register_method_to_app_class(properties[:user_defined_logic])

    @app = middleware.to_app
  end

  def call(env)
    @app.call(env)
  end

  def call_without_middlewares(env)
    request = Rack::Request.new(env)
    response = Rack::Response.new
    return catch(:rack_response){ execute(request, response) }.finish
  end

  protected

  def execute(request,response)
    request_handler = @app_class.new
    request_handler.request = request
    request_handler.response = response
    set_response_body(response, get_response_body(request_handler))
    return response
  end

  def get_response_body(request_handler)
    catch :response_body do
      evaluated_value = evaluate_value(request_handler)
      
      evaluated_value
    end
  end

  def set_response_body(response, response_body)
    response.write(String(@serializer.serialize(response_body)))
  end

  def evaluate_value(request_handler)
    @error_handler.execute_with_error_handling_for(request_handler) do
      request_handler.__send__(@endpoint_method_name)
    end
  end

  def register_method_to_app_class(proc)
    method_name = '__' + ::Rack::App::Utils.uuid
    @app_class.__send__(:define_method, method_name, &proc)
    return method_name
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rack-app-5.0.0.rc1 lib/rack/app/endpoint.rb