amfora 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/amfora.rb ADDED
@@ -0,0 +1,2 @@
1
+ $:.unshift File.expand_path(File.dirname(__FILE__))
2
+ require 'amf'
data/lib/rack/amf.rb ADDED
@@ -0,0 +1,12 @@
1
+ require 'rack'
2
+ require 'amf'
3
+
4
+ require 'rack/amf/application'
5
+
6
+ module Rack::AMF
7
+ APPLICATION_AMF = 'application/x-amf'.freeze
8
+
9
+ def self.new(app, options={})
10
+ Rack::AMF::Application.new(app, options)
11
+ end
12
+ end
@@ -0,0 +1,54 @@
1
+ module Rack::AMF
2
+ class Application
3
+ def initialize(app, options = {})
4
+ @app = app
5
+ @options = options
6
+ end
7
+
8
+ def call(env)
9
+ # Check if we should handle it
10
+ return @app.call(env) if env['CONTENT_TYPE'] != APPLICATION_AMF
11
+
12
+ # Parse request and response
13
+ env['rack.input'].rewind
14
+ request = ::AMF::Request.new.populate_from_stream(env['rack.input'].read)
15
+ env['rack-amf.request'] = request
16
+
17
+ response = ::AMF::Response.new
18
+ response.amf_version = request.amf_version == 3 ? 3 :0
19
+ env['rack-amf.response'] = response
20
+
21
+ target_uri = request.message.response_uri
22
+ if request.message.data.is_a?(::AMF::Messages::CommandMessage)
23
+ if request.message.data.operation == ::AMF::Messages::CommandMessage::CLIENT_PING_OPERATION
24
+ data = ::AMF::Messages::AcknowledgeMessage.new(request.message.data)
25
+ else
26
+ data = ::AMF::Messages::ErrorMessage.new(Exception.new("CommandMessage #{request.message.data.operation} not implemented"),
27
+ request.message.data)
28
+ end
29
+ elsif request.message.data.is_a?(::AMF::Messages::RemotingMessage)
30
+ am = ::AMF::Messages::AcknowledgeMessage.new(request.message.data)
31
+
32
+ env["REQUEST_PATH"] = env["REQUEST_URI"] = request.message.data.source
33
+ env["REQUEST_METHOD"] = request.message.data.operation
34
+
35
+ status, headers, app_response = @app.call(env)
36
+
37
+ if !app_response.body.is_a?(String)
38
+ am.body = app_response.body.to_amf
39
+ else
40
+ am.body = app_response.body
41
+ end
42
+ data = am
43
+ end
44
+
45
+ target_uri += data.is_a?(::AMF::Messages::ErrorMessage) ? '/onStatus' : '/onResult'
46
+
47
+ response.message = ::AMF::Message.new(target_uri, '', data.to_amf({:amf_version => response.amf_version}))
48
+
49
+ # Calculate length and return result
50
+ result = response.to_s
51
+ [200, {"Content-Type" => APPLICATION_AMF, 'Content-Length' => result.length.to_s}, [result]]
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Amfora" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'amfora'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: amfora
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dima Berastau
8
+ - Tony Hillerson
9
+ - Stephen Augenstein
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+
14
+ date: 2009-11-19 00:00:00 -08:00
15
+ default_executable:
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: rspec
19
+ type: :development
20
+ version_requirement:
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: "0"
26
+ version:
27
+ description: RESTful Rack Middleware that provides AMF0/AMF3 support to Rails and Rack applications
28
+ email: dima.berastau@gmail.com
29
+ executables: []
30
+
31
+ extensions: []
32
+
33
+ extra_rdoc_files:
34
+ - LICENSE
35
+ - README.rdoc
36
+ files:
37
+ - .document
38
+ - .gitignore
39
+ - LICENSE
40
+ - README.rdoc
41
+ - Rakefile
42
+ - VERSION
43
+ - amfora.gemspec
44
+ - lib/amf.rb
45
+ - lib/amf/active_record.rb
46
+ - lib/amf/class_mapping.rb
47
+ - lib/amf/constants.rb
48
+ - lib/amf/messages.rb
49
+ - lib/amf/pure.rb
50
+ - lib/amf/pure/deserializer.rb
51
+ - lib/amf/pure/io_helpers.rb
52
+ - lib/amf/pure/remoting.rb
53
+ - lib/amf/pure/serializer.rb
54
+ - lib/amf/version.rb
55
+ - lib/amfora.rb
56
+ - lib/rack/amf.rb
57
+ - lib/rack/amf/application.rb
58
+ - spec/amfora_spec.rb
59
+ - spec/spec_helper.rb
60
+ has_rdoc: true
61
+ homepage: http://github.com/dima/amfora
62
+ licenses: []
63
+
64
+ post_install_message:
65
+ rdoc_options:
66
+ - --charset=UTF-8
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ version:
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
80
+ version:
81
+ requirements: []
82
+
83
+ rubyforge_project:
84
+ rubygems_version: 1.3.5
85
+ signing_key:
86
+ specification_version: 3
87
+ summary: RESTful AMF0/AMF3 Rack Middleware
88
+ test_files:
89
+ - spec/amfora_spec.rb
90
+ - spec/spec_helper.rb