Yoshihiro Tanaka created THRIFT-2077:
----------------------------------------

             Summary: Erlang Thrift library does not handle unicode string 
values
                 Key: THRIFT-2077
                 URL: https://issues.apache.org/jira/browse/THRIFT-2077
             Project: Thrift
          Issue Type: Bug
          Components: Erlang - Library
    Affects Versions: 0.9
         Environment: R15B03 or before
            Reporter: Yoshihiro Tanaka


When callback function returns unicode string, thrift server crashes with 
following code:
{noformat}
-module(mysample_thrift_service).

-include ("mysample_thrift.hrl").

-export([ start_link/0,
          stop/1,
          handle_function/2,
          handle_error/2,
          check_val/1,
          send_req/1
         ]).

start_link () ->
  Options = [ {port, 1234},
              {name, ?MODULE},
              {framed,true},
              {service, mysample_thrift},
              {handler, ?MODULE},
              {socket_opts, [{recv_timeout, 60*60*1000}]}
            ],
  thrift_socket_server:start (Options).

stop (Server) ->
  thrift_socket_server:stop (Server),
  ok.

handle_function (Function, Args) when is_atom(Function), is_tuple(Args) ->
  case apply (?MODULE, Function, tuple_to_list(Args)) of
    ok -> ok;
    Reply -> {reply, Reply}
  end.

handle_error (_, closed) -> ok;
handle_error (Function, Reason) ->
  io:format ("Error Function:~p, Reason:~p~n", [Function, Reason]).

check_val (Val = <<"ascii string">>) ->
  binary_to_list (Val);
check_val (Val = <<"unicode">>) ->
  binary_to_list (Val) ++ [8220,98,97,100,8221];
check_val (Val) ->
  "ok_string".

send_req(Val) ->
  {ok,Client0} = thrift_client_util:new(
                   localhost, 1234, mysample_thrift, [{framed,true}]
                 ),
  {Client1,{ok,Result}} = thrift_client:call(Client0,check_val,[Val]),
  thrift_client:close(Client1),

  {ok, Result}.
{noformat}


The error looks as following:
{noformat}
2> mysample_thrift_service:send_req("unicode").

=ERROR REPORT==== 29-Jun-2013::22:06:25 ===
check_val had an error: {badarg,
                            [{erlang,list_to_binary,
                                 [[117,110,105,99,111,100,101,8220,98,97,100,
                                   8221]],
                                 []},
                             {thrift_binary_protocol,write,2,
                                 [{file,"thrift_binary_protocol.erl"},
                                  {line,159}]},
                             {thrift_protocol,write,2,
                                 [{file,"thrift_protocol.erl"},{line,389}]},
                             {thrift_protocol,struct_write_loop,3,
                                 [{file,"thrift_protocol.erl"},{line,402}]},
                             {thrift_protocol,write,2,
                                 [{file,"thrift_protocol.erl"},{line,322}]},
                             {thrift_processor,send_reply,5,
                                 [{file,"src/thrift_processor.erl"},
                                  {line,200}]},
                             {thrift_processor,handle_function,3,
                                 [{file,"src/thrift_processor.erl"},
                                  {line,90}]},
                             {thrift_processor,loop,1,
                                 [{file,"src/thrift_processor.erl"},
                                  {line,43}]}]}
{noformat}

I tried to fix using 'unicode:characters_to_binary/3', but it did not work.


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to