File 0276-inets-Fix-httpd-reload_config-2.patch of Package erlang

From 6f5541f5a734c086e48a70b3f9c2261293893b6a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A9ter=20Dimitrov?= <peterdmv@erlang.org>
Date: Wed, 18 Apr 2018 16:22:22 +0200
Subject: [PATCH] inets: Fix httpd:reload_config/2

- Add proper handling of path() as the first argument to
  httpd:reload_config/2.

Change-Id: Ia5779bdd55bff974e8eb0dd16ef26edf1f52fcff
---
 lib/inets/src/http_server/httpd.erl | 29 +++++++++++++++-----
 lib/inets/test/httpd_SUITE.erl      | 53 +++++++++++++++++++++++++++++++++++--
 2 files changed, 74 insertions(+), 8 deletions(-)

diff --git a/lib/inets/src/http_server/httpd.erl b/lib/inets/src/http_server/httpd.erl
index 540e68e749..1eaa1c930a 100644
--- a/lib/inets/src/http_server/httpd.erl
+++ b/lib/inets/src/http_server/httpd.erl
@@ -36,7 +36,13 @@
 	]).
 
 %% API
--export([parse_query/1, reload_config/2, info/1, info/2, info/3]).
+-export([
+         parse_query/1,
+         reload_config/2,
+         info/1,
+         info/2,
+         info/3
+        ]).
 
 %%%========================================================================
 %%% API
@@ -49,13 +55,24 @@ parse_query(String) ->
 reload_config(Config = [Value| _], Mode) when is_tuple(Value) ->
     do_reload_config(Config, Mode);
 reload_config(ConfigFile, Mode) ->
-    case httpd_conf:load(ConfigFile) of
-	{ok, ConfigList} ->
-	    do_reload_config(ConfigList, Mode);
-	Error ->
-	    Error
+    try file:consult(ConfigFile) of
+        {ok, [PropList]} ->
+            %% Erlang terms format
+            do_reload_config(PropList, Mode);
+        {error, _ } ->
+            %% Apache format
+            case httpd_conf:load(ConfigFile) of
+                {ok, ConfigList} ->
+                    do_reload_config(ConfigList, Mode);
+                Error ->
+                    Error
+            end
+    catch
+        exit:_ ->
+            throw({error, {could_not_consult_proplist_file, ConfigFile}})
     end.
 
+
 info(Pid) when is_pid(Pid) ->
     info(Pid, []).
 
diff --git a/lib/inets/test/httpd_SUITE.erl b/lib/inets/test/httpd_SUITE.erl
index 9a85c51d24..ff20322012 100644
--- a/lib/inets/test/httpd_SUITE.erl
+++ b/lib/inets/test/httpd_SUITE.erl
@@ -112,7 +112,8 @@ groups() ->
 		   non_disturbing_0_9,
 		   disturbing_1_1,
 		   disturbing_1_0, 
-		   disturbing_0_9
+		   disturbing_0_9,
+		   reload_config_file
 		  ]},
      {post, [], [chunked_post, chunked_chunked_encoded_post, post_204]},
      {basic_auth, [], [basic_auth_1_1, basic_auth_1_0, basic_auth_0_9]},
@@ -168,6 +169,7 @@ init_per_suite(Config) ->
     ServerRoot = filename:join(PrivDir, "server_root"),
     inets_test_lib:del_dirs(ServerRoot),
     DocRoot = filename:join(ServerRoot, "htdocs"),
+    setup_tmp_dir(PrivDir),
     setup_server_dirs(ServerRoot, DocRoot, DataDir),
     {ok, Hostname0} = inet:gethostname(),
     Inet = 
@@ -1536,6 +1538,45 @@ non_disturbing(Config) when is_list(Config)->
     end,
     inets_test_lib:close(Type, Socket),
     [{server_name, "httpd_non_disturbing_" ++ Version}] =  httpd:info(Server, [server_name]).
+%%-------------------------------------------------------------------------
+reload_config_file(Config) when is_list(Config) ->
+    ServerRoot = proplists:get_value(server_root, Config),
+    HttpdConf = filename:join(get_tmp_dir(Config), "inets_httpd_server.conf"),
+    ServerConfig =
+        "[\n" ++
+        "{bind_address, \"localhost\"}," ++
+        "{port,0}," ++
+        "{server_name,\"httpd_test\"}," ++
+        "{server_root,\"" ++ ServerRoot ++  "\"}," ++
+        "{document_root,\"" ++ proplists:get_value(doc_root, Config) ++ "\"}" ++
+        "].",
+    ok = file:write_file(HttpdConf, ServerConfig),
+    {ok, Server} = inets:start(httpd, [{proplist_file, HttpdConf}]),
+    Port = proplists:get_value(port, httpd:info(Server)),
+    NewConfig =
+        "[\n" ++
+        "{bind_address, \"localhost\"}," ++
+        "{port," ++ integer_to_list(Port) ++ "}," ++
+        "{server_name,\"httpd_test_new\"}," ++
+        "{server_root,\"" ++ ServerRoot ++  "\"}," ++
+        "{document_root,\"" ++ proplists:get_value(doc_root, Config) ++ "\"}" ++
+        "].",
+    NewConfigApache =
+        "BindAddress localhost\n" ++
+        "Port " ++ integer_to_list(Port) ++ "\n" ++
+        "ServerName httpd_test_new_apache\n" ++
+        "ServerRoot " ++ ServerRoot ++ "\n" ++
+        "DocumentRoot " ++ proplists:get_value(doc_root, Config) ++ "\n",
+
+    %% Test Erlang term format
+    ok = file:write_file(HttpdConf, NewConfig),
+    ok = httpd:reload_config(HttpdConf, non_disturbing),
+    "httpd_test_new" = proplists:get_value(server_name, httpd:info(Server)),
+
+    %% Test Apache format
+    ok = file:write_file(HttpdConf, NewConfigApache),
+    ok = httpd:reload_config(HttpdConf, non_disturbing),
+    "httpd_test_new_apache" = proplists:get_value(server_name, httpd:info(Server)).
 
 %%-------------------------------------------------------------------------
 mime_types_format(Config) when is_list(Config) -> 
@@ -1728,7 +1769,15 @@ setup_server_dirs(ServerRoot, DocRoot, DataDir) ->
     {ok, FileInfo1} = file:read_file_info(EnvCGI),
     ok = file:write_file_info(EnvCGI, 
 			      FileInfo1#file_info{mode = 8#00755}).
-    
+
+setup_tmp_dir(PrivDir) ->
+    TmpDir =  filename:join(PrivDir, "tmp"),
+    ok = file:make_dir(TmpDir).
+
+get_tmp_dir(Config) ->
+    PrivDir = proplists:get_value(priv_dir, Config),
+    filename:join(PrivDir, "tmp").
+
 start_apps(Group) when  Group == https_basic;
 			Group == https_limit;
 			Group == https_custom;
-- 
2.16.4