RocketAMF 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +39 -3
- data/Rakefile +1 -1
- data/lib/rocketamf/pure/deserializer.rb +17 -6
- data/lib/rocketamf/pure/serializer.rb +12 -0
- data/lib/rocketamf/version.rb +1 -1
- data/spec/amf/deserializer_spec.rb +15 -3
- data/spec/amf/serializer_spec.rb +16 -3
- data/spec/fixtures/objects/amf3-byteArray.bin +0 -0
- data/spec/fixtures/objects/amf3-byteArrayRef.bin +1 -0
- metadata +4 -2
data/README.rdoc
CHANGED
@@ -8,13 +8,49 @@ A fast AMF serializer/deserializer and request/response wrappers to simplify rem
|
|
8
8
|
|
9
9
|
== EXAMPLE:
|
10
10
|
|
11
|
-
|
11
|
+
# helloworld.ru
|
12
|
+
|
13
|
+
require 'rocketamf'
|
14
|
+
|
15
|
+
class HelloWorldApp
|
16
|
+
APPLICATION_AMF = 'application/x-amf'.freeze
|
17
|
+
|
18
|
+
def call env
|
19
|
+
if is_amf?(env)
|
20
|
+
# Wrap request and response
|
21
|
+
env['rack.input'].rewind
|
22
|
+
request = RocketAMF::Request.new.populate_from_stream(env['rack.input'].read)
|
23
|
+
response = RocketAMF::Response.new
|
24
|
+
|
25
|
+
# Handle request
|
26
|
+
response.each_method_call request do |method, args|
|
27
|
+
raise "Service #{method} does not exists" unless method == 'App.helloWorld'
|
28
|
+
'Hello world'
|
29
|
+
end
|
30
|
+
|
31
|
+
# Pass back response
|
32
|
+
response_str = response.serialize
|
33
|
+
return [200, {'Content-Type' => APPLICATION_AMF, 'Content-Length' => response_str.length.to_s}, [response_str]]
|
34
|
+
else
|
35
|
+
return [200, {'Content-Type' => 'text/plain', 'Content-Length' => '16' }, ["Rack AMF gateway"]]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def is_amf? env
|
41
|
+
return false unless env['CONTENT_TYPE'] == APPLICATION_AMF
|
42
|
+
return false unless env['PATH_INFO'] == '/amf'
|
43
|
+
return true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
run HelloWorldApp.new
|
12
48
|
|
13
49
|
== LICENSE:
|
14
50
|
|
15
51
|
(The MIT License)
|
16
52
|
|
17
|
-
Copyright (c) 2009
|
53
|
+
Copyright (c) 2009 Stephen Augenstein and Jacob Smith
|
18
54
|
|
19
55
|
Permission is hereby granted, free of charge, to any person obtaining
|
20
56
|
a copy of this software and associated documentation files (the
|
@@ -33,4 +69,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
33
69
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
34
70
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
35
71
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
36
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
72
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -23,7 +23,7 @@ end
|
|
23
23
|
|
24
24
|
spec = Gem::Specification.new do |s|
|
25
25
|
s.name = 'RocketAMF'
|
26
|
-
s.version = '0.0.
|
26
|
+
s.version = '0.0.7'
|
27
27
|
s.summary = 'Fast AMF serializer/deserializer and request/response wrappers to simplify remoting implementation'
|
28
28
|
|
29
29
|
s.files = FileList['README.rdoc', 'Rakefile', 'lib/**/*.rb', 'spec/**/*.rb', 'spec/**/*.bin', 'spec/spec.opts']
|
@@ -191,7 +191,7 @@ module RocketAMF
|
|
191
191
|
when AMF3_XML_MARKER
|
192
192
|
#read_amf3_xml
|
193
193
|
when AMF3_BYTE_ARRAY_MARKER
|
194
|
-
|
194
|
+
read_amf3_byte_array source
|
195
195
|
else
|
196
196
|
raise AMFError, "Invalid type: #{type}"
|
197
197
|
end
|
@@ -242,11 +242,7 @@ module RocketAMF
|
|
242
242
|
return @string_cache[reference]
|
243
243
|
else
|
244
244
|
length = type >> 1
|
245
|
-
|
246
|
-
#It may be better to take one more parameter that
|
247
|
-
#would specify whether or not they expect us to return
|
248
|
-
#a string
|
249
|
-
str = "" #if stringRequest
|
245
|
+
str = ""
|
250
246
|
if length > 0
|
251
247
|
str = source.read(length)
|
252
248
|
@string_cache << str
|
@@ -255,6 +251,21 @@ module RocketAMF
|
|
255
251
|
end
|
256
252
|
end
|
257
253
|
|
254
|
+
def read_amf3_byte_array source
|
255
|
+
type = read_integer source
|
256
|
+
isReference = (type & 0x01) == 0
|
257
|
+
|
258
|
+
if isReference
|
259
|
+
reference = type >> 1
|
260
|
+
return @object_cache[reference]
|
261
|
+
else
|
262
|
+
length = type >> 1
|
263
|
+
obj = StringIO.new source.read(length)
|
264
|
+
@object_cache << obj
|
265
|
+
obj
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
258
269
|
def read_array source
|
259
270
|
type = read_integer source
|
260
271
|
isReference = (type & 0x01) == 0
|
@@ -157,6 +157,8 @@ module RocketAMF
|
|
157
157
|
write_string obj.to_s, stream
|
158
158
|
elsif obj.is_a?(Time)
|
159
159
|
write_date obj, stream
|
160
|
+
elsif obj.is_a?(StringIO)
|
161
|
+
write_byte_array obj, stream
|
160
162
|
elsif obj.is_a?(Array)
|
161
163
|
write_array obj, stream
|
162
164
|
elsif obj.is_a?(Hash) || obj.is_a?(Object)
|
@@ -217,6 +219,16 @@ module RocketAMF
|
|
217
219
|
end
|
218
220
|
end
|
219
221
|
|
222
|
+
def write_byte_array array, stream
|
223
|
+
stream << AMF3_BYTE_ARRAY_MARKER
|
224
|
+
if @object_cache[array] != nil
|
225
|
+
write_reference @object_cache[array], stream
|
226
|
+
else
|
227
|
+
@object_cache.add_obj array
|
228
|
+
write_utf8_vr array.string, stream
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
220
232
|
def write_array array, stream
|
221
233
|
stream << AMF3_ARRAY_MARKER
|
222
234
|
if @object_cache[array] != nil
|
data/lib/rocketamf/version.rb
CHANGED
@@ -168,7 +168,7 @@ describe "when deserializing" do
|
|
168
168
|
end
|
169
169
|
|
170
170
|
#BAH! Who sends XML over AMF?
|
171
|
-
it "should deserialize
|
171
|
+
it "should deserialize XML"
|
172
172
|
end
|
173
173
|
|
174
174
|
describe "objects" do
|
@@ -227,7 +227,13 @@ describe "when deserializing" do
|
|
227
227
|
output.should == [h1, h2, so1, {:foo_three => nil}, {}, [h1, h2, so1], [], 42, "", [], "", {}, "bar_one", so1]
|
228
228
|
end
|
229
229
|
|
230
|
-
it "should deserialize a byte array"
|
230
|
+
it "should deserialize a byte array" do
|
231
|
+
input = object_fixture("amf3-byteArray.bin")
|
232
|
+
output = RocketAMF.deserialize(input, 3)
|
233
|
+
|
234
|
+
output.should be_a StringIO
|
235
|
+
output.string.should == "\000\003これtest\100"
|
236
|
+
end
|
231
237
|
end
|
232
238
|
|
233
239
|
describe "and implementing the AMF Spec" do
|
@@ -299,7 +305,13 @@ describe "when deserializing" do
|
|
299
305
|
end
|
300
306
|
|
301
307
|
it "should keep references of duplicate XML and XMLDocuments"
|
302
|
-
|
308
|
+
|
309
|
+
it "should keep references of duplicate byte arrays" do
|
310
|
+
input = object_fixture("amf3-byteArrayRef.bin")
|
311
|
+
output = RocketAMF.deserialize(input, 3)
|
312
|
+
output[0].object_id.should == output[1].object_id
|
313
|
+
output[0].string.should == "ASDF"
|
314
|
+
end
|
303
315
|
|
304
316
|
it "should deserialize a deep object graph with circular references" do
|
305
317
|
input = object_fixture("amf3-graphMember.bin")
|
data/spec/amf/serializer_spec.rb
CHANGED
@@ -155,7 +155,7 @@ describe "when serializing" do
|
|
155
155
|
end
|
156
156
|
|
157
157
|
#BAH! Who sends XML over AMF?
|
158
|
-
it "should serialize
|
158
|
+
it "should serialize XML"
|
159
159
|
end
|
160
160
|
|
161
161
|
describe "objects" do
|
@@ -225,7 +225,12 @@ describe "when serializing" do
|
|
225
225
|
output.should == expected
|
226
226
|
end
|
227
227
|
|
228
|
-
it "should serialize a byte array"
|
228
|
+
it "should serialize a byte array" do
|
229
|
+
expected = object_fixture("amf3-byteArray.bin")
|
230
|
+
input = StringIO.new "\000\003これtest\100"
|
231
|
+
output = RocketAMF.serialize(input, 3)
|
232
|
+
output.should == expected
|
233
|
+
end
|
229
234
|
end
|
230
235
|
|
231
236
|
describe "and implementing the AMF Spec" do
|
@@ -296,7 +301,15 @@ describe "when serializing" do
|
|
296
301
|
end
|
297
302
|
|
298
303
|
it "should keep references of duplicate XML and XMLDocuments"
|
299
|
-
|
304
|
+
|
305
|
+
it "should keep references of duplicate byte arrays" do
|
306
|
+
b = StringIO.new "ASDF"
|
307
|
+
|
308
|
+
expected = object_fixture("amf3-byteArrayRef.bin")
|
309
|
+
input = [b, b]
|
310
|
+
output = RocketAMF.serialize(input, 3)
|
311
|
+
output.should == expected
|
312
|
+
end
|
300
313
|
|
301
314
|
it "should serialize a deep object graph with circular references" do
|
302
315
|
class GraphMember
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
ASDF
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: RocketAMF
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Hillerson
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2010-
|
13
|
+
date: 2010-03-30 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|
@@ -62,6 +62,8 @@ files:
|
|
62
62
|
- spec/fixtures/objects/amf3-0.bin
|
63
63
|
- spec/fixtures/objects/amf3-arrayRef.bin
|
64
64
|
- spec/fixtures/objects/amf3-bigNum.bin
|
65
|
+
- spec/fixtures/objects/amf3-byteArray.bin
|
66
|
+
- spec/fixtures/objects/amf3-byteArrayRef.bin
|
65
67
|
- spec/fixtures/objects/amf3-date.bin
|
66
68
|
- spec/fixtures/objects/amf3-datesRef.bin
|
67
69
|
- spec/fixtures/objects/amf3-dynObject.bin
|