summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTianMaiChengGhostRidder <51288333+TianMaiChengGhostRidder@users.noreply.github.com>2022-08-14 21:00:59 +0800
committerJens Geyer <jensg@apache.org>2022-08-30 22:12:05 +0200
commit22f6a8a3c879175e18ce95f88a393f34ff8f158c (patch)
treee49f820dafbddb3c6d133a850e4cd2bd0a095cb7
parentbce985be5507eed5643587219dc647ce48a1091c (diff)
downloadthrift-22f6a8a3c879175e18ce95f88a393f34ff8f158c.tar.gz
If the amount of data transmitted is large, an error will be reported.
Client: erl Patch: TianMaiChengGhostRidder <51288333+TianMaiChengGhostRidder@users.noreply.github.com>
-rw-r--r--lib/erl/src/thrift_socket_transport.erl19
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/erl/src/thrift_socket_transport.erl b/lib/erl/src/thrift_socket_transport.erl
index fa10ed0c6..fe210da97 100644
--- a/lib/erl/src/thrift_socket_transport.erl
+++ b/lib/erl/src/thrift_socket_transport.erl
@@ -70,7 +70,24 @@ when is_integer(Len), Len >= 0 ->
X when X >= Len ->
{Result, Remaining} = split_binary(Binary, Len),
{State#t_socket{buffer = Remaining}, {ok, Result}};
- _ -> recv(State, Len)
+ _ ->
+ %%recv(State, Len)
+ loop_recv(State,Len,Len)
+ end.
+
+loop_recv(State=#t_socket{buffer = Buf},ReadLen,NextReadLen) when NextReadLen =< 0->
+ {Result,Remaining}=split_binary(Buf,ReadLen),
+ {State#t_socket{buffer = Remaining},{ok,Result}};
+
+loop_recv(State=#t_socket{socket = Socket,buffer = Buf},ReadLen,NextReadLen) when NextReadLen >0 ->
+ case gen_tcp:recv(Socket,0,State#t_socket.recv_timeout) of
+ {error,Error}->
+ gen_tcp:close(Socket),
+ {State,{error,Error}};
+ {ok,Data}->
+ Binary=iolist_to_binary([Buf,Data]),
+ Give=min(iolist_size(Binary),ReadLen),
+ loop_recv(State#t_socket{buffer = Binary},ReadLen,ReadLen-Give)
end.
recv(State = #t_socket{socket = Socket, buffer = Buf}, Len) ->