write_i64(buf, transfer.t);
}
-static void write_string(VALUE buf, char* str) {
- int32_t len = strlen(str);
+static void write_string(VALUE buf, char* str, size_t len) {
write_i32(buf, len);
- rb_str_buf_cat2(buf, str);
+ rb_str_buf_cat(buf, str, len);
}
// Some functions macro'd out because they're nops for the binary protocol
break;
case T_STR:
- write_string(buf, StringValuePtr(obj));
+ write_string(buf, StringValuePtr(obj), RSTRING(obj)->len);
break;
case T_STRCT: {
\000\005words\f\000\003\v\000\001\000\000\000\rhello, world!\000\000")
@prot.decode_binary(SpecNamespace::Foo.new, trans).should == SpecNamespace::Foo.new
end
+
+ it "should encode a string with null bytes in it" do
+ foo = SpecNamespace::Hello.new(:greeting => "Hello\000World!")
+ @prot.encode_binary(foo).should == "\v\000\001\000\000\000\fHello\000World!\000"
+ end
+
+ it "should decode a string with null bytes in it" do
+ trans = Thrift::MemoryBuffer.new("\v\000\001\000\000\000\fHello\000World!\000")
+ @prot.decode_binary(SpecNamespace::Hello.new, trans).should == SpecNamespace::Hello.new(:greeting => "Hello\000World!")
+ end
end
describe BinaryProtocolAcceleratedFactory do