thrift 0.2.0 → 0.2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/CHANGELOG +1 -0
- data/Manifest +14 -2
- data/benchmark/gen-rb/BenchmarkService.rb +81 -0
- data/benchmark/gen-rb/Benchmark_constants.rb +11 -0
- data/benchmark/gen-rb/Benchmark_types.rb +10 -0
- data/ext/extconf.rb +1 -1
- data/lib/thrift/protocol/binaryprotocol.rb +213 -0
- data/lib/thrift/protocol/binaryprotocolaccelerated.rb +19 -0
- data/lib/thrift/protocol/tbinaryprotocol.rb +2 -0
- data/lib/thrift/protocol/tprotocol.rb +2 -0
- data/lib/thrift/server/httpserver.rb +44 -0
- data/lib/thrift/server/nonblockingserver.rb +278 -0
- data/lib/thrift/server/thttpserver.rb +2 -0
- data/lib/thrift/server/tserver.rb +2 -0
- data/spec/gen-rb/NonblockingService.rb +268 -0
- data/spec/gen-rb/ThriftSpec_constants.rb +11 -0
- data/spec/gen-rb/ThriftSpec_types.rb +134 -0
- data/thrift.gemspec +5 -5
- metadata +36 -9
- metadata.gz.sig +0 -0
- data/ext/conftest.dSYM/Contents/Info.plist +0 -25
- data/ext/conftest.dSYM/Contents/Resources/DWARF/conftest +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
@@ -6,14 +6,15 @@ Rakefile
|
|
6
6
|
benchmark/Benchmark.thrift
|
7
7
|
benchmark/benchmark.rb
|
8
8
|
benchmark/client.rb
|
9
|
+
benchmark/gen-rb/BenchmarkService.rb
|
10
|
+
benchmark/gen-rb/Benchmark_constants.rb
|
11
|
+
benchmark/gen-rb/Benchmark_types.rb
|
9
12
|
benchmark/server.rb
|
10
13
|
benchmark/thin_server.rb
|
11
14
|
ext/binary_protocol_accelerated.c
|
12
15
|
ext/binary_protocol_accelerated.h
|
13
16
|
ext/compact_protocol.c
|
14
17
|
ext/compact_protocol.h
|
15
|
-
ext/conftest.dSYM/Contents/Info.plist
|
16
|
-
ext/conftest.dSYM/Contents/Resources/DWARF/conftest
|
17
18
|
ext/constants.h
|
18
19
|
ext/extconf.rb
|
19
20
|
ext/macros.h
|
@@ -33,15 +34,23 @@ lib/thrift/processor.rb
|
|
33
34
|
lib/thrift/protocol/base_protocol.rb
|
34
35
|
lib/thrift/protocol/binary_protocol.rb
|
35
36
|
lib/thrift/protocol/binary_protocol_accelerated.rb
|
37
|
+
lib/thrift/protocol/binaryprotocol.rb
|
38
|
+
lib/thrift/protocol/binaryprotocolaccelerated.rb
|
36
39
|
lib/thrift/protocol/compact_protocol.rb
|
40
|
+
lib/thrift/protocol/tbinaryprotocol.rb
|
41
|
+
lib/thrift/protocol/tprotocol.rb
|
37
42
|
lib/thrift/serializer/deserializer.rb
|
38
43
|
lib/thrift/serializer/serializer.rb
|
39
44
|
lib/thrift/server/base_server.rb
|
45
|
+
lib/thrift/server/httpserver.rb
|
40
46
|
lib/thrift/server/mongrel_http_server.rb
|
41
47
|
lib/thrift/server/nonblocking_server.rb
|
48
|
+
lib/thrift/server/nonblockingserver.rb
|
42
49
|
lib/thrift/server/simple_server.rb
|
43
50
|
lib/thrift/server/thread_pool_server.rb
|
44
51
|
lib/thrift/server/threaded_server.rb
|
52
|
+
lib/thrift/server/thttpserver.rb
|
53
|
+
lib/thrift/server/tserver.rb
|
45
54
|
lib/thrift/struct.rb
|
46
55
|
lib/thrift/thrift_native.rb
|
47
56
|
lib/thrift/transport/base_server_transport.rb
|
@@ -69,6 +78,9 @@ spec/binary_protocol_spec_shared.rb
|
|
69
78
|
spec/client_spec.rb
|
70
79
|
spec/compact_protocol_spec.rb
|
71
80
|
spec/exception_spec.rb
|
81
|
+
spec/gen-rb/NonblockingService.rb
|
82
|
+
spec/gen-rb/ThriftSpec_constants.rb
|
83
|
+
spec/gen-rb/ThriftSpec_types.rb
|
72
84
|
spec/http_client_spec.rb
|
73
85
|
spec/mongrel_http_server_spec.rb
|
74
86
|
spec/nonblocking_server_spec.rb
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#
|
2
|
+
# Autogenerated by Thrift
|
3
|
+
#
|
4
|
+
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'thrift'
|
8
|
+
require 'thrift/protocol'
|
9
|
+
require File.dirname(__FILE__) + '/Benchmark_types'
|
10
|
+
|
11
|
+
module ThriftBenchmark
|
12
|
+
module BenchmarkService
|
13
|
+
class Client
|
14
|
+
include ::Thrift::Client
|
15
|
+
|
16
|
+
def fibonacci(n)
|
17
|
+
send_fibonacci(n)
|
18
|
+
return recv_fibonacci()
|
19
|
+
end
|
20
|
+
|
21
|
+
def send_fibonacci(n)
|
22
|
+
send_message('fibonacci', Fibonacci_args, :n => n)
|
23
|
+
end
|
24
|
+
|
25
|
+
def recv_fibonacci()
|
26
|
+
result = receive_message(Fibonacci_result)
|
27
|
+
return result.success unless result.success.nil?
|
28
|
+
raise Thrift::ApplicationException.new(Thrift::ApplicationException::MISSING_RESULT, 'fibonacci failed: unknown result')
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
class Processor
|
34
|
+
include ::Thrift::Processor
|
35
|
+
|
36
|
+
def process_fibonacci(seqid, iprot, oprot)
|
37
|
+
args = read_args(iprot, Fibonacci_args)
|
38
|
+
result = Fibonacci_result.new()
|
39
|
+
result.success = @handler.fibonacci(args.n)
|
40
|
+
write_result(result, oprot, 'fibonacci', seqid)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
# HELPER FUNCTIONS AND STRUCTURES
|
46
|
+
|
47
|
+
class Fibonacci_args
|
48
|
+
include ::Thrift::Struct
|
49
|
+
N = 1
|
50
|
+
|
51
|
+
Thrift::Struct.field_accessor self, :n
|
52
|
+
FIELDS = {
|
53
|
+
N => {:type => Thrift::Types::BYTE, :name => 'n'}
|
54
|
+
}
|
55
|
+
|
56
|
+
def struct_fields; FIELDS; end
|
57
|
+
|
58
|
+
def validate
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
class Fibonacci_result
|
64
|
+
include ::Thrift::Struct
|
65
|
+
SUCCESS = 0
|
66
|
+
|
67
|
+
Thrift::Struct.field_accessor self, :success
|
68
|
+
FIELDS = {
|
69
|
+
SUCCESS => {:type => Thrift::Types::I32, :name => 'success'}
|
70
|
+
}
|
71
|
+
|
72
|
+
def struct_fields; FIELDS; end
|
73
|
+
|
74
|
+
def validate
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
data/ext/extconf.rb
CHANGED
@@ -0,0 +1,213 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2006- Facebook
|
3
|
+
# Distributed under the Apache Software License
|
4
|
+
#
|
5
|
+
# See accompanying file LICENSE or visit the Thrift site at:
|
6
|
+
# http://developers.facebook.com/thrift/
|
7
|
+
#
|
8
|
+
# Author: Mark Slee <mcslee@facebook.com>
|
9
|
+
#
|
10
|
+
require 'thrift/protocol'
|
11
|
+
|
12
|
+
module Thrift
|
13
|
+
class BinaryProtocol < Protocol
|
14
|
+
VERSION_MASK = 0xffff0000
|
15
|
+
VERSION_1 = 0x80010000
|
16
|
+
TYPE_MASK = 0x000000ff
|
17
|
+
|
18
|
+
attr_reader :strict_read, :strict_write
|
19
|
+
|
20
|
+
def initialize(trans, strict_read=true, strict_write=true)
|
21
|
+
super(trans)
|
22
|
+
@strict_read = strict_read
|
23
|
+
@strict_write = strict_write
|
24
|
+
end
|
25
|
+
|
26
|
+
def write_message_begin(name, type, seqid)
|
27
|
+
# this is necessary because we added (needed) bounds checking to
|
28
|
+
# write_i32, and 0x80010000 is too big for that.
|
29
|
+
if strict_write
|
30
|
+
write_i16(VERSION_1 >> 16)
|
31
|
+
write_i16(type)
|
32
|
+
write_string(name)
|
33
|
+
write_i32(seqid)
|
34
|
+
else
|
35
|
+
write_string(name)
|
36
|
+
write_byte(type)
|
37
|
+
write_i32(seqid)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def write_field_begin(name, type, id)
|
42
|
+
write_byte(type)
|
43
|
+
write_i16(id)
|
44
|
+
end
|
45
|
+
|
46
|
+
def write_field_stop
|
47
|
+
write_byte(Thrift::Types::STOP)
|
48
|
+
end
|
49
|
+
|
50
|
+
def write_map_begin(ktype, vtype, size)
|
51
|
+
write_byte(ktype)
|
52
|
+
write_byte(vtype)
|
53
|
+
write_i32(size)
|
54
|
+
end
|
55
|
+
|
56
|
+
def write_list_begin(etype, size)
|
57
|
+
write_byte(etype)
|
58
|
+
write_i32(size)
|
59
|
+
end
|
60
|
+
|
61
|
+
def write_set_begin(etype, size)
|
62
|
+
write_byte(etype)
|
63
|
+
write_i32(size)
|
64
|
+
end
|
65
|
+
|
66
|
+
def write_bool(bool)
|
67
|
+
write_byte(bool ? 1 : 0)
|
68
|
+
end
|
69
|
+
|
70
|
+
def write_byte(byte)
|
71
|
+
trans.write([byte].pack('c'))
|
72
|
+
end
|
73
|
+
|
74
|
+
def write_i16(i16)
|
75
|
+
trans.write([i16].pack('n'))
|
76
|
+
end
|
77
|
+
|
78
|
+
def write_i32(i32)
|
79
|
+
raise RangeError if i32 < -2**31 || i32 >= 2**31
|
80
|
+
trans.write([i32].pack('N'))
|
81
|
+
end
|
82
|
+
|
83
|
+
def write_i64(i64)
|
84
|
+
hi = i64 >> 32
|
85
|
+
lo = i64 & 0xffffffff
|
86
|
+
trans.write([hi, lo].pack('N2'))
|
87
|
+
end
|
88
|
+
|
89
|
+
def write_double(dub)
|
90
|
+
trans.write([dub].pack('G'))
|
91
|
+
end
|
92
|
+
|
93
|
+
def write_string(str)
|
94
|
+
write_i32(str.length)
|
95
|
+
trans.write(str)
|
96
|
+
end
|
97
|
+
|
98
|
+
def read_message_begin
|
99
|
+
version = read_i32
|
100
|
+
if version < 0
|
101
|
+
if (version & VERSION_MASK != VERSION_1)
|
102
|
+
raise ProtocolException.new(ProtocolException::BAD_VERSION, 'Missing version identifier')
|
103
|
+
end
|
104
|
+
type = version & TYPE_MASK
|
105
|
+
name = read_string
|
106
|
+
seqid = read_i32
|
107
|
+
[name, type, seqid]
|
108
|
+
else
|
109
|
+
if strict_read
|
110
|
+
raise ProtocolException.new(ProtocolException::BAD_VERSION, 'No version identifier, old protocol client?')
|
111
|
+
end
|
112
|
+
name = trans.read_all(version)
|
113
|
+
type = read_byte
|
114
|
+
seqid = read_i32
|
115
|
+
[name, type, seqid]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def read_field_begin
|
120
|
+
type = read_byte
|
121
|
+
if (type == Types::STOP)
|
122
|
+
[nil, type, 0]
|
123
|
+
else
|
124
|
+
id = read_i16
|
125
|
+
[nil, type, id]
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def read_map_begin
|
130
|
+
ktype = read_byte
|
131
|
+
vtype = read_byte
|
132
|
+
size = read_i32
|
133
|
+
[ktype, vtype, size]
|
134
|
+
end
|
135
|
+
|
136
|
+
def read_list_begin
|
137
|
+
etype = read_byte
|
138
|
+
size = read_i32
|
139
|
+
[etype, size]
|
140
|
+
end
|
141
|
+
|
142
|
+
def read_set_begin
|
143
|
+
etype = read_byte
|
144
|
+
size = read_i32
|
145
|
+
[etype, size]
|
146
|
+
end
|
147
|
+
|
148
|
+
def read_bool
|
149
|
+
byte = read_byte
|
150
|
+
byte != 0
|
151
|
+
end
|
152
|
+
|
153
|
+
def read_byte
|
154
|
+
dat = trans.read_all(1)
|
155
|
+
val = dat[0]
|
156
|
+
if (val > 0x7f)
|
157
|
+
val = 0 - ((val - 1) ^ 0xff)
|
158
|
+
end
|
159
|
+
val
|
160
|
+
end
|
161
|
+
|
162
|
+
def read_i16
|
163
|
+
dat = trans.read_all(2)
|
164
|
+
val, = dat.unpack('n')
|
165
|
+
if (val > 0x7fff)
|
166
|
+
val = 0 - ((val - 1) ^ 0xffff)
|
167
|
+
end
|
168
|
+
val
|
169
|
+
end
|
170
|
+
|
171
|
+
def read_i32
|
172
|
+
dat = trans.read_all(4)
|
173
|
+
val, = dat.unpack('N')
|
174
|
+
if (val > 0x7fffffff)
|
175
|
+
val = 0 - ((val - 1) ^ 0xffffffff)
|
176
|
+
end
|
177
|
+
val
|
178
|
+
end
|
179
|
+
|
180
|
+
def read_i64
|
181
|
+
dat = trans.read_all(8)
|
182
|
+
hi, lo = dat.unpack('N2')
|
183
|
+
if (hi > 0x7fffffff)
|
184
|
+
hi ^= 0xffffffff
|
185
|
+
lo ^= 0xffffffff
|
186
|
+
0 - (hi << 32) - lo - 1
|
187
|
+
else
|
188
|
+
(hi << 32) + lo
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
def read_double
|
193
|
+
dat = trans.read_all(8)
|
194
|
+
val = dat.unpack('G').first
|
195
|
+
val
|
196
|
+
end
|
197
|
+
|
198
|
+
def read_string
|
199
|
+
sz = read_i32
|
200
|
+
dat = trans.read_all(sz)
|
201
|
+
dat
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
deprecate_class! :TBinaryProtocol => BinaryProtocol
|
206
|
+
|
207
|
+
class BinaryProtocolFactory < ProtocolFactory
|
208
|
+
def get_protocol(trans)
|
209
|
+
return Thrift::BinaryProtocol.new(trans)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
deprecate_class! :TBinaryProtocolFactory => BinaryProtocolFactory
|
213
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'thrift/protocol/binaryprotocol'
|
2
|
+
require 'thrift_native'
|
3
|
+
|
4
|
+
=begin
|
5
|
+
The only change required for a transport to support TBinaryProtocolAccelerated is to implement 2 methods:
|
6
|
+
* borrow(size), which takes an optional argument and returns atleast _size_ bytes from the transport,
|
7
|
+
or the default buffer size if no argument is given
|
8
|
+
* consume!(size), which removes size bytes from the front of the buffer
|
9
|
+
|
10
|
+
See TMemoryBuffer and TBufferedTransport for examples.
|
11
|
+
=end
|
12
|
+
|
13
|
+
module Thrift
|
14
|
+
class BinaryProtocolAcceleratedFactory < ProtocolFactory
|
15
|
+
def get_protocol(trans)
|
16
|
+
BinaryProtocolAccelerated.new(trans)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'thrift/protocol'
|
2
|
+
require 'thrift/protocol/binaryprotocol'
|
3
|
+
require 'thrift/transport'
|
4
|
+
|
5
|
+
require 'mongrel'
|
6
|
+
|
7
|
+
## Sticks a service on a URL, using mongrel to do the HTTP work
|
8
|
+
module Thrift
|
9
|
+
class SimpleMongrelHTTPServer
|
10
|
+
class Handler < Mongrel::HttpHandler
|
11
|
+
def initialize(processor, protocol_factory)
|
12
|
+
@processor = processor
|
13
|
+
@protocol_factory = protocol_factory
|
14
|
+
end
|
15
|
+
|
16
|
+
def process(request, response)
|
17
|
+
if request.params["REQUEST_METHOD"] == "POST"
|
18
|
+
response.start(200) do |head, out|
|
19
|
+
head["Content-Type"] = "application/x-thrift"
|
20
|
+
transport = IOStreamTransport.new request.body, out
|
21
|
+
protocol = @protocol_factory.get_protocol transport
|
22
|
+
@processor.process protocol, protocol
|
23
|
+
end
|
24
|
+
else
|
25
|
+
response.start(404) { }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(processor, opts={})
|
31
|
+
port = opts[:port] || 80
|
32
|
+
ip = opts[:ip] || "0.0.0.0"
|
33
|
+
path = opts[:path] || ""
|
34
|
+
protocol_factory = opts[:protocol_factory] || BinaryProtocolFactory.new
|
35
|
+
@server = Mongrel::HttpServer.new ip, port
|
36
|
+
@server.register "/#{path}", Handler.new(processor, protocol_factory)
|
37
|
+
end
|
38
|
+
|
39
|
+
def serve
|
40
|
+
@server.run.join
|
41
|
+
end
|
42
|
+
end
|
43
|
+
deprecate_class! :TSimpleMongrelHTTPServer => SimpleMongrelHTTPServer
|
44
|
+
end
|