hessian2 1.1.1 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +6 -2
- data/LICENSE.txt +22 -0
- data/README.md +161 -0
- data/hessian2.gemspec +3 -2
- data/lib/hessian2.rb +12 -4
- data/lib/hessian2/class_wrapper.rb +89 -0
- data/lib/hessian2/client.rb +38 -0
- data/lib/hessian2/constants.rb +164 -0
- data/lib/hessian2/em_client.rb +52 -0
- data/lib/hessian2/fault.rb +3 -0
- data/lib/hessian2/handler.rb +15 -0
- data/lib/hessian2/hessian_client.rb +3 -38
- data/lib/hessian2/parser.rb +619 -0
- data/lib/hessian2/struct_wrapper.rb +55 -0
- data/lib/hessian2/type_wrapper.rb +49 -8
- data/lib/hessian2/version.rb +1 -1
- data/lib/hessian2/writer.rb +498 -0
- data/spec/binary_spec.rb +51 -0
- data/spec/boolean_spec.rb +26 -0
- data/spec/class_wrapper_spec.rb +52 -0
- data/spec/create_monkeys.rb +14 -0
- data/spec/date_spec.rb +45 -0
- data/spec/double_spec.rb +78 -0
- data/spec/int_spec.rb +54 -0
- data/spec/list_spec.rb +66 -0
- data/spec/long_spec.rb +68 -0
- data/spec/map_spec.rb +36 -0
- data/spec/null_spec.rb +17 -0
- data/spec/object_spec.rb +65 -0
- data/spec/ref_spec.rb +43 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/string_spec.rb +61 -0
- data/spec/struct_wrapper_spec.rb +47 -0
- data/spec/type_wrapper_spec.rb +102 -0
- data/test/app.rb +15 -0
- data/test/client.rb +9 -0
- data/test/config.ru +2 -0
- data/test/monkey_service.rb +12 -0
- metadata +79 -19
- data/README.rdoc +0 -21
- data/lib/hessian2/hessian_exception.rb +0 -3
- data/lib/hessian2/hessian_parser.rb +0 -75
- data/lib/hessian2/hessian_writer.rb +0 -130
- data/test/test_hessian_parser.rb +0 -56
metadata
CHANGED
@@ -1,18 +1,30 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hessian2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 2.0.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- takafan
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
14
|
-
|
15
|
-
|
11
|
+
date: 2013-10-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bigdecimal
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: like json, additionally, 麻绳2 parse your object as a struct.
|
16
28
|
email:
|
17
29
|
- takafan@163.com
|
18
30
|
executables: []
|
@@ -21,39 +33,87 @@ extra_rdoc_files: []
|
|
21
33
|
files:
|
22
34
|
- .gitignore
|
23
35
|
- Gemfile
|
24
|
-
-
|
36
|
+
- LICENSE.txt
|
37
|
+
- README.md
|
25
38
|
- Rakefile
|
26
39
|
- hessian2.gemspec
|
27
40
|
- lib/hessian2.rb
|
41
|
+
- lib/hessian2/class_wrapper.rb
|
42
|
+
- lib/hessian2/client.rb
|
43
|
+
- lib/hessian2/constants.rb
|
44
|
+
- lib/hessian2/em_client.rb
|
45
|
+
- lib/hessian2/fault.rb
|
46
|
+
- lib/hessian2/handler.rb
|
28
47
|
- lib/hessian2/hessian_client.rb
|
29
|
-
- lib/hessian2/
|
30
|
-
- lib/hessian2/
|
31
|
-
- lib/hessian2/hessian_writer.rb
|
48
|
+
- lib/hessian2/parser.rb
|
49
|
+
- lib/hessian2/struct_wrapper.rb
|
32
50
|
- lib/hessian2/type_wrapper.rb
|
33
51
|
- lib/hessian2/version.rb
|
34
|
-
-
|
52
|
+
- lib/hessian2/writer.rb
|
53
|
+
- spec/binary_spec.rb
|
54
|
+
- spec/boolean_spec.rb
|
55
|
+
- spec/class_wrapper_spec.rb
|
56
|
+
- spec/create_monkeys.rb
|
57
|
+
- spec/date_spec.rb
|
58
|
+
- spec/double_spec.rb
|
59
|
+
- spec/int_spec.rb
|
60
|
+
- spec/list_spec.rb
|
61
|
+
- spec/long_spec.rb
|
62
|
+
- spec/map_spec.rb
|
63
|
+
- spec/null_spec.rb
|
64
|
+
- spec/object_spec.rb
|
65
|
+
- spec/ref_spec.rb
|
66
|
+
- spec/spec_helper.rb
|
67
|
+
- spec/string_spec.rb
|
68
|
+
- spec/struct_wrapper_spec.rb
|
69
|
+
- spec/type_wrapper_spec.rb
|
70
|
+
- test/app.rb
|
71
|
+
- test/client.rb
|
72
|
+
- test/config.ru
|
73
|
+
- test/monkey_service.rb
|
35
74
|
homepage: http://github.com/takafan/hessian2
|
36
|
-
licenses:
|
75
|
+
licenses:
|
76
|
+
- MIT
|
77
|
+
metadata: {}
|
37
78
|
post_install_message:
|
38
79
|
rdoc_options: []
|
39
80
|
require_paths:
|
40
81
|
- lib
|
41
82
|
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
83
|
requirements:
|
44
|
-
- -
|
84
|
+
- - '>='
|
45
85
|
- !ruby/object:Gem::Version
|
46
86
|
version: '0'
|
47
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
-
none: false
|
49
88
|
requirements:
|
50
|
-
- -
|
89
|
+
- - '>='
|
51
90
|
- !ruby/object:Gem::Version
|
52
91
|
version: '0'
|
53
92
|
requirements: []
|
54
93
|
rubyforge_project: hessian2
|
55
|
-
rubygems_version: 1.
|
94
|
+
rubygems_version: 2.1.5
|
56
95
|
signing_key:
|
57
|
-
specification_version:
|
96
|
+
specification_version: 4
|
58
97
|
summary: Hessian2
|
59
|
-
test_files:
|
98
|
+
test_files:
|
99
|
+
- spec/binary_spec.rb
|
100
|
+
- spec/boolean_spec.rb
|
101
|
+
- spec/class_wrapper_spec.rb
|
102
|
+
- spec/create_monkeys.rb
|
103
|
+
- spec/date_spec.rb
|
104
|
+
- spec/double_spec.rb
|
105
|
+
- spec/int_spec.rb
|
106
|
+
- spec/list_spec.rb
|
107
|
+
- spec/long_spec.rb
|
108
|
+
- spec/map_spec.rb
|
109
|
+
- spec/null_spec.rb
|
110
|
+
- spec/object_spec.rb
|
111
|
+
- spec/ref_spec.rb
|
112
|
+
- spec/spec_helper.rb
|
113
|
+
- spec/string_spec.rb
|
114
|
+
- spec/struct_wrapper_spec.rb
|
115
|
+
- spec/type_wrapper_spec.rb
|
116
|
+
- test/app.rb
|
117
|
+
- test/client.rb
|
118
|
+
- test/config.ru
|
119
|
+
- test/monkey_service.rb
|
data/README.rdoc
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
= hessian2
|
2
|
-
|
3
|
-
implement hessian 1.0.2 specification. refactor Christer Sandberg's hessian, ruby 1.9.3 required.
|
4
|
-
|
5
|
-
== Using
|
6
|
-
|
7
|
-
gem install hessian2
|
8
|
-
|
9
|
-
require 'hessian2'
|
10
|
-
|
11
|
-
url = 'http://localhost:8080/person_service'
|
12
|
-
|
13
|
-
client = Hessian2::HessianClient.new(url)
|
14
|
-
|
15
|
-
# call remote function: public Person getPersonByUid(Long uid);
|
16
|
-
uid = Hessian2::TypeWrapper.new('L', 59)
|
17
|
-
puts client.getPersonByUid(uid)
|
18
|
-
|
19
|
-
== Authors
|
20
|
-
|
21
|
-
* {Takafan}[http://hululuu.com]
|
@@ -1,75 +0,0 @@
|
|
1
|
-
module Hessian2
|
2
|
-
module HessianParser
|
3
|
-
|
4
|
-
def parse(data, refs = [], chunks = [])
|
5
|
-
t = data.slice!(0)
|
6
|
-
case t
|
7
|
-
when 'r' # reply
|
8
|
-
data.slice!(0, 2)
|
9
|
-
parse(data)
|
10
|
-
when 'f' # fault
|
11
|
-
parse(data)
|
12
|
-
code = parse(data)
|
13
|
-
parse(data)
|
14
|
-
message = parse(data)
|
15
|
-
raise HessianException.new, "#{code}: #{message}"
|
16
|
-
when 'N' # null
|
17
|
-
nil
|
18
|
-
when 'T' # true
|
19
|
-
true
|
20
|
-
when 'F' # false
|
21
|
-
false
|
22
|
-
when 'I' # int
|
23
|
-
data.slice!(0, 4).unpack('l>')[0]
|
24
|
-
when 'L' # long
|
25
|
-
data.slice!(0, 8).unpack('q>')[0]
|
26
|
-
when 'D' # double
|
27
|
-
data.slice!(0, 8).unpack('G')[0]
|
28
|
-
when 'd' # date
|
29
|
-
val = data.slice!(0, 8).unpack('Q>')[0]
|
30
|
-
Time.at(val / 1000, val % 1000 * 1000)
|
31
|
-
when 'S', 's', 'X', 'x' # string, xml
|
32
|
-
len = data.slice!(0, 2).unpack('n')[0]
|
33
|
-
|
34
|
-
chunk = data.unpack("U#{len}")
|
35
|
-
chunks << chunk
|
36
|
-
data.slice!(0, chunk.pack('U*').bytesize)
|
37
|
-
|
38
|
-
if 'sx'.include?(t)
|
39
|
-
parse(data, refs, chunks)
|
40
|
-
else
|
41
|
-
chunks.flatten.pack('U*')
|
42
|
-
end
|
43
|
-
when 'B', 'b' # binary
|
44
|
-
len = data.slice!(0, 2).unpack('n')[0]
|
45
|
-
|
46
|
-
chunk = data.slice!(0, len)
|
47
|
-
chunks << chunk
|
48
|
-
|
49
|
-
if t == 'b'
|
50
|
-
parse(data, refs, chunks)
|
51
|
-
else
|
52
|
-
chunks.flatten
|
53
|
-
end
|
54
|
-
when 'V' # list
|
55
|
-
data.slice!(0, 3 + data.unpack('an')[1]) if data[0] == 't'
|
56
|
-
data.slice!(0, 5) if data[0] == 'l'
|
57
|
-
refs << (list = [])
|
58
|
-
list << parse(data, refs) while data[0] != 'z'
|
59
|
-
data.slice!(0)
|
60
|
-
list
|
61
|
-
when 'M' # map
|
62
|
-
data.slice!(0, 3 + data.unpack('an')[1]) if data[0] == 't'
|
63
|
-
refs << (map = {})
|
64
|
-
map[parse(data, refs)] = parse(data, refs) while data[0] != 'z'
|
65
|
-
data.slice!(0)
|
66
|
-
map
|
67
|
-
when 'R' # ref
|
68
|
-
refs[data.slice!(0, 4).unpack('N')[0]]
|
69
|
-
else
|
70
|
-
raise HessianException.new, "Invalid type: '#{t}'"
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
end
|
@@ -1,130 +0,0 @@
|
|
1
|
-
module Hessian2
|
2
|
-
module HessianWriter
|
3
|
-
CHUNK_SIZE = 32768
|
4
|
-
|
5
|
-
def write_call(method, args)
|
6
|
-
refs = {}
|
7
|
-
out = [ 'c', '0', '1', 'm', method.length ].pack('ahhan') << method
|
8
|
-
args.each { |arg| out << write(arg, refs) }
|
9
|
-
out << 'z'
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
def write(val, refs = {}, chunks = [], type = nil)
|
14
|
-
case val
|
15
|
-
when TypeWrapper
|
16
|
-
obj, hessian_type = val.object, val.hessian_type
|
17
|
-
case hessian_type
|
18
|
-
when 'L', 'Long', 'long' # declare as long
|
19
|
-
[ 'L', obj ].pack('aq>') # long
|
20
|
-
when 'X', 'x' # declare as xml
|
21
|
-
if obj.size > CHUNK_SIZE
|
22
|
-
chunk = obj.slice!(0, CHUNK_SIZE)
|
23
|
-
if chunk.ascii_only?
|
24
|
-
chunks << [ 's', CHUNK_SIZE ].pack('an') << chunk
|
25
|
-
else
|
26
|
-
chunks << [ 's', CHUNK_SIZE, chunk.unpack('U*') ].flatten.pack('anU*')
|
27
|
-
end
|
28
|
-
write(TypeWrapper.new('X', obj), refs, chunks)
|
29
|
-
else
|
30
|
-
if obj.ascii_only?
|
31
|
-
chunks << [ 'X', obj.size ].pack('an') << obj
|
32
|
-
else
|
33
|
-
chunks << [ 'X', obj.size, obj.unpack('U*') ].flatten.pack('anU*')
|
34
|
-
end
|
35
|
-
chunks.join # xml
|
36
|
-
end
|
37
|
-
when 'B', 'b' # declare as binary
|
38
|
-
[ 'B', obj.size ].pack('an') << obj
|
39
|
-
if obj.size > CHUNK_SIZE
|
40
|
-
chunk = obj.slice!(0, CHUNK_SIZE)
|
41
|
-
chunks << [ 'b', CHUNK_SIZE ].pack('an') << chunk
|
42
|
-
write(TypeWrapper.new('B', obj), refs, chunks)
|
43
|
-
else
|
44
|
-
chunks << [ 'B', obj.size ].pack('an') << obj
|
45
|
-
chunks.join # binary
|
46
|
-
end
|
47
|
-
else # type for list, map
|
48
|
-
write(obj, refs, chunks, hessian_type)
|
49
|
-
end
|
50
|
-
when NilClass
|
51
|
-
'N' # null
|
52
|
-
when TrueClass
|
53
|
-
'T' # true
|
54
|
-
when FalseClass
|
55
|
-
'F' # false
|
56
|
-
when Fixnum
|
57
|
-
[ 'I', val ].pack('al>') # int
|
58
|
-
when Bignum
|
59
|
-
[ 'L', val ].pack('aq>') # long
|
60
|
-
when Float
|
61
|
-
[ 'D', val ].pack('aG') # double
|
62
|
-
when Time
|
63
|
-
[ 'd', val.to_f * 1000 ].pack('aQ>') # date
|
64
|
-
when String
|
65
|
-
if val.size > CHUNK_SIZE
|
66
|
-
chunk = val.slice!(0, CHUNK_SIZE)
|
67
|
-
if chunk.ascii_only?
|
68
|
-
chunks << [ 's', CHUNK_SIZE ].pack('an') << chunk
|
69
|
-
else
|
70
|
-
# unpack-pack if chunk incompatible with ASCII-8BIT
|
71
|
-
chunks << [ 's', CHUNK_SIZE, chunk.unpack('U*') ].flatten.pack('anU*')
|
72
|
-
end
|
73
|
-
write(val, refs, chunks)
|
74
|
-
else
|
75
|
-
if val.ascii_only?
|
76
|
-
chunks << [ 'S', val.size ].pack('an') << val
|
77
|
-
else
|
78
|
-
chunks << [ 'S', val.size, val.unpack('U*') ].flatten.pack('anU*')
|
79
|
-
end
|
80
|
-
chunks.join # string
|
81
|
-
end
|
82
|
-
when Symbol
|
83
|
-
str = val.to_s
|
84
|
-
[ 'S', str.size ].pack('an') << str # string
|
85
|
-
when Array
|
86
|
-
idx = refs[val.object_id]
|
87
|
-
return [ 'R', idx ].pack('aN') if idx
|
88
|
-
|
89
|
-
refs[val.object_id] = refs.size
|
90
|
-
|
91
|
-
str = 'V'
|
92
|
-
str << 't' << [ type.size, type ].pack('na*') if type
|
93
|
-
str << 'l' << [ val.size ].pack('N')
|
94
|
-
val.each{ |v| str << write(v, refs) }
|
95
|
-
str << 'z' # list
|
96
|
-
when Hash
|
97
|
-
idx = refs[val.object_id]
|
98
|
-
return [ 'R', idx ].pack('aN') if idx
|
99
|
-
|
100
|
-
refs[val.object_id] = refs.size
|
101
|
-
|
102
|
-
str = 'M'
|
103
|
-
str << 't' << [ type.size, type ].pack('na*') if type
|
104
|
-
val.each do |k, v|
|
105
|
-
str << write(k, refs)
|
106
|
-
str << write(v, refs)
|
107
|
-
end
|
108
|
-
str << 'z' # map
|
109
|
-
else # covert val to hash
|
110
|
-
h = {}.tap do |h|
|
111
|
-
val.instance_variables.each {|var| h[var.to_s.delete("@")] = val.instance_variable_get(var) }
|
112
|
-
end
|
113
|
-
|
114
|
-
unless type
|
115
|
-
# map ruby module to java package
|
116
|
-
arr = val.class.to_s.split('::')
|
117
|
-
if arr.size > 1
|
118
|
-
klass = arr.pop
|
119
|
-
type = arr.map{|m| m.downcase}.join('.') << ".#{klass}"
|
120
|
-
else
|
121
|
-
type = arr.first
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
write(h, refs, chunks, type)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
end
|
130
|
-
end
|
data/test/test_hessian_parser.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
lib_path = File.expand_path('../../lib', __FILE__)
|
2
|
-
$:.unshift(lib_path)
|
3
|
-
require 'hessian2'
|
4
|
-
require 'test/unit'
|
5
|
-
|
6
|
-
class HessianParserTest < Test::Unit::TestCase
|
7
|
-
|
8
|
-
include Hessian2::HessianParser
|
9
|
-
|
10
|
-
def test_integer
|
11
|
-
assert_equal 4711, parse("r\001\000I\000\000\022gz")
|
12
|
-
end
|
13
|
-
def test_long
|
14
|
-
assert_equal 2, parse("r\001\000L\000\000\000\000\000\000\000\002z")
|
15
|
-
end
|
16
|
-
def test_double
|
17
|
-
assert_equal 3.4, parse("r\001\000D@\v333333z")
|
18
|
-
end
|
19
|
-
def test_false
|
20
|
-
assert_equal false, parse("r\001\000Fz")
|
21
|
-
end
|
22
|
-
def test_true
|
23
|
-
assert_equal true, parse("r\001\000Tz")
|
24
|
-
end
|
25
|
-
def test_string
|
26
|
-
assert_equal "string", parse("r\001\000S\000\006stringz")
|
27
|
-
end
|
28
|
-
def test_null
|
29
|
-
assert_equal nil, parse("r\001\000Nz")
|
30
|
-
end
|
31
|
-
def test_date
|
32
|
-
time = parse("r\001\000d\000\000\001\010\344\036\332\360z")
|
33
|
-
assert_instance_of Time, time
|
34
|
-
assert_equal '2006-01-19 19:23:13', time.getutc.strftime("%Y-%m-%d %H:%M:%S")
|
35
|
-
assert_equal 520000, time.usec
|
36
|
-
end
|
37
|
-
def test_integer_array
|
38
|
-
assert_equal [ 1, 2, 3 ], parse([ "r\001\000Vt\000\004[intl\000\000\000\003",
|
39
|
-
"I\000\000\000\001I\000\000\000\002I\000\000\000\003zz" ].join)
|
40
|
-
end
|
41
|
-
def test_array
|
42
|
-
assert_equal [ 'sillen', 32 ], parse([ "r\001\000Vt\000\a[objectl\000\000\000\002",
|
43
|
-
"S\000\006sillenI\000\000\000 zz" ].join)
|
44
|
-
end
|
45
|
-
def test_array_in_array
|
46
|
-
assert_equal [ 'A list', [ 9, 3 ] ], parse([ "r\001\000Vl\000\000\000\002S\000\006",
|
47
|
-
"A listVt\000\022[java.lang.Integerl\000\000\000\002I\000\000\000\t",
|
48
|
-
"I\000\000\000\003zzz" ].join)
|
49
|
-
end
|
50
|
-
def test_map
|
51
|
-
map = { 'sillen' => 32, 'numbers' => [ 1.1, 1.2, 1.3 ] }
|
52
|
-
assert_equal map, parse([ "r\001\000Mt\000\000S\000\anumbersVt\000\a[double",
|
53
|
-
"l\000\000\000\003D?\361\231\231\231\231\231\232D?\363333333D?",
|
54
|
-
"\364\314\314\314\314\314\315zS\000\006sillenI\000\000\000 zz" ].join)
|
55
|
-
end
|
56
|
-
end
|