aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/inets/doc/src/httpc.xml4
-rw-r--r--lib/inets/src/http_client/httpc.erl34
2 files changed, 33 insertions, 5 deletions
diff --git a/lib/inets/doc/src/httpc.xml b/lib/inets/doc/src/httpc.xml
index df333074cd..8b04b4c7f3 100644
--- a/lib/inets/doc/src/httpc.xml
+++ b/lib/inets/doc/src/httpc.xml
@@ -89,7 +89,9 @@ headers() = [header()]
header() = {field(), value()}
field() = string()
value() = string()
-body() = string() | binary() | {fun(acc()) -> send_fun_result(), acc()}
+body() = string() | binary() |
+ {fun(acc()) -> send_fun_result(), acc()} |
+ {chunkify, fun(acc()) -> send_fun_result(), acc()}
send_fun_result() = eof | {ok, iolist(), acc()}
acc() = term()
filename() = string()
diff --git a/lib/inets/src/http_client/httpc.erl b/lib/inets/src/http_client/httpc.erl
index b82a9db4c9..8cf82df809 100644
--- a/lib/inets/src/http_client/httpc.erl
+++ b/lib/inets/src/http_client/httpc.erl
@@ -126,7 +126,8 @@ request(Url, Profile) ->
%% Header = {Field, Value}
%% Field = string()
%% Value = string()
-%% Body = string() | binary() | {fun(SendAcc) -> SendFunResult, SendAcc} - HTLM-code
+%% Body = string() | binary() | {fun(SendAcc) -> SendFunResult, SendAcc} |
+%% {chunkify, fun(SendAcc) -> SendFunResult, SendAcc} - HTLM-code
%% SendFunResult = eof | {ok, iolist(), NewSendAcc}
%% SendAcc = NewSendAcc = term()
%%
@@ -428,11 +429,20 @@ service_info(Pid) ->
handle_request(Method, Url,
{Scheme, UserInfo, Host, Port, Path, Query},
- Headers, ContentType, Body,
+ Headers0, ContentType, Body0,
HTTPOptions0, Options0, Profile) ->
Started = http_util:timestamp(),
- NewHeaders = [{http_util:to_lower(Key), Val} || {Key, Val} <- Headers],
+ NewHeaders0 = [{http_util:to_lower(Key), Val} || {Key, Val} <- Headers0],
+
+ {NewHeaders, Body} = case Body0 of
+ {chunkify, BodyFun, Acc} ->
+ NewHeaders1 = lists:keystore("transfer-encoding", 1,
+ NewHeaders0, {"transfer-encoding", "chunked"}),
+ {NewHeaders1, {chunkify_fun(BodyFun), Acc}};
+ _ ->
+ {NewHeaders0, Body0}
+ end,
try
begin
@@ -456,7 +466,7 @@ handle_request(Method, Url,
abs_uri = Url,
userinfo = UserInfo,
stream = Stream,
- headers_as_is = headers_as_is(Headers, Options),
+ headers_as_is = headers_as_is(Headers0, Options),
socket_opts = SocketOpts,
started = Started},
case httpc_manager:request(Request, profile_name(Profile)) of
@@ -473,6 +483,22 @@ handle_request(Method, Url,
Error
end.
+chunkify_fun(BodyFun) ->
+ fun(eof_body_fun) ->
+ eof;
+ (Acc) ->
+ case BodyFun(Acc) of
+ eof ->
+ {ok, <<"0\r\n\r\n">>, eof_body_fun};
+ {ok, Data, NewAcc} ->
+ Bin = iolist_to_binary(Data),
+ Chunk = [hex_size(Bin), "\r\n", Bin, "\r\n"],
+ {ok, iolist_to_binary(Chunk), NewAcc}
+ end
+ end.
+
+hex_size(Bin) ->
+ hd(io_lib:format("~.16B", [size(Bin)])).
handle_answer(RequestId, false, _) ->
{ok, RequestId};