Class: Rack::AMF::Application

Inherits:
Object
  • Object
show all
Defined in:
lib/rack/amf/application.rb

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ Application

Returns a new instance of Application.



3
4
5
6
# File 'lib/rack/amf/application.rb', line 3

def initialize(app, options = {})
  @app = app
  @options = options
end

Instance Method Details

#call(env) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/rack/amf/application.rb', line 8

def call(env)
  # Check if we should handle it
  return @app.call(env) if env['CONTENT_TYPE'] != APPLICATION_AMF

  # Parse request and response
  env['rack.input'].rewind
  request = ::AMF::Request.new.populate_from_stream(env['rack.input'].read)
  env['rack-amf.request'] = request
  
  response = ::AMF::Response.new
  response.amf_version = request.amf_version == 3 ? 3 :0
  env['rack-amf.response'] = response
  
  target_uri = request.message.response_uri
  if request.message.data.is_a?(::AMF::Messages::CommandMessage)
    if request.message.data.operation == ::AMF::Messages::CommandMessage::CLIENT_PING_OPERATION
      data = ::AMF::Messages::AcknowledgeMessage.new(request.message.data)
    else
      data = ::AMF::Messages::ErrorMessage.new(Exception.new("CommandMessage #{request.message.data.operation} not implemented"), 
        request.message.data)
    end
  elsif request.message.data.is_a?(::AMF::Messages::RemotingMessage)
    am = ::AMF::Messages::AcknowledgeMessage.new(request.message.data)

    env["REQUEST_PATH"] = env["REQUEST_URI"] = request.message.data.source
    env["REQUEST_METHOD"] = request.message.data.operation

    status, headers, app_response = @app.call(env)
    
    if !app_response.body.is_a?(String)
      am.body = app_response.body.to_amf
    else
      am.body = app_response.body
    end
    data = am
  end
              
  target_uri += data.is_a?(::AMF::Messages::ErrorMessage) ? '/onStatus' : '/onResult'

  response.message = ::AMF::Message.new(target_uri, '', data.to_amf({:amf_version => response.amf_version}))
    
  # Calculate length and return result
  result = response.to_s
  [200, {"Content-Type" => APPLICATION_AMF, 'Content-Length' => result.length.to_s}, [result]]
end