mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-16 13:10:24 +00:00
Add a workaround to disable chunked transfer-encoding
This is an undocumented workaround to disable chunks when using HTTP/1.1. It can be used when the client advertises itself as HTTP/1.1 despite not understanding the chunked transfer-encoding. Usage can be found looking at the test for it. When activated, Cowboy will still advertise itself as HTTP/1.1, but will send the body the same way it would if it was HTTP/1.0.
This commit is contained in:
parent
9d2096cd35
commit
c2e946708e
3 changed files with 67 additions and 20 deletions
|
@ -90,6 +90,7 @@
|
|||
-export([stream_body_set_resp_close/1]).
|
||||
-export([stream_body_set_resp_chunked/1]).
|
||||
-export([stream_body_set_resp_chunked10/1]).
|
||||
-export([streamed_response/1]).
|
||||
-export([te_chunked/1]).
|
||||
-export([te_chunked_chopped/1]).
|
||||
-export([te_chunked_delayed/1]).
|
||||
|
@ -167,6 +168,7 @@ groups() ->
|
|||
stream_body_set_resp_close,
|
||||
stream_body_set_resp_chunked,
|
||||
stream_body_set_resp_chunked10,
|
||||
streamed_response,
|
||||
te_chunked,
|
||||
te_chunked_chopped,
|
||||
te_chunked_delayed,
|
||||
|
@ -352,6 +354,7 @@ init_dispatch(Config) ->
|
|||
cowboy_router:compile([
|
||||
{"localhost", [
|
||||
{"/chunked_response", http_chunked, []},
|
||||
{"/streamed_response", http_streamed, []},
|
||||
{"/init_shutdown", http_init_shutdown, []},
|
||||
{"/long_polling", http_long_polling, []},
|
||||
{"/headers/dupe", http_handler,
|
||||
|
@ -1285,6 +1288,17 @@ stream_body_set_resp_chunked10(Config) ->
|
|||
end,
|
||||
{error, closed} = Transport:recv(Socket, 0, 1000).
|
||||
|
||||
streamed_response(Config) ->
|
||||
Client = ?config(client, Config),
|
||||
{ok, Client2} = cowboy_client:request(<<"GET">>,
|
||||
build_url("/streamed_response", Config), Client),
|
||||
{ok, 200, Headers, Client3} = cowboy_client:response(Client2),
|
||||
false = lists:keymember(<<"transfer-encoding">>, 1, Headers),
|
||||
{ok, Transport, Socket} = cowboy_client:transport(Client3),
|
||||
{ok, <<"streamed_handler\r\nworks fine!">>}
|
||||
= Transport:recv(Socket, 29, 1000),
|
||||
{error, closed} = cowboy_client:response(Client3).
|
||||
|
||||
te_chunked(Config) ->
|
||||
Client = ?config(client, Config),
|
||||
Body = list_to_binary(io_lib:format("~p", [lists:seq(1, 100)])),
|
||||
|
|
20
test/http_SUITE_data/http_streamed.erl
Normal file
20
test/http_SUITE_data/http_streamed.erl
Normal file
|
@ -0,0 +1,20 @@
|
|||
%% Feel free to use, reuse and abuse the code in this file.
|
||||
|
||||
-module(http_streamed).
|
||||
-behaviour(cowboy_http_handler).
|
||||
-export([init/3, handle/2, terminate/3]).
|
||||
|
||||
init({_Transport, http}, Req, _Opts) ->
|
||||
{ok, Req, undefined}.
|
||||
|
||||
handle(Req, State) ->
|
||||
Req2 = cowboy_req:set([{resp_state, waiting_stream}], Req),
|
||||
{ok, Req3} = cowboy_req:chunked_reply(200, Req2),
|
||||
timer:sleep(100),
|
||||
cowboy_req:chunk("streamed_handler\r\n", Req3),
|
||||
timer:sleep(100),
|
||||
cowboy_req:chunk("works fine!", Req3),
|
||||
{ok, Req3, State}.
|
||||
|
||||
terminate(_, _, _) ->
|
||||
ok.
|
Loading…
Add table
Add a link
Reference in a new issue