Эрланг: почему Злиб возвращает пустое тело сюда? - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь использовать zlib для сжатия данных, отправляемых клиенту. Обычно я просто посылаю BLOB-объекты JSON клиенту, используя send(). Вот функция, которая обрабатывает работу:

handle_tcp({data, RawData}, #s1{socket=Socket}=State) ->
  case decode_and_dispatch(RawData, State#s1.state, Socket) of
    {ok, NewState, Body} ->
      lager:debug("Sending to client decompressed ~p",[Body]),
      send(Socket, Body),
      {noreply, State#s1{state=NewState}};
    {error, _NewState, Msg} ->
      lager:info("calling client_err_msg with ~p~n",[Msg]),
      send(Socket, client_err_msg(Msg)),
      {noreply, State};
    Else ->
      lager:error("Unexpected error: ~p", [Else]),
      send(Socket, client_err_msg(<<"server rejected the message">>)),
      {noreply, State}
  end;

Мои изменения неуловимы и находятся в первой части предложения, чтобы сжать Body перед отправкой его обратно клиенту, к сожалению, это возвращает пустой список. Может кто-нибудь уловить, что я делаю здесь не так? Я не вижу никаких сбоев процесса или чего-либо в журналах ошибок. Просто пустой список передается клиенту.

handle_tcp({data, RawData}, #s1{socket=Socket}=State) ->
  case decode_and_dispatch(RawData, State#s1.state, Socket) of
    {ok, NewState, Body} ->
      lager:debug("Sending to client decompressed ~p",[Body]),
      %% compress the payload
      Z = zlib:open(),
      zlib:deflateInit(Z),
      CompressedBody = zlib:deflate(Z,Body),
      lager:debug("Sending to client compressed ~p",[CompressedBody]),
      %%zlib:deflateEnd(Z),
      send(Socket, CompressedBody),
      %%send(Socket, Body),
      {noreply, State#s1{state=NewState}};
    {error, _NewState, Msg} ->
      lager:info("calling client_err_msg with ~p~n",[Msg]),
      send(Socket, client_err_msg(Msg)),
      {noreply, State};
    Else ->
      lager:error("Unexpected error: ~p", [Else]),
      send(Socket, client_err_msg(<<"server rejected the message">>)),
      {noreply, State}
  end;

1 Ответ

3 голосов
/ 26 марта 2012

Вам необходимо предоставить параметр "finish" flush для последнего вызова deflate, например, Zlib:. Выкачивает (Z, Body, отделка)

...