67 lines
1.3 KiB
Ruby
67 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
require 'rack'
|
|
|
|
CODEPATH = '/userfunc/user'
|
|
|
|
module Fission
|
|
class Request < Rack::Request
|
|
def headers
|
|
Hash[
|
|
*env.select { |k,v| k.start_with?('HTTP_') }
|
|
.map { |k,v| [k.sub(/\AHTTP_/, '').split('_').map(&:capitalize).join('-'), v] }
|
|
.sort
|
|
.flatten
|
|
]
|
|
end
|
|
end
|
|
|
|
class Context
|
|
attr_reader :env
|
|
|
|
def initialize(env)
|
|
@env = env
|
|
end
|
|
|
|
def request
|
|
@request ||= Request.new(env)
|
|
end
|
|
end
|
|
|
|
module Specializer
|
|
def self.call(env)
|
|
load CODEPATH
|
|
Rack::Response.new([], 201).finish
|
|
rescue
|
|
Rack::Response.new(['500 Internal Server Error'], 500, {}).finish
|
|
end
|
|
end
|
|
|
|
module Handler
|
|
def self.call(env)
|
|
response = if method(:handler).arity > 0
|
|
handler(Context.new(env))
|
|
else
|
|
handler
|
|
end
|
|
|
|
response.is_a?(Array) ? response : Rack::Response.new([response]).finish
|
|
rescue
|
|
Rack::Response.new(['500 Internal Server Error'], 500, {}).finish
|
|
end
|
|
end
|
|
end
|
|
|
|
app = Rack::Builder.new do
|
|
use Rack::CommonLogger, $stderr
|
|
|
|
map "/specialize" do
|
|
run Fission::Specializer
|
|
end
|
|
|
|
map "/" do
|
|
run Fission::Handler
|
|
end
|
|
end
|
|
|
|
Rack::Handler::WEBrick.run app, Host: '0.0.0.0', Port: 8888
|