0
Fork 0
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:
Adrian Roe 2013-06-26 18:04:20 +01:00 committed by Loïc Hoguin
parent 9d2096cd35
commit c2e946708e
3 changed files with 67 additions and 20 deletions

View file

@ -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)])),

View 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.