From 5e74354a48653fe2456688f80c6bccb11143f6af Mon Sep 17 00:00:00 2001 From: Polexy Date: Fri, 25 Nov 2022 15:37:30 +0300 Subject: [PATCH] Body parsing optimization --- src/hackney_http.erl | 4 +++- src/hackney_response.erl | 10 ++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/hackney_http.erl b/src/hackney_http.erl index c1018ccf..1f6fc1d8 100644 --- a/src/hackney_http.erl +++ b/src/hackney_http.erl @@ -384,6 +384,8 @@ transfer_decode(Data, St=#hparser{ {ok, Chunk, St#hparser{buffer=Rest}}; more -> {more, St#hparser{buffer=Data}, Buf}; + {more, TransferState2} -> + {more, St#hparser{buffer=Data, body_state={stream, TransferDecode, TransferState2, ContentDecode}}, Buf}; {done, Rest} -> {done, Rest}; {done, Data2, _Rest} -> @@ -424,7 +426,7 @@ te_chunked(Data, _) -> {ok, Chunk, Rest1} -> {chunk_ok, Chunk, Rest1}; eof -> - more + {more, {byte_size(Rest), Size}} end; eof -> more diff --git a/src/hackney_response.erl b/src/hackney_response.erl index 2241fc25..57c0edd8 100644 --- a/src/hackney_response.erl +++ b/src/hackney_response.erl @@ -9,6 +9,7 @@ -module(hackney_response). -include("hackney.hrl"). +-include("hackney_lib.hrl"). -type response_state() :: start | waiting | on_status | on_headers | on_body. -export_type([response_state/0]). @@ -165,8 +166,8 @@ stream_body1(Error, _Client) -> -spec stream_body_recv(binary(), #client{}) -> {ok, binary(), #client{}} | {error, term()}. -stream_body_recv(Buffer, Client=#client{version=Version, clen=CLen}) -> - case recv(Client) of +stream_body_recv(Buffer, Client=#client{version=Version, clen=CLen, parser=#hparser{body_state={stream, _, TransferState, _}}}) -> + case recv(Client, TransferState) of {ok, Data} -> stream_body(Data, Client); {error, Reason} -> @@ -347,6 +348,11 @@ maybe_close(#client{version={Min,Maj}, headers=Headers, clen=CLen}) -> recv(#client{transport=Transport, socket=Skt, recv_timeout=Timeout}) -> Transport:recv(Skt, 0, Timeout). +recv(#client{transport=Transport, socket=Skt, recv_timeout=Timeout}, {_BufSize, undefined}) -> + Transport:recv(Skt, 0, Timeout); +recv(#client{transport=Transport, socket=Skt, recv_timeout=Timeout}, {BufSize, ExpectedSize}) -> + Transport:recv(Skt, ExpectedSize - BufSize, Timeout). + close(#client{socket=nil}=Client) -> Client#client{state = closed}; close(#client{transport=Transport, socket=Skt}=Client) ->