diff options
author | Loïc Hoguin <[email protected]> | 2017-11-01 15:33:10 +0000 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2017-11-01 15:33:10 +0000 |
commit | 83bd8bc935cbbba39c8c706a1f7d5a6e9ac932ef (patch) | |
tree | 168cd9ffcffe5a8caaaa9dd8b2459d3bd4fa52f1 /test | |
parent | 774824cd0f37e5956e1dd8f903be990c3ce4666a (diff) | |
download | cowboy-83bd8bc935cbbba39c8c706a1f7d5a6e9ac932ef.tar.gz cowboy-83bd8bc935cbbba39c8c706a1f7d5a6e9ac932ef.tar.bz2 cowboy-83bd8bc935cbbba39c8c706a1f7d5a6e9ac932ef.zip |
Fix two edge cases for cowboy_req:stream_body
Sending data of size 0 with the fin flag set resulted in nothing
being sent to the client and still considering the response to
be finished for HTTP/1.1.
For both HTTP/1.1 and HTTP/2, the final chunk of body that is
sent automatically by Cowboy at the end of a response that the
user did not properly terminate was not passing through stream
handlers. This resulted in issues like compression being incorrect.
Some tests still fail under 20.1.3. They are due to recent zlib
changes and should be fixed in a future patch release. Unfortunately
it does not seem to be any 20.1 version that is safe to use for
Cowboy, although some will work better than others.
Diffstat (limited to 'test')
-rw-r--r-- | test/handlers/resp_h.erl | 20 | ||||
-rw-r--r-- | test/req_SUITE.erl | 10 |
2 files changed, 26 insertions, 4 deletions
diff --git a/test/handlers/resp_h.erl b/test/handlers/resp_h.erl index 94c7f60..add90ad 100644 --- a/test/handlers/resp_h.erl +++ b/test/handlers/resp_h.erl @@ -188,10 +188,22 @@ do(<<"stream_reply3">>, Req0, Opts) -> end, stream_body(Req), {ok, Req, Opts}; -do(<<"stream_body">>, Req, Opts) -> - %% Call stream_body without initiating streaming. - cowboy_req:stream_body(<<0:800000>>, fin, Req), - {ok, Req, Opts}; +do(<<"stream_body">>, Req0, Opts) -> + case cowboy_req:binding(arg, Req0) of + <<"fin0">> -> + Req = cowboy_req:stream_reply(200, Req0), + cowboy_req:stream_body(<<"Hello world!">>, nofin, Req), + cowboy_req:stream_body(<<>>, fin, Req), + {ok, Req, Opts}; + <<"nofin">> -> + Req = cowboy_req:stream_reply(200, Req0), + cowboy_req:stream_body(<<"Hello world!">>, nofin, Req), + {ok, Req, Opts}; + _ -> + %% Call stream_body without initiating streaming. + cowboy_req:stream_body(<<0:800000>>, fin, Req0), + {ok, Req0, Opts} + end; do(<<"push">>, Req, Opts) -> case cowboy_req:binding(arg, Req) of <<"method">> -> diff --git a/test/req_SUITE.erl b/test/req_SUITE.erl index 107cdd8..862ee53 100644 --- a/test/req_SUITE.erl +++ b/test/req_SUITE.erl @@ -827,6 +827,16 @@ stream_reply3(Config) -> {500, _, _} = do_get("/resp/stream_reply3/error", Config), ok. +stream_body_fin0(Config) -> + doc("Streamed body with last chunk of size 0."), + {200, _, <<"Hello world!">>} = do_get("/resp/stream_body/fin0", Config), + ok. + +stream_body_nofin(Config) -> + doc("Unfinished streamed body."), + {200, _, <<"Hello world!">>} = do_get("/resp/stream_body/nofin", Config), + ok. + %% @todo Crash when calling stream_body after the fin flag has been set. %% @todo Crash when calling stream_body after calling reply. %% @todo Crash when calling stream_body before calling stream_reply. |