diff options
-rw-r--r-- | doc/src/guide/broken_clients.asciidoc | 27 | ||||
-rw-r--r-- | test/http_SUITE.erl | 15 | ||||
-rw-r--r-- | test/http_SUITE_data/http_streamed.erl | 14 |
3 files changed, 14 insertions, 42 deletions
diff --git a/doc/src/guide/broken_clients.asciidoc b/doc/src/guide/broken_clients.asciidoc index 17bb892..1d1a51a 100644 --- a/doc/src/guide/broken_clients.asciidoc +++ b/doc/src/guide/broken_clients.asciidoc @@ -46,16 +46,17 @@ implementations. There is no easy solution for this other than forking the project and editing the `cowboy_protocol` file directly. -=== Chunked transfer-encoding - -Sometimes an HTTP client advertises itself as HTTP/1.1 but -does not support chunked transfer-encoding. This is invalid -behavior, as HTTP/1.1 clients are required to support it. - -A simple workaround exists in these cases. By changing the -Req object response state to `waiting_stream`, Cowboy will -understand that it must use the identity transfer-encoding -when replying, just like if it was an HTTP/1.0 client. - -[source,erlang] -Req2 = cowboy_req:set(resp_state, waiting_stream). +// @todo This currently has no equivalent in Cowboy 2.0. +// === Chunked transfer-encoding +// +// Sometimes an HTTP client advertises itself as HTTP/1.1 but +// does not support chunked transfer-encoding. This is invalid +// behavior, as HTTP/1.1 clients are required to support it. +// +// A simple workaround exists in these cases. By changing the +// Req object response state to `waiting_stream`, Cowboy will +// understand that it must use the identity transfer-encoding +// when replying, just like if it was an HTTP/1.0 client. +// +// [source,erlang] +// Req2 = cowboy_req:set(resp_state, waiting_stream). diff --git a/test/http_SUITE.erl b/test/http_SUITE.erl index 260aff6..3ea53fd 100644 --- a/test/http_SUITE.erl +++ b/test/http_SUITE.erl @@ -103,7 +103,6 @@ init_dispatch(Config) -> cowboy_router:compile([ {"localhost", [ {"/chunked_response", http_chunked, []}, - {"/streamed_response", http_streamed, []}, {"/headers/dupe", http_handler, [{headers, #{<<"connection">> => <<"close">>}}]}, {"/set_resp/header", http_set_resp, @@ -807,20 +806,6 @@ stream_body_set_resp_chunked10(Config) -> {ok, <<"stream_body_set_resp_chunked">>} = gun:await_body(ConnPid, Ref), gun_down(ConnPid). -%% Undocumented hack: force chunked response to be streamed as HTTP/1.1. -streamed_response(Config) -> - Client = raw_open(Config), - ok = raw_send(Client, "GET /streamed_response HTTP/1.1\r\nHost: localhost\r\n\r\n"), - Data = raw_recv_head(Client), - {'HTTP/1.1', 200, _, Rest} = cow_http:parse_status_line(Data), - {Headers, Rest2} = cow_http:parse_headers(Rest), - false = lists:keymember(<<"transfer-encoding">>, 1, Headers), - Rest2Size = byte_size(Rest2), - ok = case <<"streamed_handler\r\nworks fine!">> of - Rest2 -> ok; - << Rest2:Rest2Size/binary, Expect/bits >> -> raw_expect_recv(Client, Expect) - end. - te_chunked(Config) -> Body = list_to_binary(io_lib:format("~p", [lists:seq(1, 100)])), ConnPid = gun_open(Config), diff --git a/test/http_SUITE_data/http_streamed.erl b/test/http_SUITE_data/http_streamed.erl deleted file mode 100644 index 6ca53fb..0000000 --- a/test/http_SUITE_data/http_streamed.erl +++ /dev/null @@ -1,14 +0,0 @@ -%% Feel free to use, reuse and abuse the code in this file. - --module(http_streamed). - --export([init/2]). - -init(Req, Opts) -> - Req2 = cowboy_req:set([{resp_state, waiting_stream}], Req), - 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, Opts}. |