Class: Perl::Rack

Inherits:
Object show all
Defined in:
lib/perl/rack.rb

Instance Method Summary collapse

Constructor Details

#initialize(filename) ⇒ Rack

Returns a new instance of Rack.



6
7
8
9
# File 'lib/perl/rack.rb', line 6

def initialize(filename)
  @interpreter = Perl::Interpreter.new
  @app = @interpreter.load(filename)
end

Instance Method Details

#call(env) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/perl/rack.rb', line 11

def call(env)
  @interpreter.call(@app, {:ref => clean_env(env)}, :scalar) do |ret|
    value = ret.deref.value # Array

    status = value[0].value

    v1 = value[1].deref.value
    headers = Hash[*v1.map { |v| v.value }]

    body = value[2].deref.value.map { |v| v.value }

    [status, headers, body]
  end
rescue => e
  puts "e: #{e.inspect}\n#{e.backtrace.join("\n")}"
end

#clean_env(hash) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/perl/rack.rb', line 28

def clean_env(hash)
  ret = hash.dup
  if defined?(PhusionPassenger)
    ret = ret.reject do |k,v|
      v.is_a?(PhusionPassenger::Utils::RewindableInput)
    end
  end
  ret.tap do |h|
    ["async.close"].each do |k|
      if h.has_key?(k)
        puts "Cannot handle env['#{k}'] (#{k} => #{h[k].inspect}), skipping"
        h.delete("async.close")
      end
    end
  end
end