mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-14 12:20:24 +00:00
Implement backpressure on cowboy_req:stream_body
This should limit the amount of memory that Cowboy is using when a handler is sending data much faster than the network. The new max_stream_buffer_size is a soft limit and only has an effect when the cowboy_stream_h handler is used.
This commit is contained in:
parent
4427108b69
commit
49af57d546
6 changed files with 91 additions and 25 deletions
|
@ -221,6 +221,11 @@ do(<<"stream_body">>, Req0, Opts) ->
|
|||
cowboy_req:stream_body(<<"world">>, nofin, Req),
|
||||
cowboy_req:stream_body(<<"!">>, fin, Req),
|
||||
{ok, Req, Opts};
|
||||
<<"loop">> ->
|
||||
Req = cowboy_req:stream_reply(200, Req0),
|
||||
_ = [cowboy_req:stream_body(<<0:1000000/unit:8>>, nofin, Req)
|
||||
|| _ <- lists:seq(1, 32)],
|
||||
{ok, Req, Opts};
|
||||
<<"nofin">> ->
|
||||
Req = cowboy_req:stream_reply(200, Req0),
|
||||
cowboy_req:stream_body(<<"Hello world!">>, nofin, Req),
|
||||
|
|
|
@ -98,7 +98,7 @@ do_get(Path, Headers, Config) ->
|
|||
Ref = gun:get(ConnPid, Path, [{<<"accept-encoding">>, <<"gzip">>}|Headers]),
|
||||
{response, IsFin, Status, RespHeaders} = gun:await(ConnPid, Ref),
|
||||
{ok, RespBody} = case IsFin of
|
||||
nofin -> gun:await_body(ConnPid, Ref);
|
||||
nofin -> gun:await_body(ConnPid, Ref, 30000);
|
||||
fin -> {ok, <<>>}
|
||||
end,
|
||||
gun:close(ConnPid),
|
||||
|
@ -891,6 +891,11 @@ stream_body_multiple(Config) ->
|
|||
{200, _, <<"Hello world!">>} = do_get("/resp/stream_body/multiple", Config),
|
||||
ok.
|
||||
|
||||
stream_body_loop(Config) ->
|
||||
doc("Streamed body via a fast loop."),
|
||||
{200, _, <<0:32000000/unit:8>>} = do_get("/resp/stream_body/loop", Config),
|
||||
ok.
|
||||
|
||||
stream_body_nofin(Config) ->
|
||||
doc("Unfinished streamed body."),
|
||||
{200, _, <<"Hello world!">>} = do_get("/resp/stream_body/nofin", Config),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue