thrift 0.9.2.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/ext/binary_protocol_accelerated.c +12 -12
  3. data/ext/struct.c +5 -1
  4. data/lib/thrift.rb +8 -4
  5. data/lib/thrift/multiplexed_processor.rb +76 -0
  6. data/lib/thrift/processor.rb +24 -6
  7. data/lib/thrift/protocol/base_protocol.rb +11 -3
  8. data/lib/thrift/protocol/binary_protocol.rb +8 -1
  9. data/lib/thrift/protocol/binary_protocol_accelerated.rb +8 -0
  10. data/lib/thrift/protocol/compact_protocol.rb +8 -0
  11. data/lib/thrift/protocol/json_protocol.rb +21 -4
  12. data/lib/thrift/protocol/multiplexed_protocol.rb +44 -0
  13. data/lib/thrift/protocol/protocol_decorator.rb +194 -0
  14. data/lib/thrift/server/base_server.rb +8 -2
  15. data/lib/thrift/server/simple_server.rb +5 -1
  16. data/lib/thrift/server/thread_pool_server.rb +5 -1
  17. data/lib/thrift/server/threaded_server.rb +5 -1
  18. data/lib/thrift/transport/base_server_transport.rb +1 -1
  19. data/lib/thrift/transport/base_transport.rb +8 -0
  20. data/lib/thrift/transport/buffered_transport.rb +9 -1
  21. data/lib/thrift/transport/framed_transport.rb +9 -1
  22. data/lib/thrift/transport/http_client_transport.rb +7 -0
  23. data/lib/thrift/transport/io_stream_transport.rb +4 -1
  24. data/lib/thrift/transport/memory_buffer_transport.rb +4 -0
  25. data/lib/thrift/transport/server_socket.rb +6 -1
  26. data/lib/thrift/transport/socket.rb +21 -17
  27. data/lib/thrift/transport/ssl_server_socket.rb +41 -0
  28. data/lib/thrift/transport/ssl_socket.rb +51 -0
  29. data/lib/thrift/transport/unix_server_socket.rb +5 -1
  30. data/lib/thrift/transport/unix_socket.rb +5 -1
  31. data/lib/thrift/union.rb +3 -6
  32. data/spec/BaseService.thrift +27 -0
  33. data/spec/ExtendedService.thrift +25 -0
  34. data/spec/base_protocol_spec.rb +79 -71
  35. data/spec/base_transport_spec.rb +155 -117
  36. data/spec/binary_protocol_accelerated_spec.rb +6 -2
  37. data/spec/binary_protocol_spec.rb +16 -8
  38. data/spec/binary_protocol_spec_shared.rb +75 -72
  39. data/spec/bytes_spec.rb +38 -38
  40. data/spec/client_spec.rb +41 -42
  41. data/spec/compact_protocol_spec.rb +32 -17
  42. data/spec/exception_spec.rb +54 -54
  43. data/spec/flat_spec.rb +62 -0
  44. data/spec/http_client_spec.rb +74 -33
  45. data/spec/json_protocol_spec.rb +170 -131
  46. data/spec/namespaced_spec.rb +10 -5
  47. data/spec/nonblocking_server_spec.rb +16 -16
  48. data/spec/processor_spec.rb +26 -26
  49. data/spec/serializer_spec.rb +20 -20
  50. data/spec/server_socket_spec.rb +27 -22
  51. data/spec/server_spec.rb +91 -51
  52. data/spec/socket_spec.rb +23 -16
  53. data/spec/socket_spec_shared.rb +31 -31
  54. data/spec/spec_helper.rb +4 -1
  55. data/spec/ssl_server_socket_spec.rb +34 -0
  56. data/spec/ssl_socket_spec.rb +78 -0
  57. data/spec/struct_nested_containers_spec.rb +24 -24
  58. data/spec/struct_spec.rb +120 -120
  59. data/spec/thin_http_server_spec.rb +18 -18
  60. data/spec/types_spec.rb +56 -53
  61. data/spec/union_spec.rb +51 -40
  62. data/spec/unix_socket_spec.rb +43 -34
  63. metadata +191 -143
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f82075a1d228750e0b70f3bae434d45ae11fa9bf73062986a0377344e9673a0f
4
+ data.tar.gz: 60bb709c6c72588e6547be56a2b9caa12711e19970ff54595fe6b6a979e6d303
5
+ SHA512:
6
+ metadata.gz: 678a0784be7d06bb5ec9b70c08031d59e8798ff439c7ded371186572b7819ca0c23d9dfe4edbbfacf13e49f1945b1383aed0b97983e491cbcbc89226433d7c1a
7
+ data.tar.gz: 294aeff21a03505dc0ac344077d7f8a0a04b817ff127507fd8e744bf9a6000dc673b0bce0898ee99670e6e38f9ae2d033198f0607331ba71e220ae828f63de4b
@@ -283,27 +283,27 @@ VALUE rb_thrift_binary_proto_read_message_end(VALUE self) {
283
283
  return Qnil;
284
284
  }
285
285
 
286
- VALUE rb_thift_binary_proto_read_struct_begin(VALUE self) {
286
+ VALUE rb_thrift_binary_proto_read_struct_begin(VALUE self) {
287
287
  return Qnil;
288
288
  }
289
289
 
290
- VALUE rb_thift_binary_proto_read_struct_end(VALUE self) {
290
+ VALUE rb_thrift_binary_proto_read_struct_end(VALUE self) {
291
291
  return Qnil;
292
292
  }
293
293
 
294
- VALUE rb_thift_binary_proto_read_field_end(VALUE self) {
294
+ VALUE rb_thrift_binary_proto_read_field_end(VALUE self) {
295
295
  return Qnil;
296
296
  }
297
297
 
298
- VALUE rb_thift_binary_proto_read_map_end(VALUE self) {
298
+ VALUE rb_thrift_binary_proto_read_map_end(VALUE self) {
299
299
  return Qnil;
300
300
  }
301
301
 
302
- VALUE rb_thift_binary_proto_read_list_end(VALUE self) {
302
+ VALUE rb_thrift_binary_proto_read_list_end(VALUE self) {
303
303
  return Qnil;
304
304
  }
305
305
 
306
- VALUE rb_thift_binary_proto_read_set_end(VALUE self) {
306
+ VALUE rb_thrift_binary_proto_read_set_end(VALUE self) {
307
307
  return Qnil;
308
308
  }
309
309
 
@@ -449,12 +449,12 @@ void Init_binary_protocol_accelerated() {
449
449
  rb_define_method(bpa_class, "read_binary", rb_thrift_binary_proto_read_binary, 0);
450
450
  // unused methods
451
451
  rb_define_method(bpa_class, "read_message_end", rb_thrift_binary_proto_read_message_end, 0);
452
- rb_define_method(bpa_class, "read_struct_begin", rb_thift_binary_proto_read_struct_begin, 0);
453
- rb_define_method(bpa_class, "read_struct_end", rb_thift_binary_proto_read_struct_end, 0);
454
- rb_define_method(bpa_class, "read_field_end", rb_thift_binary_proto_read_field_end, 0);
455
- rb_define_method(bpa_class, "read_map_end", rb_thift_binary_proto_read_map_end, 0);
456
- rb_define_method(bpa_class, "read_list_end", rb_thift_binary_proto_read_list_end, 0);
457
- rb_define_method(bpa_class, "read_set_end", rb_thift_binary_proto_read_set_end, 0);
452
+ rb_define_method(bpa_class, "read_struct_begin", rb_thrift_binary_proto_read_struct_begin, 0);
453
+ rb_define_method(bpa_class, "read_struct_end", rb_thrift_binary_proto_read_struct_end, 0);
454
+ rb_define_method(bpa_class, "read_field_end", rb_thrift_binary_proto_read_field_end, 0);
455
+ rb_define_method(bpa_class, "read_map_end", rb_thrift_binary_proto_read_map_end, 0);
456
+ rb_define_method(bpa_class, "read_list_end", rb_thrift_binary_proto_read_list_end, 0);
457
+ rb_define_method(bpa_class, "read_set_end", rb_thrift_binary_proto_read_set_end, 0);
458
458
 
459
459
  rbuf_ivar_id = rb_intern("@rbuf");
460
460
  }
data/ext/struct.c CHANGED
@@ -290,7 +290,7 @@ static void write_container(int ttype, VALUE field_info, VALUE value, VALUE prot
290
290
 
291
291
  if (TYPE(value) == T_ARRAY) {
292
292
  items = value;
293
- } else {
293
+ } else {
294
294
  if (rb_cSet == CLASS_OF(value)) {
295
295
  items = rb_funcall(value, entries_method_id, 0);
296
296
  } else {
@@ -670,6 +670,10 @@ static VALUE rb_thrift_union_write(VALUE self, VALUE protocol) {
670
670
 
671
671
  VALUE field_info = rb_hash_aref(struct_fields, field_id);
672
672
 
673
+ if(NIL_P(field_info)) {
674
+ rb_raise(rb_eRuntimeError, "set_field is not valid for this union!");
675
+ }
676
+
673
677
  VALUE ttype_value = rb_hash_aref(field_info, type_sym);
674
678
  int ttype = FIX2INT(ttype_value);
675
679
 
data/lib/thrift.rb CHANGED
@@ -1,4 +1,4 @@
1
- #
1
+ #
2
2
  # Licensed to the Apache Software Foundation (ASF) under one
3
3
  # or more contributor license agreements. See the NOTICE file
4
4
  # distributed with this work for additional information
@@ -6,16 +6,16 @@
6
6
  # to you under the Apache License, Version 2.0 (the
7
7
  # "License"); you may not use this file except in compliance
8
8
  # with the License. You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing,
13
13
  # software distributed under the License is distributed on an
14
14
  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
15
  # KIND, either express or implied. See the License for the
16
16
  # specific language governing permissions and limitations
17
17
  # under the License.
18
- #
18
+ #
19
19
  # Contains some contributions under the Thrift Software License.
20
20
  # Please see doc/old-thrift-license.txt in the Thrift distribution for
21
21
  # details.
@@ -27,6 +27,7 @@ require 'thrift/core_ext'
27
27
  require 'thrift/exceptions'
28
28
  require 'thrift/types'
29
29
  require 'thrift/processor'
30
+ require 'thrift/multiplexed_processor'
30
31
  require 'thrift/client'
31
32
  require 'thrift/struct'
32
33
  require 'thrift/union'
@@ -42,12 +43,15 @@ require 'thrift/protocol/binary_protocol'
42
43
  require 'thrift/protocol/binary_protocol_accelerated'
43
44
  require 'thrift/protocol/compact_protocol'
44
45
  require 'thrift/protocol/json_protocol'
46
+ require 'thrift/protocol/multiplexed_protocol'
45
47
 
46
48
  # transport
47
49
  require 'thrift/transport/base_transport'
48
50
  require 'thrift/transport/base_server_transport'
49
51
  require 'thrift/transport/socket'
52
+ require 'thrift/transport/ssl_socket'
50
53
  require 'thrift/transport/server_socket'
54
+ require 'thrift/transport/ssl_server_socket'
51
55
  require 'thrift/transport/unix_socket'
52
56
  require 'thrift/transport/unix_server_socket'
53
57
  require 'thrift/transport/buffered_transport'
@@ -0,0 +1,76 @@
1
+ #
2
+ # Licensed to the Apache Software Foundation (ASF) under one
3
+ # or more contributor license agreements. See the NOTICE file
4
+ # distributed with this work for additional information
5
+ # regarding copyright ownership. The ASF licenses this file
6
+ # to you under the Apache License, Version 2.0 (the
7
+ # "License"); you may not use this file except in compliance
8
+ # with the License. You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing,
13
+ # software distributed under the License is distributed on an
14
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ # KIND, either express or implied. See the License for the
16
+ # specific language governing permissions and limitations
17
+ # under the License.
18
+
19
+ require 'thrift/protocol/protocol_decorator'
20
+ require 'thrift/protocol/base_protocol'
21
+
22
+ module Thrift
23
+ class MultiplexedProcessor
24
+ def initialize
25
+ @actual_processors = {}
26
+ end
27
+
28
+ def register_processor(service_name, processor)
29
+ @actual_processors[service_name] = processor
30
+ end
31
+
32
+ def process(iprot, oprot)
33
+ name, type, seqid = iprot.read_message_begin
34
+ check_type(type)
35
+ check_separator(name)
36
+ service_name, method = name.split(':')
37
+ processor(service_name).process(StoredMessageProtocol.new(iprot, [method, type, seqid]), oprot)
38
+ end
39
+
40
+ protected
41
+
42
+ def processor(service_name)
43
+ if @actual_processors.has_key?(service_name)
44
+ @actual_processors[service_name]
45
+ else
46
+ raise Thrift::Exception.new("Service name not found: #{service_name}. Did you forget to call #{self.class.name}#register_processor?")
47
+ end
48
+ end
49
+
50
+ def check_type(type)
51
+ unless [MessageTypes::CALL, MessageTypes::ONEWAY].include?(type)
52
+ raise Thrift::Exception.new('This should not have happened!?')
53
+ end
54
+ end
55
+
56
+ def check_separator(name)
57
+ if name.count(':') < 1
58
+ raise Thrift::Exception.new("Service name not found in message name: #{name}. Did you forget to use a Thrift::Protocol::MultiplexedProtocol in your client?")
59
+ end
60
+ end
61
+ end
62
+
63
+ class StoredMessageProtocol < BaseProtocol
64
+
65
+ include ProtocolDecorator
66
+
67
+ def initialize(protocol, message_begin)
68
+ super(protocol)
69
+ @message_begin = message_begin
70
+ end
71
+
72
+ def read_message_begin
73
+ @message_begin
74
+ end
75
+ end
76
+ end
@@ -17,25 +17,36 @@
17
17
  # under the License.
18
18
  #
19
19
 
20
+ require 'logger'
21
+
20
22
  module Thrift
21
23
  module Processor
22
- def initialize(handler)
24
+ def initialize(handler, logger=nil)
23
25
  @handler = handler
26
+ if logger.nil?
27
+ @logger = Logger.new(STDERR)
28
+ @logger.level = Logger::WARN
29
+ else
30
+ @logger = logger
31
+ end
24
32
  end
25
33
 
26
34
  def process(iprot, oprot)
27
35
  name, type, seqid = iprot.read_message_begin
28
36
  if respond_to?("process_#{name}")
29
- send("process_#{name}", seqid, iprot, oprot)
37
+ begin
38
+ send("process_#{name}", seqid, iprot, oprot)
39
+ rescue => e
40
+ x = ApplicationException.new(ApplicationException::INTERNAL_ERROR, 'Internal error')
41
+ @logger.debug "Internal error : #{e.message}\n#{e.backtrace.join("\n")}"
42
+ write_error(x, oprot, name, seqid)
43
+ end
30
44
  true
31
45
  else
32
46
  iprot.skip(Types::STRUCT)
33
47
  iprot.read_message_end
34
48
  x = ApplicationException.new(ApplicationException::UNKNOWN_METHOD, 'Unknown function '+name)
35
- oprot.write_message_begin(name, MessageTypes::EXCEPTION, seqid)
36
- x.write(oprot)
37
- oprot.write_message_end
38
- oprot.trans.flush
49
+ write_error(x, oprot, name, seqid)
39
50
  false
40
51
  end
41
52
  end
@@ -53,5 +64,12 @@ module Thrift
53
64
  oprot.write_message_end
54
65
  oprot.trans.flush
55
66
  end
67
+
68
+ def write_error(err, oprot, name, seqid)
69
+ oprot.write_message_begin(name, MessageTypes::EXCEPTION, seqid)
70
+ err.write(oprot)
71
+ oprot.write_message_end
72
+ oprot.trans.flush
73
+ end
56
74
  end
57
75
  end
@@ -323,8 +323,6 @@ module Thrift
323
323
 
324
324
  def skip(type)
325
325
  case type
326
- when Types::STOP
327
- nil
328
326
  when Types::BOOL
329
327
  read_bool
330
328
  when Types::BYTE
@@ -367,13 +365,23 @@ module Thrift
367
365
  skip(etype)
368
366
  end
369
367
  read_list_end
368
+ else
369
+ raise ProtocolException.new(ProtocolException::INVALID_DATA, 'Invalid data')
370
370
  end
371
371
  end
372
+
373
+ def to_s
374
+ "#{trans.to_s}"
375
+ end
372
376
  end
373
377
 
374
378
  class BaseProtocolFactory
375
379
  def get_protocol(trans)
376
380
  raise NotImplementedError
377
381
  end
382
+
383
+ def to_s
384
+ "base"
385
+ end
378
386
  end
379
- end
387
+ end
@@ -226,12 +226,19 @@ module Thrift
226
226
  size = read_i32
227
227
  trans.read_all(size)
228
228
  end
229
-
229
+
230
+ def to_s
231
+ "binary(#{super.to_s})"
232
+ end
230
233
  end
231
234
 
232
235
  class BinaryProtocolFactory < BaseProtocolFactory
233
236
  def get_protocol(trans)
234
237
  return Thrift::BinaryProtocol.new(trans)
235
238
  end
239
+
240
+ def to_s
241
+ "binary"
242
+ end
236
243
  end
237
244
  end
@@ -35,5 +35,13 @@ module Thrift
35
35
  BinaryProtocol.new(trans)
36
36
  end
37
37
  end
38
+
39
+ def to_s
40
+ if (defined? BinaryProtocolAccelerated)
41
+ "binary-accel"
42
+ else
43
+ "binary"
44
+ end
45
+ end
38
46
  end
39
47
  end
@@ -345,6 +345,10 @@ module Thrift
345
345
  size = read_varint32()
346
346
  trans.read_all(size)
347
347
  end
348
+
349
+ def to_s
350
+ "compact(#{super.to_s})"
351
+ end
348
352
 
349
353
  private
350
354
 
@@ -431,5 +435,9 @@ module Thrift
431
435
  def get_protocol(trans)
432
436
  CompactProtocol.new(trans)
433
437
  end
438
+
439
+ def to_s
440
+ "compact"
441
+ end
434
442
  end
435
443
  end
@@ -18,6 +18,7 @@
18
18
  # under the License.
19
19
  #
20
20
 
21
+ require 'base64'
21
22
 
22
23
  module Thrift
23
24
  class LookaheadReader
@@ -310,7 +311,7 @@ module Thrift
310
311
  def write_json_base64(str)
311
312
  @context.write(trans)
312
313
  trans.write(@@kJSONStringDelimiter)
313
- write_json_string([str].pack("m"))
314
+ trans.write(Base64.strict_encode64(str))
314
315
  trans.write(@@kJSONStringDelimiter)
315
316
  end
316
317
 
@@ -332,7 +333,7 @@ module Thrift
332
333
  # "NaN" or "Infinity" or "-Infinity".
333
334
  def write_json_double(num)
334
335
  @context.write(trans)
335
- # Normalize output of boost::lexical_cast for NaNs and Infinities
336
+ # Normalize output of thrift::to_string for NaNs and Infinities
336
337
  special = false;
337
338
  if (num.nan?)
338
339
  special = true;
@@ -513,7 +514,7 @@ module Thrift
513
514
  # The elements of this array must match up with the sequence of characters in
514
515
  # escape_chars
515
516
  escape_char_vals = [
516
- '"', '\\', '/', '\b', '\f', '\n', '\r', '\t',
517
+ "\"", "\\", "\/", "\b", "\f", "\n", "\r", "\t",
517
518
  ]
518
519
 
519
520
  if !skipContext
@@ -546,7 +547,15 @@ module Thrift
546
547
 
547
548
  # Reads a block of base64 characters, decoding it, and returns via str
548
549
  def read_json_base64
549
- read_json_string.unpack("m")[0]
550
+ str = read_json_string
551
+ m = str.length % 4
552
+ if m != 0
553
+ # Add missing padding
554
+ (4 - m).times do
555
+ str += '='
556
+ end
557
+ end
558
+ Base64.strict_decode64(str)
550
559
  end
551
560
 
552
561
  # Reads a sequence of characters, stopping at the first one that is not
@@ -759,11 +768,19 @@ module Thrift
759
768
  def read_binary
760
769
  read_json_base64
761
770
  end
771
+
772
+ def to_s
773
+ "json(#{super.to_s})"
774
+ end
762
775
  end
763
776
 
764
777
  class JsonProtocolFactory < BaseProtocolFactory
765
778
  def get_protocol(trans)
766
779
  return Thrift::JsonProtocol.new(trans)
767
780
  end
781
+
782
+ def to_s
783
+ "json"
784
+ end
768
785
  end
769
786
  end
@@ -0,0 +1,44 @@
1
+ #
2
+ # Licensed to the Apache Software Foundation (ASF) under one
3
+ # or more contributor license agreements. See the NOTICE file
4
+ # distributed with this work for additional information
5
+ # regarding copyright ownership. The ASF licenses this file
6
+ # to you under the Apache License, Version 2.0 (the
7
+ # "License"); you may not use this file except in compliance
8
+ # with the License. You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing,
13
+ # software distributed under the License is distributed on an
14
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ # KIND, either express or implied. See the License for the
16
+ # specific language governing permissions and limitations
17
+ # under the License.
18
+
19
+ require 'thrift/protocol/protocol_decorator'
20
+
21
+ module Thrift
22
+ class MultiplexedProtocol < BaseProtocol
23
+
24
+ include ProtocolDecorator
25
+
26
+ def initialize(protocol, service_name)
27
+ super(protocol)
28
+ @service_name = service_name
29
+ end
30
+
31
+ def write_message_begin(name, type, seqid)
32
+ case type
33
+ when MessageTypes::CALL, MessageTypes::ONEWAY
34
+ @protocol.write_message_begin("#{@service_name}:#{name}", type, seqid)
35
+ else
36
+ @protocol.write_message_begin(name, type, seqid)
37
+ end
38
+ end
39
+
40
+ def to_s
41
+ "multiplexed(#{@service_name=@protocol.to_s})"
42
+ end
43
+ end
44
+ end