Class: Rack::AMF::Application
- Inherits:
-
Object
- Object
- Rack::AMF::Application
- Defined in:
- lib/rack/amf/application.rb
Instance Method Summary collapse
- #call(env) ⇒ Object
-
#initialize(app, options = {}) ⇒ Application
constructor
A new instance of Application.
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, = {}) @app = app = 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..response_uri if request..data.is_a?(::AMF::Messages::CommandMessage) if request..data.operation == ::AMF::Messages::CommandMessage::CLIENT_PING_OPERATION data = ::AMF::Messages::AcknowledgeMessage.new(request..data) else data = ::AMF::Messages::ErrorMessage.new(Exception.new("CommandMessage #{request.message.data.operation} not implemented"), request..data) end elsif request..data.is_a?(::AMF::Messages::RemotingMessage) am = ::AMF::Messages::AcknowledgeMessage.new(request..data) env["REQUEST_PATH"] = env["REQUEST_URI"] = request..data.source env["REQUEST_METHOD"] = request..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. = ::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 |