thrift 0.8.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +7 -0
  2. data/{README → README.md} +0 -0
  3. data/ext/binary_protocol_accelerated.c +33 -14
  4. data/ext/bytes.c +36 -0
  5. data/ext/bytes.h +31 -0
  6. data/ext/compact_protocol.c +27 -8
  7. data/ext/constants.h +8 -5
  8. data/ext/extconf.rb +5 -1
  9. data/ext/memory_buffer.c +12 -9
  10. data/ext/protocol.c +0 -185
  11. data/ext/protocol.h +0 -20
  12. data/ext/strlcpy.h +7 -3
  13. data/ext/struct.c +27 -7
  14. data/ext/thrift_native.c +16 -11
  15. data/lib/thrift.rb +10 -4
  16. data/lib/thrift/bytes.rb +131 -0
  17. data/lib/thrift/client.rb +13 -4
  18. data/lib/thrift/exceptions.rb +3 -0
  19. data/lib/thrift/multiplexed_processor.rb +76 -0
  20. data/lib/thrift/processor.rb +24 -6
  21. data/lib/thrift/protocol/base_protocol.rb +109 -12
  22. data/lib/thrift/protocol/binary_protocol.rb +22 -7
  23. data/lib/thrift/protocol/binary_protocol_accelerated.rb +8 -0
  24. data/lib/thrift/protocol/compact_protocol.rb +23 -6
  25. data/lib/thrift/protocol/json_protocol.rb +786 -0
  26. data/lib/thrift/protocol/multiplexed_protocol.rb +44 -0
  27. data/lib/thrift/protocol/protocol_decorator.rb +194 -0
  28. data/lib/thrift/server/base_server.rb +8 -2
  29. data/lib/thrift/server/mongrel_http_server.rb +2 -0
  30. data/lib/thrift/server/simple_server.rb +5 -1
  31. data/lib/thrift/server/thin_http_server.rb +91 -0
  32. data/lib/thrift/server/thread_pool_server.rb +5 -1
  33. data/lib/thrift/server/threaded_server.rb +5 -1
  34. data/lib/thrift/struct.rb +1 -1
  35. data/lib/thrift/struct_union.rb +2 -2
  36. data/lib/thrift/transport/base_server_transport.rb +1 -1
  37. data/lib/thrift/transport/base_transport.rb +30 -20
  38. data/lib/thrift/transport/buffered_transport.rb +25 -11
  39. data/lib/thrift/transport/framed_transport.rb +20 -11
  40. data/lib/thrift/transport/http_client_transport.rb +16 -6
  41. data/lib/thrift/transport/io_stream_transport.rb +5 -2
  42. data/lib/thrift/transport/memory_buffer_transport.rb +10 -6
  43. data/lib/thrift/transport/server_socket.rb +6 -1
  44. data/lib/thrift/transport/socket.rb +23 -17
  45. data/lib/thrift/transport/ssl_server_socket.rb +41 -0
  46. data/lib/thrift/transport/ssl_socket.rb +51 -0
  47. data/lib/thrift/transport/unix_server_socket.rb +5 -1
  48. data/lib/thrift/transport/unix_socket.rb +5 -1
  49. data/lib/thrift/union.rb +3 -6
  50. data/spec/BaseService.thrift +27 -0
  51. data/spec/ExtendedService.thrift +25 -0
  52. data/spec/Referenced.thrift +44 -0
  53. data/spec/ThriftNamespacedSpec.thrift +53 -0
  54. data/spec/ThriftSpec.thrift +52 -1
  55. data/spec/base_protocol_spec.rb +158 -93
  56. data/spec/base_transport_spec.rb +194 -157
  57. data/spec/binary_protocol_accelerated_spec.rb +14 -14
  58. data/spec/binary_protocol_spec.rb +29 -16
  59. data/spec/binary_protocol_spec_shared.rb +148 -65
  60. data/spec/bytes_spec.rb +160 -0
  61. data/spec/client_spec.rb +45 -47
  62. data/spec/compact_protocol_spec.rb +36 -22
  63. data/spec/exception_spec.rb +79 -80
  64. data/spec/flat_spec.rb +62 -0
  65. data/spec/http_client_spec.rb +91 -16
  66. data/spec/json_protocol_spec.rb +552 -0
  67. data/spec/namespaced_spec.rb +67 -0
  68. data/spec/nonblocking_server_spec.rb +26 -28
  69. data/spec/processor_spec.rb +29 -32
  70. data/spec/serializer_spec.rb +31 -33
  71. data/spec/server_socket_spec.rb +32 -28
  72. data/spec/server_spec.rb +112 -84
  73. data/spec/socket_spec.rb +27 -20
  74. data/spec/socket_spec_shared.rb +32 -32
  75. data/spec/spec_helper.rb +17 -11
  76. data/spec/ssl_server_socket_spec.rb +34 -0
  77. data/spec/ssl_socket_spec.rb +78 -0
  78. data/spec/struct_nested_containers_spec.rb +191 -0
  79. data/spec/struct_spec.rb +159 -161
  80. data/spec/thin_http_server_spec.rb +141 -0
  81. data/spec/types_spec.rb +71 -69
  82. data/spec/union_spec.rb +97 -76
  83. data/spec/unix_socket_spec.rb +49 -41
  84. metadata +268 -188
  85. data/CHANGELOG +0 -1
  86. data/benchmark/gen-rb/benchmark_constants.rb +0 -10
  87. data/benchmark/gen-rb/benchmark_service.rb +0 -80
  88. data/benchmark/gen-rb/benchmark_types.rb +0 -9
  89. data/spec/gen-rb/nonblocking_service.rb +0 -272
  90. data/spec/gen-rb/thrift_spec_constants.rb +0 -10
  91. data/spec/gen-rb/thrift_spec_types.rb +0 -345
  92. data/spec/mongrel_http_server_spec.rb +0 -117
  93. data/test/debug_proto/gen-rb/debug_proto_test_constants.rb +0 -273
  94. data/test/debug_proto/gen-rb/debug_proto_test_types.rb +0 -760
  95. data/test/debug_proto/gen-rb/empty_service.rb +0 -24
  96. data/test/debug_proto/gen-rb/inherited.rb +0 -79
  97. data/test/debug_proto/gen-rb/reverse_order_service.rb +0 -82
  98. data/test/debug_proto/gen-rb/service_for_exception_with_a_map.rb +0 -81
  99. data/test/debug_proto/gen-rb/srv.rb +0 -330
@@ -1,20 +0,0 @@
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
-
20
- void Init_protocol();
@@ -17,14 +17,18 @@
17
17
  * under the License.
18
18
  */
19
19
 
20
-
21
20
  #include <sys/types.h>
22
21
  #include <string.h>
23
22
 
23
+ #ifndef __has_builtin
24
+ #define __has_builtin(x) 0
25
+ #endif
26
+
24
27
  #ifndef HAVE_STRLCPY
25
- size_t
26
- strlcpy (char *dst, const char *src, size_t dst_sz);
28
+ size_t strlcpy (char *dst, const char *src, size_t dst_sz);
27
29
  #else
30
+ #if !__has_builtin(strlcpy)
28
31
  extern size_t strlcpy(char *, const char *, size_t);
29
32
  #endif
33
+ #endif
30
34
 
@@ -75,6 +75,11 @@ VALUE default_write_string(VALUE protocol, VALUE value) {
75
75
  return Qnil;
76
76
  }
77
77
 
78
+ VALUE default_write_binary(VALUE protocol, VALUE value) {
79
+ rb_funcall(protocol, write_binary_method_id, 1, value);
80
+ return Qnil;
81
+ }
82
+
78
83
  VALUE default_write_list_begin(VALUE protocol, VALUE etype, VALUE length) {
79
84
  rb_funcall(protocol, write_list_begin_method_id, 2, etype, length);
80
85
  return Qnil;
@@ -190,6 +195,10 @@ VALUE default_read_string(VALUE protocol) {
190
195
  return rb_funcall(protocol, read_string_method_id, 0);
191
196
  }
192
197
 
198
+ VALUE default_read_binary(VALUE protocol) {
199
+ return rb_funcall(protocol, read_binary_method_id, 0);
200
+ }
201
+
193
202
  VALUE default_read_struct_begin(VALUE protocol) {
194
203
  return rb_funcall(protocol, read_struct_begin_method_id, 0);
195
204
  }
@@ -281,7 +290,7 @@ static void write_container(int ttype, VALUE field_info, VALUE value, VALUE prot
281
290
 
282
291
  if (TYPE(value) == T_ARRAY) {
283
292
  items = value;
284
- } else {
293
+ } else {
285
294
  if (rb_cSet == CLASS_OF(value)) {
286
295
  items = rb_funcall(value, entries_method_id, 0);
287
296
  } else {
@@ -327,7 +336,12 @@ static void write_anything(int ttype, VALUE value, VALUE protocol, VALUE field_i
327
336
  } else if (ttype == TTYPE_DOUBLE) {
328
337
  default_write_double(protocol, value);
329
338
  } else if (ttype == TTYPE_STRING) {
330
- default_write_string(protocol, value);
339
+ VALUE is_binary = rb_hash_aref(field_info, binary_sym);
340
+ if (is_binary != Qtrue) {
341
+ default_write_string(protocol, value);
342
+ } else {
343
+ default_write_binary(protocol, value);
344
+ }
331
345
  } else if (IS_CONTAINER(ttype)) {
332
346
  write_container(ttype, field_info, value, protocol);
333
347
  } else if (ttype == TTYPE_STRUCT) {
@@ -430,7 +444,12 @@ static VALUE read_anything(VALUE protocol, int ttype, VALUE field_info) {
430
444
  } else if (ttype == TTYPE_I64) {
431
445
  result = default_read_i64(protocol);
432
446
  } else if (ttype == TTYPE_STRING) {
433
- result = default_read_string(protocol);
447
+ VALUE is_binary = rb_hash_aref(field_info, binary_sym);
448
+ if (is_binary != Qtrue) {
449
+ result = default_read_string(protocol);
450
+ } else {
451
+ result = default_read_binary(protocol);
452
+ }
434
453
  } else if (ttype == TTYPE_DOUBLE) {
435
454
  result = default_read_double(protocol);
436
455
  } else if (ttype == TTYPE_STRUCT) {
@@ -607,7 +626,7 @@ static VALUE rb_thrift_union_read(VALUE self, VALUE protocol) {
607
626
  if (field_type == specified_type) {
608
627
  // read the value
609
628
  VALUE name = rb_hash_aref(field_info, name_sym);
610
- rb_iv_set(self, "@setfield", ID2SYM(rb_intern(RSTRING_PTR(name))));
629
+ rb_iv_set(self, "@setfield", rb_str_intern(name));
611
630
  rb_iv_set(self, "@value", read_anything(protocol, field_type, field_info));
612
631
  } else {
613
632
  rb_funcall(protocol, skip_method_id, 1, field_type_value);
@@ -627,9 +646,6 @@ static VALUE rb_thrift_union_read(VALUE self, VALUE protocol) {
627
646
  rb_raise(rb_eRuntimeError, "too many fields in union!");
628
647
  }
629
648
 
630
- // read field end
631
- default_read_field_end(protocol);
632
-
633
649
  // read struct end
634
650
  default_read_struct_end(protocol);
635
651
 
@@ -654,6 +670,10 @@ static VALUE rb_thrift_union_write(VALUE self, VALUE protocol) {
654
670
 
655
671
  VALUE field_info = rb_hash_aref(struct_fields, field_id);
656
672
 
673
+ if(NIL_P(field_info)) {
674
+ rb_raise(rb_eRuntimeError, "set_field is not valid for this union!");
675
+ }
676
+
657
677
  VALUE ttype_value = rb_hash_aref(field_info, type_sym);
658
678
  int ttype = FIX2INT(ttype_value);
659
679
 
@@ -18,15 +18,16 @@
18
18
  */
19
19
 
20
20
  #include <ruby.h>
21
+ #include <bytes.h>
21
22
  #include <struct.h>
22
23
  #include <binary_protocol_accelerated.h>
23
24
  #include <compact_protocol.h>
24
- #include <protocol.h>
25
25
  #include <memory_buffer.h>
26
26
 
27
27
  // cached classes/modules
28
28
  VALUE rb_cSet;
29
29
  VALUE thrift_module;
30
+ VALUE thrift_bytes_module;
30
31
  VALUE thrift_types_module;
31
32
 
32
33
  // TType constants
@@ -56,19 +57,20 @@ ID write_i32_method_id;
56
57
  ID write_i64_method_id;
57
58
  ID write_double_method_id;
58
59
  ID write_string_method_id;
60
+ ID write_binary_method_id;
59
61
  ID write_map_begin_method_id;
60
62
  ID write_map_end_method_id;
61
63
  ID write_list_begin_method_id;
62
64
  ID write_list_end_method_id;
63
65
  ID write_set_begin_method_id;
64
66
  ID write_set_end_method_id;
65
- ID size_method_id;
66
67
  ID read_bool_method_id;
67
68
  ID read_byte_method_id;
68
69
  ID read_i16_method_id;
69
70
  ID read_i32_method_id;
70
71
  ID read_i64_method_id;
71
72
  ID read_string_method_id;
73
+ ID read_binary_method_id;
72
74
  ID read_double_method_id;
73
75
  ID read_map_begin_method_id;
74
76
  ID read_map_end_method_id;
@@ -81,15 +83,15 @@ ID read_struct_end_method_id;
81
83
  ID read_field_begin_method_id;
82
84
  ID read_field_end_method_id;
83
85
  ID keys_method_id;
84
- ID entries_method_id;
85
- ID name_method_id;
86
- ID sort_method_id;
86
+ ID entries_method_id;
87
87
  ID write_field_stop_method_id;
88
88
  ID skip_method_id;
89
89
  ID write_method_id;
90
90
  ID read_all_method_id;
91
91
  ID read_into_buffer_method_id;
92
- ID native_qmark_method_id;
92
+ ID force_binary_encoding_id;
93
+ ID convert_to_utf8_byte_buffer_id;
94
+ ID convert_to_string_id;
93
95
 
94
96
  // constant ids
95
97
  ID fields_const_id;
@@ -104,11 +106,13 @@ VALUE key_sym;
104
106
  VALUE value_sym;
105
107
  VALUE element_sym;
106
108
  VALUE class_sym;
109
+ VALUE binary_sym;
107
110
  VALUE protocol_exception_class;
108
111
 
109
112
  void Init_thrift_native() {
110
113
  // cached classes
111
114
  thrift_module = rb_const_get(rb_cObject, rb_intern("Thrift"));
115
+ thrift_bytes_module = rb_const_get(thrift_module, rb_intern("Bytes"));
112
116
  thrift_types_module = rb_const_get(thrift_module, rb_intern("Types"));
113
117
  rb_cSet = rb_const_get(rb_cObject, rb_intern("Set"));
114
118
  protocol_exception_class = rb_const_get(thrift_module, rb_intern("ProtocolException"));
@@ -139,19 +143,20 @@ void Init_thrift_native() {
139
143
  write_i64_method_id = rb_intern("write_i64");
140
144
  write_double_method_id = rb_intern("write_double");
141
145
  write_string_method_id = rb_intern("write_string");
146
+ write_binary_method_id = rb_intern("write_binary");
142
147
  write_map_begin_method_id = rb_intern("write_map_begin");
143
148
  write_map_end_method_id = rb_intern("write_map_end");
144
149
  write_list_begin_method_id = rb_intern("write_list_begin");
145
150
  write_list_end_method_id = rb_intern("write_list_end");
146
151
  write_set_begin_method_id = rb_intern("write_set_begin");
147
152
  write_set_end_method_id = rb_intern("write_set_end");
148
- size_method_id = rb_intern("size");
149
153
  read_bool_method_id = rb_intern("read_bool");
150
154
  read_byte_method_id = rb_intern("read_byte");
151
155
  read_i16_method_id = rb_intern("read_i16");
152
156
  read_i32_method_id = rb_intern("read_i32");
153
157
  read_i64_method_id = rb_intern("read_i64");
154
158
  read_string_method_id = rb_intern("read_string");
159
+ read_binary_method_id = rb_intern("read_binary");
155
160
  read_double_method_id = rb_intern("read_double");
156
161
  read_map_begin_method_id = rb_intern("read_map_begin");
157
162
  read_map_end_method_id = rb_intern("read_map_end");
@@ -165,14 +170,14 @@ void Init_thrift_native() {
165
170
  read_field_end_method_id = rb_intern("read_field_end");
166
171
  keys_method_id = rb_intern("keys");
167
172
  entries_method_id = rb_intern("entries");
168
- name_method_id = rb_intern("name");
169
- sort_method_id = rb_intern("sort");
170
173
  write_field_stop_method_id = rb_intern("write_field_stop");
171
174
  skip_method_id = rb_intern("skip");
172
175
  write_method_id = rb_intern("write");
173
176
  read_all_method_id = rb_intern("read_all");
174
177
  read_into_buffer_method_id = rb_intern("read_into_buffer");
175
- native_qmark_method_id = rb_intern("native?");
178
+ force_binary_encoding_id = rb_intern("force_binary_encoding");
179
+ convert_to_utf8_byte_buffer_id = rb_intern("convert_to_utf8_byte_buffer");
180
+ convert_to_string_id = rb_intern("convert_to_string");
176
181
 
177
182
  // constant ids
178
183
  fields_const_id = rb_intern("FIELDS");
@@ -187,8 +192,8 @@ void Init_thrift_native() {
187
192
  value_sym = ID2SYM(rb_intern("value"));
188
193
  element_sym = ID2SYM(rb_intern("element"));
189
194
  class_sym = ID2SYM(rb_intern("class"));
195
+ binary_sym = ID2SYM(rb_intern("binary"));
190
196
 
191
- Init_protocol();
192
197
  Init_struct();
193
198
  Init_binary_protocol_accelerated();
194
199
  Init_compact_protocol();
@@ -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,26 +6,28 @@
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.
22
22
 
23
23
  $:.unshift File.dirname(__FILE__)
24
24
 
25
+ require 'thrift/bytes'
25
26
  require 'thrift/core_ext'
26
27
  require 'thrift/exceptions'
27
28
  require 'thrift/types'
28
29
  require 'thrift/processor'
30
+ require 'thrift/multiplexed_processor'
29
31
  require 'thrift/client'
30
32
  require 'thrift/struct'
31
33
  require 'thrift/union'
@@ -40,12 +42,16 @@ require 'thrift/protocol/base_protocol'
40
42
  require 'thrift/protocol/binary_protocol'
41
43
  require 'thrift/protocol/binary_protocol_accelerated'
42
44
  require 'thrift/protocol/compact_protocol'
45
+ require 'thrift/protocol/json_protocol'
46
+ require 'thrift/protocol/multiplexed_protocol'
43
47
 
44
48
  # transport
45
49
  require 'thrift/transport/base_transport'
46
50
  require 'thrift/transport/base_server_transport'
47
51
  require 'thrift/transport/socket'
52
+ require 'thrift/transport/ssl_socket'
48
53
  require 'thrift/transport/server_socket'
54
+ require 'thrift/transport/ssl_server_socket'
49
55
  require 'thrift/transport/unix_socket'
50
56
  require 'thrift/transport/unix_server_socket'
51
57
  require 'thrift/transport/buffered_transport'
@@ -0,0 +1,131 @@
1
+ # encoding: ascii-8bit
2
+ #
3
+ # Licensed to the Apache Software Foundation (ASF) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The ASF licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+ #
20
+
21
+ module Thrift
22
+ # A collection of utilities for working with bytes and byte buffers.
23
+ module Bytes
24
+ if RUBY_VERSION >= '1.9'
25
+ # Creates and empty byte buffer (String with BINARY encoding)
26
+ #
27
+ # size - The Integer size of the buffer (default: nil) to create
28
+ #
29
+ # Returns a String with BINARY encoding, filled with null characters
30
+ # if size is greater than zero
31
+ def self.empty_byte_buffer(size = nil)
32
+ if (size && size > 0)
33
+ "\0".force_encoding(Encoding::BINARY) * size
34
+ else
35
+ ''.force_encoding(Encoding::BINARY)
36
+ end
37
+ end
38
+
39
+ # Forces the encoding of the buffer to BINARY. If the buffer
40
+ # passed is frozen, then it will be duplicated.
41
+ #
42
+ # buffer - The String to force the encoding of.
43
+ #
44
+ # Returns the String passed with an encoding of BINARY; returned
45
+ # String may be a duplicate.
46
+ def self.force_binary_encoding(buffer)
47
+ buffer = buffer.dup if buffer.frozen?
48
+ buffer.force_encoding(Encoding::BINARY)
49
+ end
50
+
51
+ # Gets the byte value of a given position in a String.
52
+ #
53
+ # string - The String to retrive the byte value from.
54
+ # index - The Integer location of the byte value to retrieve.
55
+ #
56
+ # Returns an Integer value between 0 and 255.
57
+ def self.get_string_byte(string, index)
58
+ string.getbyte(index)
59
+ end
60
+
61
+ # Sets the byte value given to a given index in a String.
62
+ #
63
+ # string - The String to set the byte value in.
64
+ # index - The Integer location to set the byte value at.
65
+ # byte - The Integer value (0 to 255) to set in the string.
66
+ #
67
+ # Returns an Integer value of the byte value to set.
68
+ def self.set_string_byte(string, index, byte)
69
+ string.setbyte(index, byte)
70
+ end
71
+
72
+ # Converts the given String to a UTF-8 byte buffer.
73
+ #
74
+ # string - The String to convert.
75
+ #
76
+ # Returns a new String with BINARY encoding, containing the UTF-8
77
+ # bytes of the original string.
78
+ def self.convert_to_utf8_byte_buffer(string)
79
+ if string.encoding != Encoding::UTF_8
80
+ # transcode to UTF-8
81
+ string = string.encode(Encoding::UTF_8)
82
+ else
83
+ # encoding is already UTF-8, but a duplicate is needed
84
+ string = string.dup
85
+ end
86
+ string.force_encoding(Encoding::BINARY)
87
+ end
88
+
89
+ # Converts the given UTF-8 byte buffer into a String
90
+ #
91
+ # utf8_buffer - A String, with BINARY encoding, containing UTF-8 bytes
92
+ #
93
+ # Returns a new String with UTF-8 encoding,
94
+ def self.convert_to_string(utf8_buffer)
95
+ # duplicate the buffer, force encoding to UTF-8
96
+ utf8_buffer.dup.force_encoding(Encoding::UTF_8)
97
+ end
98
+ else
99
+ def self.empty_byte_buffer(size = nil)
100
+ if (size && size > 0)
101
+ "\0" * size
102
+ else
103
+ ''
104
+ end
105
+ end
106
+
107
+ def self.force_binary_encoding(buffer)
108
+ buffer
109
+ end
110
+
111
+ def self.get_string_byte(string, index)
112
+ string[index]
113
+ end
114
+
115
+ def self.set_string_byte(string, index, byte)
116
+ string[index] = byte
117
+ end
118
+
119
+ def self.convert_to_utf8_byte_buffer(string)
120
+ # This assumes $KCODE is 'UTF8'/'U', which would mean the String is already a UTF-8 byte buffer
121
+ # TODO consider handling other $KCODE values and transcoding with iconv
122
+ string
123
+ end
124
+
125
+ def self.convert_to_string(utf8_buffer)
126
+ # See comment in 'convert_to_utf8_byte_buffer' for relevant assumptions.
127
+ utf8_buffer
128
+ end
129
+ end
130
+ end
131
+ end
@@ -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
 
20
20
  module Thrift
21
21
  module Client
@@ -27,6 +27,15 @@ module Thrift
27
27
 
28
28
  def send_message(name, args_class, args = {})
29
29
  @oprot.write_message_begin(name, MessageTypes::CALL, @seqid)
30
+ send_message_args(args_class, args)
31
+ end
32
+
33
+ def send_oneway_message(name, args_class, args = {})
34
+ @oprot.write_message_begin(name, MessageTypes::ONEWAY, @seqid)
35
+ send_message_args(args_class, args)
36
+ end
37
+
38
+ def send_message_args(args_class, args)
30
39
  data = args_class.new
31
40
  args.each do |k, v|
32
41
  data.send("#{k.to_s}=", v)