File 0433-inets-Fix-handling-of-Content-Type-httpc.patch of Package erlang

From d95cfc3b4a8ea1bbd8ad6c90f1e00b0150a87d7e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A9ter=20Dimitrov?= <peterdmv@erlang.org>
Date: Tue, 2 Oct 2018 17:03:00 +0200
Subject: [PATCH] inets: Fix handling of 'Content-Type' (httpc)

'Content-Type' is sent when it is explicitly set as a header or
there is a non-empty body in the request.

Former implementation dropped the explicit 'Content-Type' when
the request had an empty body.

Change-Id: I00a9e4a5011f9d28c04c0dfc5fe1561b1ab7eb09
---
 lib/inets/src/http_client/httpc_request.erl | 12 ++++++++++--
 lib/inets/test/httpc_SUITE.erl              | 10 ++++++++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/lib/inets/src/http_client/httpc_request.erl b/lib/inets/src/http_client/httpc_request.erl
index 9b81bd7a80..4cb2d57b14 100644
--- a/lib/inets/src/http_client/httpc_request.erl
+++ b/lib/inets/src/http_client/httpc_request.erl
@@ -213,9 +213,11 @@ update_body(Headers, Body) ->
 update_headers(Headers, ContentType, Body, []) ->
     case Body of
         [] ->
-            Headers#http_request_h{'content-length' = "0"};
+            Headers1 = Headers#http_request_h{'content-length' = "0"},
+            handle_content_type(Headers1, ContentType);
         <<>> ->
-            Headers#http_request_h{'content-length' = "0"};
+            Headers1 = Headers#http_request_h{'content-length' = "0"},
+            handle_content_type(Headers1, ContentType);
         {Fun, _Acc} when is_function(Fun, 1) ->
             %% A client MUST NOT generate a 100-continue expectation in a request
             %% that does not include a message body. This implies that either the
@@ -245,6 +247,12 @@ body_length(Body) when is_binary(Body) ->
 body_length(Body) when is_list(Body) ->
   integer_to_list(length(Body)).
 
+%% Set 'Content-Type' when it is explicitly set.
+handle_content_type(Headers, "") ->
+    Headers;
+handle_content_type(Headers, ContentType) ->
+    Headers#http_request_h{'content-type' = ContentType}.
+
 method(Method) ->
     http_util:to_upper(atom_to_list(Method)).
 
diff --git a/lib/inets/test/httpc_SUITE.erl b/lib/inets/test/httpc_SUITE.erl
index 3d375222b5..89a90b62f3 100644
--- a/lib/inets/test/httpc_SUITE.erl
+++ b/lib/inets/test/httpc_SUITE.erl
@@ -151,6 +151,7 @@ only_simulated() ->
      relaxed,
      multipart_chunks,
      delete_no_body,
+     post_with_content_type,
      stream_fun_server_close
     ].
 
@@ -1477,6 +1478,15 @@ delete_no_body(Config) when is_list(Config) ->
     {ok, {{_,500,_}, _, _}} =
         httpc:request(delete, {URL, [], "text/plain", "TEST"}, [], []).
 
+%%--------------------------------------------------------------------
+post_with_content_type(doc) ->
+    ["Test that a POST request with explicit 'Content-Type' does not drop the 'Content-Type' header - Solves ERL-736"];
+post_with_content_type(Config) when is_list(Config) ->
+    URL = url(group_name(Config), "/delete_no_body.html", Config),
+    %% Simulated server replies 500 if 'Content-Type' header is present
+    {ok, {{_,500,_}, _, _}} =
+        httpc:request(post, {URL, [], "application/x-www-form-urlencoded", ""}, [], []).
+
 %%--------------------------------------------------------------------
 request_options() ->
     [{doc, "Test http get request with socket options against local server (IPv6)"}].
-- 
2.16.4